From 026019a69fa9a2d3c024bd90683fe7bd07e1f4bf Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 17:59:14 -0400 Subject: [PATCH 01/94] build: update doxygen config for merged sphinxbase --- doc/doxy2swig.py | 18 +++++++++++++++++- doc/doxyfile.in | 15 +++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/doc/doxy2swig.py b/doc/doxy2swig.py index 6af3ef0fe..2e1469e92 100644 --- a/doc/doxy2swig.py +++ b/doc/doxy2swig.py @@ -39,6 +39,13 @@ # TODO: do not process unnecessary files TYPEMAP = { + 'cmd_ln_t': ('Config', 'cmd_ln_'), + 'fe_t': ('FrontEnd', 'fe_'), + 'feat_t': ('Feature', 'feat_'), + 'fsg_model_t': ('FsgModel', 'fsg_model_'), + 'jsgf_t': ('Jsgf', 'jsgf_'), + 'ngram_model_set_t': ('NGramModelSet', 'ngram_model_set_'), + 'ngram_model_t': ('NGramModel', 'ngram_model_'), 'ps_decoder_t': ('Decoder', 'ps_'), 'ps_lattice_t': ('Lattice', 'ps_lattice_'), 'ps_nbest_t': ('NBest', 'ps_nbest_'), @@ -47,6 +54,12 @@ USE_PREFIXES = [ 'ps_', + 'cmd__ln_8', + 'fe_8', + 'feat_', + 'fsg__model_', + 'jsgf_8', + 'ngram__model_' ] def my_open_read(source): @@ -290,7 +303,10 @@ def do_memberdef(self, node): name = first['name'].firstChild.data for n in node.getElementsByTagName('param'): - arg_type = n.getElementsByTagName('type')[0] + elts = n.getElementsByTagName('type') + if len(elts) == 0: + continue + arg_type = elts[0] ref = self.get_specific_nodes(arg_type, ('ref')) if 'ref' in ref: type_name = ref['ref'].firstChild.data diff --git a/doc/doxyfile.in b/doc/doxyfile.in index 2cd5eb016..299a97ef4 100644 --- a/doc/doxyfile.in +++ b/doc/doxyfile.in @@ -146,6 +146,13 @@ JAVADOC_AUTOBRIEF = YES MULTILINE_CPP_IS_BRIEF = NO +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. @@ -455,7 +462,7 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = @top_srcdir@/include @top_srcdir@/src/libpocketsphinx +INPUT = @top_srcdir@/include @top_srcdir@/src @top_srcdir@/src/libpocketsphinx # This tag can be used to specify the character encoding of the source files that # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default @@ -497,7 +504,7 @@ EXCLUDE_SYMLINKS = NO # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* -EXCLUDE_PATTERNS = */.svn/* */.deps/* */.libs/* */cmu6_lts_rules.* +EXCLUDE_PATTERNS = */.svn/* */.deps/* */.libs/* *.py */cmu6_lts_rules.* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the output. @@ -783,7 +790,7 @@ COMPACT_LATEX = NO # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. -PAPER_TYPE = a4wide +PAPER_TYPE = letter # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. @@ -1058,7 +1065,7 @@ SKIP_FUNCTION_MACROS = YES # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. -TAGFILES = @sphinxbasebuild@/doc/doxytags=../sphinxbase +TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. From debbdf141ca145ce8aa843baaa75953dbf93a1d7 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 18:00:28 -0400 Subject: [PATCH 02/94] build: import all sphinxbase code (will change things from here) --- doc/sphinx_cepview.1 | 41 + doc/sphinx_cepview.1.in | 18 + doc/sphinx_cont_seg.1 | 117 + doc/sphinx_cont_seg.1.in | 19 + doc/sphinx_fe.1 | 193 ++ doc/sphinx_fe.1.in | 29 + doc/sphinx_lm_convert.1 | 45 + doc/sphinx_lm_convert.1.in | 19 + doc/sphinx_lm_eval.1 | 56 + doc/sphinx_lm_eval.1.in | 18 + doc/sphinx_lm_sort.1 | 21 + doc/sphinx_pitch.1 | 72 + doc/sphinx_pitch.1.in | 16 + include/android/config.h | 108 + include/android/sphinx_config.h | 17 + include/sphinx_config.h.in | 19 + include/sphinxbase/Makefile.am | 38 + include/sphinxbase/ad.h | 126 + include/sphinxbase/agc.h | 202 ++ include/sphinxbase/bio.h | 316 ++ include/sphinxbase/bitarr.h | 142 + include/sphinxbase/bitvec.h | 155 + include/sphinxbase/byteorder.h | 98 + include/sphinxbase/case.h | 135 + include/sphinxbase/ckd_alloc.h | 310 ++ include/sphinxbase/clapack_lite.h | 36 + include/sphinxbase/cmd_ln.h | 609 ++++ include/sphinxbase/cmn.h | 191 ++ include/sphinxbase/err.h | 199 ++ include/sphinxbase/f2c.h | 218 ++ include/sphinxbase/fe.h | 628 ++++ include/sphinxbase/feat.h | 469 +++ include/sphinxbase/filename.h | 112 + include/sphinxbase/fixpoint.h | 145 + include/sphinxbase/fsg_model.h | 376 +++ include/sphinxbase/genrand.h | 177 + include/sphinxbase/glist.h | 242 ++ include/sphinxbase/hash_table.h | 443 +++ include/sphinxbase/heap.h | 153 + include/sphinxbase/jsgf.h | 209 ++ include/sphinxbase/listelem_alloc.h | 125 + include/sphinxbase/logmath.h | 249 ++ include/sphinxbase/matrix.h | 214 ++ include/sphinxbase/mmio.h | 85 + include/sphinxbase/ngram_model.h | 703 ++++ include/sphinxbase/pio.h | 302 ++ include/sphinxbase/prim_type.h | 183 + include/sphinxbase/priority_queue.h | 45 + include/sphinxbase/profile.h | 231 ++ include/sphinxbase/sbthread.h | 221 ++ include/sphinxbase/sphinxbase_export.h | 15 + include/sphinxbase/strfuncs.h | 158 + include/sphinxbase/yin.h | 116 + include/win32/config.h | 31 + include/win32/sphinx_config.h | 13 + include/wince/assert.h | 6 + include/wince/config.h | 3 + include/wince/errno.h | 94 + include/wince/sphinx_config.h | 16 + src/libsphinxad/Makefile.am | 31 + src/libsphinxad/ad_alsa.c | 344 ++ src/libsphinxad/ad_base.c | 110 + src/libsphinxad/ad_openal.c | 128 + src/libsphinxad/ad_oss.c | 390 +++ src/libsphinxad/ad_pulse.c | 162 + src/libsphinxad/ad_win32.c | 506 +++ src/libsphinxbase/Makefile.am | 12 + src/libsphinxbase/fe/Makefile.am | 29 + src/libsphinxbase/fe/fe_design.txt | 44 + src/libsphinxbase/fe/fe_interface.c | 764 +++++ src/libsphinxbase/fe/fe_internal.h | 204 ++ src/libsphinxbase/fe/fe_noise.c | 492 +++ src/libsphinxbase/fe/fe_noise.h | 66 + src/libsphinxbase/fe/fe_prespch_buf.c | 206 ++ src/libsphinxbase/fe/fe_prespch_buf.h | 76 + src/libsphinxbase/fe/fe_sigproc.c | 1206 +++++++ src/libsphinxbase/fe/fe_type.h | 59 + src/libsphinxbase/fe/fe_warp.c | 252 ++ src/libsphinxbase/fe/fe_warp.h | 90 + src/libsphinxbase/fe/fe_warp_affine.c | 181 + src/libsphinxbase/fe/fe_warp_affine.h | 76 + src/libsphinxbase/fe/fe_warp_inverse_linear.c | 178 + src/libsphinxbase/fe/fe_warp_inverse_linear.h | 77 + .../fe/fe_warp_piecewise_linear.c | 223 ++ .../fe/fe_warp_piecewise_linear.h | 77 + src/libsphinxbase/fe/fixlog.c | 229 ++ src/libsphinxbase/fe/make_log_sub_table.py | 35 + src/libsphinxbase/fe/make_log_table.py | 24 + src/libsphinxbase/fe/yin.c | 322 ++ src/libsphinxbase/feat/Makefile.am | 14 + src/libsphinxbase/feat/agc.c | 227 ++ src/libsphinxbase/feat/cmn.c | 188 ++ src/libsphinxbase/feat/cmn_live.c | 173 + src/libsphinxbase/feat/feat.c | 1497 +++++++++ src/libsphinxbase/feat/lda.c | 158 + src/libsphinxbase/lm/Makefile.am | 36 + src/libsphinxbase/lm/_jsgf_scanner.l | 87 + src/libsphinxbase/lm/fsg_model.c | 939 ++++++ src/libsphinxbase/lm/jsgf.c | 966 ++++++ src/libsphinxbase/lm/jsgf_internal.h | 140 + src/libsphinxbase/lm/jsgf_parser.c | 1799 ++++++++++ src/libsphinxbase/lm/jsgf_parser.h | 90 + src/libsphinxbase/lm/jsgf_parser.y | 156 + src/libsphinxbase/lm/jsgf_scanner.c | 2221 ++++++++++++ src/libsphinxbase/lm/jsgf_scanner.h | 342 ++ src/libsphinxbase/lm/lm_trie.c | 867 +++++ src/libsphinxbase/lm/lm_trie.h | 114 + src/libsphinxbase/lm/lm_trie_quant.c | 321 ++ src/libsphinxbase/lm/lm_trie_quant.h | 121 + src/libsphinxbase/lm/ngram_model.c | 1063 ++++++ src/libsphinxbase/lm/ngram_model_internal.h | 197 ++ src/libsphinxbase/lm/ngram_model_set.c | 866 +++++ src/libsphinxbase/lm/ngram_model_set.h | 70 + src/libsphinxbase/lm/ngram_model_trie.c | 693 ++++ src/libsphinxbase/lm/ngram_model_trie.h | 82 + src/libsphinxbase/lm/ngrams_raw.c | 387 +++ src/libsphinxbase/lm/ngrams_raw.h | 94 + src/libsphinxbase/util/Makefile.am | 46 + src/libsphinxbase/util/README.python | 41 + src/libsphinxbase/util/bio.c | 644 ++++ src/libsphinxbase/util/bitarr.c | 139 + src/libsphinxbase/util/bitvec.c | 101 + src/libsphinxbase/util/blas_lite.c | 2147 ++++++++++++ src/libsphinxbase/util/case.c | 141 + src/libsphinxbase/util/ckd_alloc.c | 427 +++ src/libsphinxbase/util/clapack_scrub.py | 276 ++ src/libsphinxbase/util/cmd_ln.c | 1088 ++++++ src/libsphinxbase/util/dtoa.c | 2985 +++++++++++++++++ src/libsphinxbase/util/err.c | 282 ++ src/libsphinxbase/util/errno.c | 51 + src/libsphinxbase/util/f2c_lite.c | 551 +++ src/libsphinxbase/util/filename.c | 120 + src/libsphinxbase/util/fortran.py | 114 + src/libsphinxbase/util/genrand.c | 198 ++ src/libsphinxbase/util/glist.c | 271 ++ src/libsphinxbase/util/hash_table.c | 706 ++++ src/libsphinxbase/util/heap.c | 292 ++ src/libsphinxbase/util/listelem_alloc.c | 294 ++ src/libsphinxbase/util/logmath.c | 503 +++ src/libsphinxbase/util/make_lite.py | 265 ++ src/libsphinxbase/util/matrix.c | 316 ++ src/libsphinxbase/util/mmio.c | 257 ++ src/libsphinxbase/util/pio.c | 657 ++++ src/libsphinxbase/util/priority_queue.c | 144 + src/libsphinxbase/util/profile.c | 345 ++ src/libsphinxbase/util/sbthread.c | 739 ++++ src/libsphinxbase/util/slamch.c | 1029 ++++++ src/libsphinxbase/util/slapack_lite.c | 1461 ++++++++ src/libsphinxbase/util/strfuncs.c | 194 ++ src/libsphinxbase/util/wrapped_routines | 4 + src/sphinx_adtools/Makefile.am | 8 + src/sphinx_adtools/cont_seg.c | 312 ++ src/sphinx_adtools/sphinx_pitch.c | 578 ++++ src/sphinx_cepview/Makefile.am | 8 + src/sphinx_cepview/main_cepview.c | 287 ++ src/sphinx_fe/Makefile.am | 14 + src/sphinx_fe/cmd_ln_defn.h | 223 ++ src/sphinx_fe/sphinx_fe.c | 1044 ++++++ src/sphinx_fe/sphinx_wave2feat.h | 66 + src/sphinx_jsgf2fsg/Makefile.am | 10 + src/sphinx_jsgf2fsg/fsg2dot.pl | 44 + src/sphinx_jsgf2fsg/main.c | 208 ++ src/sphinx_lmtools/Makefile.am | 9 + src/sphinx_lmtools/sphinx_lm_convert.c | 207 ++ src/sphinx_lmtools/sphinx_lm_eval.c | 324 ++ swig/cmd_ln.i | 83 + swig/fe.i | 58 + swig/feat.i | 43 + swig/fsg_model.i | 149 + swig/iterators.i | 221 ++ swig/jsgf.i | 80 + swig/logmath.i | 83 + swig/ngram_model.i | 121 + swig/sphinxbase.i | 132 + swig/typemaps.i | 101 + test/regression/chan3-dither.cepview | 2178 ++++++++++++ test/regression/chan3-logspec.cepview | 2178 ++++++++++++ test/regression/chan3-smoothspec.cepview | 2178 ++++++++++++ test/regression/chan3.2chan.wav | Bin 0 -> 920476 bytes test/regression/chan3.cepview | 2178 ++++++++++++ test/regression/chan3.ctl | 3 + test/regression/chan3.f0 | 2090 ++++++++++++ test/regression/chan3.logspec | Bin 0 -> 313636 bytes test/regression/chan3.mfc | Bin 0 -> 113260 bytes test/regression/chan3.raw | Bin 0 -> 460216 bytes test/regression/chan3.sph | Bin 0 -> 461240 bytes test/regression/chan3.wav | Bin 0 -> 460260 bytes test/regression/polite.gram | 12 + test/regression/test-cepview.sh | 14 + test/regression/test-sphinx_fe-ctl.sh | 62 + test/regression/test-sphinx_fe-dct.sh | 30 + test/regression/test-sphinx_fe-dither-seed.sh | 35 + test/regression/test-sphinx_fe-logspec.sh | 31 + test/regression/test-sphinx_fe-logspec2cep.sh | 21 + test/regression/test-sphinx_fe-smoothspec.sh | 31 + test/regression/test-sphinx_fe.sh | 30 + test/regression/test-sphinx_jsgf2fsg.sh | 17 + test/regression/test-sphinx_pitch.sh | 14 + test/regression/test.command.fsg | 24 + test/regression/test.gram | 36 + test/regression/test.kleene.fsg | 14 + test/regression/test.nestedRightRecursion.fsg | 7 + test/regression/test.nulltest.fsg | 17 + test/regression/test.rightRecursion.fsg | 11 + test/regression/testfuncs.sh.in | 60 + test/unit/test_alloc/Makefile.am | 15 + test/unit/test_alloc/test_ckd_alloc.c | 103 + test/unit/test_alloc/test_ckd_alloc_abort.c | 19 + test/unit/test_alloc/test_ckd_alloc_abort.sh | 11 + test/unit/test_alloc/test_ckd_alloc_catch.c | 26 + test/unit/test_alloc/test_ckd_alloc_fail.c | 19 + test/unit/test_alloc/test_ckd_alloc_fail.sh | 11 + test/unit/test_alloc/test_listelem_alloc.c | 64 + test/unit/test_alloc/test_macros.h | 11 + test/unit/test_bitvec/Makefile.am | 12 + test/unit/test_bitvec/test_bitvec.c | 62 + test/unit/test_bitvec/test_macros.h | 11 + test/unit/test_case/Makefile.am | 21 + test/unit/test_case/_lcase1.test | 2 + test/unit/test_case/_lcase2.test | 2 + test/unit/test_case/_lcase3.test | 2 + test/unit/test_case/_strcmp1.test | 2 + test/unit/test_case/_strcmp2.test | 2 + test/unit/test_case/_strcmp3.test | 2 + test/unit/test_case/_ucase1.test | 2 + test/unit/test_case/_ucase2.test | 2 + test/unit/test_case/_ucase3.test | 2 + test/unit/test_case/chgCase.c | 99 + test/unit/test_cmdln/Makefile.am | 24 + test/unit/test_cmdln/_test_parse_badargs.res | 9 + test/unit/test_cmdln/_test_parse_badargs.test | 14 + test/unit/test_cmdln/_test_parse_defaults.res | 6 + .../unit/test_cmdln/_test_parse_defaults.test | 10 + .../test_cmdln/_test_parse_defaults_r.res | 10 + .../test_cmdln/_test_parse_defaults_r.test | 10 + test/unit/test_cmdln/_test_parse_goodargs.res | 1 + .../unit/test_cmdln/_test_parse_goodargs.test | 8 + test/unit/test_cmdln/_test_parse_multiple.res | 1 + .../unit/test_cmdln/_test_parse_multiple.test | 8 + test/unit/test_cmdln/cmdln_parse.c | 31 + test/unit/test_cmdln/cmdln_parse_multiple.c | 36 + test/unit/test_cmdln/cmdln_parse_r.c | 62 + test/unit/test_fe/Makefile.am | 12 + test/unit/test_fe/test_fe.c | 218 ++ test/unit/test_fe/test_macros.h | 12 + test/unit/test_fe/test_pitch.c | 55 + test/unit/test_feat/Makefile.am | 15 + test/unit/test_feat/_test_feat.res | 18 + test/unit/test_feat/_test_feat.test | 7 + test/unit/test_feat/test_feat.c | 108 + test/unit/test_feat/test_feat_fe.c | 153 + test/unit/test_feat/test_feat_live.c | 118 + test/unit/test_feat/test_macros.h | 11 + test/unit/test_feat/test_subvq.c | 91 + test/unit/test_fsg/Makefile.am | 18 + test/unit/test_fsg/goforward.fsg | 24 + test/unit/test_fsg/polite.gram | 10 + test/unit/test_fsg/public.gram | 7 + test/unit/test_fsg/test_fsg_jsgf.c | 55 + test/unit/test_fsg/test_fsg_read.c | 56 + test/unit/test_fsg/test_fsg_write_fsm.c | 34 + test/unit/test_fsg/test_macros.h | 11 + test/unit/test_hash/Makefile.am | 31 + test/unit/test_hash/_hash_delete1.res | 6 + test/unit/test_hash/_hash_delete1.test | 7 + test/unit/test_hash/_hash_delete2.res | 7 + test/unit/test_hash/_hash_delete2.test | 7 + test/unit/test_hash/_hash_delete3.res | 7 + test/unit/test_hash/_hash_delete3.test | 7 + test/unit/test_hash/_hash_delete4.res | 7 + test/unit/test_hash/_hash_delete4.test | 7 + test/unit/test_hash/_hash_delete5.res | 1 + test/unit/test_hash/_hash_delete5.test | 7 + test/unit/test_hash/deletehash.c | 116 + test/unit/test_hash/display.res | 6 + test/unit/test_hash/displayhash.c | 63 + test/unit/test_hash/test_hash_iter.c | 52 + test/unit/test_hash/test_macros.h | 7 + test/unit/test_lineiter/Makefile.am | 16 + test/unit/test_lineiter/test.txt | 7 + test/unit/test_lineiter/test_lineiter.c | 37 + test/unit/test_lineiter/test_macros.h | 11 + test/unit/test_logmath/Makefile.am | 13 + test/unit/test_logmath/test_log_int16.c | 77 + test/unit/test_logmath/test_log_int8.c | 44 + test/unit/test_logmath/test_log_shifted.c | 77 + test/unit/test_logmath/test_macros.h | 9 + test/unit/test_matrix/Makefile.am | 27 + test/unit/test_matrix/_test_determinant.res | 2 + test/unit/test_matrix/_test_determinant.test | 7 + test/unit/test_matrix/_test_invert.res | 19 + test/unit/test_matrix/_test_invert.test | 7 + test/unit/test_matrix/_test_solve.res | 1 + test/unit/test_matrix/_test_solve.test | 7 + test/unit/test_matrix/test_determinant.c | 36 + test/unit/test_matrix/test_invert.c | 104 + test/unit/test_matrix/test_solve.c | 36 + test/unit/test_ngram/100.lm.bin | Bin 0 -> 804990 bytes test/unit/test_ngram/100.lm.bz2 | Bin 0 -> 14653 bytes test/unit/test_ngram/100.lm.dmp | Bin 0 -> 26194 bytes test/unit/test_ngram/100.lm.gz | Bin 0 -> 17923 bytes test/unit/test_ngram/100.lmctl | 4 + test/unit/test_ngram/100.probdef | 11 + test/unit/test_ngram/102.lm.dmp | Bin 0 -> 25224 bytes test/unit/test_ngram/102.lm.gz | Bin 0 -> 15867 bytes test/unit/test_ngram/104.lm.gz | Bin 0 -> 299 bytes test/unit/test_ngram/105.lm.gz | Bin 0 -> 208 bytes test/unit/test_ngram/106.lm.gz | Bin 0 -> 268 bytes test/unit/test_ngram/107.lm.gz | Bin 0 -> 291 bytes test/unit/test_ngram/Makefile.am | 40 + test/unit/test_ngram/test_lm_add.c | 43 + test/unit/test_ngram/test_lm_casefold.c | 44 + test/unit/test_ngram/test_lm_class.c | 123 + test/unit/test_ngram/test_lm_read.c | 103 + test/unit/test_ngram/test_lm_score.c | 88 + test/unit/test_ngram/test_lm_set.c | 197 ++ test/unit/test_ngram/test_lm_write.c | 90 + test/unit/test_ngram/test_macros.h | 11 + test/unit/test_ngram/turtle.lm | 498 +++ test/unit/test_ngram/turtle.lm.dmp | Bin 0 -> 6070 bytes test/unit/test_ngram/turtle.ug.lm | 98 + test/unit/test_ngram/turtle.ug.lm.dmp | Bin 0 -> 3685 bytes test/unit/test_string/Makefile.am | 23 + test/unit/test_string/_fread_line.test | 2 + test/unit/test_string/_fread_line.txt | 3 + test/unit/test_string/_nextword.test | 2 + test/unit/test_string/_str2words.test | 2 + test/unit/test_string/_string_join.test | 2 + test/unit/test_string/_string_trim.test | 2 + test/unit/test_string/strtest.c | 191 ++ test/unit/test_string/test_atof.c | 40 + test/unit/test_thread/Makefile.am | 18 + test/unit/test_thread/test_event.c | 37 + test/unit/test_thread/test_macros.h | 10 + test/unit/test_thread/test_msgq.c | 42 + test/unit/test_thread/test_thread.c | 67 + test/unit/test_util/Makefile.am | 23 + test/unit/test_util/test_bit_encode.c | 51 + test/unit/test_util/test_bitarr.c | 36 + test/unit/test_util/test_build_directory.c | 26 + test/unit/test_util/test_filename.c | 43 + test/unit/test_util/test_fopen.c | 44 + test/unit/test_util/test_heap.c | 40 + test/unit/test_util/test_macros.h | 10 + test/unit/test_util/test_readfile.c | 27 + 345 files changed, 67091 insertions(+) create mode 100644 doc/sphinx_cepview.1 create mode 100644 doc/sphinx_cepview.1.in create mode 100644 doc/sphinx_cont_seg.1 create mode 100644 doc/sphinx_cont_seg.1.in create mode 100644 doc/sphinx_fe.1 create mode 100644 doc/sphinx_fe.1.in create mode 100644 doc/sphinx_lm_convert.1 create mode 100644 doc/sphinx_lm_convert.1.in create mode 100644 doc/sphinx_lm_eval.1 create mode 100644 doc/sphinx_lm_eval.1.in create mode 100644 doc/sphinx_lm_sort.1 create mode 100644 doc/sphinx_pitch.1 create mode 100644 doc/sphinx_pitch.1.in create mode 100644 include/android/config.h create mode 100644 include/android/sphinx_config.h create mode 100644 include/sphinx_config.h.in create mode 100644 include/sphinxbase/Makefile.am create mode 100644 include/sphinxbase/ad.h create mode 100644 include/sphinxbase/agc.h create mode 100644 include/sphinxbase/bio.h create mode 100644 include/sphinxbase/bitarr.h create mode 100644 include/sphinxbase/bitvec.h create mode 100644 include/sphinxbase/byteorder.h create mode 100644 include/sphinxbase/case.h create mode 100644 include/sphinxbase/ckd_alloc.h create mode 100644 include/sphinxbase/clapack_lite.h create mode 100644 include/sphinxbase/cmd_ln.h create mode 100644 include/sphinxbase/cmn.h create mode 100644 include/sphinxbase/err.h create mode 100644 include/sphinxbase/f2c.h create mode 100644 include/sphinxbase/fe.h create mode 100644 include/sphinxbase/feat.h create mode 100644 include/sphinxbase/filename.h create mode 100644 include/sphinxbase/fixpoint.h create mode 100644 include/sphinxbase/fsg_model.h create mode 100644 include/sphinxbase/genrand.h create mode 100644 include/sphinxbase/glist.h create mode 100644 include/sphinxbase/hash_table.h create mode 100644 include/sphinxbase/heap.h create mode 100644 include/sphinxbase/jsgf.h create mode 100644 include/sphinxbase/listelem_alloc.h create mode 100644 include/sphinxbase/logmath.h create mode 100644 include/sphinxbase/matrix.h create mode 100644 include/sphinxbase/mmio.h create mode 100644 include/sphinxbase/ngram_model.h create mode 100644 include/sphinxbase/pio.h create mode 100644 include/sphinxbase/prim_type.h create mode 100644 include/sphinxbase/priority_queue.h create mode 100644 include/sphinxbase/profile.h create mode 100644 include/sphinxbase/sbthread.h create mode 100644 include/sphinxbase/sphinxbase_export.h create mode 100644 include/sphinxbase/strfuncs.h create mode 100644 include/sphinxbase/yin.h create mode 100644 include/win32/config.h create mode 100644 include/win32/sphinx_config.h create mode 100644 include/wince/assert.h create mode 100644 include/wince/config.h create mode 100644 include/wince/errno.h create mode 100644 include/wince/sphinx_config.h create mode 100644 src/libsphinxad/Makefile.am create mode 100644 src/libsphinxad/ad_alsa.c create mode 100644 src/libsphinxad/ad_base.c create mode 100644 src/libsphinxad/ad_openal.c create mode 100644 src/libsphinxad/ad_oss.c create mode 100644 src/libsphinxad/ad_pulse.c create mode 100644 src/libsphinxad/ad_win32.c create mode 100644 src/libsphinxbase/Makefile.am create mode 100644 src/libsphinxbase/fe/Makefile.am create mode 100644 src/libsphinxbase/fe/fe_design.txt create mode 100644 src/libsphinxbase/fe/fe_interface.c create mode 100644 src/libsphinxbase/fe/fe_internal.h create mode 100644 src/libsphinxbase/fe/fe_noise.c create mode 100644 src/libsphinxbase/fe/fe_noise.h create mode 100644 src/libsphinxbase/fe/fe_prespch_buf.c create mode 100644 src/libsphinxbase/fe/fe_prespch_buf.h create mode 100644 src/libsphinxbase/fe/fe_sigproc.c create mode 100644 src/libsphinxbase/fe/fe_type.h create mode 100644 src/libsphinxbase/fe/fe_warp.c create mode 100644 src/libsphinxbase/fe/fe_warp.h create mode 100644 src/libsphinxbase/fe/fe_warp_affine.c create mode 100644 src/libsphinxbase/fe/fe_warp_affine.h create mode 100644 src/libsphinxbase/fe/fe_warp_inverse_linear.c create mode 100644 src/libsphinxbase/fe/fe_warp_inverse_linear.h create mode 100644 src/libsphinxbase/fe/fe_warp_piecewise_linear.c create mode 100644 src/libsphinxbase/fe/fe_warp_piecewise_linear.h create mode 100644 src/libsphinxbase/fe/fixlog.c create mode 100644 src/libsphinxbase/fe/make_log_sub_table.py create mode 100644 src/libsphinxbase/fe/make_log_table.py create mode 100644 src/libsphinxbase/fe/yin.c create mode 100644 src/libsphinxbase/feat/Makefile.am create mode 100644 src/libsphinxbase/feat/agc.c create mode 100644 src/libsphinxbase/feat/cmn.c create mode 100644 src/libsphinxbase/feat/cmn_live.c create mode 100644 src/libsphinxbase/feat/feat.c create mode 100644 src/libsphinxbase/feat/lda.c create mode 100644 src/libsphinxbase/lm/Makefile.am create mode 100644 src/libsphinxbase/lm/_jsgf_scanner.l create mode 100644 src/libsphinxbase/lm/fsg_model.c create mode 100644 src/libsphinxbase/lm/jsgf.c create mode 100644 src/libsphinxbase/lm/jsgf_internal.h create mode 100644 src/libsphinxbase/lm/jsgf_parser.c create mode 100644 src/libsphinxbase/lm/jsgf_parser.h create mode 100644 src/libsphinxbase/lm/jsgf_parser.y create mode 100644 src/libsphinxbase/lm/jsgf_scanner.c create mode 100644 src/libsphinxbase/lm/jsgf_scanner.h create mode 100644 src/libsphinxbase/lm/lm_trie.c create mode 100644 src/libsphinxbase/lm/lm_trie.h create mode 100644 src/libsphinxbase/lm/lm_trie_quant.c create mode 100644 src/libsphinxbase/lm/lm_trie_quant.h create mode 100644 src/libsphinxbase/lm/ngram_model.c create mode 100644 src/libsphinxbase/lm/ngram_model_internal.h create mode 100644 src/libsphinxbase/lm/ngram_model_set.c create mode 100644 src/libsphinxbase/lm/ngram_model_set.h create mode 100644 src/libsphinxbase/lm/ngram_model_trie.c create mode 100644 src/libsphinxbase/lm/ngram_model_trie.h create mode 100644 src/libsphinxbase/lm/ngrams_raw.c create mode 100644 src/libsphinxbase/lm/ngrams_raw.h create mode 100644 src/libsphinxbase/util/Makefile.am create mode 100644 src/libsphinxbase/util/README.python create mode 100644 src/libsphinxbase/util/bio.c create mode 100644 src/libsphinxbase/util/bitarr.c create mode 100644 src/libsphinxbase/util/bitvec.c create mode 100644 src/libsphinxbase/util/blas_lite.c create mode 100644 src/libsphinxbase/util/case.c create mode 100644 src/libsphinxbase/util/ckd_alloc.c create mode 100644 src/libsphinxbase/util/clapack_scrub.py create mode 100644 src/libsphinxbase/util/cmd_ln.c create mode 100644 src/libsphinxbase/util/dtoa.c create mode 100644 src/libsphinxbase/util/err.c create mode 100644 src/libsphinxbase/util/errno.c create mode 100644 src/libsphinxbase/util/f2c_lite.c create mode 100644 src/libsphinxbase/util/filename.c create mode 100644 src/libsphinxbase/util/fortran.py create mode 100644 src/libsphinxbase/util/genrand.c create mode 100644 src/libsphinxbase/util/glist.c create mode 100644 src/libsphinxbase/util/hash_table.c create mode 100644 src/libsphinxbase/util/heap.c create mode 100644 src/libsphinxbase/util/listelem_alloc.c create mode 100644 src/libsphinxbase/util/logmath.c create mode 100755 src/libsphinxbase/util/make_lite.py create mode 100644 src/libsphinxbase/util/matrix.c create mode 100644 src/libsphinxbase/util/mmio.c create mode 100644 src/libsphinxbase/util/pio.c create mode 100644 src/libsphinxbase/util/priority_queue.c create mode 100644 src/libsphinxbase/util/profile.c create mode 100644 src/libsphinxbase/util/sbthread.c create mode 100644 src/libsphinxbase/util/slamch.c create mode 100644 src/libsphinxbase/util/slapack_lite.c create mode 100644 src/libsphinxbase/util/strfuncs.c create mode 100644 src/libsphinxbase/util/wrapped_routines create mode 100644 src/sphinx_adtools/Makefile.am create mode 100644 src/sphinx_adtools/cont_seg.c create mode 100644 src/sphinx_adtools/sphinx_pitch.c create mode 100644 src/sphinx_cepview/Makefile.am create mode 100644 src/sphinx_cepview/main_cepview.c create mode 100644 src/sphinx_fe/Makefile.am create mode 100644 src/sphinx_fe/cmd_ln_defn.h create mode 100644 src/sphinx_fe/sphinx_fe.c create mode 100644 src/sphinx_fe/sphinx_wave2feat.h create mode 100644 src/sphinx_jsgf2fsg/Makefile.am create mode 100755 src/sphinx_jsgf2fsg/fsg2dot.pl create mode 100644 src/sphinx_jsgf2fsg/main.c create mode 100644 src/sphinx_lmtools/Makefile.am create mode 100644 src/sphinx_lmtools/sphinx_lm_convert.c create mode 100644 src/sphinx_lmtools/sphinx_lm_eval.c create mode 100644 swig/cmd_ln.i create mode 100644 swig/fe.i create mode 100644 swig/feat.i create mode 100644 swig/fsg_model.i create mode 100644 swig/iterators.i create mode 100644 swig/jsgf.i create mode 100644 swig/logmath.i create mode 100644 swig/ngram_model.i create mode 100644 swig/sphinxbase.i create mode 100644 swig/typemaps.i create mode 100644 test/regression/chan3-dither.cepview create mode 100644 test/regression/chan3-logspec.cepview create mode 100644 test/regression/chan3-smoothspec.cepview create mode 100644 test/regression/chan3.2chan.wav create mode 100644 test/regression/chan3.cepview create mode 100644 test/regression/chan3.ctl create mode 100644 test/regression/chan3.f0 create mode 100644 test/regression/chan3.logspec create mode 100644 test/regression/chan3.mfc create mode 100644 test/regression/chan3.raw create mode 100644 test/regression/chan3.sph create mode 100644 test/regression/chan3.wav create mode 100644 test/regression/polite.gram create mode 100755 test/regression/test-cepview.sh create mode 100755 test/regression/test-sphinx_fe-ctl.sh create mode 100755 test/regression/test-sphinx_fe-dct.sh create mode 100755 test/regression/test-sphinx_fe-dither-seed.sh create mode 100755 test/regression/test-sphinx_fe-logspec.sh create mode 100755 test/regression/test-sphinx_fe-logspec2cep.sh create mode 100755 test/regression/test-sphinx_fe-smoothspec.sh create mode 100755 test/regression/test-sphinx_fe.sh create mode 100755 test/regression/test-sphinx_jsgf2fsg.sh create mode 100755 test/regression/test-sphinx_pitch.sh create mode 100644 test/regression/test.command.fsg create mode 100644 test/regression/test.gram create mode 100644 test/regression/test.kleene.fsg create mode 100644 test/regression/test.nestedRightRecursion.fsg create mode 100644 test/regression/test.nulltest.fsg create mode 100644 test/regression/test.rightRecursion.fsg create mode 100644 test/regression/testfuncs.sh.in create mode 100644 test/unit/test_alloc/Makefile.am create mode 100644 test/unit/test_alloc/test_ckd_alloc.c create mode 100644 test/unit/test_alloc/test_ckd_alloc_abort.c create mode 100755 test/unit/test_alloc/test_ckd_alloc_abort.sh create mode 100644 test/unit/test_alloc/test_ckd_alloc_catch.c create mode 100644 test/unit/test_alloc/test_ckd_alloc_fail.c create mode 100755 test/unit/test_alloc/test_ckd_alloc_fail.sh create mode 100644 test/unit/test_alloc/test_listelem_alloc.c create mode 100644 test/unit/test_alloc/test_macros.h create mode 100644 test/unit/test_bitvec/Makefile.am create mode 100644 test/unit/test_bitvec/test_bitvec.c create mode 100644 test/unit/test_bitvec/test_macros.h create mode 100644 test/unit/test_case/Makefile.am create mode 100755 test/unit/test_case/_lcase1.test create mode 100755 test/unit/test_case/_lcase2.test create mode 100755 test/unit/test_case/_lcase3.test create mode 100755 test/unit/test_case/_strcmp1.test create mode 100755 test/unit/test_case/_strcmp2.test create mode 100755 test/unit/test_case/_strcmp3.test create mode 100755 test/unit/test_case/_ucase1.test create mode 100755 test/unit/test_case/_ucase2.test create mode 100755 test/unit/test_case/_ucase3.test create mode 100644 test/unit/test_case/chgCase.c create mode 100644 test/unit/test_cmdln/Makefile.am create mode 100644 test/unit/test_cmdln/_test_parse_badargs.res create mode 100755 test/unit/test_cmdln/_test_parse_badargs.test create mode 100644 test/unit/test_cmdln/_test_parse_defaults.res create mode 100755 test/unit/test_cmdln/_test_parse_defaults.test create mode 100644 test/unit/test_cmdln/_test_parse_defaults_r.res create mode 100755 test/unit/test_cmdln/_test_parse_defaults_r.test create mode 100644 test/unit/test_cmdln/_test_parse_goodargs.res create mode 100755 test/unit/test_cmdln/_test_parse_goodargs.test create mode 100644 test/unit/test_cmdln/_test_parse_multiple.res create mode 100755 test/unit/test_cmdln/_test_parse_multiple.test create mode 100644 test/unit/test_cmdln/cmdln_parse.c create mode 100644 test/unit/test_cmdln/cmdln_parse_multiple.c create mode 100644 test/unit/test_cmdln/cmdln_parse_r.c create mode 100644 test/unit/test_fe/Makefile.am create mode 100644 test/unit/test_fe/test_fe.c create mode 100644 test/unit/test_fe/test_macros.h create mode 100644 test/unit/test_fe/test_pitch.c create mode 100644 test/unit/test_feat/Makefile.am create mode 100644 test/unit/test_feat/_test_feat.res create mode 100755 test/unit/test_feat/_test_feat.test create mode 100644 test/unit/test_feat/test_feat.c create mode 100644 test/unit/test_feat/test_feat_fe.c create mode 100644 test/unit/test_feat/test_feat_live.c create mode 100644 test/unit/test_feat/test_macros.h create mode 100644 test/unit/test_feat/test_subvq.c create mode 100644 test/unit/test_fsg/Makefile.am create mode 100644 test/unit/test_fsg/goforward.fsg create mode 100644 test/unit/test_fsg/polite.gram create mode 100644 test/unit/test_fsg/public.gram create mode 100644 test/unit/test_fsg/test_fsg_jsgf.c create mode 100644 test/unit/test_fsg/test_fsg_read.c create mode 100644 test/unit/test_fsg/test_fsg_write_fsm.c create mode 100644 test/unit/test_fsg/test_macros.h create mode 100644 test/unit/test_hash/Makefile.am create mode 100644 test/unit/test_hash/_hash_delete1.res create mode 100755 test/unit/test_hash/_hash_delete1.test create mode 100644 test/unit/test_hash/_hash_delete2.res create mode 100755 test/unit/test_hash/_hash_delete2.test create mode 100644 test/unit/test_hash/_hash_delete3.res create mode 100755 test/unit/test_hash/_hash_delete3.test create mode 100644 test/unit/test_hash/_hash_delete4.res create mode 100755 test/unit/test_hash/_hash_delete4.test create mode 100644 test/unit/test_hash/_hash_delete5.res create mode 100755 test/unit/test_hash/_hash_delete5.test create mode 100644 test/unit/test_hash/deletehash.c create mode 100644 test/unit/test_hash/display.res create mode 100644 test/unit/test_hash/displayhash.c create mode 100644 test/unit/test_hash/test_hash_iter.c create mode 100644 test/unit/test_hash/test_macros.h create mode 100644 test/unit/test_lineiter/Makefile.am create mode 100644 test/unit/test_lineiter/test.txt create mode 100644 test/unit/test_lineiter/test_lineiter.c create mode 100644 test/unit/test_lineiter/test_macros.h create mode 100644 test/unit/test_logmath/Makefile.am create mode 100644 test/unit/test_logmath/test_log_int16.c create mode 100644 test/unit/test_logmath/test_log_int8.c create mode 100644 test/unit/test_logmath/test_log_shifted.c create mode 100644 test/unit/test_logmath/test_macros.h create mode 100644 test/unit/test_matrix/Makefile.am create mode 100644 test/unit/test_matrix/_test_determinant.res create mode 100755 test/unit/test_matrix/_test_determinant.test create mode 100644 test/unit/test_matrix/_test_invert.res create mode 100755 test/unit/test_matrix/_test_invert.test create mode 100644 test/unit/test_matrix/_test_solve.res create mode 100755 test/unit/test_matrix/_test_solve.test create mode 100644 test/unit/test_matrix/test_determinant.c create mode 100644 test/unit/test_matrix/test_invert.c create mode 100644 test/unit/test_matrix/test_solve.c create mode 100644 test/unit/test_ngram/100.lm.bin create mode 100644 test/unit/test_ngram/100.lm.bz2 create mode 100644 test/unit/test_ngram/100.lm.dmp create mode 100644 test/unit/test_ngram/100.lm.gz create mode 100644 test/unit/test_ngram/100.lmctl create mode 100644 test/unit/test_ngram/100.probdef create mode 100644 test/unit/test_ngram/102.lm.dmp create mode 100644 test/unit/test_ngram/102.lm.gz create mode 100644 test/unit/test_ngram/104.lm.gz create mode 100644 test/unit/test_ngram/105.lm.gz create mode 100644 test/unit/test_ngram/106.lm.gz create mode 100644 test/unit/test_ngram/107.lm.gz create mode 100644 test/unit/test_ngram/Makefile.am create mode 100644 test/unit/test_ngram/test_lm_add.c create mode 100755 test/unit/test_ngram/test_lm_casefold.c create mode 100644 test/unit/test_ngram/test_lm_class.c create mode 100644 test/unit/test_ngram/test_lm_read.c create mode 100644 test/unit/test_ngram/test_lm_score.c create mode 100644 test/unit/test_ngram/test_lm_set.c create mode 100644 test/unit/test_ngram/test_lm_write.c create mode 100644 test/unit/test_ngram/test_macros.h create mode 100644 test/unit/test_ngram/turtle.lm create mode 100644 test/unit/test_ngram/turtle.lm.dmp create mode 100644 test/unit/test_ngram/turtle.ug.lm create mode 100644 test/unit/test_ngram/turtle.ug.lm.dmp create mode 100644 test/unit/test_string/Makefile.am create mode 100755 test/unit/test_string/_fread_line.test create mode 100644 test/unit/test_string/_fread_line.txt create mode 100755 test/unit/test_string/_nextword.test create mode 100755 test/unit/test_string/_str2words.test create mode 100755 test/unit/test_string/_string_join.test create mode 100755 test/unit/test_string/_string_trim.test create mode 100644 test/unit/test_string/strtest.c create mode 100644 test/unit/test_string/test_atof.c create mode 100644 test/unit/test_thread/Makefile.am create mode 100644 test/unit/test_thread/test_event.c create mode 100644 test/unit/test_thread/test_macros.h create mode 100644 test/unit/test_thread/test_msgq.c create mode 100644 test/unit/test_thread/test_thread.c create mode 100644 test/unit/test_util/Makefile.am create mode 100644 test/unit/test_util/test_bit_encode.c create mode 100644 test/unit/test_util/test_bitarr.c create mode 100644 test/unit/test_util/test_build_directory.c create mode 100644 test/unit/test_util/test_filename.c create mode 100644 test/unit/test_util/test_fopen.c create mode 100644 test/unit/test_util/test_heap.c create mode 100644 test/unit/test_util/test_macros.h create mode 100644 test/unit/test_util/test_readfile.c diff --git a/doc/sphinx_cepview.1 b/doc/sphinx_cepview.1 new file mode 100644 index 000000000..5318859e4 --- /dev/null +++ b/doc/sphinx_cepview.1 @@ -0,0 +1,41 @@ +.TH SPHINX_CEPVIEW 1 "2007-08-27" +.SH NAME +sphinx_cepview \- View acoustic feature files +.SH SYNOPSIS +.B sphinx_cepview +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads acoustic feature files in Sphinx format and +displays their contents as text for inspection. +.TP +.B \-b +The beginning frame 0-based. +.TP +.B \-d +Number of displayed coefficients. +.TP +.B \-describe +Whether description will be shown. +.TP +.B \-e +The ending frame. +.TP +.B \-f +feature file. +.TP +.B \-header +Whether header is shown. +.TP +.B \-i +Number of coefficients in the feature vector. +.TP +.B \-logfn +file (default stdout/stderr) +.SH AUTHOR +Written by numerous people at CMU from 1994 onwards. This manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1994-2007 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_cepview.1.in b/doc/sphinx_cepview.1.in new file mode 100644 index 000000000..8169c18be --- /dev/null +++ b/doc/sphinx_cepview.1.in @@ -0,0 +1,18 @@ +.TH SPHINX_CEPVIEW 1 "2007-08-27" +.SH NAME +sphinx_cepview \- View acoustic feature files +.SH SYNOPSIS +.B sphinx_cepview +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads acoustic feature files in Sphinx format and +displays their contents as text for inspection. +.\" ### ARGUMENTS ### +.SH AUTHOR +Written by numerous people at CMU from 1994 onwards. This manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1994-2007 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_cont_seg.1 b/doc/sphinx_cont_seg.1 new file mode 100644 index 000000000..2b889c47e --- /dev/null +++ b/doc/sphinx_cont_seg.1 @@ -0,0 +1,117 @@ +.TH SPHINX_CONT_SEG 1 "2008-05-12" +.SH NAME +sphinx_cont_seg \- Segment a waveform file into non-silence regions +.SH SYNOPSIS +.B sphinx_cont_seg +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads an input file and segments it into individual +non-silence regions. It can process either file or read data from +microphone. Use following arguments: +.TP +.B \-adcdev +of audio device to use for input. +.TP +.B \-alpha +Preemphasis parameter +.TP +.B \-argfile +file giving extra arguments. +.TP +.B \-dither +Add 1/2-bit noise +.TP +.B \-doublebw +Use double bandwidth filters (same center freq) +.TP +.B \-frate +Frame rate +.TP +.B \-infile +of audio file to use for input. +.TP +.B \-input_endian +Endianness of input data, big or little, ignored if NIST or MS Wav +.TP +.B \-lifter +Length of sin-curve for liftering, or 0 for no liftering. +.TP +.B \-logspec +Write out logspectral files instead of cepstra +.TP +.B \-lowerf +Lower edge of filters +.TP +.B \-ncep +Number of cep coefficients +.TP +.B \-nfft +Size of FFT +.TP +.B \-nfilt +Number of filter banks +.TP +.B \-remove_dc +Remove DC offset from each frame +.TP +.B \-remove_noise +Remove noise with spectral subtraction in mel-energies +.TP +.B \-remove_silence +Enables VAD, removes silence frames from processing +.TP +.B \-round_filters +Round mel filter frequencies to DFT points +.TP +.B \-samprate +Sampling rate +.TP +.B \-seed +Seed for random number generator; if less than zero, pick our own +.TP +.B \-singlefile +a single cleaned file. +.TP +.B \-smoothspec +Write out cepstral-smoothed logspectral files +.TP +.B \-transform +Which type of transform to use to calculate cepstra (legacy, dct, or htk) +.TP +.B \-unit_area +Normalize mel filters to unit area +.TP +.B \-upperf +Upper edge of filters +.TP +.B \-vad_postspeech +Num of silence frames to keep after from speech to silence. +.TP +.B \-vad_prespeech +Num of speech frames to keep before silence to speech. +.TP +.B \-vad_startspeech +Num of speech frames to trigger vad from silence to speech. +.TP +.B \-vad_threshold +Threshold for decision between noise and silence frames. Log-ratio between signal level and noise level. +.TP +.B \-verbose +Show input filenames +.TP +.B \-warp_params +defining the warping function +.TP +.B \-warp_type +Warping function type (or shape) +.TP +.B \-wlen +Hamming window length +.SH AUTHOR +Written by M. K. Ravishankar . This (rather lousy) manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1999-2001 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_cont_seg.1.in b/doc/sphinx_cont_seg.1.in new file mode 100644 index 000000000..f7e8a64c7 --- /dev/null +++ b/doc/sphinx_cont_seg.1.in @@ -0,0 +1,19 @@ +.TH SPHINX_CONT_SEG 1 "2008-05-12" +.SH NAME +sphinx_cont_seg \- Segment a waveform file into non-silence regions +.SH SYNOPSIS +.B sphinx_cont_seg +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads an input file and segments it into individual +non-silence regions. It can process either file or read data from +microphone. Use following arguments: +.\" ### ARGUMENTS ### +.SH AUTHOR +Written by M. K. Ravishankar . This (rather lousy) manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1999-2001 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_fe.1 b/doc/sphinx_fe.1 new file mode 100644 index 000000000..80d0c28d1 --- /dev/null +++ b/doc/sphinx_fe.1 @@ -0,0 +1,193 @@ +.TH SPHINX_FE 1 "2007-08-27" +.SH NAME +sphinx_fe \- Convert audio files to acoustic feature files +.SH SYNOPSIS +.B sphinx_fe +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program converts audio files (in either Microsoft WAV, NIST +Sphere, or raw format) to acoustic feature files for input to +batch-mode speech recognition. The resulting files are also useful +for various other things. A list of options follows: +.TP +.B \-alpha +Preemphasis parameter +.TP +.B \-argfile +file (e.g. feat.params from an acoustic model) to read parameters from. This will override anything set in other command line arguments. +.TP +.B \-blocksize +Number of samples to read at a time. +.TP +.B \-build_outdirs +Create missing subdirectories in output directory +.TP +.B \-c +file for batch processing +.TP +.B \-cep2spec +Input is cepstral files, output is log spectral files +.TP +.B \-di +directory, input file names are relative to this, if defined +.TP +.B \-dither +Add 1/2-bit noise +.TP +.B \-do +directory, output files are relative to this +.TP +.B \-doublebw +Use double bandwidth filters (same center freq) +.TP +.B \-ei +extension to be applied to all input files +.TP +.B \-eo +extension to be applied to all output files +.TP +.B \-example +Shows example of how to use the tool +.TP +.B \-frate +Frame rate +.TP +.B \-help +Shows the usage of the tool +.TP +.B \-i +audio input file +.TP +.B \-input_endian +Endianness of input data, big or little, ignored if NIST or MS Wav +.TP +.B \-lifter +Length of sin-curve for liftering, or 0 for no liftering. +.TP +.B \-logspec +Write out logspectral files instead of cepstra +.TP +.B \-lowerf +Lower edge of filters +.TP +.B \-mach_endian +Endianness of machine, big or little +.TP +.B \-mswav +Defines input format as Microsoft Wav (RIFF) +.TP +.B \-ncep +Number of cep coefficients +.TP +.B \-nchans +Number of channels of data (interlaced samples assumed) +.TP +.B \-nfft +Size of FFT +.TP +.B \-nfilt +Number of filter banks +.TP +.B \-nist +Defines input format as NIST sphere +.TP +.B \-npart +Number of parts to run in (supersedes \fB\-nskip\fR and \fB\-runlen\fR if non-zero) +.TP +.B \-nskip +If a control file was specified, the number of utterances to skip at the head of the file +.TP +.B \-o +cepstral output file +.TP +.B \-ofmt +Format of output files - one of sphinx, htk, text. +.TP +.B \-part +Index of the part to run (supersedes \fB\-nskip\fR and \fB\-runlen\fR if non-zero) +.TP +.B \-raw +Defines input format as raw binary data +.TP +.B \-remove_dc +Remove DC offset from each frame +.TP +.B \-remove_noise +Remove noise with spectral subtraction in mel-energies +.TP +.B \-remove_silence +Enables VAD, removes silence frames from processing +.TP +.B \-round_filters +Round mel filter frequencies to DFT points +.TP +.B \-runlen +If a control file was specified, the number of utterances to process, or \fB\-1\fR for all +.TP +.B \-samprate +Sampling rate +.TP +.B \-seed +Seed for random number generator; if less than zero, pick our own +.TP +.B \-smoothspec +Write out cepstral-smoothed logspectral files +.TP +.B \-spec2cep +Input is log spectral files, output is cepstral files +.TP +.B \-sph2pipe +Input is NIST sphere (possibly with Shorten), use sph2pipe to convert +.TP +.B \-transform +Which type of transform to use to calculate cepstra (legacy, dct, or htk) +.TP +.B \-unit_area +Normalize mel filters to unit area +.TP +.B \-upperf +Upper edge of filters +.TP +.B \-vad_postspeech +Num of silence frames to keep after from speech to silence. +.TP +.B \-vad_prespeech +Num of speech frames to keep before silence to speech. +.TP +.B \-vad_startspeech +Num of speech frames to trigger vad from silence to speech. +.TP +.B \-vad_threshold +Threshold for decision between noise and silence frames. Log-ratio between signal level and noise level. +.TP +.B \-verbose +Show input filenames +.TP +.B \-warp_params +defining the warping function +.TP +.B \-warp_type +Warping function type (or shape) +.TP +.B \-whichchan +Channel to process (numbered from 1), or 0 to mix all channels +.TP +.B \-wlen +Hamming window length +.PP +Currently the only kind of features supported are MFCCs (mel-frequency +cepstral coefficients). There are numerous options which control the +properties of the output features. It is \fBVERY\fR important that +you document the specific set of flags used to create any given set of +feature files, since this information is \fBNOT\fR recorded in the +files themselves, and any mismatch between the parameters used to +extract features for recognition and those used to extract features +for training will cause recognition to fail. +.SH AUTHOR +Written by numerous people at CMU from 1994 onwards. This manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1994-2007 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_fe.1.in b/doc/sphinx_fe.1.in new file mode 100644 index 000000000..2470b42a3 --- /dev/null +++ b/doc/sphinx_fe.1.in @@ -0,0 +1,29 @@ +.TH SPHINX_FE 1 "2007-08-27" +.SH NAME +sphinx_fe \- Convert audio files to acoustic feature files +.SH SYNOPSIS +.B sphinx_fe +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program converts audio files (in either Microsoft WAV, NIST +Sphere, or raw format) to acoustic feature files for input to +batch-mode speech recognition. The resulting files are also useful +for various other things. A list of options follows: +.\" ### ARGUMENTS ### +.PP +Currently the only kind of features supported are MFCCs (mel-frequency +cepstral coefficients). There are numerous options which control the +properties of the output features. It is \fBVERY\fR important that +you document the specific set of flags used to create any given set of +feature files, since this information is \fBNOT\fR recorded in the +files themselves, and any mismatch between the parameters used to +extract features for recognition and those used to extract features +for training will cause recognition to fail. +.SH AUTHOR +Written by numerous people at CMU from 1994 onwards. This manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1994-2007 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_lm_convert.1 b/doc/sphinx_lm_convert.1 new file mode 100644 index 000000000..29b559b38 --- /dev/null +++ b/doc/sphinx_lm_convert.1 @@ -0,0 +1,45 @@ +.TH SPHINX_LM_CONVERT 1 "2010-03-18" +.SH NAME +sphinx_lm_convert \- Convert and manipulate language model files +.SH SYNOPSIS +.B sphinx_lm_convert +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program converts language model files from one format to +another. It can also be used to change the character encoding +of the text in a language model file and to force word strings +to upper or lower case. +.TP +.B \-case +\'lower\' or \'upper\' - case fold to lower/upper case (NOT UNICODE AWARE) +.TP +.B \-debug +level for debugging messages +.TP +.B \-help +Shows the usage of the tool +.TP +.B \-i +language model file (required) +.TP +.B \-ifmt +language model format (will guess if not specified) +.TP +.B \-logbase +Base in which all log-likelihoods calculated +.TP +.B \-mmap +Use memory-mapped I/O for reading binary LM files +.TP +.B \-o +language model file (required) +.TP +.B \-ofmt +language model file (will guess if not specified) +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2010 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_lm_convert.1.in b/doc/sphinx_lm_convert.1.in new file mode 100644 index 000000000..e5be115a7 --- /dev/null +++ b/doc/sphinx_lm_convert.1.in @@ -0,0 +1,19 @@ +.TH SPHINX_LM_CONVERT 1 "2010-03-18" +.SH NAME +sphinx_lm_convert \- Convert and manipulate language model files +.SH SYNOPSIS +.B sphinx_lm_convert +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program converts language model files from one format to +another. It can also be used to change the character encoding +of the text in a language model file and to force word strings +to upper or lower case. +.\" ### ARGUMENTS ### +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2010 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_lm_eval.1 b/doc/sphinx_lm_eval.1 new file mode 100644 index 000000000..a806e00b5 --- /dev/null +++ b/doc/sphinx_lm_eval.1 @@ -0,0 +1,56 @@ +.TH SPHINX_LM_EVAL 1 "2008-05-12" +.SH NAME +sphinx_lm_eval \- Evaluate perplexity of a transcription +.SH SYNOPSIS +.B sphinx_lm_eval +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program evaluates the perplexity of a text file according to a +given language model. The text file is assumed to be in transcript +format, i.e. one utterance per line, delimited by and . +.TP +.B \-help +Shows the usage of the tool +.TP +.B \-lm +model file +.TP +.B \-lmctlfn +file listing a set of language models +.TP +.B \-lmname +of language model in \fB\-lmctlfn\fR to use for all utterances +.TP +.B \-logbase +Base in which all log-likelihoods calculated +.TP +.B \-lsn +file to evaluate +.TP +.B \-lw +Language model weight +.TP +.B \-mmap +Use memory-mapped I/O for reading binary LM files +.TP +.B \-probdef +definition file for classes in LM +.TP +.B \-text +string to evaluate +.TP +.B \-uw +Unigram probability weight (interpolated with uniform distribution) +.TP +.B \-verbose +Print details of perplexity calculation +.TP +.B \-wip +Word insertion probability +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2007-2008 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_lm_eval.1.in b/doc/sphinx_lm_eval.1.in new file mode 100644 index 000000000..64f10df4c --- /dev/null +++ b/doc/sphinx_lm_eval.1.in @@ -0,0 +1,18 @@ +.TH SPHINX_LM_EVAL 1 "2008-05-12" +.SH NAME +sphinx_lm_eval \- Evaluate perplexity of a transcription +.SH SYNOPSIS +.B sphinx_lm_eval +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program evaluates the perplexity of a text file according to a +given language model. The text file is assumed to be in transcript +format, i.e. one utterance per line, delimited by and . +.\" ### ARGUMENTS ### +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2007-2008 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_lm_sort.1 b/doc/sphinx_lm_sort.1 new file mode 100644 index 000000000..bd5346ebc --- /dev/null +++ b/doc/sphinx_lm_sort.1 @@ -0,0 +1,21 @@ +.TH SPHINX_LM_SORT 1 "2008-06-26" +.SH NAME +sphinx_lm_sort \- Order N-Grams in a language model for Sphinx +.SH SYNOPSIS +.B sphinx_lm_sort +< +.I input_lm +> +.I output_lm +.SH DESCRIPTION +.PP +This program arranges the N-Grams in an ARPA-format language model to +be acceptable to Sphinx. This is necessary if you created the +language model with SRILM or any other tool which is not as strict +about ordering N-Grams in its output. +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2008 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_pitch.1 b/doc/sphinx_pitch.1 new file mode 100644 index 000000000..79b19c25b --- /dev/null +++ b/doc/sphinx_pitch.1 @@ -0,0 +1,72 @@ +.TH SPHINX_PITCH 1 "2007-05-12" +.SH NAME +sphinx_pitch \- Extract pitch from audio files +.SH SYNOPSIS +.B sphinx_pitch +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads audio files and analyzes them for pitch and voicing. +.TP +.B \-c +file for batch processing +.TP +.B \-di +directory, input file names are relative to this, if defined +.TP +.B \-do +directory, output files are relative to this +.TP +.B \-ei +extension to be applied to all input files +.TP +.B \-eo +extension to be applied to all output files +.TP +.B \-flen +Number of seconds in each analysis frame (needs to be greater than twice the longest period you wish to detect - to detect down to 80Hz you need a frame length of 2.0/80 = 0.025). +.TP +.B \-fshift +Frame shift: number of seconds between each analysis frame. +.TP +.B \-i +audio input file +.TP +.B \-input_endian +of audio data (will be determined automatically if not given) +.TP +.B \-mswav +Defines input format as Microsoft Wav (RIFF) +.TP +.B \-nist +Defines input format as NIST sphere +.TP +.B \-nskip +If a control file was specified, the number of utterances to skip at the head of the file +.TP +.B \-o +text output file (standard output will be used if not given) +.TP +.B \-raw +Defines input format as raw binary data +.TP +.B \-runlen +If a control file was specified, the number of utterances to process (see \fB\-nskip\fR too) +.TP +.B \-samprate +Sampling rate of audio data (will be determined automatically if 0) +.TP +.B \-search_range +Fraction of the best local estimate to use as a search range for smoothing. +.TP +.B \-smooth_window +Number of frames on either side of the current frame to use for smoothing. +.TP +.B \-voice_thresh +Threshold of normalized difference under which to search for the fundamental period. +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2007-2008 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doc/sphinx_pitch.1.in b/doc/sphinx_pitch.1.in new file mode 100644 index 000000000..fa44ff0b8 --- /dev/null +++ b/doc/sphinx_pitch.1.in @@ -0,0 +1,16 @@ +.TH SPHINX_PITCH 1 "2007-05-12" +.SH NAME +sphinx_pitch \- Extract pitch from audio files +.SH SYNOPSIS +.B sphinx_pitch +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads audio files and analyzes them for pitch and voicing. +.\" ### ARGUMENTS ### +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2007-2008 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/include/android/config.h b/include/android/config.h new file mode 100644 index 000000000..806b8364b --- /dev/null +++ b/include/android/config.h @@ -0,0 +1,108 @@ +/* include/config.h. Generated from config.h.in by configure. */ +/* include/config.h.in. Generated from configure.in by autoheader. */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Enable thread safety */ +#define ENABLE_THREADS /**/ + +/* Use fixed-point computation */ +/* #undef FIXED_POINT */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if you have the iconv() function. */ +/* #define HAVE_ICONV 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `asound' library (-lasound). */ +/* #define HAVE_LIBASOUND 1 */ + +/* Define to 1 if you have the `blas' library (-lblas). */ +/* #define HAVE_LIBBLAS 1 */ + +/* Define to 1 if you have the `lapack' library (-llapack). */ +/* #define HAVE_LIBLAPACK 1 */ + +/* Define to 1 if you have the `m' library (-lm). */ +#define HAVE_LIBM 1 + +/* Define to 1 if you have the `pthread' library (-lpthread). */ +#define HAVE_LIBPTHREAD 1 + +/* Define to 1 if the system has the type `long long'. */ +#define HAVE_LONG_LONG 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `perror' function. */ +#define HAVE_PERROR 1 + +/* Define to 1 if you have the `popen' function. */ +#define HAVE_POPEN 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define as const if the declaration of iconv() needs const. */ +#define ICONV_CONST + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE void + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Enable matrix algebra with LAPACK */ +/* #define WITH_LAPACK */ + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif diff --git a/include/android/sphinx_config.h b/include/android/sphinx_config.h new file mode 100644 index 000000000..205289a09 --- /dev/null +++ b/include/android/sphinx_config.h @@ -0,0 +1,17 @@ +/* include/sphinx_config.h. Generated from sphinx_config.h.in by configure. */ +/* sphinx_config.h: Externally visible configuration parameters */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Use fixed-point computation */ +/* #undef FIXED_POINT */ + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* Define to 1 if the system has the type `long long'. */ +#define HAVE_LONG_LONG 1 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 diff --git a/include/sphinx_config.h.in b/include/sphinx_config.h.in new file mode 100644 index 000000000..ea729844f --- /dev/null +++ b/include/sphinx_config.h.in @@ -0,0 +1,19 @@ +/* sphinx_config.h: Externally visible configuration parameters */ + +/* Use fixed-point computation */ +#undef FIXED_POINT + +/* Default radix point for fixed-point */ +#undef DEFAULT_RADIX + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* Define to 1 if the system has the type `long long'. */ +#undef HAVE_LONG_LONG + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* Enable debugging output */ +#undef SPHINX_DEBUG diff --git a/include/sphinxbase/Makefile.am b/include/sphinxbase/Makefile.am new file mode 100644 index 000000000..fa42a51ca --- /dev/null +++ b/include/sphinxbase/Makefile.am @@ -0,0 +1,38 @@ +pkginclude_HEADERS = \ + ad.h \ + agc.h \ + bio.h \ + bitarr.h \ + bitvec.h \ + byteorder.h \ + case.h \ + ckd_alloc.h \ + clapack_lite.h \ + cmd_ln.h \ + cmn.h \ + err.h \ + f2c.h \ + feat.h \ + fe.h \ + filename.h \ + fixpoint.h \ + fsg_model.h \ + genrand.h \ + glist.h \ + hash_table.h \ + heap.h \ + jsgf.h \ + listelem_alloc.h \ + logmath.h \ + matrix.h \ + mmio.h \ + ngram_model.h \ + pio.h \ + yin.h \ + prim_type.h \ + priority_queue.h \ + profile.h \ + sbthread.h \ + sphinxbase_export.h \ + strfuncs.h + diff --git a/include/sphinxbase/ad.h b/include/sphinxbase/ad.h new file mode 100644 index 000000000..5b9c25fe7 --- /dev/null +++ b/include/sphinxbase/ad.h @@ -0,0 +1,126 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2014 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** \file ad.h + * \brief generic live audio interface for recording and playback + */ + +#ifndef _AD_H_ +#define _AD_H_ + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define DEFAULT_SAMPLES_PER_SEC 16000 + +/* Return codes */ +#define AD_OK 0 +#define AD_EOF -1 +#define AD_ERR_GEN -1 +#define AD_ERR_NOT_OPEN -2 +#define AD_ERR_WAVE -3 + +typedef struct ad_rec_s ad_rec_t; + +/** + * Open a specific audio device for recording. + * + * The device is opened in non-blocking mode and placed in idle state. + * + * @return pointer to read-only ad_rec_t structure if successful, NULL + * otherwise. The return value to be used as the first argument to + * other recording functions. + */ +SPHINXBASE_EXPORT +ad_rec_t *ad_open_dev ( + const char *dev, /**< Device name (platform-specific) */ + int32 samples_per_sec /**< Samples per second */ + ); + +/** + * Open the default audio device with a given sampling rate. + */ +SPHINXBASE_EXPORT +ad_rec_t *ad_open_sps ( + int32 samples_per_sec /**< Samples per second */ + ); + + +/** + * Open the default audio device. + */ +SPHINXBASE_EXPORT +ad_rec_t *ad_open ( void ); + + +/* Start audio recording. Return value: 0 if successful, <0 otherwise */ +SPHINXBASE_EXPORT +int32 ad_start_rec (ad_rec_t *); + + +/* Stop audio recording. Return value: 0 if successful, <0 otherwise */ +SPHINXBASE_EXPORT +int32 ad_stop_rec (ad_rec_t *); + + +/* Close the recording device. Return value: 0 if successful, <0 otherwise */ +SPHINXBASE_EXPORT +int32 ad_close (ad_rec_t *); + +/* + * Read next block of audio samples while recording; read upto max samples into buf. + * Return value: # samples actually read (could be 0 since non-blocking); -1 if not + * recording and no more samples remaining to be read from most recent recording. + */ +SPHINXBASE_EXPORT +int32 ad_read (ad_rec_t *, int16 *buf, int32 max); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/agc.h b/include/sphinxbase/agc.h new file mode 100644 index 000000000..67d74f693 --- /dev/null +++ b/include/sphinxbase/agc.h @@ -0,0 +1,202 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * agc.h -- Various forms of automatic gain control (AGC) + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.1 2006/04/05 20:27:30 dhdfu + * A Great Reorganzation of header files and executables + * + * Revision 1.8 2005/06/21 19:25:41 arthchan2003 + * 1, Fixed doxygen documentation. 2, Added $ keyword. + * + * Revision 1.4 2005/06/13 04:02:56 archan + * Fixed most doxygen-style documentation under libs3decoder. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 28-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Copied from previous version. + */ + + +#ifndef _S3_AGC_H_ +#define _S3_AGC_H_ + +/* Win32/WinCE DLL gunk */ +#include + +#include +#include + +/** \file agc.h + * \brief routine that implements automatic gain control + * + * \warning This function may not be fully compatible with + * SphinxTrain's family of AGC. + * + * This implements AGC. + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Types of acoustic gain control to apply to the features. + */ +typedef enum agc_type_e { + AGC_NONE = 0, + AGC_MAX, + AGC_EMAX, + AGC_NOISE +} agc_type_t; + +/** Convert string representation (from command-line) to agc_type_t */ +SPHINXBASE_EXPORT +agc_type_t agc_type_from_str(const char *str); + +/** String representations of agc_type_t values. */ +SPHINXBASE_EXPORT +extern const char *agc_type_str[]; + +/** + * Structure holding data for doing AGC. + **/ +typedef struct agc_s { + mfcc_t max; /**< Estimated max for current utterance (for AGC_EMAX) */ + mfcc_t obs_max; /**< Observed max in current utterance */ + int32 obs_frame; /**< Whether any data was observed after prev update */ + int32 obs_utt; /**< Whether any utterances have been observed */ + mfcc_t obs_max_sum; + mfcc_t noise_thresh; /**< Noise threshold (for AGC_NOISE only) */ +} agc_t; + +/** + * Initialize AGC structure with default values. + */ +SPHINXBASE_EXPORT +agc_t *agc_init(void); + +/** + * Free AGC structure. + */ +SPHINXBASE_EXPORT +void agc_free(agc_t *agc); + +/** + * Apply AGC to the given mfc vectors (normalize all C0 mfc coefficients in the given + * input such that the max C0 value is 0, by subtracting the input max C0 from all). + * This function operates on an entire utterance at a time. Hence, the entire utterance + * must be available beforehand (batchmode). + */ +SPHINXBASE_EXPORT +void agc_max(agc_t *agc, /**< In: AGC structure (not used) */ + mfcc_t **mfc, /**< In/Out: mfc[f] = cepstrum vector in frame f */ + int32 n_frame /**< In: number of frames of cepstrum vectors supplied */ + ); + +/** + * Apply AGC to the given block of MFC vectors. + * Unlike agc_max() this does not require the entire utterance to be + * available. Call agc_emax_update() at the end of each utterance to + * update the AGC parameters. */ +SPHINXBASE_EXPORT +void agc_emax(agc_t *agc, /**< In: AGC structure */ + mfcc_t **mfc, /**< In/Out: mfc[f] = cepstrum vector in frame f */ + int32 n_frame /**< In: number of frames of cepstrum vectors supplied */ + ); + +/** + * Update AGC parameters for next utterance. + **/ +SPHINXBASE_EXPORT +void agc_emax_update(agc_t *agc /**< In: AGC structure */ + ); + +/** + * Get the current AGC maximum estimate. + **/ +SPHINXBASE_EXPORT +float32 agc_emax_get(agc_t *agc); + +/** + * Set the current AGC maximum estimate. + **/ +SPHINXBASE_EXPORT +void agc_emax_set(agc_t *agc, float32 m); + +/** + * Apply AGC using noise threshold to the given block of MFC vectors. + **/ +SPHINXBASE_EXPORT +void agc_noise(agc_t *agc, /**< In: AGC structure */ + mfcc_t **mfc, /**< In/Out: mfc[f] = cepstrum vector in frame f */ + int32 n_frame /**< In: number of frames of cepstrum vectors supplied */ + ); + +/** + * Get the current AGC noise threshold. + **/ +SPHINXBASE_EXPORT +float32 agc_get_threshold(agc_t *agc); + +/** + * Set the current AGC noise threshold. + **/ +SPHINXBASE_EXPORT +void agc_set_threshold(agc_t *agc, float32 threshold); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/bio.h b/include/sphinxbase/bio.h new file mode 100644 index 000000000..343617737 --- /dev/null +++ b/include/sphinxbase/bio.h @@ -0,0 +1,316 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * bio.h -- Sphinx-3 binary file I/O functions. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: bio.h,v $ + * Revision 1.8 2005/06/21 20:40:46 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add the $ keyword. + * + * Revision 1.5 2005/06/13 04:02:57 archan + * Fixed most doxygen-style documentation under libs3decoder. + * + * Revision 1.4 2005/05/10 21:21:52 archan + * Three functionalities added but not tested. Code on 1) addition/deletion of LM in mode 4. 2) reading text-based LM 3) Converting txt-based LM to dmp-based LM. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 28-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +#ifndef _S3_BIO_H_ +#define _S3_BIO_H_ + +#include +#include + +/* Win32/WinCE DLL gunk */ +#include +#include +#include + +/** \file bio.h + * \brief Cross platform binary IO to process files in sphinx3 format. + * + * + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define BYTE_ORDER_MAGIC (0x11223344) + +/** "reversed senses" SWAP, ARCHAN: This is still incorporated in + Sphinx 3 because lm3g2dmp used it. Don't think that I am very + happy with it. */ + +#if (__BIG_ENDIAN__) +#define REVERSE_SENSE_SWAP_INT16(x) x = ( (((x)<<8)&0x0000ff00) | (((x)>>8)&0x00ff) ) +#define REVERSE_SENSE_SWAP_INT32(x) x = ( (((x)<<24)&0xff000000) | (((x)<<8)&0x00ff0000) | \ + (((x)>>8)&0x0000ff00) | (((x)>>24)&0x000000ff) ) +#else +#define REVERSE_SENSE_SWAP_INT16(x) +#define REVERSE_SENSE_SWAP_INT32(x) + +#endif + + + +/** + * Read binary file format header: has the following format + *
+ *     s3
+ *      
+ *      
+ *     ...
+ *     endhdr
+ *     4-byte byte-order word used to find file byte ordering relative to host machine.
+ * 
+ * Lines beginning with # are ignored. + * Memory for name and val allocated by this function; use bio_hdrarg_free to free them. + * @return 0 if successful, -1 otherwise. + */ +SPHINXBASE_EXPORT +int32 bio_readhdr (FILE *fp, /**< In: File to read */ + char ***name, /**< Out: array of argument name strings read */ + char ***val, /**< Out: corresponding value strings read */ + int32 *swap /**< Out: file needs byteswapping iff (*swap) */ + ); +/** + * Write a simple binary file header, containing only the version string. Also write + * the byte order magic word. + * @return 0 if successful, -1 otherwise. + */ +SPHINXBASE_EXPORT +int32 bio_writehdr_version (FILE *fp, /**< Output: File to write */ + char *version /**< Input: A string of version */ + ); + + +/** + * Write a simple binary file header with only byte order magic word. + * @return 0 if successful, -1 otherwise. + */ +SPHINXBASE_EXPORT +int32 bio_writehdr(FILE *fp, ...); + +/** + * Free name and value strings previously allocated and returned by bio_readhdr. + */ +SPHINXBASE_EXPORT +void bio_hdrarg_free (char **name, /**< In: Array previously returned by bio_readhdr */ + char **val /**< In: Array previously returned by bio_readhdr */ + ); + +/** + * Like fread but perform byteswapping and accumulate checksum (the 2 extra arguments). + * + * @return unlike fread, returns -1 if required number of elements (n_el) not read; also, + * no byteswapping or checksum accumulation is performed in that case. + */ +SPHINXBASE_EXPORT +int32 bio_fread (void *buf, /**< In: buffer to write */ + int32 el_sz, /**< In: element size */ + int32 n_el, /**< In: number of elements */ + FILE *fp, /**< In: An input file pointer */ + int32 swap, /**< In: Byteswap iff (swap != 0) */ + uint32 *chksum /**< In/Out: Accumulated checksum */ + ); + +/** + * Like fwrite but perform byteswapping and accumulate checksum (the 2 extra arguments). + * + * @return the number of elemens written (like fwrite). + */ +SPHINXBASE_EXPORT +int32 bio_fwrite(const void *buf, /**< In: buffer to write */ + int32 el_sz, /**< In: element size */ + int32 n_el, /**< In: number of elements */ + FILE *fp, /**< In: An input file pointer */ + int32 swap, /**< In: Byteswap iff (swap != 0) */ + uint32 *chksum /**< In/Out: Accumulated checksum */ + ); + +/** + * Read a 1-d array (fashioned after fread): + * + * - 4-byte array size (returned in n_el) + * - memory allocated for the array and read (returned in buf) + * + * Byteswapping and checksum accumulation performed as necessary. + * Fails fatally if expected data not read. + * @return number of array elements allocated and read; -1 if error. + */ +SPHINXBASE_EXPORT +int32 bio_fread_1d (void **buf, /**< Out: contains array data; allocated by this + function; can be freed using ckd_free */ + size_t el_sz, /**< In: Array element size */ + uint32 *n_el, /**< Out: Number of array elements allocated/read */ + FILE *fp, /**< In: File to read */ + int32 sw, /**< In: Byteswap iff (swap != 0) */ + uint32 *ck /**< In/Out: Accumulated checksum */ + ); + +/** + * Read a 2-d matrix: + * + * - 4-byte # rows, # columns (returned in d1, d2, d3) + * - memory allocated for the array and read (returned in buf) + * + * Byteswapping and checksum accumulation performed as necessary. + * Fails fatally if expected data not read. + * @return number of array elements allocated and read; -1 if error. + */ +SPHINXBASE_EXPORT +int32 bio_fread_2d(void ***arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + FILE *fp, + uint32 swap, + uint32 *chksum); + +/** + * Read a 3-d array (set of matrices) + * + * - 4-byte # matrices, # rows, # columns (returned in d1, d2, d3) + * - memory allocated for the array and read (returned in buf) + * + * Byteswapping and checksum accumulation performed as necessary. + * Fails fatally if expected data not read. + * @return number of array elements allocated and read; -1 if error. + */ +SPHINXBASE_EXPORT +int32 bio_fread_3d(void ****arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + uint32 *d3, + FILE *fp, + uint32 swap, + uint32 *chksum); + +int +bio_fread_intv_3d(void ****arr, + size_t e_sz, + uint32 s, + uint32 e, + uint32 *d1, + uint32 *d2, + uint32 *d3, + FILE *fp, + uint32 swap, + uint32 *chksum); + +/** + * Read and verify checksum at the end of binary file. Fails fatally if there is + * a mismatch. + */ +SPHINXBASE_EXPORT +void bio_verify_chksum (FILE *fp, /**< In: File to read */ + int32 byteswap, /**< In: Byteswap iff (swap != 0) */ + uint32 chksum /**< In: Value to compare with checksum in file */ + ); + + + +/** + * Write a 1-d array. + * Checksum accumulation performed as necessary. + * + * @return number of array elements successfully written or -1 if error. + */ +SPHINXBASE_EXPORT +int bio_fwrite_1d(void *arr, /**< In: Data to write */ + size_t e_sz, /**< In: Size of the elements in bytes */ + uint32 d1, /**< In: First dimension */ + FILE *fp, /**< In: File to write to */ + uint32 *chksum /**< In/Out: Checksum accumulator */ + ); + +/** + * Write a 3-d array (set of matrices). + * Checksum accumulation performed as necessary. + * + * @return number of array elements successfully written or -1 if error. + */ +SPHINXBASE_EXPORT +int bio_fwrite_3d(void ***arr, /**< In: Data to write */ + size_t e_sz, /**< In: Size of the elements in bytes */ + uint32 d1, /**< In: First dimension */ + uint32 d2, /**< In: Second dimension */ + uint32 d3, /**< In: Third dimension */ + FILE *fp, /**< In: File to write to */ + uint32 *chksum /**< In/Out: Checksum accumulator */ + ); + +/** + * Read raw data from the wav file. + * + * @return pointer to the data. + */ +SPHINXBASE_EXPORT +int16* bio_read_wavfile(char const *directory, /**< In: the folder where the file is located */ + char const *filename, /**< In: the name of the file */ + char const *extension, /**< In: file extension */ + int32 header, /**< In: the size of the header to skip usually 44 bytes */ + int32 endian, /**< In: endian of the data */ + size_t *nsamps /**< Out: number of samples read */ + ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/bitarr.h b/include/sphinxbase/bitarr.h new file mode 100644 index 000000000..1fc3a9faf --- /dev/null +++ b/include/sphinxbase/bitarr.h @@ -0,0 +1,142 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _LIBUTIL_BITARR_H_ +#define _LIBUTIL_BITARR_H_ + +#include + +#include +/* Win32/WinCE DLL gunk */ +#include + +/** + * @file bitarr.h + * @brief An implementation bit array - memory efficient storage for digit int and float data. + * + * Implementation of basic operations of read/write digits consuming as little space as possible. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Structure that specifies bits required to efficiently store certain data + */ +typedef struct bitarr_mask_s { + uint8 bits; + uint32 mask; +} bitarr_mask_t; + +/** + * Structure that stores address of certain value in bit array + */ +typedef struct bitarr_address_s { + void *base; + uint32 offset; +} bitarr_address_t; + +/** + * Read uint64 value from bit array. + * Assumes mask == (1 << length) - 1 where length <= 57 + * @param address to read from + * @param length number of bits for value + * @param mask of read value + * @return uint64 value that was read + */ +SPHINXBASE_EXPORT +uint64 bitarr_read_int57(bitarr_address_t address, uint8 length, uint64 mask); + +/** + * Write specified value into bit array. + * Assumes value < (1 << length) and length <= 57. + * Assumes the memory is zero initially. + * @param address to write to + * @param length amount of active bytes in value to write + * @param value integer to write + */ +SPHINXBASE_EXPORT +void bitarr_write_int57(bitarr_address_t address, uint8 length, uint64 value); + +/** + * Read uint32 value from bit array. + * Assumes mask == (1 << length) - 1 where length <= 25 + * @param address to read from + * @param length number of bits for value + * @param mask of read value + * @return uint32 value that was read + */ +SPHINXBASE_EXPORT +uint32 bitarr_read_int25(bitarr_address_t address, uint8 length, uint32 mask); + +/** + * Write specified value into bit array. + * Assumes value < (1 << length) and length <= 25. + * Assumes the memory is zero initially. + * @param address in bit array ti write to + * @param length amount of active bytes in value to write + * @param value integer to write + */ +SPHINXBASE_EXPORT +void bitarr_write_int25(bitarr_address_t address, uint8 length, uint32 value); + +/** + * Fills mask for certain int range according to provided max value + * @param bit_mask mask that is filled + * @param max_value bigest integer that is going to be stored using this mask + */ +SPHINXBASE_EXPORT +void bitarr_mask_from_max(bitarr_mask_t *bit_mask, uint32 max_value); + +/** + * Computes amount of bits required ti store integers upto value provided. + * @param max_value bigest integer that going to be stored using this amount of bits + * @return amount of bits required to store integers from range with maximum provided + */ +SPHINXBASE_EXPORT +uint8 bitarr_required_bits(uint32 max_value); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBUTIL_BITARR_H_ */ diff --git a/include/sphinxbase/bitvec.h b/include/sphinxbase/bitvec.h new file mode 100644 index 000000000..d5644df89 --- /dev/null +++ b/include/sphinxbase/bitvec.h @@ -0,0 +1,155 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _LIBUTIL_BITVEC_H_ +#define _LIBUTIL_BITVEC_H_ + +#include + +/* Win32/WinCE DLL gunk */ +#include + +#include +#include + +/** + * @file bitvec.h + * @brief An implementation of bit vectors. + * + * Implementation of basic operations of bit vectors. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define BITVEC_BITS 32 +typedef uint32 bitvec_t; + +/** + * Number of bitvec_t in a bit vector + */ +#define bitvec_size(n) (((n)+BITVEC_BITS-1)/BITVEC_BITS) + +/** + * Allocate a bit vector, all bits are clear + */ +#define bitvec_alloc(n) ckd_calloc(bitvec_size(n), sizeof(bitvec_t)) + +/** + * Resize a bit vector, clear the remaining bits + */ +SPHINXBASE_EXPORT +bitvec_t *bitvec_realloc(bitvec_t *vec, /* In: Bit vector to search */ + size_t old_len, /* In: Old length */ + size_t new_len); /* In: New lenght of above bit vector */ +/** + * Free a bit vector. + */ +#define bitvec_free(v) ckd_free(v) + +/** + * Set the b-th bit of bit vector v + * @param v is a vector + * @param b is the bit which will be set + */ + +#define bitvec_set(v,b) (v[(b)/BITVEC_BITS] |= (1UL << ((b) & (BITVEC_BITS-1)))) + +/** + * Set all n bits in bit vector v + * @param v is a vector + * @param n is the number of bits + */ + +#define bitvec_set_all(v,n) memset(v, (bitvec_t)-1, \ + (((n)+BITVEC_BITS-1)/BITVEC_BITS) * \ + sizeof(bitvec_t)) +/** + * Clear the b-th bit of bit vector v + * @param v is a vector + * @param b is the bit which will be set + */ + +#define bitvec_clear(v,b) (v[(b)/BITVEC_BITS] &= ~(1UL << ((b) & (BITVEC_BITS-1)))) + +/** + * Clear all n bits in bit vector v + * @param v is a vector + * @param n is the number of bits + */ + +#define bitvec_clear_all(v,n) memset(v, 0, (((n)+BITVEC_BITS-1)/BITVEC_BITS) * \ + sizeof(bitvec_t)) + +/** + * Check whether the b-th bit is set in vector v + * @param v is a vector + * @param b is the bit which will be checked + */ + +#define bitvec_is_set(v,b) (v[(b)/BITVEC_BITS] & (1UL << ((b) & (BITVEC_BITS-1)))) + +/** + * Check whether the b-th bit is cleared in vector v + * @param v is a vector + * @param b is the bit which will be checked + */ + +#define bitvec_is_clear(v,b) (! (bitvec_is_set(v,b))) + + +/** + * Return the number of bits set in the given bitvector. + * + * @param vec is the bit vector + * @param len is the length of bit vector vec + * @return the number of bits being set in vector vec + */ +SPHINXBASE_EXPORT +size_t bitvec_count_set(bitvec_t *vec, /* In: Bit vector to search */ + size_t len); /* In: Lenght of above bit vector */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/byteorder.h b/include/sphinxbase/byteorder.h new file mode 100644 index 000000000..692ce60a0 --- /dev/null +++ b/include/sphinxbase/byteorder.h @@ -0,0 +1,98 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * byteorder.h -- Byte swapping ordering macros. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * $Log: byteorder.h,v $ + * Revision 1.8 2005/09/01 21:09:54 dhdfu + * Really, actually, truly consolidate byteswapping operations into + * byteorder.h. Where unconditional byteswapping is needed, SWAP_INT32() + * and SWAP_INT16() are to be used. The WORDS_BIGENDIAN macro from + * autoconf controls the functioning of the conditional swap macros + * (SWAP_?[LW]) whose names and semantics have been regularized. + * Private, adhoc macros have been removed. + * + */ + +#ifndef __S2_BYTEORDER_H__ +#define __S2_BYTEORDER_H__ 1 + +/* Macro to byteswap an int16 variable. x = ptr to variable */ +#define SWAP_INT16(x) *(x) = ((0x00ff & (*(x))>>8) | (0xff00 & (*(x))<<8)) + +/* Macro to byteswap an int32 variable. x = ptr to variable */ +#define SWAP_INT32(x) *(x) = ((0x000000ff & (*(x))>>24) | \ + (0x0000ff00 & (*(x))>>8) | \ + (0x00ff0000 & (*(x))<<8) | \ + (0xff000000 & (*(x))<<24)) + +/* Macro to byteswap a float32 variable. x = ptr to variable */ +#define SWAP_FLOAT32(x) SWAP_INT32((int32 *) x) + +/* Macro to byteswap a float64 variable. x = ptr to variable */ +#define SWAP_FLOAT64(x) { int *low = (int *) (x), *high = (int *) (x) + 1,\ + temp;\ + SWAP_INT32(low); SWAP_INT32(high);\ + temp = *low; *low = *high; *high = temp;} + +#ifdef WORDS_BIGENDIAN +#define SWAP_BE_64(x) +#define SWAP_BE_32(x) +#define SWAP_BE_16(x) +#define SWAP_LE_64(x) SWAP_FLOAT64(x) +#define SWAP_LE_32(x) SWAP_INT32(x) +#define SWAP_LE_16(x) SWAP_INT16(x) +#else +#define SWAP_LE_64(x) +#define SWAP_LE_32(x) +#define SWAP_LE_16(x) +#define SWAP_BE_64(x) SWAP_FLOAT64(x) +#define SWAP_BE_32(x) SWAP_INT32(x) +#define SWAP_BE_16(x) SWAP_INT16(x) +#endif + +#endif diff --git a/include/sphinxbase/case.h b/include/sphinxbase/case.h new file mode 100644 index 000000000..bd1f62e02 --- /dev/null +++ b/include/sphinxbase/case.h @@ -0,0 +1,135 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * case.h -- Upper/lower case conversion routines + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: case.h,v $ + * Revision 1.7 2005/06/22 02:58:54 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added strcmp_nocase, UPPER_CASE and LOWER_CASE definitions. + * + * 16-Feb-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +/** + * @file case.h + * @brief Locale-independent implementation of case swapping operation. + * + * This function implements ASCII-only case switching and comparison + * related operations, which do not depend on the locale and are + * guaranteed to exist on all versions of Windows. + */ + +#ifndef _LIBUTIL_CASE_H_ +#define _LIBUTIL_CASE_H_ + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + + /** + * Return upper case form for c + */ +#define UPPER_CASE(c) ((((c) >= 'a') && ((c) <= 'z')) ? (c-32) : c) + + /** + * Return lower case form for c + */ +#define LOWER_CASE(c) ((((c) >= 'A') && ((c) <= 'Z')) ? (c+32) : c) + + + /** + * Convert str to all upper case. + * @param str is a string. + */ +SPHINXBASE_EXPORT +void ucase(char *str); + + /** + * Convert str to all lower case + * @param str is a string. + */ +SPHINXBASE_EXPORT +void lcase(char *str); + + /** + * (FIXME! The implementation is incorrect!) + * Case insensitive string compare. Return the usual -1, 0, +1, depending on + * str1 <, =, > str2 (case insensitive, of course). + * @param str1 is the first string. + * @param str2 is the second string. + */ +SPHINXBASE_EXPORT +int32 strcmp_nocase(const char *str1, const char *str2); + +/** + * Like strcmp_nocase() but with a maximum length. + */ +SPHINXBASE_EXPORT +int32 strncmp_nocase(const char *str1, const char *str2, size_t len); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/ckd_alloc.h b/include/sphinxbase/ckd_alloc.h new file mode 100644 index 000000000..221ed6cae --- /dev/null +++ b/include/sphinxbase/ckd_alloc.h @@ -0,0 +1,310 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * ckd_alloc.h -- Memory allocation package. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: ckd_alloc.h,v $ + * Revision 1.10 2005/06/22 02:59:25 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Removed file,line arguments from free functions. + * + * 01-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +/********************************************************************* + * + * $Header: /cvsroot/cmusphinx/sphinx3/src/libutil/ckd_alloc.h,v 1.10 2005/06/22 02:59:25 arthchan2003 Exp $ + * + * Carnegie Mellon ARPA Speech Group + * + * Copyright (c) 1994 Carnegie Mellon University. + * All rights reserved. + * + ********************************************************************* + * + * file: ckd_alloc.h + * + * traceability: + * + * description: + * + * author: + * + *********************************************************************/ + + +#ifndef _LIBUTIL_CKD_ALLOC_H_ +#define _LIBUTIL_CKD_ALLOC_H_ + +#include +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + +/** \file ckd_alloc.h + *\brief Sphinx's memory allocation/deallocation routines. + * + *Implementation of efficient memory allocation deallocation for + *multiple dimensional arrays. + * + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Control behaviour of the program when allocation fails. + * + * Although your program is probably toast when memory allocation + * fails, it is also probably a good idea to be able to catch these + * errors and alert the user in some way. Either that, or you might + * want the program to call abort() so that you can debug the failed + * code. This function allows you to control that behaviour. + * + * @param env Pointer to a jmp_buf initialized with + * setjmp(), or NULL to remove a previously set jump target. + * @param abort If non-zero, the program will call abort() when + * allocation fails rather than exiting or calling longjmp(). + * @return Pointer to a previously set jmp_buf, if any. + */ +jmp_buf *ckd_set_jump(jmp_buf *env, int abort); + +/** + * Fail (with a message) according to behaviour specified by ckd_set_jump(). + */ +void ckd_fail(char *format, ...); + +/* + * The following functions are similar to the malloc family, except + * that they have two additional parameters, caller_file and + * caller_line, for error reporting. All functions print a diagnostic + * message if any error occurs, with any other behaviour determined by + * ckd_set_jump(), above. + */ + +SPHINXBASE_EXPORT +void *__ckd_calloc__(size_t n_elem, size_t elem_size, + const char *caller_file, int caller_line); + +SPHINXBASE_EXPORT +void *__ckd_malloc__(size_t size, + const char *caller_file, int caller_line); + +SPHINXBASE_EXPORT +void *__ckd_realloc__(void *ptr, size_t new_size, + const char *caller_file, int caller_line); + +/** + * Like strdup, except that if an error occurs it prints a diagnostic message and + * exits. If origin in NULL the function also returns NULL. + */ +SPHINXBASE_EXPORT +char *__ckd_salloc__(const char *origstr, + const char *caller_file, int caller_line); + +/** + * Allocate a 2-D array and return ptr to it (ie, ptr to vector of ptrs). + * The data area is allocated in one block so it can also be treated as a 1-D array. + */ +SPHINXBASE_EXPORT +void *__ckd_calloc_2d__(size_t d1, size_t d2, /* In: #elements in the 2 dimensions */ + size_t elemsize, /* In: Size (#bytes) of each element */ + const char *caller_file, int caller_line); /* In */ + +/** + * Allocate a 3-D array and return ptr to it. + * The data area is allocated in one block so it can also be treated as a 1-D array. + */ +SPHINXBASE_EXPORT +void *__ckd_calloc_3d__(size_t d1, size_t d2, size_t d3, /* In: #elems in the dims */ + size_t elemsize, /* In: Size (#bytes) per element */ + const char *caller_file, int caller_line); /* In */ + +/** + * Allocate a 34D array and return ptr to it. + * The data area is allocated in one block so it can also be treated as a 1-D array. + */ +SPHINXBASE_EXPORT +void ****__ckd_calloc_4d__(size_t d1, + size_t d2, + size_t d3, + size_t d4, + size_t elem_size, + char *caller_file, + int caller_line); + +/** + * Overlay a 3-D array over a previously allocated storage area. + **/ +SPHINXBASE_EXPORT +void * __ckd_alloc_3d_ptr(size_t d1, + size_t d2, + size_t d3, + void *store, + size_t elem_size, + char *caller_file, + int caller_line); + +/** + * Overlay a s-D array over a previously allocated storage area. + **/ +SPHINXBASE_EXPORT +void *__ckd_alloc_2d_ptr(size_t d1, + size_t d2, + void *store, + size_t elem_size, + char *caller_file, + int caller_line); + +/** + * Test and free a 1-D array + */ +SPHINXBASE_EXPORT +void ckd_free(void *ptr); + +/** + * Free a 2-D array (ptr) previously allocated by ckd_calloc_2d + */ +SPHINXBASE_EXPORT +void ckd_free_2d(void *ptr); + +/** + * Free a 3-D array (ptr) previously allocated by ckd_calloc_3d + */ +SPHINXBASE_EXPORT +void ckd_free_3d(void *ptr); + +/** + * Free a 4-D array (ptr) previously allocated by ckd_calloc_4d + */ +SPHINXBASE_EXPORT +void ckd_free_4d(void *ptr); + +/** + * Macros to simplify the use of above functions. + * One should use these, rather than target functions directly. + */ + +/** + * Macro for __ckd_calloc__ + */ +#define ckd_calloc(n,sz) __ckd_calloc__((n),(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_malloc__ + */ +#define ckd_malloc(sz) __ckd_malloc__((sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_realloc__ + */ +#define ckd_realloc(ptr,sz) __ckd_realloc__(ptr,(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_salloc__ + */ + +#define ckd_salloc(ptr) __ckd_salloc__(ptr,__FILE__,__LINE__) + +/** + * Macro for __ckd_calloc_2d__ + */ + +#define ckd_calloc_2d(d1,d2,sz) __ckd_calloc_2d__((d1),(d2),(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_calloc_3d__ + */ + +#define ckd_calloc_3d(d1,d2,d3,sz) __ckd_calloc_3d__((d1),(d2),(d3),(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_calloc_4d__ + */ +#define ckd_calloc_4d(d1, d2, d3, d4, s) __ckd_calloc_4d__((d1), (d2), (d3), (d4), (s), __FILE__, __LINE__) + +/** + * Macro for __ckd_alloc_2d_ptr__ + */ + +#define ckd_alloc_2d_ptr(d1, d2, bf, sz) __ckd_alloc_2d_ptr((d1), (d2), (bf), (sz), __FILE__, __LINE__) + +/** + * Free only the pointer arrays allocated with ckd_alloc_2d_ptr(). + */ +#define ckd_free_2d_ptr(bf) ckd_free(bf) + +/** + * Macro for __ckd_alloc_3d_ptr__ + */ + +#define ckd_alloc_3d_ptr(d1, d2, d3, bf, sz) __ckd_alloc_3d_ptr((d1), (d2), (d3), (bf), (sz), __FILE__, __LINE__) + +/** + * Free only the pointer arrays allocated with ckd_alloc_3d_ptr(). + */ +#define ckd_free_3d_ptr(bf) ckd_free_2d(bf) + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/clapack_lite.h b/include/sphinxbase/clapack_lite.h new file mode 100644 index 000000000..0f5a1f4bd --- /dev/null +++ b/include/sphinxbase/clapack_lite.h @@ -0,0 +1,36 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +#ifndef __CLAPACK_LITE_H +#define __CLAPACK_LITE_H + +#include "f2c.h" + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/* Subroutine */ int sgemm_(char *transa, char *transb, integer *m, integer * + n, integer *k, real *alpha, real *a, integer *lda, real *b, integer * + ldb, real *beta, real *c__, integer *ldc); +/* Subroutine */ int sgemv_(char *trans, integer *m, integer *n, real *alpha, + real *a, integer *lda, real *x, integer *incx, real *beta, real *y, + integer *incy); +/* Subroutine */ int ssymm_(char *side, char *uplo, integer *m, integer *n, + real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, + real *c__, integer *ldc); + +/* Subroutine */ int sposv_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info); +/* Subroutine */ int spotrf_(char *uplo, integer *n, real *a, integer *lda, + integer *info); + +#ifdef __cplusplus +} +#endif + + +#endif /* __CLAPACK_LITE_H */ diff --git a/include/sphinxbase/cmd_ln.h b/include/sphinxbase/cmd_ln.h new file mode 100644 index 000000000..67bd03e39 --- /dev/null +++ b/include/sphinxbase/cmd_ln.h @@ -0,0 +1,609 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmd_ln.h -- Command line argument parsing. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * 15-Jul-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added required arguments types. + * + * 07-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created, based on Eric's implementation. Basically, combined several + * functions into one, eliminated validation, and simplified the interface. + */ + + +#ifndef _LIBUTIL_CMD_LN_H_ +#define _LIBUTIL_CMD_LN_H_ + +#include +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + +/** + * @file cmd_ln.h + * @brief Command-line and other configurationparsing and handling. + * + * Configuration parameters, optionally parsed from the command line. + */ + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * @struct arg_t + * Argument definition structure. + */ +typedef struct arg_s { + char const *name; /**< Name of the command line switch */ + int type; /**< Type of the argument in question */ + char const *deflt; /**< Default value (as a character string), or NULL if none */ + char const *doc; /**< Documentation/description string */ +} arg_t; + +/** + * @name Values for arg_t::type + */ +/* @{ */ +/** + * Bit indicating a required argument. + */ +#define ARG_REQUIRED (1<<0) +/** + * Integer argument (optional). + */ +#define ARG_INTEGER (1<<1) +/** + * Floating point argument (optional). + */ +#define ARG_FLOATING (1<<2) +/** + * String argument (optional). + */ +#define ARG_STRING (1<<3) +/** + * Boolean (true/false) argument (optional). + */ +#define ARG_BOOLEAN (1<<4) +/** + * Boolean (true/false) argument (optional). + */ +#define ARG_STRING_LIST (1<<5) + +/** + * Required integer argument. + */ +#define REQARG_INTEGER (ARG_INTEGER | ARG_REQUIRED) +/** + * Required floating point argument. + */ +#define REQARG_FLOATING (ARG_FLOATING | ARG_REQUIRED) +/** + * Required string argument. + */ +#define REQARG_STRING (ARG_STRING | ARG_REQUIRED) +/** + * Required boolean argument. + */ +#define REQARG_BOOLEAN (ARG_BOOLEAN | ARG_REQUIRED) + +/** + * @deprecated Use ARG_INTEGER instead. + */ +#define ARG_INT32 ARG_INTEGER +/** + * @deprecated Use ARG_FLOATING instead. + */ +#define ARG_FLOAT32 ARG_FLOATING +/** + * @deprecated Use ARG_FLOATING instead. + */ +#define ARG_FLOAT64 ARG_FLOATING +/** + * @deprecated Use REQARG_INTEGER instead. + */ +#define REQARG_INT32 (ARG_INT32 | ARG_REQUIRED) +/** + * @deprecated Use REQARG_FLOATING instead. + */ +#define REQARG_FLOAT32 (ARG_FLOAT32 | ARG_REQUIRED) +/** + * @deprecated Use REQARG_FLOATING instead. + */ +#define REQARG_FLOAT64 (ARG_FLOAT64 | ARG_REQUIRED) +/* @} */ + + +/** + * Helper macro to stringify enums and other non-string values for + * default arguments. + **/ +#define ARG_STRINGIFY(s) ARG_STRINGIFY1(s) +#define ARG_STRINGIFY1(s) #s + +/** + * @struct cmd_ln_t + * Opaque structure used to hold the results of command-line parsing. + */ +typedef struct cmd_ln_s cmd_ln_t; + +/** + * Create a cmd_ln_t from NULL-terminated list of arguments. + * + * This function creates a cmd_ln_t from a NULL-terminated list of + * argument strings. For example, to create the equivalent of passing + * "-hmm foodir -dsratio 2 -lm bar.lm" on the command-line: + * + * config = cmd_ln_init(NULL, defs, TRUE, "-hmm", "foodir", "-dsratio", "2", + * "-lm", "bar.lm", NULL); + * + * Note that for simplicity, all arguments are passed + * as strings, regardless of the actual underlying type. + * + * @param inout_cmdln Previous command-line to update, or NULL to create a new one. + * @param defn Array of argument name definitions, or NULL to allow any arguments. + * @param strict Whether to fail on duplicate or unknown arguments. + * @return A cmd_ln_t* containing the results of command line parsing, or NULL on failure. + */ +SPHINXBASE_EXPORT +cmd_ln_t *cmd_ln_init(cmd_ln_t *inout_cmdln, arg_t const *defn, int32 strict, ...); + +/** + * Retain ownership of a command-line argument set. + * + * @return pointer to retained command-line argument set. + */ +SPHINXBASE_EXPORT +cmd_ln_t *cmd_ln_retain(cmd_ln_t *cmdln); + +/** + * Release a command-line argument set and all associated strings. + * + * @return new reference count (0 if freed completely) + */ +SPHINXBASE_EXPORT +int cmd_ln_free_r(cmd_ln_t *cmdln); + +/** + * Parse a list of strings into argumetns. + * + * Parse the given list of arguments (name-value pairs) according to + * the given definitions. Argument values can be retrieved in future + * using cmd_ln_access(). argv[0] is assumed to be the program name + * and skipped. Any unknown argument name causes a fatal error. The + * routine also prints the prevailing argument values (to stderr) + * after parsing. + * + * @note It is currently assumed that the strings in argv are + * allocated statically, or at least that they will be valid as + * long as the cmd_ln_t returned from this function. + * Unpredictable behaviour will result if they are freed or + * otherwise become invalidated. + * + * @return A cmd_ln_t containing the results of command line parsing, + * or NULL on failure. + **/ +SPHINXBASE_EXPORT +cmd_ln_t *cmd_ln_parse_r(cmd_ln_t *inout_cmdln, /**< In/Out: Previous command-line to update, + or NULL to create a new one. */ + arg_t const *defn, /**< In: Array of argument name definitions */ + int32 argc, /**< In: Number of actual arguments */ + char *argv[], /**< In: Actual arguments */ + int32 strict /**< In: Fail on duplicate or unknown + arguments, or no arguments? */ + ); + +/** + * Parse an arguments file by deliminating on " \r\t\n" and putting each tokens + * into an argv[] for cmd_ln_parse(). + * + * @return A cmd_ln_t containing the results of command line parsing, or NULL on failure. + */ +SPHINXBASE_EXPORT +cmd_ln_t *cmd_ln_parse_file_r(cmd_ln_t *inout_cmdln, /**< In/Out: Previous command-line to update, + or NULL to create a new one. */ + arg_t const *defn, /**< In: Array of argument name definitions*/ + char const *filename,/**< In: A file that contains all + the arguments */ + int32 strict /**< In: Fail on duplicate or unknown + arguments, or no arguments? */ + ); + +/** + * Access the generic type union for a command line argument. + */ +SPHINXBASE_EXPORT +anytype_t *cmd_ln_access_r(cmd_ln_t *cmdln, char const *name); + +/** + * Retrieve a string from a command-line object. + * + * The command-line object retains ownership of this string, so you + * should not attempt to free it manually. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the string value associated with name, or NULL if + * name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately NULL and where the corresponding flag + * is unknown. + */ +SPHINXBASE_EXPORT +char const *cmd_ln_str_r(cmd_ln_t *cmdln, char const *name); + +/** + * Retrieve an array of strings from a command-line object. + * + * The command-line object retains ownership of this array, so you + * should not attempt to free it manually. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the array of strings associated with name, or NULL if + * name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately NULL and where the corresponding flag + * is unknown. + */ +SPHINXBASE_EXPORT +char const **cmd_ln_str_list_r(cmd_ln_t *cmdln, char const *name); + +/** + * Retrieve an integer from a command-line object. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the integer value associated with name, or 0 if + * name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately zero and where the corresponding flag + * is unknown. + */ +SPHINXBASE_EXPORT +long cmd_ln_int_r(cmd_ln_t *cmdln, char const *name); + +/** + * Retrieve a floating-point number from a command-line object. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the float value associated with name, or 0.0 if + * name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately zero and where the corresponding flag + * is unknown. + */ +SPHINXBASE_EXPORT +double cmd_ln_float_r(cmd_ln_t *cmdln, char const *name); + +/** + * Retrieve a boolean value from a command-line object. + */ +#define cmd_ln_boolean_r(c,n) (cmd_ln_int_r(c,n) != 0) + +/** + * Set a string in a command-line object. + * + * @param cmdln Command-line object. + * @param name The command-line flag to set. + * @param str String value to set. The command-line object does not + * retain ownership of this pointer. + */ +SPHINXBASE_EXPORT +void cmd_ln_set_str_r(cmd_ln_t *cmdln, char const *name, char const *str); + +/** + * Set a string in a command-line object even if it is not present in argument + * description. Useful for setting extra values computed from configuration, propagated + * to other parts. + * + * @param cmdln Command-line object. + * @param name The command-line flag to set. + * @param str String value to set. The command-line object does not + * retain ownership of this pointer. + */ +SPHINXBASE_EXPORT +void cmd_ln_set_str_extra_r(cmd_ln_t *cmdln, char const *name, char const *str); + +/** + * Set an integer in a command-line object. + * + * @param cmdln Command-line object. + * @param name The command-line flag to set. + * @param iv Integer value to set. + */ +SPHINXBASE_EXPORT +void cmd_ln_set_int_r(cmd_ln_t *cmdln, char const *name, long iv); + +/** + * Set a floating-point number in a command-line object. + * + * @param cmdln Command-line object. + * @param name The command-line flag to set. + * @param fv Integer value to set. + */ +SPHINXBASE_EXPORT +void cmd_ln_set_float_r(cmd_ln_t *cmdln, char const *name, double fv); + +/** + * Set a boolean value in a command-line object. + */ +#define cmd_ln_set_boolean_r(c,n,b) (cmd_ln_set_int_r(c,n,(b)!=0)) + +/* + * Compatibility macros + */ +#define cmd_ln_int32_r(c,n) (int32)cmd_ln_int_r(c,n) +#define cmd_ln_float32_r(c,n) (float32)cmd_ln_float_r(c,n) +#define cmd_ln_float64_r(c,n) (float64)cmd_ln_float_r(c,n) +#define cmd_ln_set_int32_r(c,n,i) cmd_ln_set_int_r(c,n,i) +#define cmd_ln_set_float32_r(c,n,f) cmd_ln_set_float_r(c,n,(double)f) +#define cmd_ln_set_float64_r(c,n,f) cmd_ln_set_float_r(c,n,(double)f) + +/** + * Re-entrant version of cmd_ln_exists(). + * + * @return True if the command line argument exists (i.e. it + * was one of the arguments defined in the call to cmd_ln_parse_r(). + */ +SPHINXBASE_EXPORT +int cmd_ln_exists_r(cmd_ln_t *cmdln, char const *name); + +/** + * Print a help message listing the valid argument names, and the associated + * attributes as given in defn. + * + * @param cmdln command-line object + * @param fp output stream + * @param defn array of argument name definitions. + */ +SPHINXBASE_EXPORT +void cmd_ln_print_help_r (cmd_ln_t *cmdln, FILE *fp, const arg_t *defn); + +/** + * Print current configuration values and defaults. + * + * @param cmdln command-line object + * @param fp output stream + * @param defn array of argument name definitions. + */ +SPHINXBASE_EXPORT +void cmd_ln_print_values_r (cmd_ln_t *cmdln, FILE *fp, const arg_t *defn); + +/** + * Non-reentrant version of cmd_ln_parse(). + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_parse_r(). + * @return 0 if successful, <0 if error. + */ +SPHINXBASE_EXPORT +int32 cmd_ln_parse(const arg_t *defn, /**< In: Array of argument name definitions */ + int32 argc, /**< In: Number of actual arguments */ + char *argv[], /**< In: Actual arguments */ + int32 strict /**< In: Fail on duplicate or unknown + arguments, or no arguments? */ + ); + +/** + * Parse an arguments file by deliminating on " \r\t\n" and putting each tokens + * into an argv[] for cmd_ln_parse(). + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_parse_file_r(). + * + * @return 0 if successful, <0 on error. + */ +SPHINXBASE_EXPORT +int32 cmd_ln_parse_file(const arg_t *defn, /**< In: Array of argument name definitions*/ + char const *filename,/**< In: A file that contains all the arguments */ + int32 strict /**< In: Fail on duplicate or unknown + arguments, or no arguments? */ + ); + +/** + * Old application initialization routine for Sphinx3 code. + * + * @deprecated This is deprecated in favor of the re-entrant API. + */ +SPHINXBASE_EXPORT +void cmd_ln_appl_enter(int argc, /**< In: Number of actual arguments */ + char *argv[], /**< In: Number of actual arguments */ + char const* default_argfn, /**< In: default argument file name*/ + const arg_t *defn /**< Command-line argument definition */ + ); + + +/** + * Finalization routine corresponding to cmd_ln_appl_enter(). + * + * @deprecated This is deprecated in favor of the re-entrant API. + */ + +SPHINXBASE_EXPORT +void cmd_ln_appl_exit(void); + +/** + * Retrieve the global cmd_ln_t object used by non-re-entrant functions. + * + * @deprecated This is deprecated in favor of the re-entrant API. + * @return global cmd_ln_t object. + */ +SPHINXBASE_EXPORT +cmd_ln_t *cmd_ln_get(void); + +/** + * Test the existence of a command-line argument in the global set of + * definitions. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_exists_r(). + * + * @return True if the command line argument exists (i.e. it + * was one of the arguments defined in the call to cmd_ln_parse(). + */ +#define cmd_ln_exists(name) cmd_ln_exists_r(cmd_ln_get(), name) + +/** + * Return a pointer to the previously parsed value for the given argument name. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_access_r(). + */ +#define cmd_ln_access(name) cmd_ln_access_r(cmd_ln_get(), name) + +/** + * Retrieve a string from the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_str_r(). + */ +#define cmd_ln_str(name) cmd_ln_str_r(cmd_ln_get(), name) + +/** + * Retrieve an array of strings in the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_str_list_r(). + */ +#define cmd_ln_str_list(name) cmd_ln_str_list_r(cmd_ln_get(), name) + +/** + * Retrieve a 32-bit integer from the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_int_r(). + */ +#define cmd_ln_int32(name) (int32)cmd_ln_int_r(cmd_ln_get(), name) +/** + * Retrieve a 32-bit float from the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_float_r(). + */ +#define cmd_ln_float32(name) (float32)cmd_ln_float_r(cmd_ln_get(), name) +/** + * Retrieve a 64-bit float from the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_float_r(). + */ +#define cmd_ln_float64(name) (float64)cmd_ln_float_r(cmd_ln_get(), name) +/** + * Retrieve a boolean from the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_boolean_r(). + */ +#define cmd_ln_boolean(name) cmd_ln_boolean_r(cmd_ln_get(), name) + +/** + * Set a string in the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_set_str_r(). + */ +#define cmd_ln_set_str(n,s) cmd_ln_set_str_r(cmd_ln_get(),n,s) +/** + * Set a 32-bit integer value in the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_set_int_r(). + */ +#define cmd_ln_set_int32(n,i) cmd_ln_set_int_r(cmd_ln_get(),n,i) +/** + * Set a 32-bit float in the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_set_float_r(). + */ +#define cmd_ln_set_float32(n,f) cmd_ln_set_float_r(cmd_ln_get(),n,f) +/** + * Set a 64-bit float in the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_set_float_r(). + */ +#define cmd_ln_set_float64(n,f) cmd_ln_set_float_r(cmd_ln_get(),n,f) +/** + * Set a boolean value in the global command line. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_set_boolean_r(). + */ +#define cmd_ln_set_boolean(n,b) cmd_ln_set_boolean_r(cmd_ln_get(),n,b) + +/** + * Print a help message listing the valid argument names, and the associated + * attributes as given in defn. + * + * @deprecated This is deprecated in favor of the re-entrant API + * function cmd_ln_print_help_r(). + */ +#define cmd_ln_print_help(f,d) cmd_ln_print_help_r(cmd_ln_get(),f,d) + +/** + * Free the global command line, if any exists. + * @deprecated Use the re-entrant API instead. + */ +SPHINXBASE_EXPORT +void cmd_ln_free (void); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/cmn.h b/include/sphinxbase/cmn.h new file mode 100644 index 000000000..7c277fb37 --- /dev/null +++ b/include/sphinxbase/cmn.h @@ -0,0 +1,191 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmn.h -- Various forms of cepstral mean normalization + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.1 2006/04/05 20:27:30 dhdfu + * A Great Reorganzation of header files and executables + * + * Revision 1.13 2006/02/23 03:48:27 arthchan2003 + * Resolved conflict in cmn.h + * + * + * Revision 1.12 2006/02/22 23:43:55 arthchan2003 + * Merged from the branch SPHINX3_5_2_RCI_IRII_BRANCH: Put data structure into the cmn_t structure. + * + * Revision 1.11.4.2 2005/10/17 04:45:57 arthchan2003 + * Free stuffs in cmn and feat corectly. + * + * Revision 1.11.4.1 2005/07/05 06:25:08 arthchan2003 + * Fixed dox-doc. + * + * Revision 1.11 2005/06/21 19:28:00 arthchan2003 + * 1, Fixed doxygen documentation. 2, Added $ keyword. + * + * Revision 1.4 2005/06/13 04:02:56 archan + * Fixed most doxygen-style documentation under libs3decoder. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 20.Apr.2001 RAH (rhoughton@mediasite.com, ricky.houghton@cs.cmu.edu) + * Added cmn_free() and moved *mean and *var out global space and named them cmn_mean and cmn_var + * + * 28-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Copied from previous version. + */ + + +#ifndef _S3_CMN_H_ +#define _S3_CMN_H_ + +/* Win32/WinCE DLL gunk */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** \file cmn.h + * \brief Apply Cepstral Mean Normalization (CMN) to the set of input mfc frames. + * + * By subtractingthe mean of the input from each frame. C0 is also included in this process. + * This function operates on an entire utterance at a time. Hence, the entire utterance + * must be available beforehand (batchmode). + */ + +/** + * Types of cepstral mean normalization to apply to the features. + */ +typedef enum cmn_type_e { + CMN_NONE = 0, + CMN_BATCH, + CMN_LIVE +} cmn_type_t; + +/** String representations of cmn_type_t values. */ +SPHINXBASE_EXPORT +extern const char *cmn_type_str[]; + +/** Convert string representation (from command-line) to cmn_type_t */ +SPHINXBASE_EXPORT +cmn_type_t cmn_type_from_str(const char *str); + +/** \struct cmn_t + * \brief wrapper of operation of the cepstral mean normalization. + */ + +typedef struct { + mfcc_t *cmn_mean; /**< Temporary variable: current means */ + mfcc_t *cmn_var; /**< Temporary variables: stored the cmn variance */ + mfcc_t *sum; /**< The sum of the cmn frames */ + int32 nframe; /**< Number of frames */ + int32 veclen; /**< Length of cepstral vector */ +} cmn_t; + +SPHINXBASE_EXPORT +cmn_t* cmn_init(int32 veclen); + +/** + * CMN for the whole sentence +*/ +SPHINXBASE_EXPORT +void cmn (cmn_t *cmn, /**< In/Out: cmn normalization, which contains the cmn_mean and cmn_var) */ + mfcc_t **mfc, /**< In/Out: mfc[f] = mfc vector in frame f */ + int32 varnorm,/**< In: if not FALSE, variance normalize the input vectors + to have unit variance (along each dimension independently); + Irrelevant if no cmn is performed */ + int32 n_frame /**< In: Number of frames of mfc vectors */ + ); + +#define CMN_WIN_HWM 800 /* #frames after which window shifted */ +#define CMN_WIN 500 + +/** + * CMN for one block of data, using live mean + */ +SPHINXBASE_EXPORT +void cmn_live(cmn_t *cmn, /**< In/Out: cmn normalization, which contains + the cmn_mean and cmn_var) */ + mfcc_t **incep, /**< In/Out: mfc[f] = mfc vector in frame f*/ + int32 varnorm, /**< This flag should always be 0 for live */ + int32 nfr /**< Number of incoming frames */ + ); + +/** + * Update live mean based on observed data + */ +SPHINXBASE_EXPORT +void cmn_live_update(cmn_t *cmn); + +/** + * Set the live mean. + */ +SPHINXBASE_EXPORT +void cmn_live_set(cmn_t *cmn, mfcc_t const *vec); + +/** + * Get the live mean. + */ +SPHINXBASE_EXPORT +void cmn_live_get(cmn_t *cmn, mfcc_t *vec); + +/* RAH, free previously allocated memory */ +SPHINXBASE_EXPORT +void cmn_free (cmn_t *cmn); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/err.h b/include/sphinxbase/err.h new file mode 100644 index 000000000..a41893892 --- /dev/null +++ b/include/sphinxbase/err.h @@ -0,0 +1,199 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _LIBUTIL_ERR_H_ +#define _LIBUTIL_ERR_H_ + +#include +#include +#include +#include + +/* Win32/WinCE DLL gunk */ +#include + +/** + * @file err.h + * @brief Implementation of logging routines. + * + * Logging, warning, debug and error message output funtionality is provided in this file. + * Sphinxbase defines several level of logging messages - INFO, WARNING, ERROR, FATAL. By + * default output goes to standard error output. + * + * Logging is implemented through macros. They take same arguments as printf: format string and + * values. By default source file name and source line are prepended to the message. Log output + * could be redirected to any file using err_set_logfp() and err_set_logfile() functions. To disable + * logging in your application, call err_set_logfp(NULL). + * + * It's possible to log multiline info messages, to do that you need to start message with + * E_INFO and output other lines with E_INFOCONT. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define E_SYSCALL(stmt, ...) if (stmt) E_FATAL_SYSTEM(__VA_ARGS__); + +#define FILELINE __FILE__ , __LINE__ + +/** + * Exit with non-zero status after error message + */ +#define E_FATAL(...) \ + do { \ + err_msg(ERR_FATAL, FILELINE, __VA_ARGS__); \ + exit(EXIT_FAILURE); \ + } while (0) + +/** + * Print error text; Call perror(""); exit(errno); + */ +#define E_FATAL_SYSTEM(...) \ + do { \ + err_msg_system(ERR_FATAL, FILELINE, __VA_ARGS__); \ + exit(EXIT_FAILURE); \ + } while (0) + +/** + * Print error text; Call perror(""); + */ +#define E_ERROR_SYSTEM(...) err_msg_system(ERR_ERROR, FILELINE, __VA_ARGS__) + +/** + * Print error message to error log + */ +#define E_ERROR(...) err_msg(ERR_ERROR, FILELINE, __VA_ARGS__) + +/** + * Print warning message to error log + */ +#define E_WARN(...) err_msg(ERR_WARN, FILELINE, __VA_ARGS__) + +/** + * Print logging information to standard error stream + */ +#define E_INFO(...) err_msg(ERR_INFO, FILELINE, __VA_ARGS__) + +/** + * Continue printing the information to standard error stream + */ +#define E_INFOCONT(...) err_msg(ERR_INFOCONT, NULL, 0, __VA_ARGS__) + +/** + * Print logging information without filename. + */ +#define E_INFO_NOFN(...) err_msg(ERR_INFO, NULL, 0, __VA_ARGS__) + +/** + * Debug is disabled by default + */ +#ifdef SPHINX_DEBUG +#define E_DEBUG(...) err_msg(ERR_DEBUG, NULL, 0, __VA_ARGS__) +#else +#define E_DEBUG(...) +#endif + +typedef enum err_e { + ERR_DEBUG, + ERR_INFO, + ERR_INFOCONT, + ERR_WARN, + ERR_ERROR, + ERR_FATAL, + ERR_MAX +} err_lvl_t; + +SPHINXBASE_EXPORT void +err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...); + +SPHINXBASE_EXPORT void +err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...); + +SPHINXBASE_EXPORT void +err_logfp_cb(void * user_data, err_lvl_t level, const char *fmt, ...); + +typedef void (*err_cb_f)(void* user_data, err_lvl_t, const char *, ...); + +/** + * Sets function to output error messages. Use it to redirect the logging + * to your application. By default the handler which dumps messages to + * stderr is set. + * + * @param callback callback to pass messages too + * @param user_data data to pass to callback + */ +SPHINXBASE_EXPORT void +err_set_callback(err_cb_f callback, void *user_data); + +/** + * Direct all logging to a given filehandle if default logfp callback is set. + * + * @param stream Filehandle to send log messages to, or NULL to disable logging. + */ +SPHINXBASE_EXPORT void +err_set_logfp(FILE *stream); + +/** + * Get the current logging filehandle. + * + * @return Current logging filehandle, NULL if logging is disabled. Initially + * it returns stderr + */ +SPHINXBASE_EXPORT FILE * +err_get_logfp(void); + +/** + * Append all log messages to a given file. + * + * Previous logging filehandle is closed (unless it was stdout or stderr). + * + * @param path File path to send log messages to + * @return 0 for success, <0 for failure (e.g. if file does not exist) + */ +SPHINXBASE_EXPORT int +err_set_logfile(const char *path); + +#ifdef __cplusplus +} +#endif + +#endif /* !_ERR_H */ diff --git a/include/sphinxbase/f2c.h b/include/sphinxbase/f2c.h new file mode 100644 index 000000000..a50d1c730 --- /dev/null +++ b/include/sphinxbase/f2c.h @@ -0,0 +1,218 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* f2c.h -- Standard Fortran to C header file */ + +/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." + + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + +#ifndef F2C_INCLUDE +#define F2C_INCLUDE + +typedef int integer; +typedef char *address; +typedef short int shortint; +typedef float real; +typedef double doublereal; +typedef struct { real r, i; } complex; +typedef struct { doublereal r, i; } doublecomplex; +typedef int logical; +typedef short int shortlogical; +typedef char logical1; +typedef char integer1; + +#define TRUE_ (1) +#define FALSE_ (0) + +/* Extern is for use with -E */ +#ifndef Extern +#define Extern extern +#endif + +/* I/O stuff */ + +#ifdef f2c_i2 +/* for -i2 */ +typedef short flag; +typedef short ftnlen; +typedef short ftnint; +#else +typedef int flag; +typedef int ftnlen; +typedef int ftnint; +#endif + +/*external read, write*/ +typedef struct +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; +} cilist; + +/*internal read, write*/ +typedef struct +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; +} icilist; + +/*open*/ +typedef struct +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; +} olist; + +/*close*/ +typedef struct +{ flag cerr; + ftnint cunit; + char *csta; +} cllist; + +/*rewind, backspace, endfile*/ +typedef struct +{ flag aerr; + ftnint aunit; +} alist; + +/* inquire */ +typedef struct +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; +} inlist; + +#define VOID void + +union Multitype { /* for multiple entry points */ + shortint h; + integer i; + real r; + doublereal d; + complex c; + doublecomplex z; + }; + +typedef union Multitype Multitype; + +typedef long Long; /* No longer used; formerly in Namelist */ + +struct Vardesc { /* for Namelist */ + char *name; + char *addr; + ftnlen *dims; + int type; + }; +typedef struct Vardesc Vardesc; + +struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; +typedef struct Namelist Namelist; + +#ifndef abs +#define abs(x) ((x) >= 0 ? (x) : -(x)) +#endif +#define dabs(x) (doublereal)abs(x) +#ifndef min +#define min(a,b) ((a) <= (b) ? (a) : (b)) +#endif +#ifndef max +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#endif +#define dmin(a,b) (doublereal)min(a,b) +#define dmax(a,b) (doublereal)max(a,b) + +/* procedure parameter types for -A and -C++ */ + +#define F2C_proc_par_types 1 +#ifdef __cplusplus +typedef int /* Unknown procedure type */ (*U_fp)(...); +typedef shortint (*J_fp)(...); +typedef integer (*I_fp)(...); +typedef real (*R_fp)(...); +typedef doublereal (*D_fp)(...), (*E_fp)(...); +typedef /* Complex */ VOID (*C_fp)(...); +typedef /* Double Complex */ VOID (*Z_fp)(...); +typedef logical (*L_fp)(...); +typedef shortlogical (*K_fp)(...); +typedef /* Character */ VOID (*H_fp)(...); +typedef /* Subroutine */ int (*S_fp)(...); +#else +typedef int /* Unknown procedure type */ (*U_fp)(void); +typedef shortint (*J_fp)(void); +typedef integer (*I_fp)(void); +typedef real (*R_fp)(void); +typedef doublereal (*D_fp)(void), (*E_fp)(void); +typedef /* Complex */ VOID (*C_fp)(void); +typedef /* Double Complex */ VOID (*Z_fp)(void); +typedef logical (*L_fp)(void); +typedef shortlogical (*K_fp)(void); +typedef /* Character */ VOID (*H_fp)(void); +typedef /* Subroutine */ int (*S_fp)(void); +#endif +/* E_fp is for real functions when -R is not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ + +/* undef any lower-case symbols that your C compiler predefines, e.g.: */ + +#ifndef Skip_f2c_Undefs +#undef cray +#undef gcos +#undef mc68010 +#undef mc68020 +#undef mips +#undef pdp11 +#undef sgi +#undef sparc +#undef sun +#undef sun2 +#undef sun3 +#undef sun4 +#undef u370 +#undef u3b +#undef u3b2 +#undef u3b5 +#undef unix +#undef vax +#endif +#endif diff --git a/include/sphinxbase/fe.h b/include/sphinxbase/fe.h new file mode 100644 index 000000000..41b029152 --- /dev/null +++ b/include/sphinxbase/fe.h @@ -0,0 +1,628 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * fe.h + * + * $Log: fe.h,v $ + * Revision 1.11 2005/02/05 02:15:02 egouvea + * Removed fe_process(), never used + * + * Revision 1.10 2004/12/10 16:48:55 rkm + * Added continuous density acoustic model handling + * + * + */ + +#if defined(_WIN32) && !defined(GNUWINCE) +#define srand48(x) srand(x) +#define lrand48() rand() +#endif + +#ifndef _NEW_FE_H_ +#define _NEW_FE_H_ + +/* Win32/WinCE DLL gunk */ +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#ifdef WORDS_BIGENDIAN +#define NATIVE_ENDIAN "big" +#else +#define NATIVE_ENDIAN "little" +#endif + +/** Default number of samples per second. */ +#define DEFAULT_SAMPLING_RATE 16000 +/** Default number of frames per second. */ +#define DEFAULT_FRAME_RATE 100 +/** Default spacing between frame starts (equal to + * DEFAULT_SAMPLING_RATE/DEFAULT_FRAME_RATE) */ +#define DEFAULT_FRAME_SHIFT 160 +/** Default size of each frame (410 samples @ 16000Hz). */ +#define DEFAULT_WINDOW_LENGTH 0.025625 +/** Default number of FFT points. */ +#define DEFAULT_FFT_SIZE 512 +/** Default number of MFCC coefficients in output. */ +#define DEFAULT_NUM_CEPSTRA 13 +/** Default number of filter bands used to generate MFCCs. */ +#define DEFAULT_NUM_FILTERS 40 + +/** Default prespeech length */ +#define DEFAULT_PRE_SPEECH 20 +/** Default postspeech length */ +#define DEFAULT_POST_SPEECH 50 +/** Default postspeech length */ +#define DEFAULT_START_SPEECH 10 + +/** Default lower edge of mel filter bank. */ +#define DEFAULT_LOWER_FILT_FREQ 133.33334 +/** Default upper edge of mel filter bank. */ +#define DEFAULT_UPPER_FILT_FREQ 6855.4976 +/** Default pre-emphasis filter coefficient. */ +#define DEFAULT_PRE_EMPHASIS_ALPHA 0.97 +/** Default type of frequency warping to use for VTLN. */ +#define DEFAULT_WARP_TYPE "inverse_linear" +/** Default random number seed to use for dithering. */ +#define SEED -1 + +#define waveform_to_cepstral_command_line_macro() \ + { "-logspec", \ + ARG_BOOLEAN, \ + "no", \ + "Write out logspectral files instead of cepstra" }, \ + \ + { "-smoothspec", \ + ARG_BOOLEAN, \ + "no", \ + "Write out cepstral-smoothed logspectral files" }, \ + \ + { "-transform", \ + ARG_STRING, \ + "legacy", \ + "Which type of transform to use to calculate cepstra (legacy, dct, or htk)" }, \ + \ + { "-alpha", \ + ARG_FLOAT32, \ + ARG_STRINGIFY(DEFAULT_PRE_EMPHASIS_ALPHA), \ + "Preemphasis parameter" }, \ + \ + { "-samprate", \ + ARG_FLOAT32, \ + ARG_STRINGIFY(DEFAULT_SAMPLING_RATE), \ + "Sampling rate" }, \ + \ + { "-frate", \ + ARG_INT32, \ + ARG_STRINGIFY(DEFAULT_FRAME_RATE), \ + "Frame rate" }, \ + \ + { "-wlen", \ + ARG_FLOAT32, \ + ARG_STRINGIFY(DEFAULT_WINDOW_LENGTH), \ + "Hamming window length" }, \ + \ + { "-nfft", \ + ARG_INT32, \ + ARG_STRINGIFY(DEFAULT_FFT_SIZE), \ + "Size of FFT" }, \ + \ + { "-nfilt", \ + ARG_INT32, \ + ARG_STRINGIFY(DEFAULT_NUM_FILTERS), \ + "Number of filter banks" }, \ + \ + { "-lowerf", \ + ARG_FLOAT32, \ + ARG_STRINGIFY(DEFAULT_LOWER_FILT_FREQ), \ + "Lower edge of filters" }, \ + \ + { "-upperf", \ + ARG_FLOAT32, \ + ARG_STRINGIFY(DEFAULT_UPPER_FILT_FREQ), \ + "Upper edge of filters" }, \ + \ + { "-unit_area", \ + ARG_BOOLEAN, \ + "yes", \ + "Normalize mel filters to unit area" }, \ + \ + { "-round_filters", \ + ARG_BOOLEAN, \ + "yes", \ + "Round mel filter frequencies to DFT points" }, \ + \ + { "-ncep", \ + ARG_INT32, \ + ARG_STRINGIFY(DEFAULT_NUM_CEPSTRA), \ + "Number of cep coefficients" }, \ + \ + { "-doublebw", \ + ARG_BOOLEAN, \ + "no", \ + "Use double bandwidth filters (same center freq)" }, \ + \ + { "-lifter", \ + ARG_INT32, \ + "0", \ + "Length of sin-curve for liftering, or 0 for no liftering." }, \ + \ + { "-vad_prespeech", \ + ARG_INT32, \ + ARG_STRINGIFY(DEFAULT_PRE_SPEECH), \ + "Num of speech frames to keep before silence to speech." }, \ + \ + { "-vad_startspeech", \ + ARG_INT32, \ + ARG_STRINGIFY(DEFAULT_START_SPEECH), \ + "Num of speech frames to trigger vad from silence to speech." }, \ + \ + { "-vad_postspeech", \ + ARG_INT32, \ + ARG_STRINGIFY(DEFAULT_POST_SPEECH), \ + "Num of silence frames to keep after from speech to silence." }, \ + \ + { "-vad_threshold", \ + ARG_FLOAT32, \ + "3.0", \ + "Threshold for decision between noise and silence frames. Log-ratio between signal level and noise level." }, \ + \ + { "-input_endian", \ + ARG_STRING, \ + NATIVE_ENDIAN, \ + "Endianness of input data, big or little, ignored if NIST or MS Wav" }, \ + \ + { "-warp_type", \ + ARG_STRING, \ + DEFAULT_WARP_TYPE, \ + "Warping function type (or shape)" }, \ + \ + { "-warp_params", \ + ARG_STRING, \ + NULL, \ + "Parameters defining the warping function" }, \ + \ + { "-dither", \ + ARG_BOOLEAN, \ + "no", \ + "Add 1/2-bit noise" }, \ + \ + { "-seed", \ + ARG_INT32, \ + ARG_STRINGIFY(SEED), \ + "Seed for random number generator; if less than zero, pick our own" }, \ + \ + { "-remove_dc", \ + ARG_BOOLEAN, \ + "no", \ + "Remove DC offset from each frame" }, \ + \ + { "-remove_noise", \ + ARG_BOOLEAN, \ + "yes", \ + "Remove noise with spectral subtraction in mel-energies" }, \ + \ + { "-remove_silence", \ + ARG_BOOLEAN, \ + "yes", \ + "Enables VAD, removes silence frames from processing" }, \ + \ + { "-verbose", \ + ARG_BOOLEAN, \ + "no", \ + "Show input filenames" } \ + + +#ifdef FIXED_POINT +/** MFCC computation type. */ +typedef fixed32 mfcc_t; + +/** Convert a floating-point value to mfcc_t. */ +#define FLOAT2MFCC(x) FLOAT2FIX(x) +/** Convert a mfcc_t value to floating-point. */ +#define MFCC2FLOAT(x) FIX2FLOAT(x) +/** Multiply two mfcc_t values. */ +#define MFCCMUL(a,b) FIXMUL(a,b) +#define MFCCLN(x,in,out) FIXLN_ANY(x,in,out) +#else /* !FIXED_POINT */ + +/** MFCC computation type. */ +typedef float32 mfcc_t; +/** Convert a floating-point value to mfcc_t. */ +#define FLOAT2MFCC(x) (x) +/** Convert a mfcc_t value to floating-point. */ +#define MFCC2FLOAT(x) (x) +/** Multiply two mfcc_t values. */ +#define MFCCMUL(a,b) ((a)*(b)) +#define MFCCLN(x,in,out) log(x) +#endif /* !FIXED_POINT */ + +/** + * Structure for the front-end computation. + */ +typedef struct fe_s fe_t; + +/** + * Error codes returned by stuff. + */ +enum fe_error_e { + FE_SUCCESS = 0, + FE_OUTPUT_FILE_SUCCESS = 0, + FE_CONTROL_FILE_ERROR = -1, + FE_START_ERROR = -2, + FE_UNKNOWN_SINGLE_OR_BATCH = -3, + FE_INPUT_FILE_OPEN_ERROR = -4, + FE_INPUT_FILE_READ_ERROR = -5, + FE_MEM_ALLOC_ERROR = -6, + FE_OUTPUT_FILE_WRITE_ERROR = -7, + FE_OUTPUT_FILE_OPEN_ERROR = -8, + FE_ZERO_ENERGY_ERROR = -9, + FE_INVALID_PARAM_ERROR = -10 +}; + +/** + * Initialize a front-end object from global command-line. + * + * This is equivalent to calling fe_init_auto_r(cmd_ln_get()). + * + * @return Newly created front-end object. + */ +SPHINXBASE_EXPORT +fe_t* fe_init_auto(void); + +/** + * Get the default set of arguments for fe_init_auto_r(). + * + * @return Pointer to an argument structure which can be passed to + * cmd_ln_init() in friends to create argument structures for + * fe_init_auto_r(). + */ +SPHINXBASE_EXPORT +arg_t const *fe_get_args(void); + +/** + * Initialize a front-end object from a command-line parse. + * + * @param config Command-line object, as returned by cmd_ln_parse_r() + * or cmd_ln_parse_file(). Ownership of this object is + * claimed by the fe_t, so you must not attempt to free + * it manually. Use cmd_ln_retain() if you wish to + * reuse it. + * @return Newly created front-end object. + */ +SPHINXBASE_EXPORT +fe_t *fe_init_auto_r(cmd_ln_t *config); + +/** + * Retrieve the command-line object used to initialize this front-end. + * + * @return command-line object for this front-end. This pointer is + * retained by the fe_t, so you should not attempt to free it + * manually. + */ +SPHINXBASE_EXPORT +const cmd_ln_t *fe_get_config(fe_t *fe); + +/** + * Start processing of the stream, resets processed frame counter + */ +SPHINXBASE_EXPORT +void fe_start_stream(fe_t *fe); + +/** + * Start processing an utterance. + * @return 0 for success, <0 for error (see enum fe_error_e) + */ +SPHINXBASE_EXPORT +int fe_start_utt(fe_t *fe); + +/** + * Get the dimensionality of the output of this front-end object. + * + * This is guaranteed to be the number of values in one frame of + * output from fe_end_utt() and fe_process_frames(). + * It is usually the number of MFCC + * coefficients, but it might be the number of log-spectrum bins, if + * the -logspec or -smoothspec options to + * fe_init_auto() were true. + * + * @param fe Front-end object + * @return Dimensionality of front-end output. + */ +SPHINXBASE_EXPORT +int fe_get_output_size(fe_t *fe); + +/** + * Get the dimensionality of the input to this front-end object. + * + * This function retrieves the number of input samples consumed by one + * frame of processing. To obtain one frame of output, you must have + * at least *out_frame_size samples. To obtain N + * frames of output, you must have at least (N-1) * + * *out_frame_shift + *out_frame_size input samples. + * + * @param fe Front-end object + * @param out_frame_shift Output: Number of samples between each frame start. + * @param out_frame_size Output: Number of samples in each frame. + */ +SPHINXBASE_EXPORT +void fe_get_input_size(fe_t *fe, int *out_frame_shift, + int *out_frame_size); + +/** + * Get vad state for the last processed frame + * + * @return 1 if speech, 0 if silence + */ +SPHINXBASE_EXPORT +uint8 fe_get_vad_state(fe_t *fe); + +/** + * Finish processing an utterance. + * + * This function also collects any remaining samples and calculates a + * final cepstral vector. If there are overflow samples remaining, it + * will pad with zeros to make a complete frame. + * + * @param fe Front-end object. + * @param out_cepvector Buffer to hold a residual cepstral vector, or NULL + * if you wish to ignore it. Must be large enough + * @param out_nframes Number of frames of residual cepstra created + * (either 0 or 1). + * @return 0 for success, <0 for error (see enum fe_error_e) + */ +SPHINXBASE_EXPORT +int fe_end_utt(fe_t *fe, mfcc_t *out_cepvector, int32 *out_nframes); + +/** + * Retain ownership of a front end object. + * + * @return pointer to the retained front end. + */ +SPHINXBASE_EXPORT +fe_t *fe_retain(fe_t *fe); + +/** + * Free the front end. + * + * Releases resources associated with the front-end object. + * + * @return new reference count (0 if freed completely) + */ +SPHINXBASE_EXPORT +int fe_free(fe_t *fe); + +/* + * Do same as fe_process_frames, but also returns + * voiced audio. Output audio is valid till next + * fe_process_frames call. + * + * DO NOT MIX fe_process_frames calls + * + * @param voiced_spch Output: obtain voiced audio samples here + * + * @param voiced_spch_nsamps Output: shows voiced_spch length + * + * @param out_frameidx Output: index of the utterance start + */ +SPHINXBASE_EXPORT +int fe_process_frames_ext(fe_t *fe, + int16 const **inout_spch, + size_t *inout_nsamps, + mfcc_t **buf_cep, + int32 *inout_nframes, + int16 *voiced_spch, + int32 *voiced_spch_nsamps, + int32 *out_frameidx); + +/** + * Process a block of samples. + * + * This function generates up to *inout_nframes of + * features, or as many as can be generated from + * *inout_nsamps samples. + * + * On exit, the inout_spch, inout_nsamps, + * and inout_nframes parameters are updated to point to + * the remaining sample data, the number of remaining samples, and the + * number of frames processed, respectively. This allows you to call + * this repeatedly to process a large block of audio in small (say, + * 5-frame) chunks: + * + * int16 *bigbuf, *p; + * mfcc_t **cepstra; + * int32 nsamps; + * int32 nframes = 5; + * + * cepstra = (mfcc_t **) + * ckd_calloc_2d(nframes, fe_get_output_size(fe), sizeof(**cepstra)); + * p = bigbuf; + * while (nsamps) { + * nframes = 5; + * fe_process_frames(fe, &p, &nsamps, cepstra, &nframes); + * // Now do something with these frames... + * if (nframes) + * do_some_stuff(cepstra, nframes); + * } + * + * @param inout_spch Input: Pointer to pointer to speech samples + * (signed 16-bit linear PCM). + * Output: Pointer to remaining samples. + * @param inout_nsamps Input: Pointer to maximum number of samples to + * process. + * Output: Number of samples remaining in input buffer. + * @param buf_cep Two-dimensional buffer (allocated with + * ckd_calloc_2d()) which will receive frames of output + * data. If NULL, no actual processing will be done, + * and the maximum number of output frames which would + * be generated is returned in + * *inout_nframes. + * @param inout_nframes Input: Pointer to maximum number of frames to + * generate. + * Output: Number of frames actually generated. + * @param out_frameidx Index of the first frame returned in a stream + * + * @return 0 for success, <0 for failure (see enum fe_error_e) + */ +SPHINXBASE_EXPORT +int fe_process_frames(fe_t *fe, + int16 const **inout_spch, + size_t *inout_nsamps, + mfcc_t **buf_cep, + int32 *inout_nframes, + int32 *out_frameidx); + +/** + * Process a block of samples, returning as many frames as possible. + * + * This function processes all the samples in a block of data and + * returns a newly allocated block of feature vectors. This block + * needs to be freed with fe_free_2d() after use. + * + * It is possible for there to be some left-over data which could not + * fit in a complete frame. This data can be processed with + * fe_end_utt(). + * + * This function is deprecated in favor of fe_process_frames(). + * + * @return 0 for success, <0 for failure (see enum fe_error_e) + */ +SPHINXBASE_EXPORT +int fe_process_utt(fe_t *fe, /**< A front end object */ + int16 const *spch, /**< The speech samples */ + size_t nsamps, /**< number of samples*/ + mfcc_t ***cep_block, /**< Output pointer to cepstra */ + int32 *nframes /**< Number of frames processed */ + ); + +/** + * Free the output pointer returned by fe_process_utt(). + **/ +SPHINXBASE_EXPORT +void fe_free_2d(void *arr); + +/** + * Convert a block of mfcc_t to float32 (can be done in-place) + **/ +SPHINXBASE_EXPORT +int fe_mfcc_to_float(fe_t *fe, + mfcc_t **input, + float32 **output, + int32 nframes); + +/** + * Convert a block of float32 to mfcc_t (can be done in-place) + **/ +SPHINXBASE_EXPORT +int fe_float_to_mfcc(fe_t *fe, + float32 **input, + mfcc_t **output, + int32 nframes); + +/** + * Process one frame of log spectra into MFCC using discrete cosine + * transform. + * + * This uses a variant of the DCT-II where the first frequency bin is + * scaled by 0.5. Unless somebody misunderstood the DCT-III equations + * and thought that's what they were implementing here, this is + * ostensibly done to account for the symmetry properties of the + * DCT-II versus the DFT - the first coefficient of the input is + * assumed to be repeated in the negative frequencies, which is not + * the case for the DFT. (This begs the question, why not just use + * the DCT-I, since it has the appropriate symmetry properties...) + * Moreover, this is bogus since the mel-frequency bins on which we + * are doing the DCT don't extend to the edge of the DFT anyway. + * + * This also means that the matrix used in computing this DCT can not + * be made orthogonal, and thus inverting the transform is difficult. + * Therefore if you want to do cepstral smoothing or have some other + * reason to invert your MFCCs, use fe_logspec_dct2() and its inverse + * fe_logspec_dct3() instead. + * + * Also, it normalizes by 1/nfilt rather than 2/nfilt, for some reason. + **/ +SPHINXBASE_EXPORT +int fe_logspec_to_mfcc(fe_t *fe, /**< A fe structure */ + const mfcc_t *fr_spec, /**< One frame of spectrum */ + mfcc_t *fr_cep /**< One frame of cepstrum */ + ); + +/** + * Convert log spectra to MFCC using DCT-II. + * + * This uses the "unitary" form of the DCT-II, i.e. with a scaling + * factor of sqrt(2/N) and a "beta" factor of sqrt(1/2) applied to the + * cos(0) basis vector (i.e. the one corresponding to the DC + * coefficient in the output). + **/ +SPHINXBASE_EXPORT +int fe_logspec_dct2(fe_t *fe, /**< A fe structure */ + const mfcc_t *fr_spec, /**< One frame of spectrum */ + mfcc_t *fr_cep /**< One frame of cepstrum */ + ); + +/** + * Convert MFCC to log spectra using DCT-III. + * + * This uses the "unitary" form of the DCT-III, i.e. with a scaling + * factor of sqrt(2/N) and a "beta" factor of sqrt(1/2) applied to the + * cos(0) basis vector (i.e. the one corresponding to the DC + * coefficient in the input). + **/ +SPHINXBASE_EXPORT +int fe_mfcc_dct3(fe_t *fe, /**< A fe structure */ + const mfcc_t *fr_cep, /**< One frame of cepstrum */ + mfcc_t *fr_spec /**< One frame of spectrum */ + ); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/include/sphinxbase/feat.h b/include/sphinxbase/feat.h new file mode 100644 index 000000000..0c1462bbe --- /dev/null +++ b/include/sphinxbase/feat.h @@ -0,0 +1,469 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * feat.h -- Cepstral features computation. + */ + +#ifndef _S3_FEAT_H_ +#define _S3_FEAT_H_ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** \file feat.h + * \brief compute the dynamic coefficients from the cepstral vector. + */ +#define LIVEBUFBLOCKSIZE 256 /** Blocks of 256 vectors allocated + for livemode decoder */ +#define S3_MAX_FRAMES 15000 /* RAH, I believe this is still too large, but better than before */ + +#define cepstral_to_feature_command_line_macro() \ +{ "-feat", \ + ARG_STRING, \ + "1s_c_d_dd", \ + "Feature stream type, depends on the acoustic model" }, \ +{ "-ceplen", \ + ARG_INT32, \ + "13", \ + "Number of components in the input feature vector" }, \ +{ "-cmn", \ + ARG_STRING, \ + "live", \ + "Cepstral mean normalization scheme ('live', 'batch', or 'none')" }, \ +{ "-cmninit", \ + ARG_STRING, \ + "40,3,-1", \ + "Initial values (comma-separated) for cepstral mean when 'live' is used" }, \ +{ "-varnorm", \ + ARG_BOOLEAN, \ + "no", \ + "Variance normalize each utterance (only if CMN == current)" }, \ +{ "-agc", \ + ARG_STRING, \ + "none", \ + "Automatic gain control for c0 ('max', 'emax', 'noise', or 'none')" }, \ +{ "-agcthresh", \ + ARG_FLOAT32, \ + "2.0", \ + "Initial threshold for automatic gain control" }, \ +{ "-lda", \ + ARG_STRING, \ + NULL, \ + "File containing transformation matrix to be applied to features (single-stream features only)" }, \ +{ "-ldadim", \ + ARG_INT32, \ + "0", \ + "Dimensionality of output of feature transformation (0 to use entire matrix)" }, \ +{"-svspec", \ + ARG_STRING, \ + NULL, \ + "Subvector specification (e.g., 24,0-11/25,12-23/26-38 or 0-12/13-25/26-38)"} + +/** + * \struct feat_t + * \brief Structure for describing a speech feature type + * Structure for describing a speech feature type (no. of streams and stream widths), + * as well as the computation for converting the input speech (e.g., Sphinx-II format + * MFC cepstra) into this type of feature vectors. + */ +typedef struct feat_s { + int refcount; /**< Reference count. */ + char *name; /**< Printable name for this feature type */ + int32 cepsize; /**< Size of input speech vector (typically, a cepstrum vector) */ + int32 n_stream; /**< Number of feature streams; e.g., 4 in Sphinx-II */ + uint32 *stream_len; /**< Vector length of each feature stream */ + int32 window_size; /**< Number of extra frames around given input frame needed to compute + corresponding output feature (so total = window_size*2 + 1) */ + int32 n_sv; /**< Number of subvectors */ + uint32 *sv_len; /**< Vector length of each subvector */ + int32 **subvecs; /**< Subvector specification (or NULL for none) */ + mfcc_t *sv_buf; /**< Temporary copy buffer for subvector projection */ + int32 sv_dim; /**< Total dimensionality of subvector (length of sv_buf) */ + + cmn_type_t cmn; /**< Type of CMN to be performed on each utterance */ + int32 varnorm; /**< Whether variance normalization is to be performed on each utt; + Irrelevant if no CMN is performed */ + agc_type_t agc; /**< Type of AGC to be performed on each utterance */ + + /** + * Feature computation function. + * @param fcb the feat_t describing this feature type + * @param input pointer into the input cepstra + * @param feat a 2-d array of output features (n_stream x stream_len) + * @return 0 if successful, -ve otherwise. + * + * Function for converting window of input speech vector + * (input[-window_size..window_size]) to output feature vector + * (feat[stream][]). If NULL, no conversion available, the + * speech input must be feature vector itself. + **/ + void (*compute_feat)(struct feat_s *fcb, mfcc_t **input, mfcc_t **feat); + cmn_t *cmn_struct; /**< Structure that stores the temporary variables for cepstral + means normalization*/ + agc_t *agc_struct; /**< Structure that stores the temporary variables for acoustic + gain control*/ + + mfcc_t **cepbuf; /**< Circular buffer of MFCC frames for live feature computation. */ + mfcc_t **tmpcepbuf; /**< Array of pointers into cepbuf to handle border cases. */ + int32 bufpos; /**< Write index in cepbuf. */ + int32 curpos; /**< Read index in cepbuf. */ + + mfcc_t ***lda; /**< Array of linear transformations (for LDA, MLLT, or whatever) */ + uint32 n_lda; /**< Number of linear transformations in lda. */ + uint32 out_dim; /**< Output dimensionality */ +} feat_t; + +/** + * Name of feature type. + */ +#define feat_name(f) ((f)->name) +/** + * Input dimensionality of feature. + */ +#define feat_cepsize(f) ((f)->cepsize) +/** + * Size of dynamic feature window. + */ +#define feat_window_size(f) ((f)->window_size) +/** + * Number of feature streams. + * + * @deprecated Do not use this, use feat_dimension1() instead. + */ +#define feat_n_stream(f) ((f)->n_stream) +/** + * Length of feature stream i. + * + * @deprecated Do not use this, use feat_dimension2() instead. + */ +#define feat_stream_len(f,i) ((f)->stream_len[i]) +/** + * Number of streams or subvectors in feature output. + */ +#define feat_dimension1(f) ((f)->n_sv ? (f)->n_sv : f->n_stream) +/** + * Dimensionality of stream/subvector i in feature output. + */ +#define feat_dimension2(f,i) ((f)->lda ? (f)->out_dim : ((f)->sv_len ? (f)->sv_len[i] : f->stream_len[i])) +/** + * Total dimensionality of feature output. + */ +#define feat_dimension(f) ((f)->out_dim) +/** + * Array with stream/subvector lengths + */ +#define feat_stream_lengths(f) ((f)->lda ? (&(f)->out_dim) : (f)->sv_len ? (f)->sv_len : f->stream_len) + +/** + * Parse subvector specification string. + * + * Format of specification: + * \li '/' separated list of subvectors + * \li each subvector is a ',' separated list of subranges + * \li each subrange is a single \verbatim \endverbatim or + * \verbatim - \endverbatim (inclusive), where + * \verbatim \endverbatim is a feature vector dimension + * specifier. + * + * E.g., "24,0-11/25,12-23/26,27-38" has: + * \li 3 subvectors + * \li the 1st subvector has feature dims: 24, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, and 11. + * \li etc. + * + * @param str subvector specification string. + * @return allocated 2-D array of subvector specs (free with + * subvecs_free()). If there are N subvectors specified, subvec[N] = + * NULL; and each subvec[0]..subvec[N-1] is -1 terminated vector of + * feature dims. + */ +SPHINXBASE_EXPORT +int32 **parse_subvecs(char const *str); + +/** + * Free array of subvector specs. + */ +SPHINXBASE_EXPORT +void subvecs_free(int32 **subvecs); + + +/** + * Allocate an array to hold several frames worth of feature vectors. The returned value + * is the mfcc_t ***data array, organized as follows: + * + * - data[0][0] = frame 0 stream 0 vector, data[0][1] = frame 0 stream 1 vector, ... + * - data[1][0] = frame 1 stream 0 vector, data[0][1] = frame 1 stream 1 vector, ... + * - data[2][0] = frame 2 stream 0 vector, data[0][1] = frame 2 stream 1 vector, ... + * - ... + * + * NOTE: For I/O convenience, the entire data area is allocated as one contiguous block. + * @return pointer to the allocated space if successful, NULL if any error. + */ +SPHINXBASE_EXPORT +mfcc_t ***feat_array_alloc(feat_t *fcb, /**< In: Descriptor from feat_init(), used + to obtain number of streams and stream sizes */ + int32 nfr /**< In: Number of frames for which to allocate */ + ); + +/** + * Realloate the array of features. Requires us to know the old size + */ +SPHINXBASE_EXPORT +mfcc_t ***feat_array_realloc(feat_t *fcb, /**< In: Descriptor from feat_init(), used + to obtain number of streams and stream sizes */ + mfcc_t ***old_feat, /**< Feature array. Freed */ + int32 ofr, /**< In: Previous number of frames */ + int32 nfr /**< In: Number of frames for which to allocate */ + ); + +/** + * Free a buffer allocated with feat_array_alloc() + */ +SPHINXBASE_EXPORT +void feat_array_free(mfcc_t ***feat); + + +/** + * Initialize feature module to use the selected type of feature stream. + * One-time only initialization at the beginning of the program. Input type + * is a string defining the kind of input->feature conversion desired: + * + * - "s2_4x": s2mfc->Sphinx-II 4-feature stream, + * - "1s_c_d_dd": s2mfc->Sphinx 3.x single feature stream, + * - "s3_1x39": s2mfc->Sphinx 3.0 single feature stream, + * - "n1,n2,n3,...": Explicit feature vector layout spec. with comma-separated + * feature stream lengths. In this case, the input data is already in the + * feature format and there is no conversion necessary. + * + * @return (feat_t *) descriptor if successful, NULL if error. Caller + * must not directly modify the contents of the returned value. + */ +SPHINXBASE_EXPORT +feat_t *feat_init(char const *type,/**< In: Type of feature stream */ + cmn_type_t cmn, /**< In: Type of cepstram mean normalization to + be done before feature computation; can be + CMN_NONE (for none) */ + int32 varnorm, /**< In: (boolean) Whether variance + normalization done on each utt; only + applicable if CMN also done */ + agc_type_t agc, /**< In: Type of automatic gain control to be + done before feature computation */ + int32 breport, /**< In: Whether to show a report for feat_t */ + int32 cepsize /**< Number of components in the input vector + (or 0 for the default for this feature type, + which is usually 13) */ + ); + +/** + * Add an LDA transformation to the feature module from a file. + * @return 0 for success or -1 if reading the LDA file failed. + **/ +SPHINXBASE_EXPORT +int32 feat_read_lda(feat_t *feat, /**< In: Descriptor from feat_init() */ + const char *ldafile, /**< In: File to read the LDA matrix from. */ + int32 dim /**< In: Dimensionality of LDA output. */ + ); + +/** + * Transform a block of features using the feature module's LDA transform. + **/ +SPHINXBASE_EXPORT +void feat_lda_transform(feat_t *fcb, /**< In: Descriptor from feat_init() */ + mfcc_t ***inout_feat, /**< Feature block to transform. */ + uint32 nfr /**< In: Number of frames in inout_feat. */ + ); + +/** + * Add a subvector specification to the feature module. + * + * The subvector splitting will be performed after dynamic feature + * computation, CMN, AGC, and any LDA transformation. The number of + * streams in the dynamic feature type must be one, as with LDA. + * + * After adding a subvector specification, the output of feature + * computation will be split into multiple subvectors, and + * feat_array_alloc() will allocate pointers accordingly. The number + * of streams will remain the + * + * @param fcb the feature descriptor. + * @param subvecs subvector specification. This pointer is retained + * by the feat_t and should not be freed manually. + * @return 0 for success or -1 if the subvector specification was + * invalid. + */ +SPHINXBASE_EXPORT +int feat_set_subvecs(feat_t *fcb, int32 **subvecs); + +/** + * Print the given block of feature vectors to the given FILE. + */ +SPHINXBASE_EXPORT +void feat_print(feat_t *fcb, /**< In: Descriptor from feat_init() */ + mfcc_t ***feat, /**< In: Feature data to be printed */ + int32 nfr, /**< In: Number of frames of feature data above */ + FILE *fp /**< In: Output file pointer */ + ); + + +/** + * Read a specified MFC file (or given segment within it), perform + * CMN/AGC as indicated by fcb, and compute feature + * vectors. Feature vectors are computed for the entire segment + * specified, by including additional surrounding or padding frames to + * accommodate the feature windows. + * + * @return Number of frames of feature vectors computed if successful; + * -1 if any error. If feat is NULL, then no actual + * computation will be done, and the number of frames which must be + * allocated will be returned. + * + * A note on how the file path is constructed: If the control file + * already specifies extension or absolute path, then these are not + * applied. The default extension is defined by the application. + */ +SPHINXBASE_EXPORT +int32 feat_s2mfc2feat(feat_t *fcb, /**< In: Descriptor from feat_init() */ + const char *file, /**< In: File to be read */ + const char *dir, /**< In: Directory prefix for file, + if needed; can be NULL */ + const char *cepext,/**< In: Extension of the + cepstrum file.It cannot be + NULL */ + int32 sf, int32 ef, /* Start/End frames + within file to be read. Use + 0,-1 to process entire + file */ + mfcc_t ***feat, /**< Out: Computed feature vectors; + caller must allocate this space */ + int32 maxfr /**< In: Available space (number of frames) in + above feat array; it must be + sufficient to hold the result. + Pass -1 for no limit. */ + ); + + +/** + * Feature computation routine for live mode decoder. + * + * This function computes features for blocks of incoming data. It + * retains an internal buffer for computing deltas, which means that + * the number of output frames will not necessarily equal the number + * of input frames. + * + * It is very important to realize that the number of + * output frames can be greater than the number of + * input frames, specifically when endutt is true. It is + * guaranteed to never exceed *inout_ncep + + * feat_window_size(fcb). You MUST have + * allocated at least that many frames in ofeat, or you + * will experience a buffer overflow. + * + * If beginutt and endutt are both true, CMN_CURRENT and AGC_MAX will + * be done. Otherwise only CMN_PRIOR and AGC_EMAX will be done. + * + * If beginutt is false, endutt is true, and the number of input + * frames exceeds the input size, then end-of-utterance processing + * won't actually be done. This condition can easily be checked, + * because *inout_ncep will equal the return value on + * exit, and will also be smaller than the value of + * *inout_ncep on entry. + * + * @return The number of output frames actually computed. + **/ +SPHINXBASE_EXPORT +int32 feat_s2mfc2feat_live(feat_t *fcb, /**< In: Descriptor from feat_init() */ + mfcc_t **uttcep, /**< In: Incoming cepstral buffer */ + int32 *inout_ncep,/**< In: Size of incoming buffer. + Out: Number of incoming frames consumed. */ + int32 beginutt, /**< In: Begining of utterance flag */ + int32 endutt, /**< In: End of utterance flag */ + mfcc_t ***ofeat /**< In: Output feature buffer. See + VERY IMPORTANT note + about the size of this buffer above. */ + ); + + +/** + * Update the normalization stats, possibly in the end of utterance + * + */ +SPHINXBASE_EXPORT +void feat_update_stats(feat_t *fcb); + + +/** + * Retain ownership of feat_t. + * + * @return pointer to retained feat_t. + */ +SPHINXBASE_EXPORT +feat_t *feat_retain(feat_t *f); + +/** + * Release resource associated with feat_t + * + * @return new reference count (0 if freed) + */ +SPHINXBASE_EXPORT +int feat_free(feat_t *f /**< In: feat_t */ + ); + +/** + * Report the feat_t data structure + */ +SPHINXBASE_EXPORT +void feat_report(feat_t *f /**< In: feat_t */ + ); +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/include/sphinxbase/filename.h b/include/sphinxbase/filename.h new file mode 100644 index 000000000..b69dcde57 --- /dev/null +++ b/include/sphinxbase/filename.h @@ -0,0 +1,112 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * filename.h -- File and path name operations. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: filename.h,v $ + * Revision 1.7 2005/06/22 03:01:07 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 30-Oct-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Started. + */ + + +#ifndef _LIBUTIL_FILENAME_H_ +#define _LIBUTIL_FILENAME_H_ + +/* Win32/WinCE DLL gunk */ +#include +#include + +/**\file filename.h + *\brief File names related operation + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Returns the last part of the path, without modifying anything in memory. + */ +SPHINXBASE_EXPORT +const char *path2basename(const char *path); + +/** + * Strip off filename from the given path and copy the directory name into dir + * Caller must have allocated dir (hint: it's always shorter than path). + */ +SPHINXBASE_EXPORT +void path2dirname(const char *path, char *dir); + + +/** + * Strip off the smallest trailing file-extension suffix and copy + * the rest into the given root argument. Caller must have + * allocated root. + */ +SPHINXBASE_EXPORT +void strip_fileext(const char *file, char *root); + +/** + * Test whether a pathname is absolute for the current OS. + */ +SPHINXBASE_EXPORT +int path_is_absolute(const char *file); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/include/sphinxbase/fixpoint.h b/include/sphinxbase/fixpoint.h new file mode 100644 index 000000000..30b5cb202 --- /dev/null +++ b/include/sphinxbase/fixpoint.h @@ -0,0 +1,145 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== */ + +/* Fixed-point arithmetic macros. + * + * Author: David Huggins-Daines + */ + +#ifndef _FIXPOINT_H_ +#define _FIXPOINT_H_ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#ifndef DEFAULT_RADIX +#define DEFAULT_RADIX 12 +#endif + +/** Fixed-point computation type. */ +typedef int32 fixed32; + +/** Convert floating point to fixed point. */ +#define FLOAT2FIX_ANY(x,radix) \ + (((x)<0.0) ? \ + ((fixed32)((x)*(float32)(1<<(radix)) - 0.5)) \ + : ((fixed32)((x)*(float32)(1<<(radix)) + 0.5))) +#define FLOAT2FIX(x) FLOAT2FIX_ANY(x,DEFAULT_RADIX) +/** Convert fixed point to floating point. */ +#define FIX2FLOAT_ANY(x,radix) ((float32)(x)/(1<<(radix))) +#define FIX2FLOAT(x) FIX2FLOAT_ANY(x,DEFAULT_RADIX) + +/** + * Multiply two fixed point numbers with an arbitrary radix point. + * + * A veritable multiplicity of implementations exist, starting with + * the fastest ones... + */ + +#if defined(__arm__) && !defined(__thumb__) +/* + * This works on most modern ARMs but *only* in ARM mode (for obvious + * reasons), so don't use it in Thumb mode (but why are you building + * signal processing code in Thumb mode?!) + */ +#define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX) +#define FIXMUL_ANY(a,b,r) ({ \ + int cl, ch, _a = a, _b = b; \ + __asm__ ("smull %0, %1, %2, %3\n" \ + "mov %0, %0, lsr %4\n" \ + "orr %0, %0, %1, lsl %5\n" \ + : "=&r" (cl), "=&r" (ch) \ + : "r" (_a), "r" (_b), "i" (r), "i" (32-(r)));\ + cl; }) + +#elif defined(_MSC_VER) || (defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 8) +/* Standard systems*/ +#define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX) +#define FIXMUL_ANY(a,b,radix) ((fixed32)(((int64)(a)*(b))>>(radix))) + +#else +/* Most general case where 'long long' doesn't exist or is slow. */ +#define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX) +#define FIXMUL_ANY(a,b,radix) ({ \ + int32 _ah, _bh; \ + uint32 _al, _bl, _t, c; \ + _ah = ((int32)(a)) >> 16; \ + _bh = ((int32)(b)) >> 16; \ + _al = ((uint32)(a)) & 0xffff; \ + _bl = ((uint32)(b)) & 0xffff; \ + _t = _ah * _bl + _al * _bh; \ + c = (fixed32)(((_al * _bl) >> (radix)) \ + + ((_ah * _bh) << (32 - (radix))) \ + + ((radix) > 16 ? (_t >> (radix - 16)) : (_t << (16 - radix)))); \ + c;}) +#endif + +/* Various fixed-point logarithmic functions that we need. */ +/** Minimum value representable in log format. */ +#define MIN_FIXLOG -2829416 /* log(1e-300) * (1< +#include + +/* SphinxBase headers. */ +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/* + * A single transition in the FSG. + */ +typedef struct fsg_link_s { + int32 from_state; + int32 to_state; + int32 logs2prob; /**< log(transition probability)*lw */ + int32 wid; /**< Word-ID; <0 if epsilon or null transition */ +} fsg_link_t; + +/* Access macros */ +#define fsg_link_from_state(l) ((l)->from_state) +#define fsg_link_to_state(l) ((l)->to_state) +#define fsg_link_wid(l) ((l)->wid) +#define fsg_link_logs2prob(l) ((l)->logs2prob) + +/** + * Adjacency list (opaque) for a state in an FSG. + */ +typedef struct trans_list_s trans_list_t; + +/** + * Word level FSG definition. + * States are simply integers 0..n_state-1. + * A transition emits a word and has a given probability of being taken. + * There can also be null or epsilon transitions, with no associated emitted + * word. + */ +typedef struct fsg_model_s { + int refcount; /**< Reference count. */ + char *name; /**< A unique string identifier for this FSG */ + int32 n_word; /**< Number of unique words in this FSG */ + int32 n_word_alloc; /**< Number of words allocated in vocab */ + char **vocab; /**< Vocabulary for this FSG. */ + bitvec_t *silwords; /**< Indicates which words are silence/fillers. */ + bitvec_t *altwords; /**< Indicates which words are pronunciation alternates. */ + logmath_t *lmath; /**< Pointer to log math computation object. */ + int32 n_state; /**< number of states in FSG */ + int32 start_state; /**< Must be in the range [0..n_state-1] */ + int32 final_state; /**< Must be in the range [0..n_state-1] */ + float32 lw; /**< Language weight that's been applied to transition + logprobs */ + trans_list_t *trans; /**< Transitions out of each state, if any. */ + listelem_alloc_t *link_alloc; /**< Allocator for FSG links. */ +} fsg_model_t; + +/* Access macros */ +#define fsg_model_name(f) ((f)->name) +#define fsg_model_n_state(f) ((f)->n_state) +#define fsg_model_start_state(f) ((f)->start_state) +#define fsg_model_final_state(f) ((f)->final_state) +#define fsg_model_log(f,p) logmath_log((f)->lmath, p) +#define fsg_model_lw(f) ((f)->lw) +#define fsg_model_n_word(f) ((f)->n_word) +#define fsg_model_word_str(f,wid) (wid == -1 ? "(NULL)" : (f)->vocab[wid]) + +/** + * Iterator over arcs. + */ +typedef struct fsg_arciter_s fsg_arciter_t; + +/** + * Have silence transitions been added? + */ +#define fsg_model_has_sil(f) ((f)->silwords != NULL) + +/** + * Have alternate word transitions been added? + */ +#define fsg_model_has_alt(f) ((f)->altwords != NULL) + +#define fsg_model_is_filler(f,wid) \ + (fsg_model_has_sil(f) ? bitvec_is_set((f)->silwords, wid) : FALSE) +#define fsg_model_is_alt(f,wid) \ + (fsg_model_has_alt(f) ? bitvec_is_set((f)->altwords, wid) : FALSE) + +/** + * Create a new FSG. + */ +SPHINXBASE_EXPORT +fsg_model_t *fsg_model_init(char const *name, logmath_t *lmath, + float32 lw, int32 n_state); + +/** + * Read a word FSG from the given file and return a pointer to the structure + * created. Return NULL if any error occurred. + * + * File format: + * + *
+ *   Any number of comment lines; ignored
+ *   FSG_BEGIN []
+ *   N <#states>
+ *   S 
+ *   F 
+ *   T    []
+ *   T ...
+ *   ... (any number of state transitions)
+ *   FSG_END
+ *   Any number of comment lines; ignored
+ * 
+ * + * The FSG spec begins with the line containing the keyword FSG_BEGIN. + * It has an optional fsg name string. If not present, the FSG has the empty + * string as its name. + * + * Following the FSG_BEGIN declaration is the number of states, the start + * state, and the final state, each on a separate line. States are numbered + * in the range [0 .. -1]. + * + * These are followed by all the state transitions, each on a separate line, + * and terminated by the FSG_END line. A state transition has the given + * probability of being taken, and emits the given word. The word emission + * is optional; if word-string omitted, it is an epsilon or null transition. + * + * Comments can also be embedded within the FSG body proper (i.e. between + * FSG_BEGIN and FSG_END): any line with a # character in col 1 is treated + * as a comment line. + * + * Return value: a new fsg_model_t structure if the file is successfully + * read, NULL otherwise. + */ +SPHINXBASE_EXPORT +fsg_model_t *fsg_model_readfile(const char *file, logmath_t *lmath, float32 lw); + +/** + * Like fsg_model_readfile(), but from an already open stream. + */ +SPHINXBASE_EXPORT +fsg_model_t *fsg_model_read(FILE *fp, logmath_t *lmath, float32 lw); + +/** + * Retain ownership of an FSG. + * + * @return Pointer to retained FSG. + */ +SPHINXBASE_EXPORT +fsg_model_t *fsg_model_retain(fsg_model_t *fsg); + +/** + * Free the given word FSG. + * + * @return new reference count (0 if freed completely) + */ +SPHINXBASE_EXPORT +int fsg_model_free(fsg_model_t *fsg); + +/** + * Add a word to the FSG vocabulary. + * + * @return Word ID for this new word. + */ +SPHINXBASE_EXPORT +int fsg_model_word_add(fsg_model_t *fsg, char const *word); + +/** + * Look up a word in the FSG vocabulary. + * + * @return Word ID for this word + */ +SPHINXBASE_EXPORT +int fsg_model_word_id(fsg_model_t *fsg, char const *word); + +/** + * Add the given transition to the FSG transition matrix. + * + * Duplicates (i.e., two transitions between the same states, with the + * same word label) are flagged and only the highest prob retained. + */ +SPHINXBASE_EXPORT +void fsg_model_trans_add(fsg_model_t * fsg, + int32 from, int32 to, int32 logp, int32 wid); + +/** + * Add a null transition between the given states. + * + * There can be at most one null transition between the given states; + * duplicates are flagged and only the best prob retained. Transition + * probs must be <= 1 (i.e., logprob <= 0). + * + * @return 1 if a new transition was added, 0 if the prob of an existing + * transition was upgraded; -1 if nothing was changed. + */ +SPHINXBASE_EXPORT +int32 fsg_model_null_trans_add(fsg_model_t * fsg, int32 from, int32 to, int32 logp); + +/** + * Add a "tag" transition between the given states. + * + * A "tag" transition is a null transition with a non-null word ID, + * which corresponds to a semantic tag or other symbol to be output + * when this transition is taken. + * + * As above, there can be at most one null or tag transition between + * the given states; duplicates are flagged and only the best prob + * retained. Transition probs must be <= 1 (i.e., logprob <= 0). + * + * @return 1 if a new transition was added, 0 if the prob of an existing + * transition was upgraded; -1 if nothing was changed. + */ +SPHINXBASE_EXPORT +int32 fsg_model_tag_trans_add(fsg_model_t * fsg, int32 from, int32 to, + int32 logp, int32 wid); + +/** + * Obtain transitive closure of null transitions in the given FSG. + * + * @param nulls List of null transitions, or NULL to find them automatically. + * @return Updated list of null transitions. + */ +SPHINXBASE_EXPORT +glist_t fsg_model_null_trans_closure(fsg_model_t * fsg, glist_t nulls); + +/** + * Get the list of transitions (if any) from state i to j. + */ +SPHINXBASE_EXPORT +glist_t fsg_model_trans(fsg_model_t *fsg, int32 i, int32 j); + +/** + * Get an iterator over the outgoing transitions from state i. + */ +SPHINXBASE_EXPORT +fsg_arciter_t *fsg_model_arcs(fsg_model_t *fsg, int32 i); + +/** + * Get the current arc from the arc iterator. + */ +SPHINXBASE_EXPORT +fsg_link_t *fsg_arciter_get(fsg_arciter_t *itor); + +/** + * Move the arc iterator forward. + */ +SPHINXBASE_EXPORT +fsg_arciter_t *fsg_arciter_next(fsg_arciter_t *itor); + +/** + * Free the arc iterator (early termination) + */ +SPHINXBASE_EXPORT +void fsg_arciter_free(fsg_arciter_t *itor); +/** + * Get the null transition (if any) from state i to j. + */ +SPHINXBASE_EXPORT +fsg_link_t *fsg_model_null_trans(fsg_model_t *fsg, int32 i, int32 j); + +/** + * Add silence word transitions to each state in given FSG. + * + * @param state state to add a self-loop to, or -1 for all states. + * @param silprob probability of silence transition. + */ +SPHINXBASE_EXPORT +int fsg_model_add_silence(fsg_model_t * fsg, char const *silword, + int state, float32 silprob); + +/** + * Add alternate pronunciation transitions for a word in given FSG. + */ +SPHINXBASE_EXPORT +int fsg_model_add_alt(fsg_model_t * fsg, char const *baseword, + char const *altword); + +/** + * Write FSG to a file. + */ +SPHINXBASE_EXPORT +void fsg_model_write(fsg_model_t *fsg, FILE *fp); + +/** + * Write FSG to a file. + */ +SPHINXBASE_EXPORT +void fsg_model_writefile(fsg_model_t *fsg, char const *file); + +/** + * Write FSG to a file in AT&T FSM format. + */ +SPHINXBASE_EXPORT +void fsg_model_write_fsm(fsg_model_t *fsg, FILE *fp); + +/** + * Write FSG to a file in AT&T FSM format. + */ +SPHINXBASE_EXPORT +void fsg_model_writefile_fsm(fsg_model_t *fsg, char const *file); + +/** + * Write FSG symbol table to a file (for AT&T FSM) + */ +SPHINXBASE_EXPORT +void fsg_model_write_symtab(fsg_model_t *fsg, FILE *file); + +/** + * Write FSG symbol table to a file (for AT&T FSM) + */ +SPHINXBASE_EXPORT +void fsg_model_writefile_symtab(fsg_model_t *fsg, char const *file); + +#ifdef __cplusplus +} +#endif + +#endif /* __FSG_MODEL_H__ */ diff --git a/include/sphinxbase/genrand.h b/include/sphinxbase/genrand.h new file mode 100644 index 000000000..5123c9524 --- /dev/null +++ b/include/sphinxbase/genrand.h @@ -0,0 +1,177 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright +` notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Any feedback is very welcome. + http://www.math.keio.ac.jp/matumoto/emt.html + email: matumoto@math.keio.ac.jp +*/ + +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * randgen.c : a portable random generator + * + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: genrand.h,v $ + * Revision 1.3 2005/06/22 03:01:50 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 18-Nov-04 ARCHAN (archan@cs.cmu.edu) at Carnegie Mellon University + * First incorporated from the Mersenne Twister Random + * Number Generator package. It was chosen because it is + * in BSD-license and its performance is quite + * reasonable. Of course if you look at the inventors's + * page. This random generator can actually gives + * 19937-bits period. This is already far from we need. + * This will possibly good enough for the next 10 years. + * + * I also downgrade the code a little bit to avoid Sphinx's + * developers misused it. + */ + +#ifndef _LIBUTIL_GENRAND_H_ +#define _LIBUTIL_GENRAND_H_ + +#define S3_RAND_MAX_INT32 0x7fffffff +#include + +/* Win32/WinCE DLL gunk */ +#include + +/** \file genrand.h + *\brief High performance prortable random generator created by Takuji + *Nishimura and Makoto Matsumoto. + * + * A high performance which applied Mersene twister primes to generate + * random number. If probably seeded, the random generator can achieve + * 19937-bits period. For technical detail. Please take a look at + * (FIXME! Need to search for the web site.) http://www. + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Macros to simplify calling of random generator function. + * + */ +#define s3_rand_seed(s) genrand_seed(s); +#define s3_rand_int31() genrand_int31() +#define s3_rand_real() genrand_real3() +#define s3_rand_res53() genrand_res53() + +/** + *Initialize the seed of the random generator. + */ +SPHINXBASE_EXPORT +void genrand_seed(unsigned long s); + +/** + *generates a random number on [0,0x7fffffff]-interval + */ +SPHINXBASE_EXPORT +long genrand_int31(void); + +/** + *generates a random number on (0,1)-real-interval + */ +SPHINXBASE_EXPORT +double genrand_real3(void); + +/** + *generates a random number on [0,1) with 53-bit resolution + */ +SPHINXBASE_EXPORT +double genrand_res53(void); + +#ifdef __cplusplus +} +#endif + +#endif /*_LIBUTIL_GENRAND_H_*/ diff --git a/include/sphinxbase/glist.h b/include/sphinxbase/glist.h new file mode 100644 index 000000000..cdb18be3b --- /dev/null +++ b/include/sphinxbase/glist.h @@ -0,0 +1,242 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * glist.h -- Module for maintaining a generic, linear linked-list structure. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: glist.h,v $ + * Revision 1.9 2005/06/22 03:02:51 arthchan2003 + * 1, Fixed doxygen documentation, 2, add keyword. + * + * Revision 1.4 2005/05/03 04:09:11 archan + * Implemented the heart of word copy search. For every ci-phone, every word end, a tree will be allocated to preserve its pathscore. This is different from 3.5 or below, only the best score for a particular ci-phone, regardless of the word-ends will be preserved at every frame. The graph propagation will not collect unused word tree at this point. srch_WST_propagate_wd_lv2 is also as the most stupid in the century. But well, after all, everything needs a start. I will then really get the results from the search and see how it looks. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 09-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added glist_chkdup_*(). + * + * 13-Feb-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created from earlier version. + */ + + +/** + * \file glist.h + * \brief Generic linked-lists maintenance. + * + * Only insert at the head of the list. A convenient little + * linked-list package, but a double-edged sword: the user must keep + * track of the data type within the linked list elements. When it + * was first written, there was no selective deletions except to + * destroy the entire list. This is modified in later version. + * + * + * (C++ would be good for this, but that's a double-edged sword as well.) + */ + + +#ifndef _LIBUTIL_GLIST_H_ +#define _LIBUTIL_GLIST_H_ + +#include +/* Win32/WinCE DLL gunk */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** A node in a generic list + */ +typedef struct gnode_s { + anytype_t data; /** See prim_type.h */ + struct gnode_s *next; /** Next node in list */ +} gnode_t; +typedef gnode_t *glist_t; /** Head of a list of gnodes */ + + +/** Access macros, for convenience + */ +#define gnode_ptr(g) ((g)->data.ptr) +#define gnode_int32(g) ((g)->data.i) +#define gnode_uint32(g) ((g)->data.ui) +#define gnode_float32(g) ((float32)(g)->data.fl) +#define gnode_float64(g) ((g)->data.fl) +#define gnode_next(g) ((g)->next) + + +/** + * Create and prepend a new list node, with the given user-defined data, at the HEAD + * of the given generic list. Return the new list thus formed. + * g may be NULL to indicate an initially empty list. + */ +SPHINXBASE_EXPORT +glist_t glist_add_ptr (glist_t g, /**< a link list */ + void *ptr /**< a pointer */ + ); + +/** + * Create and prepend a new list node containing an integer. + */ +SPHINXBASE_EXPORT +glist_t glist_add_int32 (glist_t g, /**< a link list */ + int32 val /**< an integer value */ + ); +/** + * Create and prepend a new list node containing an unsigned integer. + */ +SPHINXBASE_EXPORT +glist_t glist_add_uint32 (glist_t g, /**< a link list */ + uint32 val /**< an unsigned integer value */ + ); +/** + * Create and prepend a new list node containing a single-precision float. + */ +SPHINXBASE_EXPORT +glist_t glist_add_float32 (glist_t g, /**< a link list */ + float32 val /**< a float32 vlaue */ + ); +/** + * Create and prepend a new list node containing a double-precision float. + */ +SPHINXBASE_EXPORT +glist_t glist_add_float64 (glist_t g, /**< a link list */ + float64 val /**< a float64 vlaue */ + ); + + + +/** + * Create and insert a new list node, with the given user-defined data, after + * the given generic node gn. gn cannot be NULL. + * Return ptr to the newly created gnode_t. + */ +SPHINXBASE_EXPORT +gnode_t *glist_insert_ptr (gnode_t *gn, /**< a generic node which ptr will be inserted after it*/ + void *ptr /**< pointer inserted */ + ); +/** + * Create and insert a new list node containing an integer. + */ +SPHINXBASE_EXPORT +gnode_t *glist_insert_int32 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + int32 val /**< int32 inserted */ + ); +/** + * Create and insert a new list node containing an unsigned integer. + */ +SPHINXBASE_EXPORT +gnode_t *glist_insert_uint32 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + uint32 val /**< uint32 inserted */ + ); +/** + * Create and insert a new list node containing a single-precision float. + */ +SPHINXBASE_EXPORT +gnode_t *glist_insert_float32 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + float32 val /**< float32 inserted */ + ); +/** + * Create and insert a new list node containing a double-precision float. + */ +SPHINXBASE_EXPORT +gnode_t *glist_insert_float64 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + float64 val /**< float64 inserted */ + ); + +/** + * Reverse the order of the given glist. (glist_add() adds to the head; one might + * ultimately want the reverse of that.) + * NOTE: The list is reversed "in place"; i.e., no new memory is allocated. + * @return: The head of the new list. + */ +SPHINXBASE_EXPORT +glist_t glist_reverse (glist_t g /**< input link list */ + ); + + +/** + Count the number of element in a given link list + @return the number of elements in the given glist_t +*/ +SPHINXBASE_EXPORT +int32 glist_count (glist_t g /**< input link list */ + ); + +/** + * Free the given generic list; user-defined data contained within is not + * automatically freed. The caller must have done that already. + */ +SPHINXBASE_EXPORT +void glist_free (glist_t g); + + +/** + * Free the given node, gn, of a glist, pred being its predecessor in the list. + * Return ptr to the next node in the list after the freed node. + */ +SPHINXBASE_EXPORT +gnode_t *gnode_free(gnode_t *gn, + gnode_t *pred + ); + +/** + * Return the last node in the given list. + */ +SPHINXBASE_EXPORT +gnode_t *glist_tail (glist_t g); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/hash_table.h b/include/sphinxbase/hash_table.h new file mode 100644 index 000000000..945628f03 --- /dev/null +++ b/include/sphinxbase/hash_table.h @@ -0,0 +1,443 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * hash.h -- Hash table module. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: hash.h,v $ + * Revision 1.7 2005/06/22 03:04:01 arthchan2003 + * 1, Implemented hash_delete and hash_display, 2, Fixed doxygen documentation, 3, Added keyword. + * + * Revision 1.8 2005/05/24 01:10:54 archan + * Fix a bug when the value only appear in the hash but there is no chain. Also make sure that prev was initialized to NULL. All success cases were tested, but not tested with the deletion is tested. + * + * Revision 1.7 2005/05/24 00:12:31 archan + * Also add function prototype for hash_display in hash.h + * + * Revision 1.4 2005/05/03 04:09:11 archan + * Implemented the heart of word copy search. For every ci-phone, every word end, a tree will be allocated to preserve its pathscore. This is different from 3.5 or below, only the best score for a particular ci-phone, regardless of the word-ends will be preserved at every frame. The graph propagation will not collect unused word tree at this point. srch_WST_propagate_wd_lv2 is also as the most stupid in the century. But well, after all, everything needs a start. I will then really get the results from the search and see how it looks. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-May-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Removed hash_key2hash(). Added hash_enter_bkey() and hash_lookup_bkey(), + * and len attribute to hash_entry_t. + * + * 30-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added hash_key2hash(). + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Included case sensitive/insensitive option. + * + * 08-31-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +/** + * @file hash_table.h + * @brief Hash table implementation + * + * This hash tables are intended for associating a pointer/integer + * "value" with a char string "key", (e.g., an ID with a word string). + * Subsequently, one can retrieve the value by providing the string + * key. (The reverse functionality--obtaining the string given the + * value--is not provided with the hash table module.) + */ + +/** + * A note by ARCHAN at 20050510: Technically what we use is so-called + * "hash table with buckets" which is very nice way to deal with + * external hashing. There are definitely better ways to do internal + * hashing (i.e. when everything is stored in the memory.) In Sphinx + * 3, this is a reasonable practice because hash table is only used in + * lookup in initialization or in lookups which is not critical for + * speed. + */ + +/** + * Another note by ARCHAN at 20050703: To use this data structure + * properly, it is very important to realize that the users are + * required to handle memory allocation of the C-style keys. The hash + * table will not make a copy of the memory allocated for any of the + * C-style key. It will not allocate memory for it. It will not delete + * memory for it. As a result, the following code sniplet will cause + * memory leak. + * + * while (1){ + * str=(char*)ckd_calloc(str_length,sizeof(char*)) + * if(hash_enter(ht,str,id)!=id){ printf("fail to add key str %s with val id %d\n",str,id)} + * } + * + */ + +/** + * A note by dhuggins on 20061010: Changed this to use void * instead + * of int32 as the value type, so that arbitrary objects can be + * inserted into a hash table (in a way that won't crash on 64-bit + * machines ;) + */ + +#ifndef _LIBUTIL_HASH_H_ +#define _LIBUTIL_HASH_H_ + +/* Win32/WinCE DLL gunk */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * The hash table structures. + * Each hash table is identified by a hash_table_t structure. hash_table_t.table is + * pre-allocated for a user-controlled max size, and is initially empty. As new + * entries are created (using hash_enter()), the empty entries get filled. If multiple + * keys hash to the same entry, new entries are allocated and linked together in a + * linear list. + */ + +typedef struct hash_entry_s { + const char *key; /** Key string, NULL if this is an empty slot. + NOTE that the key must not be changed once the entry + has been made. */ + size_t len; /** Key-length; the key string does not have to be a C-style NULL + terminated string; it can have arbitrary binary bytes */ + void *val; /** Value associated with above key */ + struct hash_entry_s *next; /** For collision resolution */ +} hash_entry_t; + +typedef struct hash_table_s { + hash_entry_t *table; /**Primary hash table, excluding entries that collide */ + int32 size; /** Primary hash table size, (is a prime#); NOTE: This is the + number of primary entries ALLOCATED, NOT the number of valid + entries in the table */ + int32 inuse; /** Number of valid entries in the table. */ + int32 nocase; /** Whether case insensitive for key comparisons */ +} hash_table_t; + +typedef struct hash_iter_s { + hash_table_t *ht; /**< Hash table we are iterating over. */ + hash_entry_t *ent; /**< Current entry in that table. */ + size_t idx; /**< Index of next bucket to search. */ +} hash_iter_t; + +/** Access macros */ +#define hash_entry_val(e) ((e)->val) +#define hash_entry_key(e) ((e)->key) +#define hash_entry_len(e) ((e)->len) +#define hash_table_inuse(h) ((h)->inuse) +#define hash_table_size(h) ((h)->size) + + +/** + * Allocate a new hash table for a given expected size. + * + * @note Case sensitivity of hash keys applies to 7-bit ASCII + * characters only, and is not locale-dependent. + * + * @return handle to allocated hash table. + */ +SPHINXBASE_EXPORT +hash_table_t * hash_table_new(int32 size, /**< In: Expected number of entries in the table */ + int32 casearg /**< In: Whether case insensitive for key + comparisons. When 1, case is insentitive, + 0, case is sensitive. */ + ); + +#define HASH_CASE_YES 0 +#define HASH_CASE_NO 1 + +/** + * Free the specified hash table; the caller is responsible for freeing the key strings + * pointed to by the table entries. + */ +SPHINXBASE_EXPORT +void hash_table_free(hash_table_t *h /**< In: Handle of hash table to free */ + ); + + +/** + * Try to add a new entry with given key and associated value to hash table h. If key doesn't + * already exist in hash table, the addition is successful, and the return value is val. But + * if key already exists, return its existing associated value. (The hash table is unchanged; + * it is up to the caller to resolve the conflict.) + */ +SPHINXBASE_EXPORT +void *hash_table_enter(hash_table_t *h, /**< In: Handle of hash table in which to create entry */ + const char *key, /**< In: C-style NULL-terminated key string + for the new entry */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Add a 32-bit integer value to a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_enter_int32(h,k,v) \ + ((int32)(long)hash_table_enter((h),(k),(void *)(long)(v))) + +/** + * Add a new entry with given key and value to hash table h. If the + * key already exists, its value is replaced with the given value, and + * the previous value is returned, otherwise val is returned. + * + * A very important but subtle point: The key pointer in the hash + * table is replaced with the pointer passed to this function. + * In general you should always pass a pointer to hash_table_enter() + * whose lifetime matches or exceeds that of the hash table. In some + * rare cases it is convenient to initially enter a value with a + * short-lived key, then later replace that with a long-lived one. + * This behaviour allows this to happen. + */ +SPHINXBASE_EXPORT +void *hash_table_replace(hash_table_t *h, /**< In: Handle of hash table in which to create entry */ + const char *key, /**< In: C-style NULL-terminated key string + for the new entry */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Replace a 32-bit integer value in a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_replace_int32(h,k,v) \ + ((int32)(long)hash_table_replace((h),(k),(void *)(long)(v))) + +/** + * Delete an entry with given key and associated value to hash table + * h. Return the value associated with the key (NULL if it did not exist) + */ + +SPHINXBASE_EXPORT +void *hash_table_delete(hash_table_t *h, /**< In: Handle of hash table in + which a key will be deleted */ + const char *key /**< In: C-style NULL-terminated + key string for the new entry */ + ); + +/** + * Like hash_table_delete, but with an explicitly specified key length, + * instead of a NULL-terminated, C-style key string. So the key + * string is a binary key (or bkey). Hash tables containing such keys + * should be created with the HASH_CASE_YES option. Otherwise, the + * results are unpredictable. + */ +SPHINXBASE_EXPORT +void *hash_table_delete_bkey(hash_table_t *h, /**< In: Handle of hash table in + which a key will be deleted */ + const char *key, /**< In: C-style NULL-terminated + key string for the new entry */ + size_t len + ); + +/** + * Delete all entries from a hash_table. + */ +SPHINXBASE_EXPORT +void hash_table_empty(hash_table_t *h /**< In: Handle of hash table */ + ); + +/** + * Like hash_table_enter, but with an explicitly specified key length, + * instead of a NULL-terminated, C-style key string. So the key + * string is a binary key (or bkey). Hash tables containing such keys + * should be created with the HASH_CASE_YES option. Otherwise, the + * results are unpredictable. + */ +SPHINXBASE_EXPORT +void *hash_table_enter_bkey(hash_table_t *h, /**< In: Handle of hash table + in which to create entry */ + const char *key, /**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Enter a 32-bit integer value in a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_enter_bkey_int32(h,k,l,v) \ + ((int32)(long)hash_table_enter_bkey((h),(k),(l),(void *)(long)(v))) + +/** + * Like hash_table_replace, but with an explicitly specified key length, + * instead of a NULL-terminated, C-style key string. So the key + * string is a binary key (or bkey). Hash tables containing such keys + * should be created with the HASH_CASE_YES option. Otherwise, the + * results are unpredictable. + */ +SPHINXBASE_EXPORT +void *hash_table_replace_bkey(hash_table_t *h, /**< In: Handle of hash table in which to create entry */ + const char *key, /**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Replace a 32-bit integer value in a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_replace_bkey_int32(h,k,l,v) \ + ((int32)(long)hash_table_replace_bkey((h),(k),(l),(void *)(long)(v))) + +/** + * Look up a key in a hash table and optionally return the associated + * value. + * @return 0 if key found in hash table, else -1. + */ +SPHINXBASE_EXPORT +int32 hash_table_lookup(hash_table_t *h, /**< In: Handle of hash table being searched */ + const char *key, /**< In: C-style NULL-terminated string whose value is sought */ + void **val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Look up a 32-bit integer value in a hash table. + * + * This function is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +SPHINXBASE_EXPORT +int32 hash_table_lookup_int32(hash_table_t *h, /**< In: Handle of hash table being searched */ + const char *key, /**< In: C-style NULL-terminated string whose value is sought */ + int32 *val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Like hash_lookup, but with an explicitly specified key length, instead of a NULL-terminated, + * C-style key string. So the key string is a binary key (or bkey). Hash tables containing + * such keys should be created with the HASH_CASE_YES option. Otherwise, the results are + * unpredictable. + */ +SPHINXBASE_EXPORT +int32 hash_table_lookup_bkey(hash_table_t *h, /**< In: Handle of hash table being searched */ + const char *key, /**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + void **val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Look up a 32-bit integer value in a hash table. + * + * This function is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +SPHINXBASE_EXPORT +int32 hash_table_lookup_bkey_int32(hash_table_t *h,/**< In: Handle of hash table being searched */ + const char *key,/**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + int32 *val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Start iterating over key-value pairs in a hash table. + */ +SPHINXBASE_EXPORT +hash_iter_t *hash_table_iter(hash_table_t *h); + +/** + * Get the next key-value pair in iteration. + * + * This function automatically frees the iterator object upon reaching + * the final entry. + * + * @return the next entry in the hash table, or NULL if done. + */ +SPHINXBASE_EXPORT +hash_iter_t *hash_table_iter_next(hash_iter_t *itor); + +/** + * Delete an unfinished iterator. + */ +SPHINXBASE_EXPORT +void hash_table_iter_free(hash_iter_t *itor); + +/** + * Build a glist of valid hash_entry_t pointers from the given hash table. Return the list. + */ +SPHINXBASE_EXPORT +glist_t hash_table_tolist(hash_table_t *h, /**< In: Hash table from which list is to be generated */ + int32 *count /**< Out: Number of entries in the list. + If this is NULL, no count will be returned. */ + + ); + +/** + * Display a hash-with-chaining representation on the screen. + * Currently, it will only works for situation where hash_enter was + * used to enter the keys. + */ +SPHINXBASE_EXPORT +void hash_table_display(hash_table_t *h, /**< In: Hash table to display */ + int32 showkey /**< In: Show the string or not, + Use 0 if hash_enter_bkey was + used. */ + ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/heap.h b/include/sphinxbase/heap.h new file mode 100644 index 000000000..ad3756aaf --- /dev/null +++ b/include/sphinxbase/heap.h @@ -0,0 +1,153 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * heap.h -- Generic heap structure for inserting in any and popping in sorted + * order. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: heap.h,v $ + * Revision 1.7 2005/06/22 03:05:49 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add keyword. + * + * Revision 1.4 2005/06/15 04:21:46 archan + * 1, Fixed doxygen-documentation, 2, Add keyword such that changes will be logged into a file. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 23-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started. + */ + + +#ifndef _LIBUTIL_HEAP_H_ +#define _LIBUTIL_HEAP_H_ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + + /** \file heap.h + * \brief Heap Implementation. + * + * General Comment: Sorted heap structure with three main operations: + * + * 1. Insert a data item (with two attributes: an application supplied pointer and an + * integer value; the heap is maintained in ascending order of the integer value). + * 2. Return the currently topmost item (i.e., item with smallest associated value). + * 3. Return the currently topmost item and pop it off the heap. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + + +typedef struct heap_s heap_t; + + +/** + * Allocate a new heap and return handle to it. + */ +SPHINXBASE_EXPORT +heap_t *heap_new(void); + + +/** + * Insert a new item into the given heap. + * Return value: 0 if successful, -1 otherwise. + */ +SPHINXBASE_EXPORT +int heap_insert(heap_t *heap, /**< In: Heap into which item is to be inserted */ + void *data, /**< In: Application-determined data pointer */ + int32 val /**< In: According to item entered in sorted heap */ + ); +/** + * Return the topmost item in the heap. + * Return value: 1 if heap is not empty and the topmost value is returned; + * 0 if heap is empty; -1 if some error occurred. + */ +SPHINXBASE_EXPORT +int heap_top(heap_t *heap, /**< In: Heap whose topmost item is to be returned */ + void **data, /**< Out: Data pointer associated with the topmost item */ + int32 *val /**< Out: Value associated with the topmost item */ + ); +/** + * Like heap_top but also pop the top item off the heap. + */ +SPHINXBASE_EXPORT +int heap_pop(heap_t *heap, void **data, int32 *val); + +/** + * Remove an item from the heap. + */ +SPHINXBASE_EXPORT +int heap_remove(heap_t *heap, void *data); + +/** + * Return the number of items in the heap. + */ +SPHINXBASE_EXPORT +size_t heap_size(heap_t *heap); + +/** + * Destroy the given heap; free the heap nodes. NOTE: Data pointers in the nodes are NOT freed. + * Return value: 0 if successful, -1 otherwise. + */ + +SPHINXBASE_EXPORT +int heap_destroy(heap_t *heap); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/jsgf.h b/include/sphinxbase/jsgf.h new file mode 100644 index 000000000..3c3de1de6 --- /dev/null +++ b/include/sphinxbase/jsgf.h @@ -0,0 +1,209 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __JSGF_H__ +#define __JSGF_H__ + +/** + * @file jsgf.h JSGF grammar compiler + * + * This file defines the data structures for parsing JSGF grammars + * into Sphinx finite-state grammars. + **/ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +typedef struct jsgf_s jsgf_t; +typedef struct jsgf_rule_s jsgf_rule_t; + +/** + * Create a new JSGF grammar. + * + * @param parent optional parent grammar for this one (NULL, usually). + * @return new JSGF grammar object, or NULL on failure. + */ +SPHINXBASE_EXPORT +jsgf_t *jsgf_grammar_new(jsgf_t *parent); + +/** + * Parse a JSGF grammar from a file. + * + * @param filename the name of the file to parse. + * @param parent optional parent grammar for this one (NULL, usually). + * @return new JSGF grammar object, or NULL on failure. + */ +SPHINXBASE_EXPORT +jsgf_t *jsgf_parse_file(const char *filename, jsgf_t *parent); + +/** + * Parse a JSGF grammar from a string. + * + * @param 0-terminated string with grammar. + * @param parent optional parent grammar for this one (NULL, usually). + * @return new JSGF grammar object, or NULL on failure. + */ +SPHINXBASE_EXPORT +jsgf_t *jsgf_parse_string(const char *string, jsgf_t *parent); + +/** + * Get the grammar name from the file. + */ +SPHINXBASE_EXPORT +char const *jsgf_grammar_name(jsgf_t *jsgf); + +/** + * Free a JSGF grammar. + */ +SPHINXBASE_EXPORT +void jsgf_grammar_free(jsgf_t *jsgf); + +/** + * Iterator over rules in a grammar. + */ +typedef hash_iter_t jsgf_rule_iter_t; + +/** + * Get an iterator over all rules in a grammar. + */ +SPHINXBASE_EXPORT +jsgf_rule_iter_t *jsgf_rule_iter(jsgf_t *grammar); + +/** + * Advance an iterator to the next rule in the grammar. + */ +#define jsgf_rule_iter_next(itor) hash_table_iter_next(itor) + +/** + * Get the current rule in a rule iterator. + */ +#define jsgf_rule_iter_rule(itor) ((jsgf_rule_t *)(itor)->ent->val) + +/** + * Free a rule iterator (if the end hasn't been reached). + */ +#define jsgf_rule_iter_free(itor) hash_table_iter_free(itor) + +/** + * Get a rule by name from a grammar. Name should not contain brackets. + */ +SPHINXBASE_EXPORT +jsgf_rule_t *jsgf_get_rule(jsgf_t *grammar, const char *name); + +/** + * Returns the first public rule of the grammar + */ +SPHINXBASE_EXPORT +jsgf_rule_t *jsgf_get_public_rule(jsgf_t *grammar); + +/** + * Get the rule name from a rule. + */ +SPHINXBASE_EXPORT +char const *jsgf_rule_name(jsgf_rule_t *rule); + +/** + * Test if a rule is public or not. + */ +SPHINXBASE_EXPORT +int jsgf_rule_public(jsgf_rule_t *rule); + +/** + * Build a Sphinx FSG object from a JSGF rule. + */ +SPHINXBASE_EXPORT +fsg_model_t *jsgf_build_fsg(jsgf_t *grammar, jsgf_rule_t *rule, + logmath_t *lmath, float32 lw); + +/** + * Build a Sphinx FSG object from a JSGF rule. + * + * This differs from jsgf_build_fsg() in that it does not do closure + * on epsilon transitions or any other postprocessing. For the time + * being this is necessary in order to write it to a file - the FSG + * code will be fixed soon. + */ +SPHINXBASE_EXPORT +fsg_model_t *jsgf_build_fsg_raw(jsgf_t *grammar, jsgf_rule_t *rule, + logmath_t *lmath, float32 lw); + + +/** + * Read JSGF from file and return FSG object from it. + * + * This function looks for a first public rule in jsgf and constructs JSGF from it. + */ +SPHINXBASE_EXPORT +fsg_model_t *jsgf_read_file(const char *file, logmath_t * lmath, float32 lw); + +/** + * Read JSGF from string and return FSG object from it. + * + * This function looks for a first public rule in jsgf and constructs JSGF from it. + */ +SPHINXBASE_EXPORT +fsg_model_t *jsgf_read_string(const char *string, logmath_t * lmath, float32 lw); + + +/** + * Convert a JSGF rule to Sphinx FSG text form. + * + * This does a direct conversion without doing transitive closure on + * null transitions and so forth. + */ +SPHINXBASE_EXPORT +int jsgf_write_fsg(jsgf_t *grammar, jsgf_rule_t *rule, FILE *outfh); + +#ifdef __cplusplus +} +#endif + + +#endif /* __JSGF_H__ */ diff --git a/include/sphinxbase/listelem_alloc.h b/include/sphinxbase/listelem_alloc.h new file mode 100644 index 000000000..91b21d177 --- /dev/null +++ b/include/sphinxbase/listelem_alloc.h @@ -0,0 +1,125 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __LISTELEM_ALLOC_H__ +#define __LISTELEM_ALLOC_H__ + +/** @file listelem_alloc.h + * @brief Fast memory allocator for uniformly sized objects + * @author M K Ravishankar + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#include +#ifdef S60 +#include +#endif + +/* Win32/WinCE DLL gunk */ +#include +#include + +/** + * List element allocator object. + */ +typedef struct listelem_alloc_s listelem_alloc_t; + +/** + * Initialize and return a list element allocator. + */ +SPHINXBASE_EXPORT +listelem_alloc_t * listelem_alloc_init(size_t elemsize); + +/** + * Finalize and release all memory associated with a list element allocator. + */ +SPHINXBASE_EXPORT +void listelem_alloc_free(listelem_alloc_t *le); + + +SPHINXBASE_EXPORT +void *__listelem_malloc__(listelem_alloc_t *le, char *file, int line); + +/** + * Allocate a list element and return pointer to it. + */ +#define listelem_malloc(le) __listelem_malloc__((le),__FILE__,__LINE__) + +SPHINXBASE_EXPORT +void *__listelem_malloc_id__(listelem_alloc_t *le, char *file, int line, + int32 *out_id); + +/** + * Allocate a list element, returning a unique identifier. + */ +#define listelem_malloc_id(le, oid) __listelem_malloc_id__((le),__FILE__,__LINE__,(oid)) + +/** + * Retrieve a list element by its identifier. + */ +SPHINXBASE_EXPORT +void *listelem_get_item(listelem_alloc_t *le, int32 id); + +/** + * Free list element of given size + */ +SPHINXBASE_EXPORT +void __listelem_free__(listelem_alloc_t *le, void *elem, char *file, int line); + +/** + * Macro of __listelem_free__ + */ +#define listelem_free(le,el) __listelem_free__((le),(el),__FILE__,__LINE__) + +/** + Print number of allocation, numer of free operation stats +*/ +SPHINXBASE_EXPORT +void listelem_stats(listelem_alloc_t *le); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/logmath.h b/include/sphinxbase/logmath.h new file mode 100644 index 000000000..1e555c245 --- /dev/null +++ b/include/sphinxbase/logmath.h @@ -0,0 +1,249 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file logmath.h + * @brief Fast integer logarithmic addition operations. + * + * In evaluating HMM models, probability values are often kept in log + * domain, to avoid overflow. To enable these logprob values to be + * held in int32 variables without significant loss of precision, a + * logbase of (1+epsilon) (where epsilon < 0.01 or so) is used. This + * module maintains this logbase (B). + * + * However, maintaining probabilities in log domain creates a problem + * when adding two probability values. This problem can be solved by + * table lookup. Note that: + * + * - \f$ b^z = b^x + b^y \f$ + * - \f$ b^z = b^x(1 + b^{y-x}) = b^y(1 + e^{x-y}) \f$ + * - \f$ z = x + log_b(1 + b^{y-x}) = y + log_b(1 + b^{x-y}) \f$ + * + * So: + * + * - when \f$ y > x, z = y + logadd\_table[-(x-y)] \f$ + * - when \f$ x > y, z = x + logadd\_table[-(y-x)] \f$ + * - where \f$ logadd\_table[n] = log_b(1 + b^{-n}) \f$ + * + * The first entry in logadd_table is + * simply \f$ log_b(2.0) \f$, for + * the case where \f$ y = x \f$ and thus + * \f$ z = log_b(2x) = log_b(2) + x \f$. The last entry is zero, + * where \f$ log_b(x+y) = x = y \f$ due to loss of precision. + * + * Since this table can be quite large particularly for small + * logbases, an option is provided to compress it by dropping the + * least significant bits of the table. + */ + +#ifndef __LOGMATH_H__ +#define __LOGMATH_H__ + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Integer log math computation table. + * + * This is exposed here to allow log-add computations to be inlined. + */ +typedef struct logadd_s logadd_t; +struct logadd_s { + /** Table, in unsigned integers of (width) bytes. */ + void *table; + /** Number of elements in (table). This is never smaller than 256 (important!) */ + uint32 table_size; + /** Width of elements of (table). */ + uint8 width; + /** Right shift applied to elements in (table). */ + int8 shift; +}; + +/** + * Integer log math computation class. + */ +typedef struct logmath_s logmath_t; + +/** + * Obtain the log-add table from a logmath_t * + */ +#define LOGMATH_TABLE(lm) ((logadd_t *)lm) + +/** + * Initialize a log math computation table. + * @param base The base B in which computation is to be done. + * @param shift Log values are shifted right by this many bits. + * @param use_table Whether to use an add table or not + * @return The newly created log math table. + */ +SPHINXBASE_EXPORT +logmath_t *logmath_init(float64 base, int shift, int use_table); + +/** + * Memory-map (or read) a log table from a file. + */ +SPHINXBASE_EXPORT +logmath_t *logmath_read(const char *filename); + +/** + * Write a log table to a file. + */ +SPHINXBASE_EXPORT +int32 logmath_write(logmath_t *lmath, const char *filename); + +/** + * Get the log table size and dimensions. + */ +SPHINXBASE_EXPORT +int32 logmath_get_table_shape(logmath_t *lmath, uint32 *out_size, + uint32 *out_width, uint32 *out_shift); + +/** + * Get the log base. + */ +SPHINXBASE_EXPORT +float64 logmath_get_base(logmath_t *lmath); + +/** + * Get the smallest possible value represented in this base. + */ +SPHINXBASE_EXPORT +int logmath_get_zero(logmath_t *lmath); + +/** + * Get the width of the values in a log table. + */ +SPHINXBASE_EXPORT +int logmath_get_width(logmath_t *lmath); + +/** + * Get the shift of the values in a log table. + */ +SPHINXBASE_EXPORT +int logmath_get_shift(logmath_t *lmath); + +/** + * Retain ownership of a log table. + * + * @return pointer to retained log table. + */ +SPHINXBASE_EXPORT +logmath_t *logmath_retain(logmath_t *lmath); + +/** + * Free a log table. + * + * @return new reference count (0 if freed completely) + */ +SPHINXBASE_EXPORT +int logmath_free(logmath_t *lmath); + +/** + * Add two values in log space exactly and slowly (without using add table). + */ +SPHINXBASE_EXPORT +int logmath_add_exact(logmath_t *lmath, int logb_p, int logb_q); + +/** + * Add two values in log space (i.e. return log(exp(p)+exp(q))) + */ +SPHINXBASE_EXPORT +int logmath_add(logmath_t *lmath, int logb_p, int logb_q); + +/** + * Convert linear floating point number to integer log in base B. + */ +SPHINXBASE_EXPORT +int logmath_log(logmath_t *lmath, float64 p); + +/** + * Convert integer log in base B to linear floating point. + */ +SPHINXBASE_EXPORT +float64 logmath_exp(logmath_t *lmath, int logb_p); + +/** + * Convert natural log (in floating point) to integer log in base B. + */ +SPHINXBASE_EXPORT +int logmath_ln_to_log(logmath_t *lmath, float64 log_p); + +/** + * Convert integer log in base B to natural log (in floating point). + */ +SPHINXBASE_EXPORT +float64 logmath_log_to_ln(logmath_t *lmath, int logb_p); + +/** + * Convert base 10 log (in floating point) to integer log in base B. + */ +SPHINXBASE_EXPORT +int logmath_log10_to_log(logmath_t *lmath, float64 log_p); + +/** + * Convert base 10 log (in floating point) to float log in base B. + */ +SPHINXBASE_EXPORT +float logmath_log10_to_log_float(logmath_t *lmath, float64 log_p); + +/** + * Convert integer log in base B to base 10 log (in floating point). + */ +SPHINXBASE_EXPORT +float64 logmath_log_to_log10(logmath_t *lmath, int logb_p); + +/** + * Convert float log in base B to base 10 log. + */ +SPHINXBASE_EXPORT +float64 logmath_log_float_to_log10(logmath_t *lmath, float log_p); + +#ifdef __cplusplus +} +#endif + + +#endif /* __LOGMATH_H__ */ diff --git a/include/sphinxbase/matrix.h b/include/sphinxbase/matrix.h new file mode 100644 index 000000000..b77cab1c9 --- /dev/null +++ b/include/sphinxbase/matrix.h @@ -0,0 +1,214 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1997-2000 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: matrix.h + * + * Description: Matrix and linear algebra functions + * + * Author: + * + *********************************************************************/ + +#ifndef MATRIX_H +#define MATRIX_H + +/** \file matrix.h + * \brief Matrix and linear algebra functions. + * + * This file contains some basic matrix and linear algebra operations. + * In general these operate on positive definite matrices ONLY, + * because all matrices we're likely to encounter are either + * covariance matrices or are derived from them, and therefore a + * non-positive-definite matrix indicates some kind of pathological + * condition. + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/* Win32/WinCE DLL gunk */ +#include +#include + + +/** + * Norm an array + * @param arr array + * @param d1 dimension + * @param d2 dimension + * @param d3 dimension + **/ +SPHINXBASE_EXPORT void norm_3d(float32 ***arr, uint32 d1, uint32 d2, uint32 d3); + +/** + * Floor 3-d array + * @param out output array + * @param in input array + * @param d1 dimension + * @param d2 dimension + * @param d3 dimension + **/ +SPHINXBASE_EXPORT void +accum_3d(float32 ***out, float32 ***in, uint32 d1, uint32 d2, uint32 d3); + +/** Ensures that non-zero values x such that -band < x < band, band > 0 are set to -band if x < 0 and band if x > 0. + * @param v array + * @param d1 array size + * @param band band value + */ +SPHINXBASE_EXPORT void band_nz_1d(float32 *v, uint32 d1, float32 band); + +/** + * Floor 3-d array + * @param m array + * @param d1 dimension + * @param d2 dimension + * @param d3 dimension + * @param floor floor value + **/ +SPHINXBASE_EXPORT void floor_nz_3d(float32 ***m, uint32 d1, uint32 d2, uint32 d3, float32 floor); + +/** + * Floor 1-d array + * @param v array + * @param d1 dimension + * @param floor floor value + **/ +SPHINXBASE_EXPORT void floor_nz_1d(float32 *v, uint32 d1, float32 floor); + +/** + * Calculate the determinant of a positive definite matrix. + * @param a The input matrix, must be positive definite. + * @param len The dimension of the input matrix. + * @return The determinant of the input matrix, or -1.0 if the matrix is + * not positive definite. + * + * \note These can be vanishingly small hence the float64 return type. + * Also note that only the upper triangular portion of a is + * considered, therefore the check for positive-definiteness is not + * reliable. + **/ +SPHINXBASE_EXPORT +float64 determinant(float32 **a, int32 len); + +/** + * Invert (if possible) a positive definite matrix with QR + * algorithm. + * + * @param out_ainv The inverse of a will be stored here. + * @param a The input matrix, must be positive definite. + * @param len The dimension of the input matrix. + * @return 0 for success or -1 for a non-positive-definite matrix. + * + * \note Only the upper triangular portion of a is considered, + * therefore the check for positive-definiteness is not reliable. + * + * \note The inversion can be done in-place, so you can use the same matrix + * if you do not need to keep a. + **/ +SPHINXBASE_EXPORT +int32 invert(float32 **out_ainv, float32 **a, int32 len); + +/** + * Solve (if possible) a positive-definite system of linear equations AX=B for X. + * @param a The A matrix on the left-hand side of the equation, must be positive-definite. + * @param b The B vector on the right-hand side of the equation. + * @param out_x The X vector will be stored here. + * @param n The dimension of the A matrix (n by n) and the B and X vectors. + * @return 0 for success or -1 for a non-positive-definite matrix. + * + * \note Only the upper triangular portion of a is considered, + * therefore the check for positive-definiteness is not reliable. + **/ +SPHINXBASE_EXPORT +int32 solve(float32 **a, float32 *b, + float32 *out_x, int32 n); + +/** + * Calculate the outer product of two vectors. + * @param out_a A (pre-allocated) len x len array. The outer product + * will be stored here. + * @param x A vector of length len. + * @param y A vector of length len. + * @param len The length of the input vectors. + **/ +SPHINXBASE_EXPORT +void outerproduct(float32 **out_a, float32 *x, float32 *y, int32 len); + +/** + * Multiply C=AB where A and B are symmetric matrices. + * @param out_c The output matrix C. + * @param a The input matrix A. + * @param b The input matrix B. + * @param n Dimensionality of A and B. + **/ +SPHINXBASE_EXPORT +void matrixmultiply(float32 **out_c, /* = */ + float32 **a, /* * */ float32 **b, + int32 n); + +/** + * Multiply a symmetric matrix by a constant in-place. + * @param inout_a The matrix to multiply. + * @param x The constant to multiply it by. + * @param n dimension of a. + **/ +SPHINXBASE_EXPORT +void scalarmultiply(float32 **inout_a, float32 x, int32 n); + +/** + * Add A += B. + * @param inout_a The A matrix to add. + * @param b The B matrix to add to A. + * @param n dimension of a and b. + **/ +SPHINXBASE_EXPORT +void matrixadd(float32 **inout_a, float32 **b, int32 n); + +#if 0 +{ /* Fool indent. */ +#endif +#ifdef __cplusplus +} +#endif + +#endif /* MATRIX_H */ diff --git a/include/sphinxbase/mmio.h b/include/sphinxbase/mmio.h new file mode 100644 index 000000000..76127339c --- /dev/null +++ b/include/sphinxbase/mmio.h @@ -0,0 +1,85 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file mmio.h + * @brief Memory-mapped I/O wrappers for files. + * @author David Huggins-Daines + **/ + +#ifndef __MMIO_H__ +#define __MMIO_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Abstract structure representing a memory-mapped file. + **/ +typedef struct mmio_file_s mmio_file_t; + +/** + * Memory-map a file for reading. + * @return a mmio_file_t * or NULL for failure. + **/ +SPHINXBASE_EXPORT +mmio_file_t *mmio_file_read(const char *filename); + +/** + * Get a pointer to the memory mapped for a file. + **/ +SPHINXBASE_EXPORT +void *mmio_file_ptr(mmio_file_t *mf); + +/** + * Unmap a file, releasing memory associated with it. + **/ +SPHINXBASE_EXPORT +void mmio_file_unmap(mmio_file_t *mf); + +#ifdef __cplusplus +} +#endif + + +#endif /* __MMIO_H__ */ diff --git a/include/sphinxbase/ngram_model.h b/include/sphinxbase/ngram_model.h new file mode 100644 index 000000000..10cca072f --- /dev/null +++ b/include/sphinxbase/ngram_model.h @@ -0,0 +1,703 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file ngram_model.h + * @brief N-Gram language models + * @author David Huggins-Daines + */ + +#ifndef __NGRAM_MODEL_H__ +#define __NGRAM_MODEL_H__ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Abstract type representing an N-Gram based language model. + */ +typedef struct ngram_model_s ngram_model_t; + +/** + * Abstract type representing a word class in an N-Gram model. + */ +typedef struct ngram_class_s ngram_class_t; + +/** + * File types for N-Gram files + */ +typedef enum ngram_file_type_e { + NGRAM_INVALID = -1, /**< Not a valid file type. */ + NGRAM_AUTO, /**< Determine file type automatically. */ + NGRAM_ARPA, /**< ARPABO text format (the standard). */ + NGRAM_BIN /**< Sphinx .DMP format. */ +} ngram_file_type_t; + +#define NGRAM_INVALID_WID -1 /**< Impossible word ID */ + +/** + * Read an N-Gram model from a file on disk. + * + * @param config Optional pointer to a set of command-line arguments. + * Recognized arguments are: + * + * - -mmap (boolean) whether to use memory-mapped I/O + * - -lw (float32) language weight to apply to the model + * - -wip (float32) word insertion penalty to apply to the model + * + * @param file_name path to the file to read. + * @param file_type type of the file, or NGRAM_AUTO to determine automatically. + * @param lmath Log-math parameters to use for probability + * calculations. Ownership of this object is assumed by + * the newly created ngram_model_t, and you should not + * attempt to free it manually. If you wish to reuse it + * elsewhere, you must retain it with logmath_retain(). + * @return newly created ngram_model_t. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_read(cmd_ln_t *config, + const char *file_name, + ngram_file_type_t file_type, + logmath_t *lmath); + +/** + * Write an N-Gram model to disk. + * + * @return 0 for success, <0 on error + */ +SPHINXBASE_EXPORT +int ngram_model_write(ngram_model_t *model, const char *file_name, + ngram_file_type_t format); + +/** + * Guess the file type for an N-Gram model from the filename. + * + * @return the guessed file type, or NGRAM_INVALID if none could be guessed. + */ +SPHINXBASE_EXPORT +ngram_file_type_t ngram_file_name_to_type(const char *file_name); + +/** + * Get the N-Gram file type from a string. + * + * @return file type, or NGRAM_INVALID if no such file type exists. + */ +SPHINXBASE_EXPORT +ngram_file_type_t ngram_str_to_type(const char *str_name); + +/** + * Get the canonical name for an N-Gram file type. + * + * @return read-only string with the name for this file type, or NULL + * if no such type exists. + */ +SPHINXBASE_EXPORT +char const *ngram_type_to_str(int type); + +/** + * Retain ownership of an N-Gram model. + * + * @return Pointer to retained model. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_retain(ngram_model_t *model); + +/** + * Release memory associated with an N-Gram model. + * + * @return new reference count (0 if freed completely) + */ +SPHINXBASE_EXPORT +int ngram_model_free(ngram_model_t *model); + +/** + * Constants for case folding. + */ +typedef enum ngram_case_e { + NGRAM_UPPER, + NGRAM_LOWER +} ngram_case_t; + +/** + * Case-fold word strings in an N-Gram model. + * + * WARNING: This is not Unicode aware, so any non-ASCII characters + * will not be converted. + */ +SPHINXBASE_EXPORT +int ngram_model_casefold(ngram_model_t *model, int kase); + +/** + * Apply a language weight, insertion penalty, and unigram weight to a + * language model. + * + * This will change the values output by ngram_score() and friends. + * This is done for efficiency since in decoding, these are the only + * values we actually need. Call ngram_prob() if you want the "raw" + * N-Gram probability estimate. + * + * To remove all weighting, call ngram_apply_weights(model, 1.0, 1.0). + */ +SPHINXBASE_EXPORT +int ngram_model_apply_weights(ngram_model_t *model, + float32 lw, float32 wip); + +/** + * Get the current weights from a language model. + * + * @param model The model in question. + * @param out_log_wip Output: (optional) logarithm of word insertion penalty. + * @return language weight. + */ +SPHINXBASE_EXPORT +float32 ngram_model_get_weights(ngram_model_t *model, int32 *out_log_wip); + +/** + * Get the score (scaled, interpolated log-probability) for a general + * N-Gram. + * + * The argument list consists of the history words (as null-terminated + * strings) of the N-Gram, in reverse order, followed by NULL. + * Therefore, if you wanted to get the N-Gram score for "a whole joy", + * you would call: + * + *
+ *  score = ngram_score(model, "joy", "whole", "a", NULL);
+ * 
+ * + * This is not the function to use in decoding, because it has some + * overhead for looking up words. Use ngram_ng_score(), + * ngram_tg_score(), or ngram_bg_score() instead. In the future there + * will probably be a version that takes a general language model + * state object, to support suffix-array LM and things like that. + * + * If one of the words is not in the LM's vocabulary, the result will + * depend on whether this is an open or closed vocabulary language + * model. For an open-vocabulary model, unknown words are all mapped + * to the unigram <UNK> which has a non-zero probability and also + * participates in higher-order N-Grams. Therefore, you will get a + * score of some sort in this case. + * + * For a closed-vocabulary model, unknown words are impossible and + * thus have zero probability. Therefore, if word is + * unknown, this function will return a "zero" log-probability, i.e. a + * large negative number. To obtain this number for comparison, call + * ngram_zero(). + */ +SPHINXBASE_EXPORT +int32 ngram_score(ngram_model_t *model, const char *word, ...); + +/** + * Quick trigram score lookup. + */ +SPHINXBASE_EXPORT +int32 ngram_tg_score(ngram_model_t *model, + int32 w3, int32 w2, int32 w1, + int32 *n_used); + +/** + * Quick bigram score lookup. + */ +SPHINXBASE_EXPORT +int32 ngram_bg_score(ngram_model_t *model, + int32 w2, int32 w1, + int32 *n_used); + +/** + * Quick general N-Gram score lookup. + */ +SPHINXBASE_EXPORT +int32 ngram_ng_score(ngram_model_t *model, int32 wid, int32 *history, + int32 n_hist, int32 *n_used); + +/** + * Get the "raw" log-probability for a general N-Gram. + * + * This returns the log-probability of an N-Gram, as defined in the + * language model file, before any language weighting, interpolation, + * or insertion penalty has been applied. + * + * @note When backing off to a unigram from a bigram or trigram, the + * unigram weight (interpolation with uniform) is not removed. + */ +SPHINXBASE_EXPORT +int32 ngram_probv(ngram_model_t *model, const char *word, ...); + +/** + * Get the "raw" log-probability for a general N-Gram. + * + * This returns the log-probability of an N-Gram, as defined in the + * language model file, before any language weighting, interpolation, + * or insertion penalty has been applied. + * + * @note When backing off to a unigram from a bigram or trigram, the + * unigram weight (interpolation with uniform) is not removed. + */ +SPHINXBASE_EXPORT +int32 ngram_prob(ngram_model_t *model, const char* const *words, int32 n); + +/** + * Quick "raw" probability lookup for a general N-Gram. + * + * See documentation for ngram_ng_score() and ngram_apply_weights() + * for an explanation of this. + */ +SPHINXBASE_EXPORT +int32 ngram_ng_prob(ngram_model_t *model, int32 wid, int32 *history, + int32 n_hist, int32 *n_used); + +/** + * Convert score to "raw" log-probability. + * + * @note The unigram weight (interpolation with uniform) is not + * removed, since there is no way to know which order of N-Gram + * generated score. + * + * @param model The N-Gram model from which score was obtained. + * @param score The N-Gram score to convert + * @return The raw log-probability value. + */ +SPHINXBASE_EXPORT +int32 ngram_score_to_prob(ngram_model_t *model, int32 score); + +/** + * Look up numerical word ID. + */ +SPHINXBASE_EXPORT +int32 ngram_wid(ngram_model_t *model, const char *word); + +/** + * Look up word string for numerical word ID. + */ +SPHINXBASE_EXPORT +const char *ngram_word(ngram_model_t *model, int32 wid); + +/** + * Get the unknown word ID for a language model. + * + * Language models can be either "open vocabulary" or "closed + * vocabulary". The difference is that the former assigns a fixed + * non-zero unigram probability to unknown words, while the latter + * does not allow unknown words (or, equivalently, it assigns them + * zero probability). If this is a closed vocabulary model, this + * function will return NGRAM_INVALID_WID. + * + * @return The ID for the unknown word, or NGRAM_INVALID_WID if none + * exists. + */ +SPHINXBASE_EXPORT +int32 ngram_unknown_wid(ngram_model_t *model); + +/** + * Get the "zero" log-probability value for a language model. + */ +SPHINXBASE_EXPORT +int32 ngram_zero(ngram_model_t *model); + +/** + * Get the order of the N-gram model (i.e. the "N" in "N-gram") + */ +SPHINXBASE_EXPORT +int32 ngram_model_get_size(ngram_model_t *model); + +/** + * Get the counts of the various N-grams in the model. + */ +SPHINXBASE_EXPORT +uint32 const *ngram_model_get_counts(ngram_model_t *model); + +/** + * M-gram iterator object. + */ +typedef struct ngram_iter_s ngram_iter_t; + +/** + * Iterate over all M-grams. + * + * @param model Language model to query. + * @param m Order of the M-Grams requested minus one (i.e. order of the history) + * @return An iterator over the requested M, or NULL if no N-grams of + * order M+1 exist. + */ +SPHINXBASE_EXPORT +ngram_iter_t *ngram_model_mgrams(ngram_model_t *model, int m); + +/** + * Get an iterator over M-grams pointing to the specified M-gram. + */ +SPHINXBASE_EXPORT +ngram_iter_t *ngram_iter(ngram_model_t *model, const char *word, ...); + +/** + * Get an iterator over M-grams pointing to the specified M-gram. + */ +SPHINXBASE_EXPORT +ngram_iter_t *ngram_ng_iter(ngram_model_t *model, int32 wid, int32 *history, int32 n_hist); + +/** + * Get information from the current M-gram in an iterator. + * + * @param out_score Output: Score for this M-gram (including any word + * penalty and language weight). + * @param out_bowt Output: Backoff weight for this M-gram. + * @return read-only array of word IDs. + */ +SPHINXBASE_EXPORT +int32 const *ngram_iter_get(ngram_iter_t *itor, + int32 *out_score, + int32 *out_bowt); + +/** + * Iterate over all M-gram successors of an M-1-gram. + * + * @param itor Iterator pointing to the M-1-gram to get successors of. + */ +SPHINXBASE_EXPORT +ngram_iter_t *ngram_iter_successors(ngram_iter_t *itor); + +/** + * Advance an M-gram iterator. + */ +SPHINXBASE_EXPORT +ngram_iter_t *ngram_iter_next(ngram_iter_t *itor); + +/** + * Terminate an M-gram iterator. + */ +SPHINXBASE_EXPORT +void ngram_iter_free(ngram_iter_t *itor); + +/** + * Add a word (unigram) to the language model. + * + * @note The semantics of this are not particularly well-defined for + * model sets, and may be subject to change. Currently this will add + * the word to all of the submodels + * + * @param model The model to add a word to. + * @param word Text of the word to add. + * @param weight Weight of this word relative to the uniform distribution. + * @return The word ID for the new word. + */ +SPHINXBASE_EXPORT +int32 ngram_model_add_word(ngram_model_t *model, + const char *word, float32 weight); + +/** + * Read a class definition file and add classes to a language model. + * + * This function assumes that the class tags have already been defined + * as unigrams in the language model. All words in the class + * definition will be added to the vocabulary as special in-class words. + * For this reason is is necessary that they not have the same names + * as any words in the general unigram distribution. The convention + * is to suffix them with ":class_tag", where class_tag is the class + * tag minus the enclosing square brackets. + * + * @return 0 for success, <0 for error + */ +SPHINXBASE_EXPORT +int32 ngram_model_read_classdef(ngram_model_t *model, + const char *file_name); + +/** + * Add a new class to a language model. + * + * If classname already exists in the unigram set for + * model, then it will be converted to a class tag, and + * classweight will be ignored. Otherwise, a new unigram + * will be created as in ngram_model_add_word(). + */ +SPHINXBASE_EXPORT +int32 ngram_model_add_class(ngram_model_t *model, + const char *classname, + float32 classweight, + char **words, + const float32 *weights, + int32 n_words); + +/** + * Add a word to a class in a language model. + * + * @param model The model to add a word to. + * @param classname Name of the class to add this word to. + * @param word Text of the word to add. + * @param weight Weight of this word relative to the within-class uniform distribution. + * @return The word ID for the new word. + */ +SPHINXBASE_EXPORT +int32 ngram_model_add_class_word(ngram_model_t *model, + const char *classname, + const char *word, + float32 weight); + +/** + * Create a set of language models sharing a common space of word IDs. + * + * This function creates a meta-language model which groups together a + * set of language models, synchronizing word IDs between them. To + * use this language model, you can either select a submodel to use + * exclusively using ngram_model_set_select(), or interpolate + * between scores from all models. To do the latter, you can either + * pass a non-NULL value of the weights parameter, or + * re-activate interpolation later on by calling + * ngram_model_set_interp(). + * + * In order to make this efficient, there are some restrictions on the + * models that can be grouped together. The most important (and + * currently the only) one is that they must all + * share the same log-math parameters. + * + * @param config Any configuration parameters to be shared between models. + * @param models Array of pointers to previously created language models. + * @param names Array of strings to use as unique identifiers for LMs. + * @param weights Array of weights to use in interpolating LMs, or NULL + * for no interpolation. + * @param n_models Number of elements in the arrays passed to this function. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_init(cmd_ln_t *config, + ngram_model_t **models, + char **names, + const float32 *weights, + int32 n_models); + +/** + * Read a set of language models from a control file. + * + * This file creates a language model set from a "control file" of + * the type used in Sphinx-II and Sphinx-III. + * File format (optional stuff is indicated by enclosing in []): + * + *
+ *   [{ LMClassFileName LMClassFilename ... }]
+ *   TrigramLMFileName LMName [{ LMClassName LMClassName ... }]
+ *   TrigramLMFileName LMName [{ LMClassName LMClassName ... }]
+ *   ...
+ * (There should be whitespace around the { and } delimiters.)
+ * 
+ * + * This is an extension of the older format that had only TrigramLMFilenName + * and LMName pairs. The new format allows a set of LMClass files to be read + * in and referred to by the trigram LMs. + * + * No "comments" allowed in this file. + * + * @param config Configuration parameters. + * @param lmctlfile Path to the language model control file. + * @param lmath Log-math parameters to use for probability + * calculations. Ownership of this object is assumed by + * the newly created ngram_model_t, and you should not + * attempt to free it manually. If you wish to reuse it + * elsewhere, you must retain it with logmath_retain(). + * @return newly created language model set. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_read(cmd_ln_t *config, + const char *lmctlfile, + logmath_t *lmath); + +/** + * Returns the number of language models in a set. + */ +SPHINXBASE_EXPORT +int32 ngram_model_set_count(ngram_model_t *set); + +/** + * Iterator over language models in a set. + */ +typedef struct ngram_model_set_iter_s ngram_model_set_iter_t; + +/** + * Begin iterating over language models in a set. + * + * @return iterator pointing to the first language model, or NULL if no models remain. + */ +SPHINXBASE_EXPORT +ngram_model_set_iter_t *ngram_model_set_iter(ngram_model_t *set); + +/** + * Move to the next language model in a set. + * + * @return iterator pointing to the next language model, or NULL if no models remain. + */ +SPHINXBASE_EXPORT +ngram_model_set_iter_t *ngram_model_set_iter_next(ngram_model_set_iter_t *itor); + +/** + * Finish iteration over a langauge model set. + */ +SPHINXBASE_EXPORT +void ngram_model_set_iter_free(ngram_model_set_iter_t *itor); + +/** + * Get language model and associated name from an iterator. + * + * @param itor the iterator + * @param lmname Output: string name associated with this language model. + * @return Language model pointed to by this iterator. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_iter_model(ngram_model_set_iter_t *itor, + char const **lmname); + +/** + * Select a single language model from a set for scoring. + * + * @return the newly selected language model, or NULL if no language + * model by that name exists. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_select(ngram_model_t *set, + const char *name); + +/** + * Look up a language model by name from a set. + * + * @return language model corresponding to name, or NULL + * if no language model by that name exists. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_lookup(ngram_model_t *set, + const char *name); + +/** + * Get the current language model name, if any. + */ +SPHINXBASE_EXPORT +const char *ngram_model_set_current(ngram_model_t *set); + +/** + * Set interpolation weights for a set and enables interpolation. + * + * If weights is NULL, any previously initialized set of + * weights will be used. If no weights were specified to + * ngram_model_set_init(), then a uniform distribution will be used. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_interp(ngram_model_t *set, + const char **names, + const float32 *weights); + +/** + * Add a language model to a set. + * + * @param set The language model set to add to. + * @param model The language model to add. + * @param name The name to associate with this model. + * @param weight Interpolation weight for this model, relative to the + * uniform distribution. 1.0 is a safe value. + * @param reuse_widmap Reuse the existing word-ID mapping in + * set. Any new words present in model + * will not be added to the word-ID mapping in this case. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_add(ngram_model_t *set, + ngram_model_t *model, + const char *name, + float32 weight, + int reuse_widmap); + +/** + * Remove a language model from a set. + * + * @param set The language model set to remove from. + * @param name The name associated with the model to remove. + * @param reuse_widmap Reuse the existing word-ID mapping in + * set. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_remove(ngram_model_t *set, + const char *name, + int reuse_widmap); + +/** + * Set the word-to-ID mapping for this model set. + */ +SPHINXBASE_EXPORT +void ngram_model_set_map_words(ngram_model_t *set, + const char **words, + int32 n_words); + +/** + * Query the word-ID mapping for the current language model. + * + * @return the local word ID in the current language model, or + * NGRAM_INVALID_WID if set_wid is invalid or + * interpolation is enabled. + */ +SPHINXBASE_EXPORT +int32 ngram_model_set_current_wid(ngram_model_t *set, + int32 set_wid); + +/** + * Test whether a word ID corresponds to a known word in the current + * state of the language model set. + * + * @return If there is a current language model, returns non-zero if + * set_wid corresponds to a known word in that language + * model. Otherwise, returns non-zero if set_wid + * corresponds to a known word in any language model. + */ +SPHINXBASE_EXPORT +int32 ngram_model_set_known_wid(ngram_model_t *set, int32 set_wid); + +/** + * Flush any cached N-Gram information + */ +SPHINXBASE_EXPORT +void ngram_model_flush(ngram_model_t *lm); + +#ifdef __cplusplus +} +#endif + + +#endif /* __NGRAM_MODEL_H__ */ diff --git a/include/sphinxbase/pio.h b/include/sphinxbase/pio.h new file mode 100644 index 000000000..fe094a60b --- /dev/null +++ b/include/sphinxbase/pio.h @@ -0,0 +1,302 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * pio.h -- Packaged I/O routines. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: pio.h,v $ + * Revision 1.3 2005/06/22 08:00:09 arthchan2003 + * Completed all doxygen documentation on file description for libs3decoder/libutil/libs3audio and programs. + * + * Revision 1.2 2005/06/22 03:09:52 arthchan2003 + * 1, Fixed doxygen documentation, 2, Added keyword. + * + * Revision 1.2 2005/06/16 00:14:08 archan + * Added const keyword to file argument for file_open + * + * Revision 1.1 2005/06/15 06:11:03 archan + * sphinx3 to s3.generic: change io.[ch] to pio.[ch] + * + * Revision 1.5 2005/06/15 04:21:46 archan + * 1, Fixed doxygen-documentation, 2, Add keyword such that changes will be logged into a file. + * + * Revision 1.4 2005/04/20 03:49:32 archan + * Add const to string argument of myfopen. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 08-Dec-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added stat_mtime(). + * + * 11-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added _myfopen() and myfopen macro. + * + * 05-Sep-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started. + */ + + +#ifndef _LIBUTIL_IO_H_ +#define _LIBUTIL_IO_H_ + +#include +#if !defined(_WIN32_WCE) && !(defined(__ADSPBLACKFIN__) && !defined(__linux__)) +#include +#endif + +/* Win32/WinCE DLL gunk */ +#include +#include + +/** \file pio.h + * \brief file IO related operations. + * + * Custom fopen with error checking is implemented. fopen_comp can + * open a file with .z, .Z, .gz or .GZ extension + * + * WARNING: Usage of stat_retry will results in 100s of waiting time + * if the file doesn't exist. +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Like fopen, but use popen and zcat if it is determined that "file" is compressed + * (i.e., has a .z, .Z, .gz, or .GZ extension). + */ +SPHINXBASE_EXPORT +FILE *fopen_comp (const char *file, /**< In: File to be opened */ + const char *mode, /**< In: "r" or "w", as with normal fopen */ + int32 *ispipe /**< Out: On return *ispipe is TRUE iff file + was opened via a pipe */ + ); + +/** + * Close a file opened using fopen_comp. + */ +SPHINXBASE_EXPORT +void fclose_comp (FILE *fp, /**< In: File pointer to be closed */ + int32 ispipe /**< In: ispipe argument that was returned by the + corresponding fopen_comp() call */ + ); + +/** + * Open a file for reading, but if file not present try to open compressed version (if + * file is uncompressed, and vice versa). + */ +SPHINXBASE_EXPORT +FILE *fopen_compchk (const char *file, /**< In: File to be opened */ + int32 *ispipe /**< Out: On return *ispipe is TRUE iff file + was opened via a pipe */ + ); + +/** + * Wrapper around fopen to check for failure and E_FATAL if failed. + */ +SPHINXBASE_EXPORT +FILE *_myfopen(const char *file, const char *mode, + const char *pgm, int32 line); /* In: __FILE__, __LINE__ from where called */ +#define myfopen(file,mode) _myfopen((file),(mode),__FILE__,__LINE__) + + +/** + * NFS file reads seem to fail now and then. Use the following functions in place of + * the regular fread. It retries failed freads several times and quits only if all of + * them fail. Be aware, however, that even normal failures such as attempting to read + * beyond EOF will trigger such retries, wasting about a minute in retries. + * Arguments identical to regular fread. + */ +SPHINXBASE_EXPORT +int32 fread_retry(void *pointer, int32 size, int32 num_items, FILE *stream); + +/** + * Read a line of arbitrary length from a file and return it as a + * newly allocated string. + * + * @deprecated Use line iterators instead. + * + * @param stream The file handle to read from. + * @param out_len Output: if not NULL, length of the string read. + * @return allocated string containing the line, or NULL on error or EOF. + */ +SPHINXBASE_EXPORT +char *fread_line(FILE *stream, size_t *out_len); + +/** + * Line iterator for files. + */ +typedef struct lineiter_t { + char *buf; + FILE *fh; + int32 bsiz; + int32 len; + int32 clean; + int32 lineno; +} lineiter_t; + +/** + * Start reading lines from a file. + */ +SPHINXBASE_EXPORT +lineiter_t *lineiter_start(FILE *fh); + +/** + * Start reading lines from a file, skip comments and trim lines. + */ +SPHINXBASE_EXPORT +lineiter_t *lineiter_start_clean(FILE *fh); + +/** + * Move to the next line in the file. + */ +SPHINXBASE_EXPORT +lineiter_t *lineiter_next(lineiter_t *li); + +/** + * Stop reading lines from a file. + */ +SPHINXBASE_EXPORT +void lineiter_free(lineiter_t *li); + +/** + * Returns current line number. + */ +SPHINXBASE_EXPORT +int lineiter_lineno(lineiter_t *li); + + +#ifdef _WIN32_WCE +/* Fake this for WinCE which has no stat() */ +#include +struct stat { + DWORD st_mtime; + DWORD st_size; +}; +#endif /* _WIN32_WCE */ + +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) +struct stat { + int32 st_mtime; + int32 st_size; +}; + +#endif + +/** + * Bitstream encoder - for writing compressed files. + */ +typedef struct bit_encode_s bit_encode_t; + +/** + * Attach bitstream encoder to a file. + */ +bit_encode_t *bit_encode_attach(FILE *outfh); + +/** + * Retain pointer to a bit encoder. + */ +bit_encode_t *bit_encode_retain(bit_encode_t *be); + +/** + * Release pointer to a bit encoder. + * + * Note that this does NOT flush any leftover bits. + */ +int bit_encode_free(bit_encode_t *be); + +/** + * Write bits to encoder. + */ +int bit_encode_write(bit_encode_t *be, unsigned char const *bits, int nbits); + +/** + * Write lowest-order bits of codeword to encoder. + */ +int bit_encode_write_cw(bit_encode_t *be, uint32 codeword, int nbits); + +/** + * Flush any unwritten bits, zero-padding if necessary. + */ +int bit_encode_flush(bit_encode_t *be); + +/** + * There is no bitstream decoder, because a stream abstraction is too + * slow. Instead we read blocks of bits and treat them as bitvectors. + */ + +/** + * Like fread_retry, but for stat. Arguments identical to regular stat. + * Return value: 0 if successful, -1 if stat failed several attempts. + */ +SPHINXBASE_EXPORT +int32 stat_retry (const char *file, struct stat *statbuf); + +/** + * Return time of last modification for the given file, or -1 if stat fails. + */ + +SPHINXBASE_EXPORT +int32 stat_mtime (const char *file); + +/** + * Create a directory and all of its parent directories, as needed. + * + * @return 0 on success, <0 on failure. + */ +SPHINXBASE_EXPORT +int build_directory(const char *path); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/prim_type.h b/include/sphinxbase/prim_type.h new file mode 100644 index 000000000..820fe968f --- /dev/null +++ b/include/sphinxbase/prim_type.h @@ -0,0 +1,183 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * prim_type.h -- Primitive types; more machine-independent. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: prim_type.h,v $ + * Revision 1.12 2005/10/05 00:31:14 dhdfu + * Make int8 be explicitly signed (signedness of 'char' is + * architecture-dependent). Then make a bunch of things use uint8 where + * signedness is unimportant, because on the architecture where 'char' is + * unsigned, it is that way for a reason (signed chars are slower). + * + * Revision 1.11 2005/06/22 03:10:23 arthchan2003 + * Added keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 12-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added arraysize_t, point_t, fpoint_t. + * + * 01-Feb-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added anytype_t. + * + * 08-31-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +#ifndef _LIBUTIL_PRIM_TYPE_H_ +#define _LIBUTIL_PRIM_TYPE_H_ + +/** + * @file prim_type.h + * @brief Basic type definitions used in Sphinx. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} /* Fool Emacs into not indenting things. */ +#endif + +#include + +/* Define some things for VisualDSP++ */ +#if defined(__ADSPBLACKFIN__) && !defined(__GNUC__) +# ifndef HAVE_LONG_LONG +# define HAVE_LONG_LONG +# endif +# ifndef ssize_t +typedef signed int ssize_t; +# endif +# define SIZEOF_LONG_LONG 8 +# define __BIGSTACKVARIABLE__ static +#else /* Not VisualDSP++ */ +# define __BIGSTACKVARIABLE__ +#endif + +/** + * Union of basic types. + */ +typedef union anytype_s { + void *ptr; + long i; + unsigned long ui; + double fl; +} anytype_t; + +/* + * Assume P64 or LP64. If you need to port this to a DSP, let us know. + */ +typedef int int32; +typedef short int16; +typedef signed char int8; +typedef unsigned int uint32; +typedef unsigned short uint16; +typedef unsigned char uint8; +typedef float float32; +typedef double float64; +#if defined(_MSC_VER) +typedef __int64 int64; +typedef unsigned __int64 uint64; +#elif defined(HAVE_LONG_LONG) && (SIZEOF_LONG_LONG == 8) +typedef long long int64; +typedef unsigned long long uint64; +#else /* !HAVE_LONG_LONG && SIZEOF_LONG_LONG == 8 */ +typedef double int64; +typedef double uint64; +#endif /* !HAVE_LONG_LONG && SIZEOF_LONG_LONG == 8 */ + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void *)0 +#endif + +/* These really ought to come from , but not everybody has that. */ +/* Useful constants */ +#define MAX_INT32 ((int32) 0x7fffffff) +#define MAX_INT16 ((int16) 0x00007fff) +#define MAX_INT8 ((int8) 0x0000007f) + +#define MAX_NEG_INT32 ((int32) 0x80000000) +#define MAX_NEG_INT16 ((int16) 0xffff8000) +#define MAX_NEG_INT8 ((int8) 0xffffff80) + +#define MAX_UINT32 ((uint32) 0xffffffff) +#define MAX_UINT16 ((uint16) 0x0000ffff) +#define MAX_UINT8 ((uint8) 0x000000ff) + +/* The following are approximate; IEEE floating point standards might quibble! */ +#define MAX_POS_FLOAT32 3.4e+38f +#define MIN_POS_FLOAT32 1.2e-38f /* But not 0 */ +#define MAX_POS_FLOAT64 1.8e+307 +#define MIN_POS_FLOAT64 2.2e-308 + +#define MAX_IEEE_NORM_POS_FLOAT32 3.4e+38f +#define MIN_IEEE_NORM_POS_FLOAT32 1.2e-38f +#define MIN_IEEE_NORM_NEG_FLOAT32 -3.4e+38f +#define MAX_IEEE_NORM_POS_FLOAT64 1.8e+307 +#define MIN_IEEE_NORM_POS_FLOAT64 2.2e-308 +#define MIN_IEEE_NORM_NEG_FLOAT64 -1.8e+307 + +/* Will the following really work?? */ +#define MIN_NEG_FLOAT32 ((float32) (-MIN_POS_FLOAT32)) +#define MIN_NEG_FLOAT64 ((float64) (-MIN_POS_FLOAT64)) + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/priority_queue.h b/include/sphinxbase/priority_queue.h new file mode 100644 index 000000000..335bcda1e --- /dev/null +++ b/include/sphinxbase/priority_queue.h @@ -0,0 +1,45 @@ +#ifndef __PRIORITY_QUEUE_H__ +#define __PRIORITY_QUEUE_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Priority queue for max element tracking. + * The one expects heap here, but for current application + * (sorting of ngram entries one per order, i.e. maximum 10) + * i'll put just and array here, so each operation takes linear time. + * I swear to rework it some day! + * TODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODO!!!!! + */ + +typedef struct priority_queue_s priority_queue_t; + +SPHINXBASE_EXPORT +priority_queue_t* priority_queue_create(size_t len, int (*compare)(const void *a, const void *b)); + +SPHINXBASE_EXPORT +void* priority_queue_poll(priority_queue_t *queue); + +SPHINXBASE_EXPORT +void priority_queue_add(priority_queue_t *queue, void *element); + +SPHINXBASE_EXPORT +size_t priority_queue_size(priority_queue_t *queue); + +SPHINXBASE_EXPORT +void priority_queue_free(priority_queue_t *queue, void (*free_ptr)(void *a)); + +#ifdef __cplusplus +} +#endif + +#endif /* __PRIORITY_QUEUE_H__ */ \ No newline at end of file diff --git a/include/sphinxbase/profile.h b/include/sphinxbase/profile.h new file mode 100644 index 000000000..ddecfb6e8 --- /dev/null +++ b/include/sphinxbase/profile.h @@ -0,0 +1,231 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * profile.h -- For timing and event counting. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: profile.h,v $ + * Revision 1.10 2005/06/22 03:10:59 arthchan2003 + * 1, Fixed doxygen documentation, 2, Added keyword. + * + * Revision 1.5 2005/06/15 04:21:47 archan + * 1, Fixed doxygen-documentation, 2, Add keyword such that changes will be logged into a file. + * + * Revision 1.4 2005/04/25 19:22:48 archan + * Refactor out the code of rescoring from lexical tree. Potentially we want to turn off the rescoring if we need. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 11-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added ptmr_init(). + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created from earlier Sphinx-3 version. + */ + + +#ifndef _LIBUTIL_PROFILE_H_ +#define _LIBUTIL_PROFILE_H_ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} /* Fool Emacs into not indenting things. */ +#endif + +/** \file profile.h + * \brief Implementation of profiling, include counting , timing, cpu clock checking + * + * Currently, function host_endian is also in this function. It is + * not documented. + */ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + + +/** + * \struct pctr_t + * + * Generic event counter for profiling. User is responsible for allocating an array + * of the desired number. There should be a sentinel with name = NULL. + */ +typedef struct { + char *name; /**< Counter print name; NULL + terminates array of counters + Used by pctr_print_all */ + int32 count; /**< Counter value */ +} pctr_t; + +/** + * operations of pctr_t + */ + +/** + * Initialize a counter + * @return an initialized counter + */ +SPHINXBASE_EXPORT +pctr_t* pctr_new ( + char *name /**< The name of the counter */ + ); + +/** + * Reset a counter + */ + +SPHINXBASE_EXPORT +void pctr_reset (pctr_t *ctr /**< A pointer of a counter */ + ); + +/** + * Print a counter + */ +SPHINXBASE_EXPORT +void pctr_print(FILE *fp, /**< A file pointer */ + pctr_t *ctr /**< A pointer of a counter */ + ); + +/** + * Increment a counter + */ +SPHINXBASE_EXPORT +void pctr_increment (pctr_t *ctr, /**< A pointer of a counter */ + int32 inc /**< The increment of the counter */ + ); + +/** + Free the counter +*/ +SPHINXBASE_EXPORT +void pctr_free(pctr_t* ctr /**< A pointer of a counter */ + ); + + +/** + * \struct ptmr_t + * Generic timer structures and functions for coarse-grained performance measurements + * using standard system calls. + */ +typedef struct { + const char *name; /**< Timer print name; NULL terminates an array of timers. + Used by ptmr_print_all */ + float64 t_cpu; /**< CPU time accumulated since most recent reset op */ + float64 t_elapsed; /**< Elapsed time accumulated since most recent reset */ + float64 t_tot_cpu; /**< Total CPU time since creation */ + float64 t_tot_elapsed; /**< Total elapsed time since creation */ + float64 start_cpu; /**< ---- FOR INTERNAL USE ONLY ---- */ + float64 start_elapsed; /**< ---- FOR INTERNAL USE ONLY ---- */ +} ptmr_t; + + + +/** Start timing using tmr */ +SPHINXBASE_EXPORT +void ptmr_start (ptmr_t *tmr /**< The timer*/ + ); + +/** Stop timing and accumulate tmr->{t_cpu, t_elapsed, t_tot_cpu, t_tot_elapsed} */ +SPHINXBASE_EXPORT +void ptmr_stop (ptmr_t *tmr /**< The timer*/ + ); + +/** Reset tmr->{t_cpu, t_elapsed} to 0.0 */ +SPHINXBASE_EXPORT +void ptmr_reset (ptmr_t *tmr /**< The timer*/ + ); + +/** Reset tmr->{t_cpu, t_elapsed, t_tot_cpu, t_tot_elapsed} to 0.0 + */ +SPHINXBASE_EXPORT +void ptmr_init (ptmr_t *tmr /**< The timer*/ + ); + + +/** + * Reset t_cpu, t_elapsed of all timer modules in array tmr[] to 0.0. + * The array should be terminated with a sentinel with .name = NULL. + */ +SPHINXBASE_EXPORT +void ptmr_reset_all (ptmr_t *tmr /**< The timer*/ + ); + +/** + * Print t_cpu for all timer modules in tmr[], normalized by norm (i.e., t_cpu/norm). + * The array should be terminated with a sentinel with .name = NULL. + */ +SPHINXBASE_EXPORT +void ptmr_print_all (FILE *fp, /**< The file pointer */ + ptmr_t *tmr, /**< The timer*/ + float64 norm + ); + + +/** + * Return the processor clock speed (in MHz); only available on some machines (Alphas). + * The dummy argument can be any integer value. + */ +SPHINXBASE_EXPORT +int32 host_pclk (int32 dummy); + + +/* + * Check the native byte-ordering of the machine by writing a magic + * number to a temporary file and reading it back. * Return value: + * 0 if BIG-ENDIAN, 1 if LITTLE-ENDIAN, -1 if error. + */ +SPHINXBASE_EXPORT +int32 host_endian ( void ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sphinxbase/sbthread.h b/include/sphinxbase/sbthread.h new file mode 100644 index 000000000..9154dfe2b --- /dev/null +++ b/include/sphinxbase/sbthread.h @@ -0,0 +1,221 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file sbthread.h + * @brief Simple portable thread functions. + * @author David Huggins-Daines + **/ + +#ifndef __SBTHREAD_H__ +#define __SBTHREAD_H__ + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Thread object. + */ +typedef struct sbthread_s sbthread_t; + +/** + * Asynchronous message queue object. + */ +typedef struct sbmsgq_s sbmsgq_t; + +/** + * Mutex (critical section) object. + */ +typedef struct sbmtx_s sbmtx_t; + +/** + * Event object. + */ +typedef struct sbevent_s sbevent_t; + +/** + * Entry point for a thread. + */ +typedef int (*sbthread_main)(sbthread_t *th); + +/** + * Start a new thread. + */ +SPHINXBASE_EXPORT +sbthread_t *sbthread_start(cmd_ln_t *config, sbthread_main func, void *arg); + +/** + * Wait for a thread to complete. + */ +SPHINXBASE_EXPORT +int sbthread_wait(sbthread_t *th); + +/** + * Free a thread object. + */ +SPHINXBASE_EXPORT +void sbthread_free(sbthread_t *th); + +/** + * Get configuration object from a thread. + */ +SPHINXBASE_EXPORT +cmd_ln_t *sbthread_config(sbthread_t *th); + +/** + * Get argument pointer from a thread. + */ +SPHINXBASE_EXPORT +void *sbthread_arg(sbthread_t *th); + +/** + * Get message queue from a thread. + */ +SPHINXBASE_EXPORT +sbmsgq_t *sbthread_msgq(sbthread_t *th); + +/** + * Wait for a thread to complete. + */ +SPHINXBASE_EXPORT +int sbthread_wait(sbthread_t *th); + +/** + * Send an asynchronous message to a thread. + * + * Each thread gets a message queue by default, so this is just a + * wrapper around sbmsgq_send(). + */ +SPHINXBASE_EXPORT +int sbthread_send(sbthread_t *th, size_t len, void const *data); + +/** + * Create a message queue. + * + * @param depth Depth of the queue. + */ +SPHINXBASE_EXPORT +sbmsgq_t *sbmsgq_init(size_t depth); + +/** + * Free a message queue. + */ +SPHINXBASE_EXPORT +void sbmsgq_free(sbmsgq_t *q); + +/** + * Post a message to a queue. + */ +SPHINXBASE_EXPORT +int sbmsgq_send(sbmsgq_t *q, size_t len, void const *data); + +/** + * Wait for a message from a queue. + */ +SPHINXBASE_EXPORT +void *sbmsgq_wait(sbmsgq_t *q, size_t *out_len, int sec, int nsec); + +/** + * Create a mutex. + */ +SPHINXBASE_EXPORT +sbmtx_t *sbmtx_init(void); + +/** + * Try to acquire a mutex. + */ +SPHINXBASE_EXPORT +int sbmtx_trylock(sbmtx_t *mtx); + +/** + * Acquire a mutex. + */ +SPHINXBASE_EXPORT +int sbmtx_lock(sbmtx_t *mtx); + +/** + * Release a mutex. + */ +SPHINXBASE_EXPORT +int sbmtx_unlock(sbmtx_t *mtx); + +/** + * Dispose of a mutex. + */ +SPHINXBASE_EXPORT +void sbmtx_free(sbmtx_t *mtx); + +/** + * Initialize an event. + */ +SPHINXBASE_EXPORT +sbevent_t *sbevent_init(void); + +/** + * Free an event. + */ +SPHINXBASE_EXPORT +void sbevent_free(sbevent_t *evt); + +/** + * Signal an event. + */ +SPHINXBASE_EXPORT +int sbevent_signal(sbevent_t *evt); + +/** + * Wait for an event to be signalled. + */ +SPHINXBASE_EXPORT +int sbevent_wait(sbevent_t *evt, int sec, int nsec); + + +#ifdef __cplusplus +} +#endif + + +#endif /* __SBTHREAD_H__ */ diff --git a/include/sphinxbase/sphinxbase_export.h b/include/sphinxbase/sphinxbase_export.h new file mode 100644 index 000000000..4022ed7fd --- /dev/null +++ b/include/sphinxbase/sphinxbase_export.h @@ -0,0 +1,15 @@ +#ifndef __SPHINXBASE_EXPORT_H__ +#define __SPHINXBASE_EXPORT_H__ + +/* Win32 DLL gunk */ +#if defined(_WIN32) && defined(SPHINX_DLL) +#if defined(SPHINXBASE_EXPORTS) /* DLL itself */ +#define SPHINXBASE_EXPORT __declspec(dllexport) +#else +#define SPHINXBASE_EXPORT __declspec(dllimport) +#endif +#else /* No DLL things*/ +#define SPHINXBASE_EXPORT +#endif + +#endif /* __SPHINXBASE_EXPORT_H__ */ diff --git a/include/sphinxbase/strfuncs.h b/include/sphinxbase/strfuncs.h new file mode 100644 index 000000000..392f1ca22 --- /dev/null +++ b/include/sphinxbase/strfuncs.h @@ -0,0 +1,158 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1995-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file strfuncs.h + * @brief Miscellaneous useful string functions + */ + +#ifndef __SB_STRFUNCS_H__ +#define __SB_STRFUNCS_H__ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Concatenate a NULL-terminated argument list of strings, returning a + * newly allocated string. + **/ +SPHINXBASE_EXPORT +char *string_join(const char *base, ...); + +/** + * Which end of a string to operate on for string_trim(). + */ +enum string_edge_e { + STRING_START, /**< Beginning of string. */ + STRING_END, /**< End of string. */ + STRING_BOTH /**< Both ends of string. */ +}; + +/** + * Remove whitespace from a string, modifying it in-place. + * + * @param string string to trim, contents will be modified. + * @param which one of STRING_START, STRING_END, or STRING_BOTH. + */ +SPHINXBASE_EXPORT +char *string_trim(char *string, enum string_edge_e which); + +/** + * Locale independent version of atof(). + * + * This function behaves like atof() in the "C" locale. Switching + * locale in a threaded program is extremely uncool, therefore we need + * this since we pass floats as strings in 1000 different places. + */ +SPHINXBASE_EXPORT +double atof_c(char const *str); + +/* FIXME: Both of these string splitting functions basically suck. I + have attempted to fix them as best I can. (dhuggins@cs, 20070808) */ + +/** + * Convert a line to an array of "words", based on whitespace separators. A word + * is a string with no whitespace chars in it. + * Note that the string line is modified as a result: NULL chars are placed after + * every word in the line. + * Return value: No. of words found; -1 if no. of words in line exceeds n_wptr. + */ +SPHINXBASE_EXPORT +int32 str2words (char *line, /**< In/Out: line to be parsed. This + string will be modified! (NUL + characters inserted at word + boundaries) */ + char **wptr, /**< In/Out: Array of pointers to + words found in line. The array + must be allocated by the caller. + It may be NULL in which case the + number of words will be counted. + This allows you to allcate it to + the proper size, e.g.: + + n = str2words(line, NULL, 0); + wptr = ckd_calloc(n, sizeof(*wptr)); + str2words(line, wptr, n); + */ + int32 n_wptr /**< In: Size of wptr array, ignored + if wptr == NULL */ + ); + +/** + * Yet another attempt at a clean "next-word-in-string" function. See arguments below. + * @return Length of word returned, or -1 if nothing found. + * This allows you to scan through a line: + * + *
+ * while ((n = nextword(line, delim, &word, &delimfound)) >= 0) {
+ *     ... do something with word ..
+ *     word[n] = delimfound;
+ *     line = word + n;
+ * }
+ * 
+ */ +SPHINXBASE_EXPORT +int32 nextword (char *line, /**< Input: String being searched for next word. + Will be modified by this function (NUL characters inserted) */ + const char *delim, /**< Input: A word, if found, must be delimited at either + end by a character from this string (or at the end + by the NULL char) */ + char **word,/**< Output: *word = ptr within line to beginning of first + word, if found. Delimiter at the end of word replaced + with the NULL char. */ + char *delimfound /**< Output: *delimfound = original delimiter found at the end + of the word. (This way, the caller can restore the + delimiter, preserving the original string.) */ + ); + +#ifdef __cplusplus +} +#endif + + +#endif /* __SB_STRFUNCS_H__ */ diff --git a/include/sphinxbase/yin.h b/include/sphinxbase/yin.h new file mode 100644 index 000000000..d93b94559 --- /dev/null +++ b/include/sphinxbase/yin.h @@ -0,0 +1,116 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + * Copyright (c) 2008 Beyond Access, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY BEYOND ACCESS, INC. ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BEYOND ACCESS, INC. NOR + * ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file yin.h + * @brief Implementation of pitch estimation + * @author David Huggins-Daines + * + * This implements part of the YIN algorithm: + * + * "YIN, a fundamental frequency estimator for speech and music". + * Alain de Cheveigné and Hideki Kawahara. Journal of the Acoustical + * Society of America, 111 (4), April 2002. + */ + +#ifndef __YIN_H__ +#define __YIN_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} /* Fool Emacs. */ +#endif + +/* Win32/WinCE DLL gunk */ +#include +#include + +/** + * Frame-based moving-window pitch estimator. + */ +typedef struct yin_s yin_t; + +/** + * Initialize moving-window pitch estimation. + */ +SPHINXBASE_EXPORT +yin_t *yin_init(int frame_size, float search_threshold, + float search_range, int smooth_window); + +/** + * Free a moving-window pitch estimator. + */ +SPHINXBASE_EXPORT +void yin_free(yin_t *pe); + +/** + * Start processing an utterance. + */ +SPHINXBASE_EXPORT +void yin_start(yin_t *pe); + +/** + * Mark the end of an utterance. + */ +SPHINXBASE_EXPORT +void yin_end(yin_t *pe); + +/** + * Feed a frame of data to the pitch estimator. + * + * @param pe Pitch estimator. + * @param frame Frame of frame_size (see + * yin_init()) samples of audio data. + */ +SPHINXBASE_EXPORT +void yin_write(yin_t *pe, int16 const *frame); + +/** + * Read a raw estimated pitch value from the pitch estimator. + * + * @param pe Pitch estimator. + * @param out_period Output: an estimate of the period (*not* the pitch) + * of the signal in samples. + * @param out_bestdiff Output: the minimum normalized difference value + * associated with *out_pitch, in Q15 + * format (i.e. scaled by 32768). This can be + * interpreted as one minus the probability of voicing. + * @return Non-zero if enough data was avaliable to return a pitch + * estimate, zero otherwise. + */ +SPHINXBASE_EXPORT +int yin_read(yin_t *pe, uint16 *out_period, uint16 *out_bestdiff); + +#ifdef __cplusplus +} +#endif + +#endif /* __YIN_H__ */ diff --git a/include/win32/config.h b/include/win32/config.h new file mode 100644 index 000000000..0266542d0 --- /dev/null +++ b/include/win32/config.h @@ -0,0 +1,31 @@ +/* include/sphinx_config.h, defaults for Win32 */ +/* sphinx_config.h: Externally visible configuration parameters for + * SphinxBase. + */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Enable thread safety */ +#define ENABLE_THREADS + +/* Use fixed-point computation */ +/* #undef FIXED_POINT */ + +/* Enable matrix algebra with LAPACK */ +#define WITH_LAPACK 1 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* We don't have popen, but we do have _popen */ +/* #define HAVE_POPEN 1 */ + +/* We do have perror */ +#define HAVE_PERROR 1 + +/* We have sys/stat.h */ +#define HAVE_SYS_STAT_H 1 + +/* Extension for executables */ +#define EXEEXT ".exe" diff --git a/include/win32/sphinx_config.h b/include/win32/sphinx_config.h new file mode 100644 index 000000000..730a14ac4 --- /dev/null +++ b/include/win32/sphinx_config.h @@ -0,0 +1,13 @@ +/* include/sphinx_config.h, defaults for Win32 */ +/* sphinx_config.h: Externally visible configuration parameters for + * SphinxBase. + */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Use fixed-point computation */ +/* #undef FIXED_POINT */ + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 diff --git a/include/wince/assert.h b/include/wince/assert.h new file mode 100644 index 000000000..0a035893b --- /dev/null +++ b/include/wince/assert.h @@ -0,0 +1,6 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* A bogus for WinCE which sometimes doesn't have it. */ +#ifndef __ASSERT_H__ +#define __ASSERT_H__ +#define assert(x) if (!(x)) (*(int *)0=0); +#endif /* __ASSERT_H__ */ diff --git a/include/wince/config.h b/include/wince/config.h new file mode 100644 index 000000000..777b967d6 --- /dev/null +++ b/include/wince/config.h @@ -0,0 +1,3 @@ +/* Keep only one configuration file */ + +#include "sphinx_config.h" diff --git a/include/wince/errno.h b/include/wince/errno.h new file mode 100644 index 000000000..3a06b1506 --- /dev/null +++ b/include/wince/errno.h @@ -0,0 +1,94 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== +/********************************************************************* + * + * File: errno.h + * + * Description: functions and variables missing from Windows CE standard + * library + * + * Author: Silvio Moioli + * + *********************************************************************/ + +#ifndef __ERRNO_H__ +#define __ERRNO_H__ + +#ifdef __cplusplus +extern "C" extern int errno; +#else +extern int errno; +#endif + +#define EPERM 1 +#define ENOENT 2 +#define ESRCH 3 +#define EINTR 4 +#define EIO 5 +#define ENXIO 6 +#define E2BIG 7 +#define ENOEXEC 8 +#define EBADF 9 +#define ECHILD 10 +#define EAGAIN 11 +#define ENOMEM 12 +#define EACCES 13 +#define EFAULT 14 +#define EBUSY 16 +#define EEXIST 17 +#define EXDEV 18 +#define ENODEV 19 +#define ENOTDIR 20 +#define EISDIR 21 +#define EINVAL 22 +#define ENFILE 23 +#define EMFILE 24 +#define ENOTTY 25 +#define EFBIG 27 +#define ENOSPC 28 +#define ESPIPE 29 +#define EROFS 30 +#define EMLINK 31 +#define EPIPE 32 +#define EDOM 33 +#define ERANGE 34 +#define EDEADLK 36 +#define ENAMETOOLONG 38 +#define ENOLCK 39 +#define ENOSYS 40 +#define ENOTEMPTY 41 +#define EILSEQ 42 + +#endif /* __ERRNO_H__ */ diff --git a/include/wince/sphinx_config.h b/include/wince/sphinx_config.h new file mode 100644 index 000000000..181baf536 --- /dev/null +++ b/include/wince/sphinx_config.h @@ -0,0 +1,16 @@ +/* include/sphinx_config.h, defaults for Windows CE. */ +/* sphinx_config.h: Externally visible configuration parameters for + * SphinxBase. + */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Use fixed-point computation */ +/* #define FIXED_POINT 1 */ + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* Extension for executables */ +#define EXEEXT ".exe" diff --git a/src/libsphinxad/Makefile.am b/src/libsphinxad/Makefile.am new file mode 100644 index 000000000..612126ef0 --- /dev/null +++ b/src/libsphinxad/Makefile.am @@ -0,0 +1,31 @@ + +# libsphinxad: Audio Device interface for Sphinx + +lib_LTLIBRARIES = libsphinxad.la + +# Confusing libtool version info means: +# +libsphinxad_la_LDFLAGS = -version-info 3:0:0 + +libsphinxad_la_SOURCES = + +EXTRA_libsphinxad_la_SOURCES = \ + ad_base.c \ + ad_oss.c \ + ad_alsa.c \ + ad_pulse.c \ + ad_openal.c \ + ad_win32.c + +libsphinxad_la_DEPENDENCIES = @ad_files@ + +libsphinxad_la_LIBADD = \ + @ad_files@ \ + @ad_libs@ \ + $(top_builddir)/src/libsphinxbase/libsphinxbase.la + +AM_CFLAGS =\ + @ad_cppflags@ \ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include diff --git a/src/libsphinxad/ad_alsa.c b/src/libsphinxad/ad_alsa.c new file mode 100644 index 000000000..6521cb196 --- /dev/null +++ b/src/libsphinxad/ad_alsa.c @@ -0,0 +1,344 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* -*- mode:c; indent-tabs-mode:t; c-basic-offset:4; comment-column:40 -*- + * + * Sphinx II libad (Linux) + * ^^^^^^^^^^^^^^^^^^^^^^^ + * $Id: ad_alsa.c,v 1.6 2001/12/11 00:24:48 lenzo Exp $ + * + * John G. Dorsey (jd5q+@andrew.cmu.edu) + * Engineering Design Research Center + * Carnegie Mellon University + * *************************************************************************** + * + * REVISION HISTORY + * + * 18-Mar-2006 David Huggins-Daines + * Update this to the ALSA 1.0 API. + * + * 12-Dec-2000 David Huggins-Daines at Cepstral LLC + * Make this at least compile with the new ALSA API. + * + * 05-Nov-1999 Sean Levy (snl@stalphonsos.com) at St. Alphonsos, LLC. + * Ported to ALSA so I can actually get working full-duplex. + * + * 09-Aug-1999 Kevin Lenzo (lenzo@cs.cmu.edu) at Cernegie Mellon University. + * Incorporated nickr@cs.cmu.edu's changes (marked below) and + * SPS_EPSILON to allow for sample rates that are "close enough". + * + * 15-Jun-1999 M. K. Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon Univ. + * Consolidated all ad functions into + * this one file. Added ad_open_sps(). + * Other cosmetic changes for consistency (e.g., use of err.h). + * + * 18-May-1999 Kevin Lenzo (lenzo@cs.cmu.edu) added . + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "prim_type.h" +#include "ad.h" + +#define AUDIO_FORMAT SND_PCM_SFMT_S16_LE /* 16-bit signed, little endian */ +#define INPUT_GAIN 85 +#define SPS_EPSILON 200 + +#define DEFAULT_DEVICE "default" + +struct ad_rec_s { + snd_pcm_t *dspH; + int32 recording; + int32 sps; + int32 bps; +}; + +static int +setparams(int32 sps, snd_pcm_t * handle) +{ + snd_pcm_hw_params_t *hwparams; + unsigned int out_sps, buffer_time, period_time; + int err; + + snd_pcm_hw_params_alloca(&hwparams); + err = snd_pcm_hw_params_any(handle, hwparams); + if (err < 0) { + fprintf(stderr, "Can not configure this PCM device: %s\n", + snd_strerror(err)); + return -1; + } + + err = + snd_pcm_hw_params_set_access(handle, hwparams, + SND_PCM_ACCESS_RW_INTERLEAVED); + if (err < 0) { + fprintf(stderr, + "Failed to set PCM device to interleaved: %s\n", + snd_strerror(err)); + return -1; + } + + err = + snd_pcm_hw_params_set_format(handle, hwparams, SND_PCM_FORMAT_S16); + if (err < 0) { + fprintf(stderr, + "Failed to set PCM device to 16-bit signed PCM: %s\n", + snd_strerror(err)); + return -1; + } + + err = snd_pcm_hw_params_set_channels(handle, hwparams, 1); + if (err < 0) { + fprintf(stderr, "Failed to set PCM device to mono: %s\n", + snd_strerror(err)); + return -1; + } + + out_sps = sps; + err = + snd_pcm_hw_params_set_rate_near(handle, hwparams, &out_sps, NULL); + if (err < 0) { + fprintf(stderr, "Failed to set sampling rate: %s\n", + snd_strerror(err)); + return -1; + } + if (abs(out_sps - sps) > SPS_EPSILON) { + fprintf(stderr, + "Available samping rate %d is too far from requested %d\n", + out_sps, sps); + return -1; + } + + /* Set buffer time to the maximum. */ + err = snd_pcm_hw_params_get_buffer_time_max(hwparams, &buffer_time, 0); + period_time = buffer_time / 4; + err = snd_pcm_hw_params_set_period_time_near(handle, hwparams, + &period_time, 0); + if (err < 0) { + fprintf(stderr, "Failed to set period time to %u: %s\n", + period_time, snd_strerror(err)); + return -1; + } + err = snd_pcm_hw_params_set_buffer_time_near(handle, hwparams, + &buffer_time, 0); + if (err < 0) { + fprintf(stderr, "Failed to set buffer time to %u: %s\n", + buffer_time, snd_strerror(err)); + return -1; + } + + err = snd_pcm_hw_params(handle, hwparams); + if (err < 0) { + fprintf(stderr, "Failed to set hwparams: %s\n", snd_strerror(err)); + return -1; + } + + err = snd_pcm_nonblock(handle, 1); + if (err < 0) { + fprintf(stderr, "Failed to set non-blocking mode: %s\n", + snd_strerror(err)); + return -1; + } + return 0; +} + +ad_rec_t * +ad_open_dev(const char *dev, int32 sps) +{ + ad_rec_t *handle; + snd_pcm_t *dspH; + + int err; + + if (dev == NULL) + dev = DEFAULT_DEVICE; + + err = snd_pcm_open(&dspH, dev, SND_PCM_STREAM_CAPTURE, 0); + if (err < 0) { + fprintf(stderr, + "Error opening audio device %s for capture: %s\n", + dev, snd_strerror(err)); + return NULL; + } + + if (setparams(sps, dspH) < 0) { + return NULL; + } + if ((handle = (ad_rec_t *) calloc(1, sizeof(ad_rec_t))) == NULL) { + fprintf(stderr, "calloc(%d) failed\n", (int)sizeof(ad_rec_t)); + abort(); + } + + handle->dspH = dspH; + handle->recording = 0; + handle->sps = sps; + handle->bps = sizeof(int16); + + return (handle); +} + +ad_rec_t * +ad_open_sps(int32 sps) +{ + return ad_open_dev(DEFAULT_DEVICE, sps); +} + +ad_rec_t * +ad_open(void) +{ + return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); +} + + +int32 +ad_close(ad_rec_t * handle) +{ + if (handle->dspH == NULL) + return AD_ERR_NOT_OPEN; + + if (handle->recording) { + if (ad_stop_rec(handle) < 0) + return AD_ERR_GEN; + } + snd_pcm_close(handle->dspH); + free(handle); + + return (0); +} + + +int32 +ad_start_rec(ad_rec_t * handle) +{ + int err; + + if (handle->dspH == NULL) + return AD_ERR_NOT_OPEN; + + if (handle->recording) + return AD_ERR_GEN; + + err = snd_pcm_prepare(handle->dspH); + if (err < 0) { + fprintf(stderr, "snd_pcm_prepare failed: %s\n", snd_strerror(err)); + return AD_ERR_GEN; + } + err = snd_pcm_start(handle->dspH); + if (err < 0) { + fprintf(stderr, "snd_pcm_start failed: %s\n", snd_strerror(err)); + return AD_ERR_GEN; + } + handle->recording = 1; + + return (0); +} + + +int32 +ad_stop_rec(ad_rec_t * handle) +{ + int err; + + if (handle->dspH == NULL) + return AD_ERR_NOT_OPEN; + + if (!handle->recording) + return AD_ERR_GEN; + + err = snd_pcm_drop(handle->dspH); + if (err < 0) { + fprintf(stderr, "snd_pcm_drop failed: %s\n", snd_strerror(err)); + return AD_ERR_GEN; + } + handle->recording = 0; + + return (0); +} + + +int32 +ad_read(ad_rec_t * handle, int16 * buf, int32 max) +{ + int32 length, err; + + if (!handle->recording) { + fprintf(stderr, "Recording is stopped, start recording with ad_start_rec\n"); + return AD_EOF; + } + + length = snd_pcm_readi(handle->dspH, buf, max); + if (length == -EAGAIN) { + length = 0; + } + else if (length == -EPIPE) { + fprintf(stderr, "Input overrun, read calls are too rare (non-fatal)\n"); + err = snd_pcm_prepare(handle->dspH); + if (err < 0) { + fprintf(stderr, "Can't recover from underrun: %s\n", + snd_strerror(err)); + return AD_ERR_GEN; + } + length = 0; + } + else if (length == -ESTRPIPE) { + fprintf(stderr, "Resuming sound driver (non-fatal)\n"); + while ((err = snd_pcm_resume(handle->dspH)) == -EAGAIN) + usleep(10000); /* Wait for the driver to wake up */ + if (err < 0) { + err = snd_pcm_prepare(handle->dspH); + if (err < 0) { + fprintf(stderr, "Can't recover from underrun: %s\n", + snd_strerror(err)); + return AD_ERR_GEN; + } + } + length = 0; + } + else if (length < 0) { + fprintf(stderr, "Audio read error: %s\n", + snd_strerror(length)); + return AD_ERR_GEN; + } + return length; +} diff --git a/src/libsphinxad/ad_base.c b/src/libsphinxad/ad_base.c new file mode 100644 index 000000000..d248ccdbc --- /dev/null +++ b/src/libsphinxad/ad_base.c @@ -0,0 +1,110 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * ad.c -- Wraps a "sphinx-II standard" audio interface around the basic audio + * utilities. + * + * HISTORY + * + * 11-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Modified to conform to new A/D API. + * + * 12-May-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Dummy template created. + */ + +#include +#include +#include + +#include "prim_type.h" +#include "ad.h" + +struct ad_rec_s { + int32 sps; /**< Samples/sec */ + int32 bps; /**< Bytes/sample */ +}; + +ad_rec_t * +ad_open_dev(const char *dev, int32 samples_per_sec) +{ + fprintf(stderr, "A/D library not implemented\n"); + return NULL; +} + + +ad_rec_t * +ad_open_sps(int32 samples_per_sec) +{ + fprintf(stderr, "A/D library not implemented\n"); + return NULL; +} + +ad_rec_t * +ad_open(void) +{ + return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); +} + + +int32 +ad_start_rec(ad_rec_t * r) +{ + return -1; +} + + +int32 +ad_stop_rec(ad_rec_t * r) +{ + return -1; +} + + +int32 +ad_read(ad_rec_t * r, int16 * buf, int32 max) +{ + return -1; +} + + +int32 +ad_close(ad_rec_t * r) +{ + return 0; +} diff --git a/src/libsphinxad/ad_openal.c b/src/libsphinxad/ad_openal.c new file mode 100644 index 000000000..18fe0425c --- /dev/null +++ b/src/libsphinxad/ad_openal.c @@ -0,0 +1,128 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2014 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#include +#include +#include + +#include "ad.h" + +#include +#include + +struct ad_rec_s { + ALCdevice * device; +}; + +ad_rec_t * +ad_open_dev(const char * dev, int32 samples_per_sec) +{ + ad_rec_t * handle = malloc(sizeof(ad_rec_t)); + + if (handle == NULL) { + fprintf(stderr, "%s\n", "failed to allocate memory"); + abort(); + } + + handle -> device = alcCaptureOpenDevice(dev, samples_per_sec, AL_FORMAT_MONO16, samples_per_sec * 10); + + if (handle -> device == NULL) { + free(handle); + fprintf(stderr, "%s\n", "failed to open capture device"); + abort(); + } + + return handle; +} + + +ad_rec_t * +ad_open_sps(int32 samples_per_sec) +{ + return ad_open_dev(NULL, samples_per_sec); +} + +ad_rec_t * +ad_open(void) +{ + return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); +} + + +int32 +ad_start_rec(ad_rec_t * r) +{ + alcCaptureStart(r -> device); + return 0; +} + + +int32 +ad_stop_rec(ad_rec_t * r) +{ + alcCaptureStop(r -> device); + return 0; +} + + +int32 +ad_read(ad_rec_t * r, int16 * buf, int32 max) +{ + ALCint number; + + alcGetIntegerv(r -> device, ALC_CAPTURE_SAMPLES, sizeof(number), &number); + if (number >= 0) { + number = (number < max ? number : max); + alcCaptureSamples(r -> device, buf, number); + } + + return number; +} + + +int32 +ad_close(ad_rec_t * r) +{ + ALCboolean isClosed; + + isClosed = alcCaptureCloseDevice(r -> device); + + if (isClosed) { + return 0; + } else { + return -1; + } +} diff --git a/src/libsphinxad/ad_oss.c b/src/libsphinxad/ad_oss.c new file mode 100644 index 000000000..d3a936d97 --- /dev/null +++ b/src/libsphinxad/ad_oss.c @@ -0,0 +1,390 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* Sphinx II libad (Linux) + * ^^^^^^^^^^^^^^^^^^^^^^^ + * $Id: ad_oss.c,v 1.9 2004/07/16 00:57:12 egouvea Exp $ + * + * John G. Dorsey (jd5q+@andrew.cmu.edu) + * Engineering Design Research Center + * Carnegie Mellon University + * ******************************************************************** + * + * REVISION HISTORY + * + * 09-Aug-1999 Kevin Lenzo (lenzo@cs.cmu.edu) at Cernegie Mellon University. + * Incorporated nickr@cs.cmu.edu's changes (marked below) and + * SPS_EPSILON to allow for sample rates that are "close enough". + * + * 15-Jun-1999 M. K. Ravishankar (rkm@cs.cmu.edu) Consolidated all ad functions into + * this one file. Added ad_open_sps(). + * Other cosmetic changes for consistency (e.g., use of err.h). + * + * 18-May-1999 Kevin Lenzo (lenzo@cs.cmu.edu) added . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "prim_type.h" +#include "ad.h" + +#define AUDIO_FORMAT AFMT_S16_LE /* 16-bit signed, little endian */ +#define INPUT_GAIN (80) + +#define SPS_EPSILON 200 +#define SAMPLERATE_TOLERANCE 0.01 + +#define DEFAULT_DEVICE "/dev/dsp" + +/** \struct ad_rec_t + * \brief Audio recording structure. + */ +struct ad_rec_s { + int32 dspFD; /* Audio device descriptor */ + int32 recording; + int32 sps; /* Samples/sec */ + int32 bps; /* Bytes/sample */ +}; + +ad_rec_t * +ad_open_dev(const char *dev, int32 sps) +{ + ad_rec_t *handle; + int32 dspFD, mixerFD; + int32 nonBlocking = 1, sourceMic = SOUND_MASK_MIC, inputGain = + INPUT_GAIN, devMask = 0; + int32 audioFormat = AUDIO_FORMAT; + int32 dspCaps = 0; + int32 sampleRate; + int32 numberChannels = 1; + + sampleRate = sps; + + if (dev == NULL) + dev = DEFAULT_DEVICE; + + /* Used to have O_NDELAY. */ + if ((dspFD = open(dev, O_RDONLY)) < 0) { + if (errno == EBUSY) + fprintf(stderr, "%s(%d): Audio device(%s) busy\n", + __FILE__, __LINE__, dev); + else + fprintf(stderr, + "%s(%d): Failed to open audio device(%s): %s\n", + __FILE__, __LINE__, dev, strerror(errno)); + return NULL; + } + + if (ioctl(dspFD, SNDCTL_DSP_SYNC, 0) < 0) { + fprintf(stderr, "Audio ioctl(SYNC) failed: %s\n", strerror(errno)); + close(dspFD); + return NULL; + } + + if (ioctl(dspFD, SNDCTL_DSP_RESET, 0) < 0) { + fprintf(stderr, "Audio ioctl(RESET) failed: %s\n", + strerror(errno)); + close(dspFD); + return NULL; + } + + if (ioctl(dspFD, SNDCTL_DSP_SETFMT, &audioFormat) < 0) { + fprintf(stderr, "Audio ioctl(SETFMT 0x%x) failed: %s\n", + audioFormat, strerror(errno)); + close(dspFD); + return NULL; + } + if (audioFormat != AUDIO_FORMAT) { + fprintf(stderr, + "Audio ioctl(SETFMT): 0x%x, expected: 0x%x\n", + audioFormat, AUDIO_FORMAT); + close(dspFD); + return NULL; + } + + if (ioctl(dspFD, SNDCTL_DSP_SPEED, &sampleRate) < 0) { + fprintf(stderr, "Audio ioctl(SPEED %d) failed %s\n", + sampleRate, strerror(errno)); + close(dspFD); + return NULL; + } + if (sampleRate != sps) { + if (abs(sampleRate - sps) <= (sampleRate * SAMPLERATE_TOLERANCE)) { + fprintf(stderr, + "Audio ioctl(SPEED) not perfect, but is acceptable. " + "(Wanted %d, but got %d)\n", sampleRate, sps); + } + else { + fprintf(stderr, + "Audio ioctl(SPEED): %d, expected: %d\n", + sampleRate, sps); + close(dspFD); + return NULL; + } + } + + if (ioctl(dspFD, SNDCTL_DSP_CHANNELS, &numberChannels) < 0) { + fprintf(stderr, "Audio ioctl(CHANNELS %d) failed %s\n", + numberChannels, strerror(errno)); + close(dspFD); + return NULL; + } + + if (ioctl(dspFD, SNDCTL_DSP_NONBLOCK, &nonBlocking) < 0) { + fprintf(stderr, "ioctl(NONBLOCK) failed: %s\n", strerror(errno)); + close(dspFD); + return NULL; + } + + if (ioctl(dspFD, SNDCTL_DSP_GETCAPS, &dspCaps) < 0) { + fprintf(stderr, "ioctl(GETCAPS) failed: %s\n", strerror(errno)); + close(dspFD); + return NULL; + } +#if 0 + printf("DSP Revision %d:\n", dspCaps & DSP_CAP_REVISION); + printf("DSP %s duplex capability.\n", + (dspCaps & DSP_CAP_DUPLEX) ? "has" : "does not have"); + printf("DSP %s real time capability.\n", + (dspCaps & DSP_CAP_REALTIME) ? "has" : "does not have"); + printf("DSP %s batch capability.\n", + (dspCaps & DSP_CAP_BATCH) ? "has" : "does not have"); + printf("DSP %s coprocessor capability.\n", + (dspCaps & DSP_CAP_COPROC) ? "has" : "does not have"); + printf("DSP %s trigger capability.\n", + (dspCaps & DSP_CAP_TRIGGER) ? "has" : "does not have"); + printf("DSP %s memory map capability.\n", + (dspCaps & DSP_CAP_MMAP) ? "has" : "does not have"); +#endif + + if ((dspCaps & DSP_CAP_DUPLEX) + && (ioctl(dspFD, SNDCTL_DSP_SETDUPLEX, 0) < 0)) + fprintf(stderr, "ioctl(SETDUPLEX) failed: %s\n", strerror(errno)); + + /* Patched by N. Roy (nickr@ri.cmu.edu), 99/7/23. + Previously, mixer was set through dspFD. This is incorrect. Should + be set through mixerFD, /dev/mixer. + Also, only the left channel volume was being set. + */ + + if ((mixerFD = open("/dev/mixer", O_RDONLY)) < 0) { + if (errno == EBUSY) { + fprintf(stderr, "%s %d: mixer device busy.\n", + __FILE__, __LINE__); + fprintf(stderr, "%s %d: Using current setting.\n", + __FILE__, __LINE__); + } + else { + fprintf(stderr, "%s %d: %s\n", __FILE__, __LINE__, + strerror(errno)); + exit(1); + } + } + + if (mixerFD >= 0) { + if (ioctl(mixerFD, SOUND_MIXER_WRITE_RECSRC, &sourceMic) < 0) { + if (errno == ENXIO) + fprintf(stderr, + "%s %d: can't set mic source for this device.\n", + __FILE__, __LINE__); + else { + fprintf(stderr, + "%s %d: mixer set to mic: %s\n", + __FILE__, __LINE__, strerror(errno)); + exit(1); + } + } + + /* Set the same gain for left and right channels. */ + inputGain = inputGain << 8 | inputGain; + + /* Some OSS devices have no input gain control, but do have a + recording level control. Find out if this is one of them and + adjust accordingly. */ + if (ioctl(mixerFD, SOUND_MIXER_READ_DEVMASK, &devMask) < 0) { + fprintf(stderr, + "%s %d: failed to read device mask: %s\n", + __FILE__, __LINE__, strerror(errno)); + exit(1); /* FIXME: not a well-behaved-library thing to do! */ + } + if (devMask & SOUND_MASK_IGAIN) { + if (ioctl(mixerFD, SOUND_MIXER_WRITE_IGAIN, &inputGain) < 0) { + fprintf(stderr, + "%s %d: mixer input gain to %d: %s\n", + __FILE__, __LINE__, inputGain, strerror(errno)); + exit(1); + } + } + else if (devMask & SOUND_MASK_RECLEV) { + if (ioctl(mixerFD, SOUND_MIXER_WRITE_RECLEV, &inputGain) < 0) { + fprintf(stderr, + "%s %d: mixer record level to %d: %s\n", + __FILE__, __LINE__, inputGain, strerror(errno)); + exit(1); + } + } + else { + fprintf(stderr, + "%s %d: can't set input gain/recording level for this device.\n", + __FILE__, __LINE__); + } + + close(mixerFD); + } + + if ((handle = (ad_rec_t *) calloc(1, sizeof(ad_rec_t))) == NULL) { + fprintf(stderr, "calloc(%ld) failed\n", sizeof(ad_rec_t)); + abort(); + } + + handle->dspFD = dspFD; + handle->recording = 0; + handle->sps = sps; + handle->bps = sizeof(int16); + + return (handle); +} + +ad_rec_t * +ad_open_sps(int32 sps) +{ + return ad_open_dev(DEFAULT_DEVICE, sps); +} + +ad_rec_t * +ad_open(void) +{ + return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); +} + +int32 +ad_close(ad_rec_t * handle) +{ + if (handle->dspFD < 0) + return AD_ERR_NOT_OPEN; + + if (handle->recording) { + if (ad_stop_rec(handle) < 0) + return AD_ERR_GEN; + } + + close(handle->dspFD); + free(handle); + + return (0); +} + +int32 +ad_start_rec(ad_rec_t * handle) +{ + if (handle->dspFD < 0) + return AD_ERR_NOT_OPEN; + + if (handle->recording) + return AD_ERR_GEN; + + /* Sample rate, format, input mix settings, &c. are configured + * with ioctl(2) calls under Linux. It makes more sense to handle + * these at device open time and consider the state of the device + * to be fixed until closed. + */ + + handle->recording = 1; + + /* rkm@cs: This doesn't actually do anything. How do we turn recording on/off? */ + + return (0); +} + +int32 +ad_stop_rec(ad_rec_t * handle) +{ + if (handle->dspFD < 0) + return AD_ERR_NOT_OPEN; + + if (!handle->recording) + return AD_ERR_GEN; + + if (ioctl(handle->dspFD, SNDCTL_DSP_SYNC, 0) < 0) { + fprintf(stderr, "Audio ioctl(SYNC) failed: %s\n", strerror(errno)); + return AD_ERR_GEN; + } + + handle->recording = 0; + + return (0); +} + +int32 +ad_read(ad_rec_t * handle, int16 * buf, int32 max) +{ + int32 length; + + length = max * handle->bps; /* #samples -> #bytes */ + + if ((length = read(handle->dspFD, buf, length)) > 0) { +#if 0 + if ((length % handle->bps) != 0) + fprintf(stderr, + "Audio read returned non-integral #sample bytes (%d)\n", + length); +#endif + length /= handle->bps; + } + + if (length < 0) { + if (errno != EAGAIN) { + fprintf(stderr, "Audio read error"); + return AD_ERR_GEN; + } + else { + length = 0; + } + } + + if ((length == 0) && (!handle->recording)) + return AD_EOF; + + return length; +} diff --git a/src/libsphinxad/ad_pulse.c b/src/libsphinxad/ad_pulse.c new file mode 100644 index 000000000..4be683fdd --- /dev/null +++ b/src/libsphinxad/ad_pulse.c @@ -0,0 +1,162 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2011 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* Input for Pulseaudio */ + +#include +#include +#include + +#include +#include + +#include "prim_type.h" +#include "ad.h" + +#define DEFAULT_DEVICE NULL + +struct ad_rec_s { + pa_simple* pa; + int32 recording; + int32 sps; + int32 bps; +}; + +ad_rec_t * +ad_open_dev(const char *dev, int32 samples_per_sec) +{ + ad_rec_t *handle; + pa_simple *pa; + pa_sample_spec ss; + int error; + + ss.format = PA_SAMPLE_S16LE; + ss.channels = 1; + ss.rate = samples_per_sec; + + pa = pa_simple_new(NULL, "ASR", PA_STREAM_RECORD, dev, "Speech", &ss, NULL, NULL, &error); + if (pa == NULL) { + fprintf(stderr, "Error opening audio device %s for capture: %s\n", dev, pa_strerror(error)); + return NULL; + } + + if ((handle = (ad_rec_t *) calloc(1, sizeof(ad_rec_t))) == NULL) { + fprintf(stderr, "Failed to allocate memory for ad device\n"); + return NULL; + } + + handle->pa = pa; + handle->recording = 0; + handle->sps = samples_per_sec; + handle->bps = sizeof(int16); + + return handle; +} + + +ad_rec_t * +ad_open_sps(int32 samples_per_sec) +{ + return ad_open_dev(DEFAULT_DEVICE, samples_per_sec); +} + +ad_rec_t * +ad_open(void) +{ + return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); +} + + +int32 +ad_start_rec(ad_rec_t * r) +{ + if (r->recording) + return AD_ERR_GEN; + + r->recording = 1; + + return 0; +} + + +int32 +ad_stop_rec(ad_rec_t * r) +{ + if (!r->recording) + return AD_ERR_GEN; + + r->recording = 0; + + return 0; +} + + +int32 +ad_read(ad_rec_t * r, int16 * buf, int32 max) +{ + int error; + + if (!r->recording) + return AD_EOF; + + if (max > 2048) { + max = 2048; + } + + if (pa_simple_read(r->pa, (void*)buf, max * 2, &error) < 0) { + fprintf(stderr, "Failed to read speech: %s\n", pa_strerror(error)); + } + + return max; +} + + +int32 +ad_close(ad_rec_t * r) +{ + if (r->pa == NULL) + return AD_ERR_NOT_OPEN; + + if (r->recording) { + if (ad_stop_rec(r) < 0) + return AD_ERR_GEN; + } + pa_simple_free(r->pa); + free(r); + + return 0; +} diff --git a/src/libsphinxad/ad_win32.c b/src/libsphinxad/ad_win32.c new file mode 100644 index 000000000..42432608f --- /dev/null +++ b/src/libsphinxad/ad_win32.c @@ -0,0 +1,506 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * rec.c -- low level audio recording for Windows NT/95. + * + * HISTORY + * + * 19-Jan-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added AD_ return codes. Added ad_open_sps_bufsize(), and + * ad_rec_t.n_buf. + * + * 07-Mar-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added ad_open_sps(), and made ad_open() call it. + * + * 10-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added ad_rec_t type to all calls. + * + * 03-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +#include +#include +#include + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/ad.h" + +#if defined (__CYGWIN__) +#include +#include +#elif (defined(_WIN32) && !defined(GNUWINCE)) || defined(_WIN32_WCE) +#include +#include +#endif + +typedef struct { + HGLOBAL h_whdr; + LPWAVEHDR p_whdr; + HGLOBAL h_buf; + LPSTR p_buf; +} ad_wbuf_t; + +/** + * Audio recording structure. + */ +struct ad_rec_s { + HWAVEIN h_wavein; /* "HANDLE" to the audio input device */ + ad_wbuf_t *wi_buf; /* Recording buffers provided to system */ + int32 n_buf; /* #Recording buffers provided to system */ + int32 opened; /* Flag; A/D opened for recording */ + int32 recording; + int32 curbuf; /* Current buffer with data for application */ + int32 curoff; /* Start of data for application in curbuf */ + int32 curlen; /* #samples of data from curoff in curbuf */ + int32 lastbuf; /* Last buffer containing data after recording stopped */ + int32 sps; /* Samples/sec */ + int32 bps; /* Bytes/sample */ +}; + +#define DEFAULT_N_WI_BUF 32 /* #Recording bufs */ +#define WI_BUFSIZE 2500 /* Samples/buf (Why this specific value?? + So that at reasonable sampling rates + data is returned frequently enough.) */ + +#ifdef _WIN32_WCE +#include "sphinxbase/ckd_alloc.h" +static void +wavein_error(char *src, int32 ret) +{ + TCHAR errbuf[512]; + wchar_t* werrbuf; + size_t len; + + waveOutGetErrorText(ret, errbuf, sizeof(errbuf)); + len = mbstowcs(NULL, errbuf, 0) + 1; + werrbuf = ckd_calloc(len, sizeof(*werrbuf)); + mbstowcs(werrbuf, errbuf, len); + + OutputDebugStringW(werrbuf); +} + +#else +static void +wavein_error(char *src, int32 ret) +{ + char errbuf[1024]; + + waveInGetErrorText(ret, errbuf, sizeof(errbuf)); + fprintf(stderr, "%s error %d: %s\n", src, ret, errbuf); +} +#endif + + +static void +wavein_free_buf(ad_wbuf_t * b) +{ + GlobalUnlock(b->h_whdr); + GlobalFree(b->h_whdr); + GlobalUnlock(b->h_buf); + GlobalFree(b->h_buf); +} + + +static int32 +wavein_alloc_buf(ad_wbuf_t * b, int32 samples_per_buf) +{ + HGLOBAL h_buf; /* handle to data buffer */ + LPSTR p_buf; /* pointer to data buffer */ + HGLOBAL h_whdr; /* handle to header */ + LPWAVEHDR p_whdr; /* pointer to header */ + + /* Allocate data buffer */ + h_buf = + GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, + samples_per_buf * sizeof(int16)); + if (!h_buf) { + fprintf(stderr, "GlobalAlloc failed\n"); + return -1; + } + if ((p_buf = GlobalLock(h_buf)) == NULL) { + GlobalFree(h_buf); + fprintf(stderr, "GlobalLock failed\n"); + return -1; + } + + /* Allocate WAVEHDR structure */ + h_whdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(WAVEHDR)); + if (h_whdr == NULL) { + GlobalUnlock(h_buf); + GlobalFree(h_buf); + + fprintf(stderr, "GlobalAlloc failed\n"); + return -1; + } + if ((p_whdr = GlobalLock(h_whdr)) == NULL) { + GlobalUnlock(h_buf); + GlobalFree(h_buf); + GlobalFree(h_whdr); + + fprintf(stderr, "GlobalLock failed\n"); + return -1; + } + + b->h_buf = h_buf; + b->p_buf = p_buf; + b->h_whdr = h_whdr; + b->p_whdr = p_whdr; + + p_whdr->lpData = p_buf; + p_whdr->dwBufferLength = samples_per_buf * sizeof(int16); + p_whdr->dwUser = 0L; + p_whdr->dwFlags = 0L; + p_whdr->dwLoops = 0L; + + return 0; +} + + +static int32 +wavein_enqueue_buf(HWAVEIN h, LPWAVEHDR whdr) +{ + int32 st; + + if ((st = waveInPrepareHeader(h, whdr, sizeof(WAVEHDR))) != 0) { + wavein_error("waveInPrepareHeader", st); + return -1; + } + if ((st = waveInAddBuffer(h, whdr, sizeof(WAVEHDR))) != 0) { + wavein_error("waveInAddBuffer", st); + return -1; + } + + return 0; +} + + +static HWAVEIN +wavein_open(int32 samples_per_sec, int32 bytes_per_sample, unsigned int device_id) +{ + WAVEFORMATEX wfmt; + int32 st; + HWAVEIN h; + + if (bytes_per_sample != sizeof(int16)) { + fprintf(stderr, "bytes/sample != %d\n", sizeof(int16)); + return NULL; + } + + wfmt.wFormatTag = WAVE_FORMAT_PCM; + wfmt.nChannels = 1; + wfmt.nSamplesPerSec = samples_per_sec; + wfmt.nAvgBytesPerSec = samples_per_sec * bytes_per_sample; + wfmt.nBlockAlign = bytes_per_sample; + wfmt.wBitsPerSample = 8 * bytes_per_sample; + + /* There should be a check here for a device of the desired type; later... */ + + st = waveInOpen((LPHWAVEIN) & h, device_id, + (LPWAVEFORMATEX) & wfmt, (DWORD) 0L, 0L, + (DWORD) CALLBACK_NULL); + if (st != 0) { + wavein_error("waveInOpen", st); + return NULL; + } + + return h; +} + + +static int32 +wavein_close(ad_rec_t * r) +{ + int32 i, st; + + /* Unprepare all buffers; multiple unprepares of the same buffer are benign */ + for (i = 0; i < r->n_buf; i++) { + /* Unpreparing an unprepared buffer, on the other hand, fails + on Win98/WinME, though this is not documented - dhuggins@cs, + 2004-07-14 */ + if (!(r->wi_buf[i].p_whdr->dwFlags & WHDR_PREPARED)) + continue; + st = waveInUnprepareHeader(r->h_wavein, + r->wi_buf[i].p_whdr, sizeof(WAVEHDR)); + if (st != 0) { + wavein_error("waveInUnprepareHeader", st); + return -1; + } + } + + /* Free buffers */ + for (i = 0; i < r->n_buf; i++) + wavein_free_buf(&(r->wi_buf[i])); + free(r->wi_buf); + + if ((st = waveInClose(r->h_wavein)) != 0) { + wavein_error("waveInClose", st); + return -1; + } + + free(r); + + return 0; +} + + +ad_rec_t * +ad_open_sps_bufsize(int32 sps, int32 bufsize_msec, unsigned int device_id) +{ + ad_rec_t *r; + int32 i, j; + HWAVEIN h; + + if ((h = wavein_open(sps, sizeof(int16), device_id)) == NULL) + return NULL; + + if ((r = (ad_rec_t *) malloc(sizeof(ad_rec_t))) == NULL) { + fprintf(stderr, "malloc(%d) failed\n", sizeof(ad_rec_t)); + waveInClose(h); + return NULL; + } + + r->n_buf = ((sps * bufsize_msec) / 1000) / WI_BUFSIZE; + if (r->n_buf < DEFAULT_N_WI_BUF) + r->n_buf = DEFAULT_N_WI_BUF; + + if ((r->wi_buf = + (ad_wbuf_t *) calloc(r->n_buf, sizeof(ad_wbuf_t))) == NULL) { + fprintf(stderr, "calloc(%d,%d) failed\n", r->n_buf, + sizeof(ad_wbuf_t)); + free(r); + waveInClose(h); + + return NULL; + } + for (i = 0; i < r->n_buf; i++) { + if (wavein_alloc_buf(&(r->wi_buf[i]), WI_BUFSIZE) < 0) { + for (j = 0; j < i; j++) + wavein_free_buf(&(r->wi_buf[j])); + free(r->wi_buf); + free(r); + waveInClose(h); + + return NULL; + } + } + + r->h_wavein = h; + r->opened = 1; + r->recording = 0; + r->curbuf = r->n_buf - 1; /* current buffer with data for application */ + r->curlen = 0; /* #samples in curbuf remaining to be consumed */ + r->lastbuf = r->curbuf; + r->sps = sps; + r->bps = sizeof(int16); /* HACK!! Hardwired value for bytes/sec */ + + return r; +} + +ad_rec_t * +ad_open_dev(const char *dev, int32 sps) +{ + unsigned int device_num = WAVE_MAPPER; + + /* Convert given deviceId parameter to int */ + if (dev != NULL && sscanf(dev, "%d", &device_num) != EOF) { + if (device_num >= waveInGetNumDevs()) { + device_num = WAVE_MAPPER; + } + } + + return (ad_open_sps_bufsize + (sps, WI_BUFSIZE * DEFAULT_N_WI_BUF * 1000 / sps, device_num)); +} + + +ad_rec_t * +ad_open_sps(int32 sps) +{ + return (ad_open_sps_bufsize + (sps, WI_BUFSIZE * DEFAULT_N_WI_BUF * 1000 / sps, WAVE_MAPPER)); +} + + +ad_rec_t * +ad_open(void) +{ + return (ad_open_sps(DEFAULT_SAMPLES_PER_SEC)); /* HACK!! Rename this constant */ +} + + +int32 +ad_close(ad_rec_t * r) +{ + if (!r->opened) + return AD_ERR_NOT_OPEN; + + if (r->recording) + if (ad_stop_rec(r) < 0) + return AD_ERR_WAVE; + + if (wavein_close(r) < 0) + return AD_ERR_WAVE; + + return 0; +} + + +int32 +ad_start_rec(ad_rec_t * r) +{ + int32 i; + + if ((!r->opened) || r->recording) + return -1; + + for (i = 0; i < r->n_buf; i++) + if (wavein_enqueue_buf(r->h_wavein, r->wi_buf[i].p_whdr) < 0) + return AD_ERR_WAVE; + r->curbuf = r->n_buf - 1; /* current buffer with data for application */ + r->curlen = 0; /* #samples in curbuf remaining to be consumed */ + + if (waveInStart(r->h_wavein) != 0) + return AD_ERR_WAVE; + + r->recording = 1; + + return 0; +} + + +int32 +ad_stop_rec(ad_rec_t * r) +{ + int32 i, st; + + if ((!r->opened) || (!r->recording)) + return -1; + + if (waveInStop(r->h_wavein) != 0) + return AD_ERR_WAVE; + + if ((st = waveInReset(r->h_wavein)) != 0) { + wavein_error("waveInReset", st); + return AD_ERR_WAVE; + } + + /* Wait until all buffers marked done */ + for (i = 0; i < r->n_buf; i++) + while (!(r->wi_buf[i].p_whdr->dwFlags & WHDR_DONE)); + + if ((r->lastbuf = r->curbuf - 1) < 0) + r->lastbuf = r->n_buf - 1; + + r->recording = 0; + + return 0; +} + + +int32 +ad_read(ad_rec_t * r, int16 * buf, int32 max) +{ + int32 t, st, len; + LPWAVEHDR whdr; + int16 *sysbufp; + + if (!r->opened) + return AD_ERR_NOT_OPEN; + + /* Check if all recorded data exhausted */ + if ((!r->recording) && (r->curbuf == r->lastbuf) + && (r->curlen == 0)) + return AD_EOF; + + len = 0; + while (max > 0) { + /* Look for next buffer with recording data */ + if (r->curlen == 0) { + /* No current buffer with data; get next buffer in sequence if available */ + t = r->curbuf + 1; + if (t >= r->n_buf) + t = 0; + + if (!(r->wi_buf[t].p_whdr->dwFlags & WHDR_DONE)) + return len; + + r->curbuf = t; + r->curlen = r->wi_buf[t].p_whdr->dwBytesRecorded >> 1; + r->curoff = 0; + } + + /* Copy data from curbuf to buf */ + whdr = r->wi_buf[r->curbuf].p_whdr; + t = (max < r->curlen) ? max : r->curlen; /* #Samples to copy */ + + if (t > 0) { + sysbufp = (int16 *) (whdr->lpData); + memcpy(buf, sysbufp + r->curoff, t * sizeof(int16)); + + buf += t; + max -= t; + r->curoff += t; + r->curlen -= t; + len += t; + } + + /* If curbuf empty recycle it to system if still recording */ + if (r->curlen == 0) { + if (r->recording) { + /* Return empty buffer to system */ + st = waveInUnprepareHeader(r->h_wavein, + whdr, sizeof(WAVEHDR)); + if (st != 0) { + wavein_error("waveInUnprepareHeader", st); + return AD_ERR_WAVE; + } + + if (wavein_enqueue_buf(r->h_wavein, whdr) < 0) + return AD_ERR_WAVE; + + } + else if (r->curbuf == r->lastbuf) { + return len; + } + } + } + + return len; +} diff --git a/src/libsphinxbase/Makefile.am b/src/libsphinxbase/Makefile.am new file mode 100644 index 000000000..dbdc8fd7a --- /dev/null +++ b/src/libsphinxbase/Makefile.am @@ -0,0 +1,12 @@ +SUBDIRS = util fe feat lm + +lib_LTLIBRARIES = libsphinxbase.la + +libsphinxbase_la_SOURCES = + +libsphinxbase_la_LDFLAGS = -version-info 3:0:0 +libsphinxbase_la_LIBADD = $(LTLIBICONV) \ + util/libsphinxutil.la \ + fe/libsphinxfe.la \ + feat/libsphinxfeat.la \ + lm/libsphinxlm.la diff --git a/src/libsphinxbase/fe/Makefile.am b/src/libsphinxbase/fe/Makefile.am new file mode 100644 index 000000000..e21027141 --- /dev/null +++ b/src/libsphinxbase/fe/Makefile.am @@ -0,0 +1,29 @@ +noinst_LTLIBRARIES = libsphinxfe.la + +libsphinxfe_la_SOURCES = \ + fe_interface.c \ + fe_noise.c \ + fe_prespch_buf.c \ + fe_sigproc.c \ + fe_warp_affine.c \ + fe_warp.c \ + fe_warp_inverse_linear.c \ + fe_warp_piecewise_linear.c \ + fixlog.c \ + yin.c + +noinst_HEADERS = \ + fe_internal.h \ + fe_noise.h \ + fe_prespch_buf.h \ + fe_type.h \ + fe_warp_affine.h \ + fe_warp.h \ + fe_warp_inverse_linear.h \ + fe_warp_piecewise_linear.h + +AM_CFLAGS =-I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include + +LIBOBJS = @LIBOBJS@ diff --git a/src/libsphinxbase/fe/fe_design.txt b/src/libsphinxbase/fe/fe_design.txt new file mode 100644 index 000000000..239c60514 --- /dev/null +++ b/src/libsphinxbase/fe/fe_design.txt @@ -0,0 +1,44 @@ +We need to have a push-style frontend since it’s important for +bindings. Callback pop-style frontend would be a pain to support in +bindings (you need to call managed/python code from callback then) + +For effective noise cancellation we need a lookahead and corresponding +delay in processing + +For effective CMN we need a delay in processing in the beginning too for +parameters estimation + +For effective VAD we need a delay in processing to catch the start of the +speech properly + +Our overall delay should be minimal to provide users a real-time +experience + +We need to operate on streams of audio, not just on utterances, there +could be adaptation across the stream + +The core concept of the live frontend must be FIFO. We push some data +into it and can get some data back. Every chunk of data must have +stream stamp attached to it. It’s not necessary that we will get +same data back, many components are asynchronous - denoise, VAD, CMN +they might introduce some delays in the beginning of the stream. + +Sphinx4 list-based frontend must be a good idea to implement all the required +queues. At the same time we'd like to keep simple allocation-free structures +like buffers. + +Ideally VAD has to be GMM-based with long-context features too + +In the future we might want to support long-context features (up to 30 frames) + +Ability to handle frame drop is a nice feature to have (occurs in a bad +channels) + +We still need proper accurate timestamps for the results. + +We need to support lookahead scoring (phone loop) and multipass scoring. + +We need to support minibatch scoring for efficient computation. + +We have two types of processing - batch and live? Is batch needed, probably +not? Most practical applications are live. diff --git a/src/libsphinxbase/fe/fe_interface.c b/src/libsphinxbase/fe/fe_interface.c new file mode 100644 index 000000000..098aeb4d1 --- /dev/null +++ b/src/libsphinxbase/fe/fe_interface.c @@ -0,0 +1,764 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/byteorder.h" +#include "sphinxbase/fixpoint.h" +#include "sphinxbase/genrand.h" +#include "sphinxbase/err.h" +#include "sphinxbase/cmd_ln.h" +#include "sphinxbase/ckd_alloc.h" + +#include "fe_internal.h" +#include "fe_warp.h" + +static const arg_t fe_args[] = { + waveform_to_cepstral_command_line_macro(), + { NULL, 0, NULL, NULL } +}; + +int +fe_parse_general_params(cmd_ln_t *config, fe_t * fe) +{ + int j, frate; + + fe->config = config; + fe->sampling_rate = cmd_ln_float32_r(config, "-samprate"); + frate = cmd_ln_int32_r(config, "-frate"); + if (frate > MAX_INT16 || frate > fe->sampling_rate || frate < 1) { + E_ERROR + ("Frame rate %d can not be bigger than sample rate %.02f\n", + frate, fe->sampling_rate); + return -1; + } + + fe->frame_rate = (int16)frate; + if (cmd_ln_boolean_r(config, "-dither")) { + fe->dither = 1; + fe->dither_seed = cmd_ln_int32_r(config, "-seed"); + } +#ifdef WORDS_BIGENDIAN + fe->swap = strcmp("big", cmd_ln_str_r(config, "-input_endian")) == 0 ? 0 : 1; +#else + fe->swap = strcmp("little", cmd_ln_str_r(config, "-input_endian")) == 0 ? 0 : 1; +#endif + fe->window_length = cmd_ln_float32_r(config, "-wlen"); + fe->pre_emphasis_alpha = cmd_ln_float32_r(config, "-alpha"); + + fe->num_cepstra = (uint8)cmd_ln_int32_r(config, "-ncep"); + fe->fft_size = (int16)cmd_ln_int32_r(config, "-nfft"); + + /* Check FFT size, compute FFT order (log_2(n)) */ + for (j = fe->fft_size, fe->fft_order = 0; j > 1; j >>= 1, fe->fft_order++) { + if (((j % 2) != 0) || (fe->fft_size <= 0)) { + E_ERROR("fft: number of points must be a power of 2 (is %d)\n", + fe->fft_size); + return -1; + } + } + /* Verify that FFT size is greater or equal to window length. */ + if (fe->fft_size < (int)(fe->window_length * fe->sampling_rate)) { + E_ERROR("FFT: Number of points must be greater or equal to frame size (%d samples)\n", + (int)(fe->window_length * fe->sampling_rate)); + return -1; + } + + fe->pre_speech = (int16)cmd_ln_int32_r(config, "-vad_prespeech"); + fe->post_speech = (int16)cmd_ln_int32_r(config, "-vad_postspeech"); + fe->start_speech = (int16)cmd_ln_int32_r(config, "-vad_startspeech"); + fe->vad_threshold = cmd_ln_float32_r(config, "-vad_threshold"); + + fe->remove_dc = cmd_ln_boolean_r(config, "-remove_dc"); + fe->remove_noise = cmd_ln_boolean_r(config, "-remove_noise"); + fe->remove_silence = cmd_ln_boolean_r(config, "-remove_silence"); + + if (0 == strcmp(cmd_ln_str_r(config, "-transform"), "dct")) + fe->transform = DCT_II; + else if (0 == strcmp(cmd_ln_str_r(config, "-transform"), "legacy")) + fe->transform = LEGACY_DCT; + else if (0 == strcmp(cmd_ln_str_r(config, "-transform"), "htk")) + fe->transform = DCT_HTK; + else { + E_ERROR("Invalid transform type (values are 'dct', 'legacy', 'htk')\n"); + return -1; + } + + if (cmd_ln_boolean_r(config, "-logspec")) + fe->log_spec = RAW_LOG_SPEC; + if (cmd_ln_boolean_r(config, "-smoothspec")) + fe->log_spec = SMOOTH_LOG_SPEC; + + return 0; +} + +static int +fe_parse_melfb_params(cmd_ln_t *config, fe_t *fe, melfb_t * mel) +{ + mel->sampling_rate = fe->sampling_rate; + mel->fft_size = fe->fft_size; + mel->num_cepstra = fe->num_cepstra; + mel->num_filters = cmd_ln_int32_r(config, "-nfilt"); + + if (fe->log_spec) + fe->feature_dimension = mel->num_filters; + else + fe->feature_dimension = fe->num_cepstra; + + mel->upper_filt_freq = cmd_ln_float32_r(config, "-upperf"); + mel->lower_filt_freq = cmd_ln_float32_r(config, "-lowerf"); + + mel->doublewide = cmd_ln_boolean_r(config, "-doublebw"); + + mel->warp_type = cmd_ln_str_r(config, "-warp_type"); + mel->warp_params = cmd_ln_str_r(config, "-warp_params"); + mel->lifter_val = cmd_ln_int32_r(config, "-lifter"); + + mel->unit_area = cmd_ln_boolean_r(config, "-unit_area"); + mel->round_filters = cmd_ln_boolean_r(config, "-round_filters"); + + if (fe_warp_set(mel, mel->warp_type) != FE_SUCCESS) { + E_ERROR("Failed to initialize the warping function.\n"); + return -1; + } + fe_warp_set_parameters(mel, mel->warp_params, mel->sampling_rate); + return 0; +} + +void +fe_print_current(fe_t const *fe) +{ + E_INFO("Current FE Parameters:\n"); + E_INFO("\tSampling Rate: %f\n", fe->sampling_rate); + E_INFO("\tFrame Size: %d\n", fe->frame_size); + E_INFO("\tFrame Shift: %d\n", fe->frame_shift); + E_INFO("\tFFT Size: %d\n", fe->fft_size); + E_INFO("\tLower Frequency: %g\n", + fe->mel_fb->lower_filt_freq); + E_INFO("\tUpper Frequency: %g\n", + fe->mel_fb->upper_filt_freq); + E_INFO("\tNumber of filters: %d\n", fe->mel_fb->num_filters); + E_INFO("\tNumber of Overflow Samps: %d\n", fe->num_overflow_samps); + E_INFO("Will %sremove DC offset at frame level\n", + fe->remove_dc ? "" : "not "); + if (fe->dither) { + E_INFO("Will add dither to audio\n"); + E_INFO("Dither seeded with %d\n", fe->dither_seed); + } + else { + E_INFO("Will not add dither to audio\n"); + } + if (fe->mel_fb->lifter_val) { + E_INFO("Will apply sine-curve liftering, period %d\n", + fe->mel_fb->lifter_val); + } + E_INFO("Will %snormalize filters to unit area\n", + fe->mel_fb->unit_area ? "" : "not "); + E_INFO("Will %sround filter frequencies to DFT points\n", + fe->mel_fb->round_filters ? "" : "not "); + E_INFO("Will %suse double bandwidth in mel filter\n", + fe->mel_fb->doublewide ? "" : "not "); +} + +fe_t * +fe_init_auto() +{ + return fe_init_auto_r(cmd_ln_get()); +} + +fe_t * +fe_init_auto_r(cmd_ln_t *config) +{ + fe_t *fe; + int prespch_frame_len; + + fe = (fe_t*)ckd_calloc(1, sizeof(*fe)); + fe->refcount = 1; + + /* transfer params to front end */ + if (fe_parse_general_params(cmd_ln_retain(config), fe) < 0) { + fe_free(fe); + return NULL; + } + + /* compute remaining fe parameters */ + /* We add 0.5 so approximate the float with the closest + * integer. E.g., 2.3 is truncate to 2, whereas 3.7 becomes 4 + */ + fe->frame_shift = (int32) (fe->sampling_rate / fe->frame_rate + 0.5); + fe->frame_size = (int32) (fe->window_length * fe->sampling_rate + 0.5); + fe->pre_emphasis_prior = 0; + + fe_start_stream(fe); + + assert (fe->frame_shift > 1); + + if (fe->frame_size < fe->frame_shift) { + E_ERROR + ("Frame size %d (-wlen) must be greater than frame shift %d (-frate)\n", + fe->frame_size, fe->frame_shift); + fe_free(fe); + return NULL; + } + + + if (fe->frame_size > (fe->fft_size)) { + E_ERROR + ("Number of FFT points has to be a power of 2 higher than %d, it is %d\n", + fe->frame_size, fe->fft_size); + fe_free(fe); + return NULL; + } + + if (fe->dither) + fe_init_dither(fe->dither_seed); + + /* establish buffers for overflow samps and hamming window */ + fe->overflow_samps = ckd_calloc(fe->frame_size, sizeof(int16)); + fe->hamming_window = ckd_calloc(fe->frame_size/2, sizeof(window_t)); + + /* create hamming window */ + fe_create_hamming(fe->hamming_window, fe->frame_size); + + /* init and fill appropriate filter structure */ + fe->mel_fb = ckd_calloc(1, sizeof(*fe->mel_fb)); + + /* transfer params to mel fb */ + fe_parse_melfb_params(config, fe, fe->mel_fb); + + if (fe->mel_fb->upper_filt_freq > fe->sampling_rate / 2 + 1.0) { + E_ERROR("Upper frequency %.1f is higher than samprate/2 (%.1f)\n", + fe->mel_fb->upper_filt_freq, fe->sampling_rate / 2); + fe_free(fe); + return NULL; + } + + fe_build_melfilters(fe->mel_fb); + + fe_compute_melcosine(fe->mel_fb); + if (fe->remove_noise || fe->remove_silence) + fe->noise_stats = fe_init_noisestats(fe->mel_fb->num_filters); + + fe->vad_data = (vad_data_t*)ckd_calloc(1, sizeof(*fe->vad_data)); + prespch_frame_len = fe->log_spec != RAW_LOG_SPEC ? fe->num_cepstra : fe->mel_fb->num_filters; + fe->vad_data->prespch_buf = fe_prespch_init(fe->pre_speech + 1, prespch_frame_len, fe->frame_shift); + + /* Create temporary FFT, spectrum and mel-spectrum buffers. */ + /* FIXME: Gosh there are a lot of these. */ + fe->spch = ckd_calloc(fe->frame_size, sizeof(*fe->spch)); + fe->frame = ckd_calloc(fe->fft_size, sizeof(*fe->frame)); + fe->spec = ckd_calloc(fe->fft_size, sizeof(*fe->spec)); + fe->mfspec = ckd_calloc(fe->mel_fb->num_filters, sizeof(*fe->mfspec)); + + /* create twiddle factors */ + fe->ccc = ckd_calloc(fe->fft_size / 4, sizeof(*fe->ccc)); + fe->sss = ckd_calloc(fe->fft_size / 4, sizeof(*fe->sss)); + fe_create_twiddle(fe); + + if (cmd_ln_boolean_r(config, "-verbose")) { + fe_print_current(fe); + } + + /*** Initialize the overflow buffers ***/ + fe_start_utt(fe); + return fe; +} + +arg_t const * +fe_get_args(void) +{ + return fe_args; +} + +const cmd_ln_t * +fe_get_config(fe_t *fe) +{ + return fe->config; +} + +void +fe_init_dither(int32 seed) +{ + E_INFO("Using %d as the seed.\n", seed); + s3_rand_seed(seed); +} + +static void +fe_reset_vad_data(vad_data_t * vad_data) +{ + vad_data->in_speech = 0; + vad_data->pre_speech_frames = 0; + vad_data->post_speech_frames = 0; + fe_prespch_reset_cep(vad_data->prespch_buf); +} + +int32 +fe_start_utt(fe_t * fe) +{ + fe->num_overflow_samps = 0; + memset(fe->overflow_samps, 0, fe->frame_size * sizeof(int16)); + fe->pre_emphasis_prior = 0; + fe_reset_vad_data(fe->vad_data); + return 0; +} + +void +fe_start_stream(fe_t *fe) +{ + fe->num_processed_samps = 0; + fe_reset_noisestats(fe->noise_stats); +} + +int +fe_get_output_size(fe_t *fe) +{ + return (int)fe->feature_dimension; +} + +void +fe_get_input_size(fe_t *fe, int *out_frame_shift, + int *out_frame_size) +{ + if (out_frame_shift) + *out_frame_shift = fe->frame_shift; + if (out_frame_size) + *out_frame_size = fe->frame_size; +} + +uint8 +fe_get_vad_state(fe_t *fe) +{ + return fe->vad_data->in_speech; +} + +int +fe_process_frames(fe_t *fe, + int16 const **inout_spch, + size_t *inout_nsamps, + mfcc_t **buf_cep, + int32 *inout_nframes, + int32 *out_frameidx) +{ + return fe_process_frames_ext(fe, inout_spch, inout_nsamps, buf_cep, inout_nframes, NULL, NULL, out_frameidx); +} + + +/** + * Copy frames collected in prespeech buffer + */ +static int +fe_copy_from_prespch(fe_t *fe, int32 *inout_nframes, mfcc_t **buf_cep, int outidx) +{ + while ((*inout_nframes) > 0 && fe_prespch_read_cep(fe->vad_data->prespch_buf, buf_cep[outidx]) > 0) { + outidx++; + (*inout_nframes)--; + } + return outidx; +} + +/** + * Update pointers after we processed a frame. A complex logic used in two places in fe_process_frames + */ +static int +fe_check_prespeech(fe_t *fe, int32 *inout_nframes, mfcc_t **buf_cep, int outidx, int32 *out_frameidx, size_t *inout_nsamps, int orig_nsamps) +{ + if (fe->vad_data->in_speech) { + if (fe_prespch_ncep(fe->vad_data->prespch_buf) > 0) { + + /* Previous frame triggered vad into speech state. Last frame is in the end of + prespeech buffer, so overwrite it */ + outidx = fe_copy_from_prespch(fe, inout_nframes, buf_cep, outidx); + + /* Sets the start frame for the returned data so that caller can update timings */ + if (out_frameidx) { + *out_frameidx = (fe->num_processed_samps + orig_nsamps - *inout_nsamps) / fe->frame_shift - fe->pre_speech; + } + } else { + outidx++; + (*inout_nframes)--; + } + } + /* Amount of data behind the original input which is still needed. */ + if (fe->num_overflow_samps > 0) + fe->num_overflow_samps -= fe->frame_shift; + + return outidx; +} + +int +fe_process_frames_ext(fe_t *fe, + int16 const **inout_spch, + size_t *inout_nsamps, + mfcc_t **buf_cep, + int32 *inout_nframes, + int16 *voiced_spch, + int32 *voiced_spch_nsamps, + int32 *out_frameidx) +{ + int outidx, n_overflow, orig_n_overflow; + int16 const *orig_spch; + size_t orig_nsamps; + + /* The logic here is pretty complex, please be careful with modifications */ + + /* FIXME: Dump PCM data if needed */ + + /* In the special case where there is no output buffer, return the + * maximum number of frames which would be generated. */ + if (buf_cep == NULL) { + if (*inout_nsamps + fe->num_overflow_samps < (size_t)fe->frame_size) + *inout_nframes = 0; + else + *inout_nframes = 1 + + ((*inout_nsamps + fe->num_overflow_samps - fe->frame_size) + / fe->frame_shift); + if (!fe->vad_data->in_speech) + *inout_nframes += fe_prespch_ncep(fe->vad_data->prespch_buf); + return *inout_nframes; + } + + if (out_frameidx) + *out_frameidx = 0; + + /* Are there not enough samples to make at least 1 frame? */ + if (*inout_nsamps + fe->num_overflow_samps < (size_t)fe->frame_size) { + if (*inout_nsamps > 0) { + /* Append them to the overflow buffer. */ + memcpy(fe->overflow_samps + fe->num_overflow_samps, + *inout_spch, *inout_nsamps * (sizeof(int16))); + fe->num_overflow_samps += *inout_nsamps; + fe->num_processed_samps += *inout_nsamps; + *inout_spch += *inout_nsamps; + *inout_nsamps = 0; + } + /* We produced no frames of output, sorry! */ + *inout_nframes = 0; + return 0; + } + + /* Can't write a frame? Then do nothing! */ + if (*inout_nframes < 1) { + *inout_nframes = 0; + return 0; + } + + /* Index of output frame. */ + outidx = 0; + + /* Try to read from prespeech buffer */ + if (fe->vad_data->in_speech && fe_prespch_ncep(fe->vad_data->prespch_buf) > 0) { + outidx = fe_copy_from_prespch(fe, inout_nframes, buf_cep, outidx); + if ((*inout_nframes) < 1) { + /* mfcc buffer is filled from prespeech buffer */ + *inout_nframes = outidx; + return 0; + } + } + + /* Keep track of the original start of the buffer. */ + orig_spch = *inout_spch; + orig_nsamps = *inout_nsamps; + orig_n_overflow = fe->num_overflow_samps; + + /* Start processing, taking care of any incoming overflow. */ + if (fe->num_overflow_samps > 0) { + int offset = fe->frame_size - fe->num_overflow_samps; + /* Append start of spch to overflow samples to make a full frame. */ + memcpy(fe->overflow_samps + fe->num_overflow_samps, + *inout_spch, offset * sizeof(**inout_spch)); + fe_read_frame(fe, fe->overflow_samps, fe->frame_size); + /* Update input-output pointers and counters. */ + *inout_spch += offset; + *inout_nsamps -= offset; + } else { + fe_read_frame(fe, *inout_spch, fe->frame_size); + /* Update input-output pointers and counters. */ + *inout_spch += fe->frame_size; + *inout_nsamps -= fe->frame_size; + } + + fe_write_frame(fe, buf_cep[outidx], voiced_spch != NULL); + outidx = fe_check_prespeech(fe, inout_nframes, buf_cep, outidx, out_frameidx, inout_nsamps, orig_nsamps); + + /* Process all remaining frames. */ + while (*inout_nframes > 0 && *inout_nsamps >= (size_t)fe->frame_shift) { + fe_shift_frame(fe, *inout_spch, fe->frame_shift); + fe_write_frame(fe, buf_cep[outidx], voiced_spch != NULL); + + outidx = fe_check_prespeech(fe, inout_nframes, buf_cep, outidx, out_frameidx, inout_nsamps, orig_nsamps); + + /* Update input-output pointers and counters. */ + *inout_spch += fe->frame_shift; + *inout_nsamps -= fe->frame_shift; + } + + /* How many relevant overflow samples are there left? */ + if (fe->num_overflow_samps <= 0) { + /* Maximum number of overflow samples past *inout_spch to save. */ + n_overflow = *inout_nsamps; + if (n_overflow > fe->frame_shift) + n_overflow = fe->frame_shift; + fe->num_overflow_samps = fe->frame_size - fe->frame_shift; + /* Make sure this isn't an illegal read! */ + if (fe->num_overflow_samps > *inout_spch - orig_spch) + fe->num_overflow_samps = *inout_spch - orig_spch; + fe->num_overflow_samps += n_overflow; + if (fe->num_overflow_samps > 0) { + memcpy(fe->overflow_samps, + *inout_spch - (fe->frame_size - fe->frame_shift), + fe->num_overflow_samps * sizeof(**inout_spch)); + /* Update the input pointer to cover this stuff. */ + *inout_spch += n_overflow; + *inout_nsamps -= n_overflow; + } + } else { + /* There is still some relevant data left in the overflow buffer. */ + /* Shift existing data to the beginning. */ + memmove(fe->overflow_samps, + fe->overflow_samps + orig_n_overflow - fe->num_overflow_samps, + fe->num_overflow_samps * sizeof(*fe->overflow_samps)); + /* Copy in whatever we had in the original speech buffer. */ + n_overflow = *inout_spch - orig_spch + *inout_nsamps; + if (n_overflow > fe->frame_size - fe->num_overflow_samps) + n_overflow = fe->frame_size - fe->num_overflow_samps; + memcpy(fe->overflow_samps + fe->num_overflow_samps, + orig_spch, n_overflow * sizeof(*orig_spch)); + fe->num_overflow_samps += n_overflow; + /* Advance the input pointers. */ + if (n_overflow > *inout_spch - orig_spch) { + n_overflow -= (*inout_spch - orig_spch); + *inout_spch += n_overflow; + *inout_nsamps -= n_overflow; + } + } + + /* Finally update the frame counter with the number of frames + * and global sample counter with number of samples we procesed */ + *inout_nframes = outidx; /* FIXME: Not sure why I wrote it this way... */ + fe->num_processed_samps += orig_nsamps - *inout_nsamps; + + return 0; +} + +int +fe_process_utt(fe_t * fe, int16 const * spch, size_t nsamps, + mfcc_t *** cep_block, int32 * nframes) +{ + mfcc_t **cep; + int rv; + + /* Figure out how many frames we will need. */ + fe_process_frames(fe, NULL, &nsamps, NULL, nframes, NULL); + /* Create the output buffer (it has to exist, even if there are no output frames). */ + if (*nframes) + cep = (mfcc_t **)ckd_calloc_2d(*nframes, fe->feature_dimension, sizeof(**cep)); + else + cep = (mfcc_t **)ckd_calloc_2d(1, fe->feature_dimension, sizeof(**cep)); + /* Now just call fe_process_frames() with the allocated buffer. */ + rv = fe_process_frames(fe, &spch, &nsamps, cep, nframes, NULL); + *cep_block = cep; + + return rv; +} + + +int32 +fe_end_utt(fe_t * fe, mfcc_t * cepvector, int32 * nframes) +{ + /* Process any remaining data, not very accurate for the VAD */ + *nframes = 0; + if (fe->num_overflow_samps > 0) { + fe_read_frame(fe, fe->overflow_samps, fe->num_overflow_samps); + fe_write_frame(fe, cepvector, FALSE); + if (fe->vad_data->in_speech) + *nframes = 1; + } + + /* reset overflow buffers... */ + fe->num_overflow_samps = 0; + + return 0; +} + +fe_t * +fe_retain(fe_t *fe) +{ + ++fe->refcount; + return fe; +} + +int +fe_free(fe_t * fe) +{ + if (fe == NULL) + return 0; + if (--fe->refcount > 0) + return fe->refcount; + + /* kill FE instance - free everything... */ + if (fe->mel_fb) { + if (fe->mel_fb->mel_cosine) + fe_free_2d((void *) fe->mel_fb->mel_cosine); + ckd_free(fe->mel_fb->lifter); + ckd_free(fe->mel_fb->spec_start); + ckd_free(fe->mel_fb->filt_start); + ckd_free(fe->mel_fb->filt_width); + ckd_free(fe->mel_fb->filt_coeffs); + ckd_free(fe->mel_fb); + } + ckd_free(fe->spch); + ckd_free(fe->frame); + ckd_free(fe->ccc); + ckd_free(fe->sss); + ckd_free(fe->spec); + ckd_free(fe->mfspec); + ckd_free(fe->overflow_samps); + ckd_free(fe->hamming_window); + + if (fe->noise_stats) + fe_free_noisestats(fe->noise_stats); + + if (fe->vad_data) { + fe_prespch_free(fe->vad_data->prespch_buf); + ckd_free(fe->vad_data); + } + + cmd_ln_free_r(fe->config); + ckd_free(fe); + + return 0; +} + +/** + * Convert a block of mfcc_t to float32 (can be done in-place) + **/ +int32 +fe_mfcc_to_float(fe_t * fe, + mfcc_t ** input, float32 ** output, int32 nframes) +{ + int32 i; + +#ifndef FIXED_POINT + if ((void *) input == (void *) output) + return nframes * fe->feature_dimension; +#endif + for (i = 0; i < nframes * fe->feature_dimension; ++i) + output[0][i] = MFCC2FLOAT(input[0][i]); + + return i; +} + +/** + * Convert a block of float32 to mfcc_t (can be done in-place) + **/ +int32 +fe_float_to_mfcc(fe_t * fe, + float32 ** input, mfcc_t ** output, int32 nframes) +{ + int32 i; + +#ifndef FIXED_POINT + if ((void *) input == (void *) output) + return nframes * fe->feature_dimension; +#endif + for (i = 0; i < nframes * fe->feature_dimension; ++i) + output[0][i] = FLOAT2MFCC(input[0][i]); + + return i; +} + +int32 +fe_logspec_to_mfcc(fe_t * fe, const mfcc_t * fr_spec, mfcc_t * fr_cep) +{ +#ifdef FIXED_POINT + fe_spec2cep(fe, fr_spec, fr_cep); +#else /* ! FIXED_POINT */ + powspec_t *powspec; + int32 i; + + powspec = ckd_malloc(fe->mel_fb->num_filters * sizeof(powspec_t)); + for (i = 0; i < fe->mel_fb->num_filters; ++i) + powspec[i] = (powspec_t) fr_spec[i]; + fe_spec2cep(fe, powspec, fr_cep); + ckd_free(powspec); +#endif /* ! FIXED_POINT */ + return 0; +} + +int32 +fe_logspec_dct2(fe_t * fe, const mfcc_t * fr_spec, mfcc_t * fr_cep) +{ +#ifdef FIXED_POINT + fe_dct2(fe, fr_spec, fr_cep, 0); +#else /* ! FIXED_POINT */ + powspec_t *powspec; + int32 i; + + powspec = ckd_malloc(fe->mel_fb->num_filters * sizeof(powspec_t)); + for (i = 0; i < fe->mel_fb->num_filters; ++i) + powspec[i] = (powspec_t) fr_spec[i]; + fe_dct2(fe, powspec, fr_cep, 0); + ckd_free(powspec); +#endif /* ! FIXED_POINT */ + return 0; +} + +int32 +fe_mfcc_dct3(fe_t * fe, const mfcc_t * fr_cep, mfcc_t * fr_spec) +{ +#ifdef FIXED_POINT + fe_dct3(fe, fr_cep, fr_spec); +#else /* ! FIXED_POINT */ + powspec_t *powspec; + int32 i; + + powspec = ckd_malloc(fe->mel_fb->num_filters * sizeof(powspec_t)); + fe_dct3(fe, fr_cep, powspec); + for (i = 0; i < fe->mel_fb->num_filters; ++i) + fr_spec[i] = (mfcc_t) powspec[i]; + ckd_free(powspec); +#endif /* ! FIXED_POINT */ + return 0; +} diff --git a/src/libsphinxbase/fe/fe_internal.h b/src/libsphinxbase/fe/fe_internal.h new file mode 100644 index 000000000..4783f3fb7 --- /dev/null +++ b/src/libsphinxbase/fe/fe_internal.h @@ -0,0 +1,204 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __FE_INTERNAL_H__ +#define __FE_INTERNAL_H__ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sphinxbase/fe.h" +#include "sphinxbase/fixpoint.h" + +#include "fe_noise.h" +#include "fe_prespch_buf.h" +#include "fe_type.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/* Values for the 'logspec' field. */ +enum { + RAW_LOG_SPEC = 1, + SMOOTH_LOG_SPEC = 2 +}; + +/* Values for the 'transform' field. */ +enum { + LEGACY_DCT = 0, + DCT_II = 1, + DCT_HTK = 2 +}; + +typedef struct melfb_s melfb_t; +/** Base Struct to hold all structure for MFCC computation. */ +struct melfb_s { + float32 sampling_rate; + int32 num_cepstra; + int32 num_filters; + int32 fft_size; + float32 lower_filt_freq; + float32 upper_filt_freq; + /* DCT coefficients. */ + mfcc_t **mel_cosine; + /* Filter coefficients. */ + mfcc_t *filt_coeffs; + int16 *spec_start; + int16 *filt_start; + int16 *filt_width; + /* Luxury mobile home. */ + int32 doublewide; + char const *warp_type; + char const *warp_params; + uint32 warp_id; + /* Precomputed normalization constants for unitary DCT-II/DCT-III */ + mfcc_t sqrt_inv_n, sqrt_inv_2n; + /* Value and coefficients for HTK-style liftering */ + int32 lifter_val; + mfcc_t *lifter; + /* Normalize filters to unit area */ + int32 unit_area; + /* Round filter frequencies to DFT points (hurts accuracy, but is + useful for legacy purposes) */ + int32 round_filters; +}; + +/* sqrt(1/2), also used for unitary DCT-II/DCT-III */ +#define SQRT_HALF FLOAT2MFCC(0.707106781186548) + +typedef struct vad_data_s { + uint8 in_speech; + int16 pre_speech_frames; + int16 post_speech_frames; + prespch_buf_t* prespch_buf; +} vad_data_t; + +/** Structure for the front-end computation. */ +struct fe_s { + cmd_ln_t *config; + int refcount; + + float32 sampling_rate; + int16 frame_rate; + int16 frame_shift; + + float32 window_length; + int16 frame_size; + int16 fft_size; + + uint8 fft_order; + uint8 feature_dimension; + uint8 num_cepstra; + uint8 remove_dc; + uint8 log_spec; + uint8 swap; + uint8 dither; + uint8 transform; + uint8 remove_noise; + uint8 remove_silence; + + float32 pre_emphasis_alpha; + int16 pre_emphasis_prior; + int32 dither_seed; + + int16 num_overflow_samps; + size_t num_processed_samps; + + /* Twiddle factors for FFT. */ + frame_t *ccc, *sss; + /* Mel filter parameters. */ + melfb_t *mel_fb; + /* Half of a Hamming Window. */ + window_t *hamming_window; + + /* Noise removal */ + noise_stats_t *noise_stats; + + /* VAD variables */ + int16 pre_speech; + int16 post_speech; + int16 start_speech; + float32 vad_threshold; + vad_data_t *vad_data; + + /* Temporary buffers for processing. */ + /* FIXME: too many of these. */ + int16 *spch; + frame_t *frame; + powspec_t *spec, *mfspec; + int16 *overflow_samps; +}; + +void fe_init_dither(int32 seed); + +/* Apply 1/2 bit noise to a buffer of audio. */ +int32 fe_dither(int16 *buffer, int32 nsamps); + +/* Load a frame of data into the fe. */ +int fe_read_frame(fe_t *fe, int16 const *in, int32 len); + +/* Shift the input buffer back and read more data. */ +int fe_shift_frame(fe_t *fe, int16 const *in, int32 len); + +/* Process a frame of data into features. */ +void fe_write_frame(fe_t *fe, mfcc_t *feat, int32 store_pcm); + +/* Initialization functions. */ +int32 fe_build_melfilters(melfb_t *MEL_FB); +int32 fe_compute_melcosine(melfb_t *MEL_FB); +void fe_create_hamming(window_t *in, int32 in_len); +void fe_create_twiddle(fe_t *fe); + +fixed32 fe_log_add(fixed32 x, fixed32 y); +fixed32 fe_log_sub(fixed32 x, fixed32 y); + +/* Miscellaneous processing functions. */ +void fe_spec2cep(fe_t * fe, const powspec_t * mflogspec, mfcc_t * mfcep); +void fe_dct2(fe_t *fe, const powspec_t *mflogspec, mfcc_t *mfcep, int htk); +void fe_dct3(fe_t *fe, const mfcc_t *mfcep, powspec_t *mflogspec); + +#ifdef __cplusplus +} +#endif + +#endif /* __FE_INTERNAL_H__ */ diff --git a/src/libsphinxbase/fe/fe_noise.c b/src/libsphinxbase/fe/fe_noise.c new file mode 100644 index 000000000..32227bdd8 --- /dev/null +++ b/src/libsphinxbase/fe/fe_noise.c @@ -0,0 +1,492 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* This noise removal algorithm is inspired by the following papers + * Computationally Efficient Speech Enchancement by Spectral Minina Tracking + * by G. Doblinger + * + * Power-Normalized Cepstral Coefficients (PNCC) for Robust Speech Recognition + * by C. Kim. + * + * For the recent research and state of art see papers about IMRCA and + * A Minimum-Mean-Square-Error Noise Reduction Algorithm On Mel-Frequency + * Cepstra For Robust Speech Recognition by Dong Yu and others + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/err.h" + +#include "fe_noise.h" +#include "fe_internal.h" + +/* Noise supression constants */ +#define SMOOTH_WINDOW 4 +#define LAMBDA_POWER 0.7 +#define LAMBDA_A 0.995 +#define LAMBDA_B 0.5 +#define LAMBDA_T 0.85 +#define MU_T 0.2 +#define MAX_GAIN 20 +#define SLOW_PEAK_FORGET_FACTOR 0.9995 +#define SLOW_PEAK_LEARN_FACTOR 0.9 +#define SPEECH_VOLUME_RANGE 8.0 + +/* define VAD_DEBUG 1 */ +#ifdef VAD_DEBUG +static FILE *vad_stats; +static int64 low_snr = 0; +static int64 low_volume = 0; +#endif + +struct noise_stats_s { + /* Smoothed power */ + powspec_t *power; + /* Noise estimate */ + powspec_t *noise; + /* Signal floor estimate */ + powspec_t *floor; + /* Peak for temporal masking */ + powspec_t *peak; + + /* Initialize it next time */ + uint8 undefined; + /* Number of items to process */ + uint32 num_filters; + + /* Sum of slow peaks for VAD */ + powspec_t slow_peak_sum; + + /* Precomputed constants */ + powspec_t lambda_power; + powspec_t comp_lambda_power; + powspec_t lambda_a; + powspec_t comp_lambda_a; + powspec_t lambda_b; + powspec_t comp_lambda_b; + powspec_t lambda_t; + powspec_t mu_t; + powspec_t max_gain; + powspec_t inv_max_gain; + + powspec_t smooth_scaling[2 * SMOOTH_WINDOW + 3]; +}; + +static void +fe_lower_envelope(noise_stats_t *noise_stats, powspec_t * buf, powspec_t * floor_buf, int32 num_filt) +{ + int i; + + for (i = 0; i < num_filt; i++) { +#ifndef FIXED_POINT + if (buf[i] >= floor_buf[i]) { + floor_buf[i] = + noise_stats->lambda_a * floor_buf[i] + noise_stats->comp_lambda_a * buf[i]; + } + else { + floor_buf[i] = + noise_stats->lambda_b * floor_buf[i] + noise_stats->comp_lambda_b * buf[i]; + } +#else + if (buf[i] >= floor_buf[i]) { + floor_buf[i] = fe_log_add(noise_stats->lambda_a + floor_buf[i], + noise_stats->comp_lambda_a + buf[i]); + } + else { + floor_buf[i] = fe_log_add(noise_stats->lambda_b + floor_buf[i], + noise_stats->comp_lambda_b + buf[i]); + } +#endif + } +} + +/* update slow peaks, check if max signal level big enough compared to peak */ +static int16 +fe_is_frame_quiet(noise_stats_t *noise_stats, powspec_t *buf, int32 num_filt) +{ + int i; + int16 is_quiet; + powspec_t sum; + double smooth_factor; + + sum = 0.0; + for (i = 0; i < num_filt; i++) { +#ifndef FIXED_POINT + sum += buf[i]; +#else + sum = fe_log_add(sum, buf[i]); +#endif + } +#ifndef FIXED_POINT + sum = log(sum); +#endif + smooth_factor = (sum > noise_stats->slow_peak_sum) ? SLOW_PEAK_LEARN_FACTOR : SLOW_PEAK_FORGET_FACTOR; + noise_stats->slow_peak_sum = noise_stats->slow_peak_sum * smooth_factor + + sum * (1 - smooth_factor); + +#ifdef VAD_DEBUG +#ifndef FIXED_POINT + fprintf(vad_stats, "%.3f %.3f ", noise_stats->slow_peak_sum, sum); +#else + fprintf(vad_stats, "%d %d ", noise_stats->slow_peak_sum, sum); +#endif +#endif +#ifndef FIXED_POINT + is_quiet = noise_stats->slow_peak_sum - SPEECH_VOLUME_RANGE > sum; +#else + is_quiet = noise_stats->slow_peak_sum - FLOAT2FIX(SPEECH_VOLUME_RANGE) > sum; +#endif + return is_quiet; +} + +/* temporal masking */ +static void +fe_temp_masking(noise_stats_t *noise_stats, powspec_t * buf, powspec_t * peak, int32 num_filt) +{ + powspec_t cur_in; + int i; + + for (i = 0; i < num_filt; i++) { + cur_in = buf[i]; + +#ifndef FIXED_POINT + peak[i] *= noise_stats->lambda_t; + if (buf[i] < noise_stats->lambda_t * peak[i]) + buf[i] = peak[i] * noise_stats->mu_t; +#else + peak[i] += noise_stats->lambda_t; + if (buf[i] < noise_stats->lambda_t + peak[i]) + buf[i] = peak[i] + noise_stats->mu_t; +#endif + + if (cur_in > peak[i]) + peak[i] = cur_in; + } +} + +/* spectral weight smoothing */ +static void +fe_weight_smooth(noise_stats_t *noise_stats, powspec_t * buf, powspec_t * coefs, int32 num_filt) +{ + int i, j; + int l1, l2; + powspec_t coef; + + for (i = 0; i < num_filt; i++) { + l1 = ((i - SMOOTH_WINDOW) > 0) ? (i - SMOOTH_WINDOW) : 0; + l2 = ((i + SMOOTH_WINDOW) < + (num_filt - 1)) ? (i + SMOOTH_WINDOW) : (num_filt - 1); + +#ifndef FIXED_POINT + coef = 0; + for (j = l1; j <= l2; j++) { + coef += coefs[j]; + } + buf[i] = buf[i] * (coef / (l2 - l1 + 1)); +#else + coef = MIN_FIXLOG; + for (j = l1; j <= l2; j++) { + coef = fe_log_add(coef, coefs[j]); + } + buf[i] = buf[i] + coef - noise_stats->smooth_scaling[l2 - l1 + 1]; +#endif + + } +} + +noise_stats_t * +fe_init_noisestats(int num_filters) +{ + int i; + noise_stats_t *noise_stats; + + noise_stats = (noise_stats_t *) ckd_calloc(1, sizeof(noise_stats_t)); + + noise_stats->power = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->noise = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->floor = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->peak = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + + noise_stats->undefined = TRUE; + noise_stats->num_filters = num_filters; + +#ifndef FIXED_POINT + noise_stats->lambda_power = LAMBDA_POWER; + noise_stats->comp_lambda_power = 1 - LAMBDA_POWER; + noise_stats->lambda_a = LAMBDA_A; + noise_stats->comp_lambda_a = 1 - LAMBDA_A; + noise_stats->lambda_b = LAMBDA_B; + noise_stats->comp_lambda_b = 1 - LAMBDA_B; + noise_stats->lambda_t = LAMBDA_T; + noise_stats->mu_t = MU_T; + noise_stats->max_gain = MAX_GAIN; + noise_stats->inv_max_gain = 1.0 / MAX_GAIN; + + for (i = 1; i < 2 * SMOOTH_WINDOW + 1; i++) { + noise_stats->smooth_scaling[i] = 1.0 / i; + } +#else + noise_stats->lambda_power = FLOAT2FIX(log(LAMBDA_POWER)); + noise_stats->comp_lambda_power = FLOAT2FIX(log(1 - LAMBDA_POWER)); + noise_stats->lambda_a = FLOAT2FIX(log(LAMBDA_A)); + noise_stats->comp_lambda_a = FLOAT2FIX(log(1 - LAMBDA_A)); + noise_stats->lambda_b = FLOAT2FIX(log(LAMBDA_B)); + noise_stats->comp_lambda_b = FLOAT2FIX(log(1 - LAMBDA_B)); + noise_stats->lambda_t = FLOAT2FIX(log(LAMBDA_T)); + noise_stats->mu_t = FLOAT2FIX(log(MU_T)); + noise_stats->max_gain = FLOAT2FIX(log(MAX_GAIN)); + noise_stats->inv_max_gain = FLOAT2FIX(log(1.0 / MAX_GAIN)); + + for (i = 1; i < 2 * SMOOTH_WINDOW + 3; i++) { + noise_stats->smooth_scaling[i] = FLOAT2FIX(log(i)); + } +#endif + +#ifdef VAD_DEBUG + vad_stats = fopen("vad_debug", "w"); +#endif + + return noise_stats; +} + +void +fe_reset_noisestats(noise_stats_t * noise_stats) +{ + if (noise_stats) + noise_stats->undefined = TRUE; +} + +void +fe_free_noisestats(noise_stats_t * noise_stats) +{ + ckd_free(noise_stats->power); + ckd_free(noise_stats->noise); + ckd_free(noise_stats->floor); + ckd_free(noise_stats->peak); + ckd_free(noise_stats); +#ifdef VAD_DEBUG + fclose(vad_stats); + E_INFO("Low SNR [%ld] frames; Low volume [%ld] frames\n", (long)low_snr, (long)low_volume); +#endif + +} + +/** + * For fixed point we are doing the computation in a fixlog domain, + * so we have to add many processing cases. + */ +void +fe_track_snr(fe_t * fe, int32 *in_speech) +{ + powspec_t *signal; + powspec_t *gain; + noise_stats_t *noise_stats; + powspec_t *mfspec; + int32 i, num_filts; + int16 is_quiet; + powspec_t lrt, snr; + + if (!(fe->remove_noise || fe->remove_silence)) { + *in_speech = TRUE; + return; + } + + noise_stats = fe->noise_stats; + mfspec = fe->mfspec; + num_filts = noise_stats->num_filters; + + signal = (powspec_t *) ckd_calloc(num_filts, sizeof(powspec_t)); + + if (noise_stats->undefined) { + noise_stats->slow_peak_sum = FIX2FLOAT(0.0); + for (i = 0; i < num_filts; i++) { + noise_stats->power[i] = mfspec[i]; +#ifndef FIXED_POINT + noise_stats->noise[i] = mfspec[i] / noise_stats->max_gain; + noise_stats->floor[i] = mfspec[i] / noise_stats->max_gain; + noise_stats->peak[i] = 0.0; +#else + noise_stats->noise[i] = mfspec[i] - noise_stats->max_gain;; + noise_stats->floor[i] = mfspec[i] - noise_stats->max_gain; + noise_stats->peak[i] = MIN_FIXLOG; +#endif + } + noise_stats->undefined = FALSE; + } + + /* Calculate smoothed power */ + for (i = 0; i < num_filts; i++) { +#ifndef FIXED_POINT + noise_stats->power[i] = + noise_stats->lambda_power * noise_stats->power[i] + noise_stats->comp_lambda_power * mfspec[i]; +#else + noise_stats->power[i] = fe_log_add(noise_stats->lambda_power + noise_stats->power[i], + noise_stats->comp_lambda_power + mfspec[i]); +#endif + } + + /* Noise estimation and vad decision */ + fe_lower_envelope(noise_stats, noise_stats->power, noise_stats->noise, num_filts); + + lrt = FLOAT2FIX(0.0); + for (i = 0; i < num_filts; i++) { +#ifndef FIXED_POINT + signal[i] = noise_stats->power[i] - noise_stats->noise[i]; + if (signal[i] < 1.0) + signal[i] = 1.0; + snr = log(noise_stats->power[i] / noise_stats->noise[i]); +#else + signal[i] = fe_log_sub(noise_stats->power[i], noise_stats->noise[i]); + snr = noise_stats->power[i] - noise_stats->noise[i]; +#endif + if (snr > lrt) + lrt = snr; + } + is_quiet = fe_is_frame_quiet(noise_stats, signal, num_filts); + +#ifdef VAD_DEBUG + if (lrt < fe->vad_threshold) + low_snr++; + else if (is_quiet) + low_volume++; +#endif + +#ifndef FIXED_POINT + if (fe->remove_silence && (lrt < fe->vad_threshold || is_quiet)) { +#else + if (fe->remove_silence && (lrt < FLOAT2FIX(fe->vad_threshold) || is_quiet)) { +#endif + *in_speech = FALSE; + } else { + *in_speech = TRUE; + } + +#ifdef VAD_DEBUG +#ifndef FIXED_POINT + fprintf(vad_stats, "%.3f %d\n", lrt, *in_speech); +#else + fprintf(vad_stats, "%d %d\n", lrt, *in_speech); +#endif +#endif + + fe_lower_envelope(noise_stats, signal, noise_stats->floor, num_filts); + + fe_temp_masking(noise_stats, signal, noise_stats->peak, num_filts); + + if (!fe->remove_noise) { + /* no need for further calculations if noise cancellation disabled */ + ckd_free(signal); + return; + } + + for (i = 0; i < num_filts; i++) { + if (signal[i] < noise_stats->floor[i]) + signal[i] = noise_stats->floor[i]; + } + + gain = (powspec_t *) ckd_calloc(num_filts, sizeof(powspec_t)); +#ifndef FIXED_POINT + for (i = 0; i < num_filts; i++) { + if (signal[i] < noise_stats->max_gain * noise_stats->power[i]) + gain[i] = signal[i] / noise_stats->power[i]; + else + gain[i] = noise_stats->max_gain; + if (gain[i] < noise_stats->inv_max_gain) + gain[i] = noise_stats->inv_max_gain; + } +#else + for (i = 0; i < num_filts; i++) { + gain[i] = signal[i] - noise_stats->power[i]; + if (gain[i] > noise_stats->max_gain) + gain[i] = noise_stats->max_gain; + if (gain[i] < noise_stats->inv_max_gain) + gain[i] = noise_stats->inv_max_gain; + } +#endif + + /* Weight smoothing and time frequency normalization */ + fe_weight_smooth(noise_stats, mfspec, gain, num_filts); + + ckd_free(gain); + ckd_free(signal); +} + +void +fe_vad_hangover(fe_t * fe, mfcc_t * feat, int32 is_speech, int32 store_pcm) +{ + if (!fe->vad_data->in_speech) { + fe_prespch_write_cep(fe->vad_data->prespch_buf, feat); + if (store_pcm) + fe_prespch_write_pcm(fe->vad_data->prespch_buf, fe->spch); + } + + /* track vad state and deal with cepstrum prespeech buffer */ + if (is_speech) { + fe->vad_data->post_speech_frames = 0; + if (!fe->vad_data->in_speech) { + fe->vad_data->pre_speech_frames++; + /* check for transition sil->speech */ + if (fe->vad_data->pre_speech_frames >= fe->start_speech) { + fe->vad_data->pre_speech_frames = 0; + fe->vad_data->in_speech = 1; + } + } + } else { + fe->vad_data->pre_speech_frames = 0; + if (fe->vad_data->in_speech) { + fe->vad_data->post_speech_frames++; + /* check for transition speech->sil */ + if (fe->vad_data->post_speech_frames >= fe->post_speech) { + fe->vad_data->post_speech_frames = 0; + fe->vad_data->in_speech = 0; + fe_prespch_reset_cep(fe->vad_data->prespch_buf); + fe_prespch_reset_pcm(fe->vad_data->prespch_buf); + } + } + } +} diff --git a/src/libsphinxbase/fe/fe_noise.h b/src/libsphinxbase/fe/fe_noise.h new file mode 100644 index 000000000..63cfdbd1e --- /dev/null +++ b/src/libsphinxbase/fe/fe_noise.h @@ -0,0 +1,66 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef FE_NOISE_H +#define FE_NOISE_H + +#include "sphinxbase/fe.h" +#include "sphinxbase/fixpoint.h" +#include "fe_type.h" + +typedef struct noise_stats_s noise_stats_t; + +/* Creates noisestats object */ +noise_stats_t *fe_init_noisestats(int num_filters); + +/* Resets collected noise statistics */ +void fe_reset_noisestats(noise_stats_t * noise_stats); + +/* Frees allocated data */ +void fe_free_noisestats(noise_stats_t * noise_stats); + +/** + * Process frame, update noise statistics, remove noise components if needed, + * and return local vad decision. + */ +void fe_track_snr(fe_t *fe, int32 *in_speech); + +/** + * Updates global state based on local VAD state smoothing the estimate. + */ +void fe_vad_hangover(fe_t *fe, mfcc_t *feat, int32 is_speech, int32 store_pcm); + +#endif /* FE_NOISE_H */ diff --git a/src/libsphinxbase/fe/fe_prespch_buf.c b/src/libsphinxbase/fe/fe_prespch_buf.c new file mode 100644 index 000000000..c6993e9b8 --- /dev/null +++ b/src/libsphinxbase/fe/fe_prespch_buf.c @@ -0,0 +1,206 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== +* Copyright (c) 2013 Carnegie Mellon University. All rights +* reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* +* This work was supported in part by funding from the Defense Advanced +* Research Projects Agency and the National Science Foundation of the +* United States of America, and the CMU Sphinx Speech Consortium. +* +* THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND +* ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY +* NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* ==================================================================== +* +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/err.h" + +#include "fe_prespch_buf.h" + +struct prespch_buf_s { + /* saved mfcc frames */ + mfcc_t **cep_buf; + /* saved pcm audio */ + int16 *pcm_buf; + + /* flag for pcm buffer initialization */ + int16 cep_write_ptr; + /* read pointer for cep buffer */ + int16 cep_read_ptr; + /* Count */ + int16 ncep; + + + /* flag for pcm buffer initialization */ + int16 pcm_write_ptr; + /* read pointer for cep buffer */ + int16 pcm_read_ptr; + /* Count */ + int16 npcm; + + /* frames amount in cep buffer */ + int16 num_frames_cep; + /* frames amount in pcm buffer */ + int16 num_frames_pcm; + /* filters amount */ + int16 num_cepstra; + /* amount of fresh samples in frame */ + int16 num_samples; +}; + +prespch_buf_t * +fe_prespch_init(int num_frames, int num_cepstra, int num_samples) +{ + prespch_buf_t *prespch_buf; + + prespch_buf = (prespch_buf_t *) ckd_calloc(1, sizeof(prespch_buf_t)); + + prespch_buf->num_cepstra = num_cepstra; + prespch_buf->num_frames_cep = num_frames; + prespch_buf->num_samples = num_samples; + prespch_buf->num_frames_pcm = 0; + + prespch_buf->cep_write_ptr = 0; + prespch_buf->cep_read_ptr = 0; + prespch_buf->ncep = 0; + + prespch_buf->pcm_write_ptr = 0; + prespch_buf->pcm_read_ptr = 0; + prespch_buf->npcm = 0; + + prespch_buf->cep_buf = (mfcc_t **) + ckd_calloc_2d(num_frames, num_cepstra, + sizeof(**prespch_buf->cep_buf)); + + prespch_buf->pcm_buf = (int16 *) + ckd_calloc(prespch_buf->num_frames_pcm * prespch_buf->num_samples, + sizeof(int16)); + + return prespch_buf; +} + + +int +fe_prespch_read_cep(prespch_buf_t * prespch_buf, mfcc_t * feat) +{ + if (prespch_buf->ncep == 0) + return 0; + memcpy(feat, prespch_buf->cep_buf[prespch_buf->cep_read_ptr], + sizeof(mfcc_t) * prespch_buf->num_cepstra); + prespch_buf->cep_read_ptr = (prespch_buf->cep_read_ptr + 1) % prespch_buf->num_frames_cep; + prespch_buf->ncep--; + return 1; +} + +void +fe_prespch_write_cep(prespch_buf_t * prespch_buf, mfcc_t * feat) +{ + memcpy(prespch_buf->cep_buf[prespch_buf->cep_write_ptr], feat, + sizeof(mfcc_t) * prespch_buf->num_cepstra); + prespch_buf->cep_write_ptr = (prespch_buf->cep_write_ptr + 1) % prespch_buf->num_frames_cep; + if (prespch_buf->ncep < prespch_buf->num_frames_cep) { + prespch_buf->ncep++; + } else { + prespch_buf->cep_read_ptr = (prespch_buf->cep_read_ptr + 1) % prespch_buf->num_frames_cep; + } +} + +void +fe_prespch_read_pcm(prespch_buf_t * prespch_buf, int16 *samples, + int32 *samples_num) +{ + int i; + int16 *cursample = samples; + *samples_num = prespch_buf->npcm * prespch_buf->num_samples; + for (i = 0; i < prespch_buf->npcm; i++) { + memcpy(cursample, &prespch_buf->pcm_buf[prespch_buf->pcm_read_ptr * prespch_buf->num_samples], + prespch_buf->num_samples * sizeof(int16)); + prespch_buf->pcm_read_ptr = (prespch_buf->pcm_read_ptr + 1) % prespch_buf->num_frames_pcm; + } + prespch_buf->pcm_read_ptr = 0; + prespch_buf->pcm_write_ptr = 0; + prespch_buf->npcm = 0; + return; +} + +void +fe_prespch_write_pcm(prespch_buf_t * prespch_buf, int16 * samples) +{ + int32 sample_ptr; + + sample_ptr = prespch_buf->pcm_write_ptr * prespch_buf->num_samples; + memcpy(&prespch_buf->pcm_buf[sample_ptr], samples, + prespch_buf->num_samples * sizeof(int16)); + + prespch_buf->pcm_write_ptr = (prespch_buf->pcm_write_ptr + 1) % prespch_buf->num_frames_pcm; + if (prespch_buf->npcm < prespch_buf->num_frames_pcm) { + prespch_buf->npcm++; + } else { + prespch_buf->pcm_read_ptr = (prespch_buf->pcm_read_ptr + 1) % prespch_buf->num_frames_pcm; + } +} + +void +fe_prespch_reset_cep(prespch_buf_t * prespch_buf) +{ + prespch_buf->cep_read_ptr = 0; + prespch_buf->cep_write_ptr = 0; + prespch_buf->ncep = 0; +} + +void +fe_prespch_reset_pcm(prespch_buf_t * prespch_buf) +{ + prespch_buf->pcm_read_ptr = 0; + prespch_buf->pcm_write_ptr = 0; + prespch_buf->npcm = 0; +} + +void +fe_prespch_free(prespch_buf_t * prespch_buf) +{ + if (!prespch_buf) + return; + if (prespch_buf->cep_buf) + ckd_free_2d((void **) prespch_buf->cep_buf); + if (prespch_buf->pcm_buf) + ckd_free(prespch_buf->pcm_buf); + ckd_free(prespch_buf); +} + +int32 +fe_prespch_ncep(prespch_buf_t * prespch_buf) +{ + return prespch_buf->ncep; +} diff --git a/src/libsphinxbase/fe/fe_prespch_buf.h b/src/libsphinxbase/fe/fe_prespch_buf.h new file mode 100644 index 000000000..2accc9c34 --- /dev/null +++ b/src/libsphinxbase/fe/fe_prespch_buf.h @@ -0,0 +1,76 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* Buffer that maintains both features and raw audio for the VAD implementation */ + +#ifndef FE_INTERNAL_H +#define FE_INTERNAL_H + +#include "sphinxbase/fe.h" + +typedef struct prespch_buf_s prespch_buf_t; + +/* Creates prespeech buffer */ +prespch_buf_t *fe_prespch_init(int num_frames, int num_cepstra, + int num_samples); + +/* Reads mfcc frame from prespeech buffer */ +int fe_prespch_read_cep(prespch_buf_t * prespch_buf, mfcc_t * fea); + +/* Writes mfcc frame to prespeech buffer */ +void fe_prespch_write_cep(prespch_buf_t * prespch_buf, mfcc_t * fea); + +/* Reads pcm frame from prespeech buffer */ +void fe_prespch_read_pcm(prespch_buf_t * prespch_buf, int16 *samples, + int32 * samples_num); + +/* Writes pcm frame to prespeech buffer */ +void fe_prespch_write_pcm(prespch_buf_t * prespch_buf, int16 * samples); + +/* Resets read/write pointers for cepstrum buffer */ +void fe_prespch_reset_cep(prespch_buf_t * prespch_buf); + +/* Resets read/write pointer for pcm audio buffer */ +void fe_prespch_reset_pcm(prespch_buf_t * prespch_buf); + +/* Releases prespeech buffer */ +void fe_prespch_free(prespch_buf_t * prespch_buf); + +/* Returns number of accumulated frames */ +int32 fe_prespch_ncep(prespch_buf_t * prespch_buf); + +#endif /* FE_INTERNAL_H */ diff --git a/src/libsphinxbase/fe/fe_sigproc.c b/src/libsphinxbase/fe/fe_sigproc.c new file mode 100644 index 000000000..041db7b64 --- /dev/null +++ b/src/libsphinxbase/fe/fe_sigproc.c @@ -0,0 +1,1206 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +/** + * Windows math.h does not contain M_PI + */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/byteorder.h" +#include "sphinxbase/fixpoint.h" +#include "sphinxbase/fe.h" +#include "sphinxbase/genrand.h" +#include "sphinxbase/err.h" + +#include "fe_internal.h" +#include "fe_warp.h" + +/* Use extra precision for cosines, Hamming window, pre-emphasis + * coefficient, twiddle factors. */ +#ifdef FIXED_POINT +#define FLOAT2COS(x) FLOAT2FIX_ANY(x,30) +#define COSMUL(x,y) FIXMUL_ANY(x,y,30) +#else +#define FLOAT2COS(x) (x) +#define COSMUL(x,y) ((x)*(y)) +#endif + +#ifdef FIXED_POINT + +/* Internal log-addition table for natural log with radix point at 8 + * bits. Each entry is 256 * log(1 + e^{-n/256}). This is used in the + * log-add computation: + * + * e^z = e^x + e^y + * e^z = e^x(1 + e^{y-x}) = e^y(1 + e^{x-y}) + * z = x + log(1 + e^{y-x}) = y + log(1 + e^{x-y}) + * + * So when y > x, z = y + logadd_table[-(x-y)] + * when x > y, z = x + logadd_table[-(y-x)] + */ +static const unsigned char fe_logadd_table[] = { + 177, 177, 176, 176, 175, 175, 174, 174, 173, 173, + 172, 172, 172, 171, 171, 170, 170, 169, 169, 168, + 168, 167, 167, 166, 166, 165, 165, 164, 164, 163, + 163, 162, 162, 161, 161, 161, 160, 160, 159, 159, + 158, 158, 157, 157, 156, 156, 155, 155, 155, 154, + 154, 153, 153, 152, 152, 151, 151, 151, 150, 150, + 149, 149, 148, 148, 147, 147, 147, 146, 146, 145, + 145, 144, 144, 144, 143, 143, 142, 142, 141, 141, + 141, 140, 140, 139, 139, 138, 138, 138, 137, 137, + 136, 136, 136, 135, 135, 134, 134, 134, 133, 133, + 132, 132, 131, 131, 131, 130, 130, 129, 129, 129, + 128, 128, 128, 127, 127, 126, 126, 126, 125, 125, + 124, 124, 124, 123, 123, 123, 122, 122, 121, 121, + 121, 120, 120, 119, 119, 119, 118, 118, 118, 117, + 117, 117, 116, 116, 115, 115, 115, 114, 114, 114, + 113, 113, 113, 112, 112, 112, 111, 111, 110, 110, + 110, 109, 109, 109, 108, 108, 108, 107, 107, 107, + 106, 106, 106, 105, 105, 105, 104, 104, 104, 103, + 103, 103, 102, 102, 102, 101, 101, 101, 100, 100, + 100, 99, 99, 99, 98, 98, 98, 97, 97, 97, + 96, 96, 96, 96, 95, 95, 95, 94, 94, 94, + 93, 93, 93, 92, 92, 92, 92, 91, 91, 91, + 90, 90, 90, 89, 89, 89, 89, 88, 88, 88, + 87, 87, 87, 87, 86, 86, 86, 85, 85, 85, + 85, 84, 84, 84, 83, 83, 83, 83, 82, 82, + 82, 82, 81, 81, 81, 80, 80, 80, 80, 79, + 79, 79, 79, 78, 78, 78, 78, 77, 77, 77, + 77, 76, 76, 76, 75, 75, 75, 75, 74, 74, + 74, 74, 73, 73, 73, 73, 72, 72, 72, 72, + 71, 71, 71, 71, 71, 70, 70, 70, 70, 69, + 69, 69, 69, 68, 68, 68, 68, 67, 67, 67, + 67, 67, 66, 66, 66, 66, 65, 65, 65, 65, + 64, 64, 64, 64, 64, 63, 63, 63, 63, 63, + 62, 62, 62, 62, 61, 61, 61, 61, 61, 60, + 60, 60, 60, 60, 59, 59, 59, 59, 59, 58, + 58, 58, 58, 58, 57, 57, 57, 57, 57, 56, + 56, 56, 56, 56, 55, 55, 55, 55, 55, 54, + 54, 54, 54, 54, 53, 53, 53, 53, 53, 52, + 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, + 50, 50, 50, 50, 50, 50, 49, 49, 49, 49, + 49, 49, 48, 48, 48, 48, 48, 48, 47, 47, + 47, 47, 47, 47, 46, 46, 46, 46, 46, 46, + 45, 45, 45, 45, 45, 45, 44, 44, 44, 44, + 44, 44, 43, 43, 43, 43, 43, 43, 43, 42, + 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, + 41, 41, 40, 40, 40, 40, 40, 40, 40, 39, + 39, 39, 39, 39, 39, 39, 38, 38, 38, 38, + 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, + 37, 36, 36, 36, 36, 36, 36, 36, 35, 35, + 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, + 34, 34, 34, 34, 33, 33, 33, 33, 33, 33, + 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 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, 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, + 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, 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, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 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, 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, + 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, 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, 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, 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, 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, + 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, 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, 0 +}; + +static const int fe_logadd_table_size = + sizeof(fe_logadd_table) / sizeof(fe_logadd_table[0]); + +fixed32 +fe_log_add(fixed32 x, fixed32 y) +{ + fixed32 d, r; + + if (x > y) { + d = (x - y) >> (DEFAULT_RADIX - 8); + r = x; + } + else { + d = (y - x) >> (DEFAULT_RADIX - 8); + r = y; + } + + if (r <= MIN_FIXLOG) + return MIN_FIXLOG; + else if (d > fe_logadd_table_size - 1) + return r; + else { + r += ((fixed32) fe_logadd_table[d] << (DEFAULT_RADIX - 8)); +/* printf("%d - %d = %d | %f - %f = %f | %f - %f = %f\n", + x, y, r, FIX2FLOAT(x), FIX2FLOAT(y), FIX2FLOAT(r), + exp(FIX2FLOAT(x)), exp(FIX2FLOAT(y)), exp(FIX2FLOAT(r))); +*/ + return r; + } +} + +/* + * log_sub for spectral subtraction, similar to logadd but we had + * to smooth function around zero with fixlog in order to improve + * table interpolation properties + * + * The table is created with the file included into distribution + * + * e^z = e^x - e^y + * e^z = e^x (1 - e^(-(x - y))) + * z = x + log(1 - e^(-(x - y))) + * z = x + fixlog(a) + (log(1 - e^(- a)) - log(a)) + * + * Input radix is 8 output radix is 10 + */ +static const uint16 fe_logsub_table[] = { +1, 3, 5, 7, 9, 11, 13, 15, 17, 19, +21, 23, 25, 27, 29, 31, 33, 35, 37, 39, +41, 43, 45, 47, 49, 51, 53, 55, 56, 58, +60, 62, 64, 66, 68, 70, 72, 74, 76, 78, +80, 82, 84, 86, 88, 90, 92, 94, 95, 97, +99, 101, 103, 105, 107, 109, 111, 113, 115, 117, +119, 121, 122, 124, 126, 128, 130, 132, 134, 136, +138, 140, 142, 143, 145, 147, 149, 151, 153, 155, +157, 159, 161, 162, 164, 166, 168, 170, 172, 174, +176, 178, 179, 181, 183, 185, 187, 189, 191, 193, +194, 196, 198, 200, 202, 204, 206, 207, 209, 211, +213, 215, 217, 219, 220, 222, 224, 226, 228, 230, +232, 233, 235, 237, 239, 241, 243, 244, 246, 248, +250, 252, 254, 255, 257, 259, 261, 263, 265, 266, +268, 270, 272, 274, 275, 277, 279, 281, 283, 284, +286, 288, 290, 292, 294, 295, 297, 299, 301, 302, +304, 306, 308, 310, 311, 313, 315, 317, 319, 320, +322, 324, 326, 327, 329, 331, 333, 335, 336, 338, +340, 342, 343, 345, 347, 349, 350, 352, 354, 356, +357, 359, 361, 363, 364, 366, 368, 370, 371, 373, +375, 377, 378, 380, 382, 384, 385, 387, 389, 391, +392, 394, 396, 397, 399, 401, 403, 404, 406, 408, +410, 411, 413, 415, 416, 418, 420, 422, 423, 425, +427, 428, 430, 432, 433, 435, 437, 439, 440, 442, +444, 445, 447, 449, 450, 452, 454, 455, 457, 459, +460, 462, 464, 465, 467, 469, 471, 472, 474, 476, +477, 479, 481, 482, 484, 486, 487, 489, 490, 492, +494, 495, 497, 499, 500, 502, 504, 505, 507, 509, +510, 512, 514, 515, 517, 518, 520, 522, 523, 525, +527, 528, 530, 532, 533, 535, 536, 538, 540, 541, +543, 544, 546, 548, 549, 551, 553, 554, 556, 557, +559, 561, 562, 564, 565, 567, 569, 570, 572, 573, +575, 577, 578, 580, 581, 583, 585, 586, 588, 589, +591, 592, 594, 596, 597, 599, 600, 602, 603, 605, +607, 608, 610, 611, 613, 614, 616, 618, 619, 621, +622, 624, 625, 627, 628, 630, 632, 633, 635, 636, +638, 639, 641, 642, 644, 645, 647, 649, 650, 652, +653, 655, 656, 658, 659, 661, 662, 664, 665, 667, +668, 670, 671, 673, 674, 676, 678, 679, 681, 682, +684, 685, 687, 688, 690, 691, 693, 694, 696, 697, +699, 700, 702, 703, 705, 706, 708, 709, 711, 712, +714, 715, 717, 718, 719, 721, 722, 724, 725, 727, +728, 730, 731, 733, 734, 736, 737, 739, 740, 742, +743, 745, 746, 747, 749, 750, 752, 753, 755, 756, +758, 759, 761, 762, 763, 765, 766, 768, 769, 771, +772, 774, 775, 776, 778, 779, 781, 782, 784, 785, +786, 788, 789, 791, 792, 794, 795, 796, 798, 799, +801, 802, 804, 805, 806, 808, 809, 811, 812, 813, +815, 816, 818, 819, 820, 822, 823, 825, 826, 827, +829, 830, 832, 833, 834, 836, 837, 839, 840, 841, +843, 844, 846, 847, 848, 850, 851, 852, 854, 855, +857, 858, 859, 861, 862, 863, 865, 866, 868, 869, +870, 872, 873, 874, 876, 877, 878, 880, 881, 883, +884, 885, 887, 888, 889, 891, 892, 893, 895, 896, +897, 899, 900, 901, 903, 904, 905, 907, 908, 909, +911, 912, 913, 915, 916, 917, 919, 920, 921, 923, +924, 925, 927, 928, 929, 931, 932, 933, 935, 936, +937, 939, 940, 941, 942, 944, 945, 946, 948, 949, +950, 952, 953, 954, 956, 957, 958, 959, 961, 962, +963, 965, 966, 967, 968, 970, 971, 972, 974, 975, +976, 977, 979, 980, 981, 983, 984, 985, 986, 988, +989, 990, 991, 993, 994, 995, 997, 998, 999, 1000, +1002, 1003, 1004, 1005, 1007, 1008, 1009, 1010, 1012, 1013, +1014, 1015, 1017, 1018, 1019, 1020, 1022, 1023, 1024, 1025, +1027, 1028, 1029, 1030, 1032, 1033, 1034, 1035, 1037, 1038, +1039, 1040, 1041, 1043, 1044, 1045, 1046, 1048, 1049, 1050, +1051, 1052, 1054, 1055, 1056, 1057, 1059, 1060, 1061, 1062, +1063, 1065, 1066, 1067, 1068, 1069, 1071, 1072, 1073, 1074, +1076, 1077, 1078, 1079, 1080, 1082, 1083, 1084, 1085, 1086, +1087, 1089, 1090, 1091, 1092, 1093, 1095, 1096, 1097, 1098, +1099, 1101, 1102, 1103, 1104, 1105, 1106, 1108, 1109, 1110, +1111, 1112, 1114, 1115, 1116, 1117, 1118, 1119, 1121, 1122, +1123, 1124, 1125, 1126, 1128, 1129, 1130, 1131, 1132, 1133, +1135, 1136, 1137, 1138, 1139, 1140, 1141, 1143, 1144, 1145, +1146, 1147, 1148, 1149, 1151, 1152, 1153, 1154, 1155, 1156, +1157, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1167, 1168, +1169, 1170, 1171, 1172, 1173, 1174, 1176, 1177, 1178, 1179, +1180, 1181, 1182, 1183, 1185, 1186, 1187, 1188, 1189, 1190, +1191, 1192, 1193, 1195, 1196, 1197, 1198, 1199, 1200, 1201, +1202, 1203, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, +1213, 1214, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, +1224, 1225, 1226, 1228, 1229, 1230, 1231, 1232, 1233, 1234, +1235, 1236, 1237, 1238, 1239, 1240, 1242, 1243, 1244, 1245, +1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, +1256, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, +1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1277, +1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, +1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, +1298, 1299, 1300, 1301, 1302, 1303, 1305, 1306, 1307, 1308, +1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, +1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, +1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, +1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, +1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, +1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, +1369, 1370, 1371, 1372, 1372, 1373, 1374, 1375, 1376, 1377, +1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, +1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, +1398, 1399, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, +1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, +1417, 1418, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, +1426, 1427, 1428, 1429, 1430, 1431, 1432, 1432, 1433, 1434, +1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, +1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, +1454, 1455, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, +1463, 1464, 1465, 1466, 1466, 1467, 1468, 1469, 1470, 1471, +1472, 1473, 1474, 1475, 1475, 1476, 1477, 1478, 1479, 1480, +1481, 1482, 1483, 1483, 1484, 1485, 1486, 1487, 1488, 1489, +1490, 1491, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, +1499, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1506, +1507, 1508, 1509, 1510, 1511, 1512, 1513, 1513, 1514, 1515, +1516, 1517, 1518, 1519, 1520, 1520, 1521, 1522, 1523, 1524, +1525, 1526, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1532, +1533, 1534, 1535, 1536, 1537, 1538, 1538, 1539, 1540, 1541, +1542, 1543, 1544, 1544, 1545, 1546, 1547, 1548, 1549, 1550, +1550, 1551, 1552, 1553, 1554, 1555, 1555, 1556, 1557, 1558, +1559, 1560, 1560, 1561, 1562, 1563, 1564, 1565, 1565, 1566, +1567, 1568, 1569, 1570, 1570, 1571, 1572, 1573, 1574, 1575, +1575, 1576, 1577, 1578, 1579, 1580, 1580, 1581, 1582, 1583, +1584, 1584, 1585, 1586, 1587, 1588, 1589, 1589, 1590, 1591, +1592, 1593, 1593, 1594, 1595, 1596, 1597, 1598, 1598, 1599, +1600, 1601, 1602, 1602, 1603, 1604, 1605, 1606, 1606, 1607, +1608, 1609, 1610, 1610, 1611, 1612, 1613, 1614, 1614, 1615, +1616, 1617, 1618, 1618, 1619, 1620, 1621, 1622, 1622, 1623, +1624, 1625, 1626, 1626, 1627, 1628, 1629, 1630, 1630, 1631, +1632, 1633, 1634, 1634, 1635, 1636, 1637, 1637, 1638, 1639, +1640, 1641, 1641, 1642, 1643, 1644, 1645, 1645, 1646, 1647, +1648, 1648, 1649, 1650, 1651, 1652, 1652, 1653, 1654, 1655, +1655, 1656, 1657, 1658, 1658, 1659, 1660, 1661, 1662, 1662, +1663, 1664, 1665, 1665, 1666, 1667, 1668, 1668, 1669, 1670, +1671, 1671, 1672, 1673, 1674, 1675, 1675, 1676, 1677, 1678, +1678, 1679, 1680, 1681, 1681, 1682, 1683, 1684, 1684, 1685, +1686, 1687, 1687, 1688, 1689, 1690, 1690, 1691, 1692, 1693, +1693, 1694, 1695, 1696, 1696, 1697, 1698, 1699, 1699, 1700, +1701, 1702, 1702, 1703, 1704, 1705, 1705, 1706, 1707, 1707, +1708, 1709, 1710, 1710, 1711, 1712, 1713, 1713, 1714, 1715, +1716, 1716, 1717, 1718, 1718, 1719, 1720, 1721, 1721, 1722, +1723, 1724, 1724, 1725, 1726, 1727, 1727, 1728, 1729, 1729, +1730, 1731, 1732, 1732, 1733, 1734, 1734, 1735, 1736, 1737, +1737, 1738, 1739, 1740, 1740, 1741, 1742, 1742, 1743, 1744, +1745, 1745, 1746, 1747, 1747, 1748, 1749, 1749, 1750, 1751, +1752, 1752, 1753, 1754, 1754, 1755, 1756, 1757, 1757, 1758, +1759, 1759, 1760, 1761, 1762, 1762, 1763, 1764, 1764, 1765, +1766, 1766, 1767, 1768, 1769, 1769, 1770, 1771, 1771, 1772, +1773, 1773, 1774, 1775, 1776, 1776, 1777, 1778, 1778, 1779, +1780, 1780, 1781, 1782, 1782, 1783, 1784, 1784, 1785, 1786, +1787, 1787, 1788, 1789, 1789, 1790, 1791, 1791, 1792, 1793, +1793, 1794, 1795, 1795, 1796, 1797, 1798, 1798, 1799, 1800, +1800, 1801, 1802, 1802, 1803, 1804, 1804, 1805, 1806, 1806, +1807, 1808, 1808, 1809, 1810, 1810, 1811, 1812, 1812, 1813, +1814, 1814, 1815, 1816, 1816, 1817, 1818, 1818, 1819, 1820, +1820, 1821, 1822, 1822, 1823, 1824, 1824, 1825, 1826, 1826, +1827, 1828, 1828, 1829, 1830, 1830, 1831, 1832, 1832, 1833, +1834, 1834, 1835, 1836, 1836, 1837, 1838, 1838, 1839, 1840, +1840, 1841, 1842, 1842, 1843, 1844, 1844, 1845, 1845, 1846, +1847, 1847, 1848, 1849, 1849, 1850, 1851, 1851, 1852, 1853, +1853, 1854, 1855, 1855, 1856, 1857, 1857, 1858, 1858, 1859, +1860, 1860, 1861, 1862, 1862, 1863, 1864, 1864, 1865, 1866, +1866, 1867, 1867, 1868, 1869, 1869, 1870, 1871, 1871, 1872, +1873, 1873, 1874, 1874, 1875, 1876, 1876, 1877, 1878, 1878, +1879, 1879, 1880, 1881, 1881, 1882, 1883, 1883, 1884, 1885, +1885, 1886, 1886, 1887, 1888, 1888, 1889, 1890, 1890, 1891, +1891, 1892, 1893, 1893, 1894, 1895, 1895, 1896, 1896, 1897, +1898, 1898, 1899, 1900, 1900, 1901, 1901, 1902, 1903, 1903, +1904, 1904, 1905, 1906, 1906, 1907, 1908, 1908, 1909, 1909, +1910, 1911, 1911, 1912, 1912, 1913, 1914, 1914, 1915, 1916, +1916, 1917, 1917, 1918, 1919, 1919, 1920, 1920, 1921, 1922, +1922, 1923, 1923, 1924, 1925, 1925, 1926, 1926, 1927, 1928, +1928, 1929, 1929, 1930, 1931, 1931, 1932, 1932, 1933, 1934, +1934, 1935, 1935, 1936, 1937, 1937, 1938, 1938, 1939, 1940, +1940, 1941, 1941, 1942, 1943, 1943, 1944, 1944, 1945, 1946, +1946, 1947, 1947, 1948, 1949, 1949, 1950, 1950, 1951, 1952, +1952, 1953, 1953, 1954, 1955, 1955, 1956, 1956, 1957, 1957, +1958, 1959, 1959, 1960, 1960, 1961, 1962, 1962, 1963, 1963, +1964, 1964, 1965, 1966, 1966, 1967, 1967, 1968, 1969, 1969, +1970, 1970, 1971, 1971, 1972, 1973, 1973, 1974, 1974, 1975, +1976, 1976, 1977, 1977, 1978, 1978, 1979, 1980, 1980, 1981, +1981, 1982, 1982, 1983, 1984, 1984, 1985, 1985, 1986, 1986, +1987, 1988, 1988, 1989, 1989, 1990, 1990, 1991, 1992, 1992, +1993, 1993, 1994, 1994, 1995, 1996, 1996, 1997, 1997, 1998, +1998, 1999, 1999, 2000, 2001, 2001, 2002, 2002, 2003, 2003, +2004, 2005, 2005, 2006, 2006, 2007, 2007, 2008, 2008, 2009, +2010, 2010, 2011, 2011, 2012, 2012, 2013, 2014, 2014, 2015, +2015, 2016, 2016, 2017, 2017, 2018, 2019, 2019, 2020, 2020, +2021, 2021, 2022, 2022, 2023, 2023, 2024, 2025, 2025, 2026, +2026, 2027, 2027, 2028, 2028, 2029, 2030, 2030, 2031, 2031, +2032, 2032, 2033, 2033, 2034, 2034, 2035, 2036, 2036, 2037, +2037, 2038, 2038, 2039, 2039, 2040, 2040, 2041, 2042, 2042, +2043, 2043, 2044, 2044, 2045, 2045, 2046, 2046, 2047, 2048, +2048, 2049, 2049, 2050, 2050, 2051, 2051, 2052, 2052, 2053, +2053, 2054, 2054, 2055, 2056, 2056, 2057, 2057, 2058, 2058, +2059, 2059, 2060, 2060, 2061, 2061, 2062, 2062, 2063, 2064, +2064, 2065, 2065, 2066, 2066, 2067, 2067, 2068, 2068, 2069, +2069, 2070, 2070, 2071, 2072, 2072, 2073, 2073, 2074, 2074, +2075, 2075, 2076, 2076, 2077, 2077, 2078, 2078, 2079, 2079, +2080, 2080, 2081 +}; + +static const int fe_logsub_table_size = + sizeof(fe_logsub_table) / sizeof(fe_logsub_table[0]); + +fixed32 +fe_log_sub(fixed32 x, fixed32 y) +{ + fixed32 d, r; + + if (x < MIN_FIXLOG || y >= x) + return MIN_FIXLOG; + + d = (x - y) >> (DEFAULT_RADIX - 8); + + if (d > fe_logsub_table_size - 1) + return x; + + r = fe_logsub_table[d] << (DEFAULT_RADIX - 10); +/* + printf("diff=%d\n", + x + FIXLN(x-y) - r - + (x + FLOAT2FIX(logf(-expm1f(FIX2FLOAT(y - x)))))); +*/ + return x + FIXLN(x-y) - r; +} + +static fixed32 +fe_log(float32 x) +{ + if (x <= 0) { + return MIN_FIXLOG; + } + else { + return FLOAT2FIX(log(x)); + } +} +#endif + +static float32 +fe_mel(melfb_t * mel, float32 x) +{ + float32 warped = fe_warp_unwarped_to_warped(mel, x); + + return (float32) (2595.0 * log10(1.0 + warped / 700.0)); +} + +static float32 +fe_melinv(melfb_t * mel, float32 x) +{ + float32 warped = (float32) (700.0 * (pow(10.0, x / 2595.0) - 1.0)); + return fe_warp_warped_to_unwarped(mel, warped); +} + +int32 +fe_build_melfilters(melfb_t * mel_fb) +{ + float32 melmin, melmax, melbw, fftfreq; + int n_coeffs, i, j; + + + /* Filter coefficient matrix, in flattened form. */ + mel_fb->spec_start = + ckd_calloc(mel_fb->num_filters, sizeof(*mel_fb->spec_start)); + mel_fb->filt_start = + ckd_calloc(mel_fb->num_filters, sizeof(*mel_fb->filt_start)); + mel_fb->filt_width = + ckd_calloc(mel_fb->num_filters, sizeof(*mel_fb->filt_width)); + + /* First calculate the widths of each filter. */ + /* Minimum and maximum frequencies in mel scale. */ + melmin = fe_mel(mel_fb, mel_fb->lower_filt_freq); + melmax = fe_mel(mel_fb, mel_fb->upper_filt_freq); + + /* Width of filters in mel scale */ + melbw = (melmax - melmin) / (mel_fb->num_filters + 1); + if (mel_fb->doublewide) { + melmin -= melbw; + melmax += melbw; + if ((fe_melinv(mel_fb, melmin) < 0) || + (fe_melinv(mel_fb, melmax) > mel_fb->sampling_rate / 2)) { + E_WARN + ("Out of Range: low filter edge = %f (%f)\n", + fe_melinv(mel_fb, melmin), 0.0); + E_WARN + (" high filter edge = %f (%f)\n", + fe_melinv(mel_fb, melmax), mel_fb->sampling_rate / 2); + return FE_INVALID_PARAM_ERROR; + } + } + + /* DFT point spacing */ + fftfreq = mel_fb->sampling_rate / (float32) mel_fb->fft_size; + + /* Count and place filter coefficients. */ + n_coeffs = 0; + for (i = 0; i < mel_fb->num_filters; ++i) { + float32 freqs[3]; + + /* Left, center, right frequencies in Hertz */ + for (j = 0; j < 3; ++j) { + if (mel_fb->doublewide) + freqs[j] = fe_melinv(mel_fb, (i + j * 2) * melbw + melmin); + else + freqs[j] = fe_melinv(mel_fb, (i + j) * melbw + melmin); + /* Round them to DFT points if requested */ + if (mel_fb->round_filters) + freqs[j] = ((int) (freqs[j] / fftfreq + 0.5)) * fftfreq; + } + + /* spec_start is the start of this filter in the power spectrum. */ + mel_fb->spec_start[i] = -1; + /* There must be a better way... */ + for (j = 0; j < mel_fb->fft_size / 2 + 1; ++j) { + float32 hz = j * fftfreq; + if (hz < freqs[0]) + continue; + else if (hz > freqs[2] || j == mel_fb->fft_size / 2) { + /* filt_width is the width in DFT points of this filter. */ + mel_fb->filt_width[i] = j - mel_fb->spec_start[i]; + /* filt_start is the start of this filter in the filt_coeffs array. */ + mel_fb->filt_start[i] = n_coeffs; + n_coeffs += mel_fb->filt_width[i]; + break; + } + if (mel_fb->spec_start[i] == -1) + mel_fb->spec_start[i] = j; + } + } + + /* Now go back and allocate the coefficient array. */ + mel_fb->filt_coeffs = + ckd_malloc(n_coeffs * sizeof(*mel_fb->filt_coeffs)); + + /* And now generate the coefficients. */ + n_coeffs = 0; + for (i = 0; i < mel_fb->num_filters; ++i) { + float32 freqs[3]; + + /* Left, center, right frequencies in Hertz */ + for (j = 0; j < 3; ++j) { + if (mel_fb->doublewide) + freqs[j] = fe_melinv(mel_fb, (i + j * 2) * melbw + melmin); + else + freqs[j] = fe_melinv(mel_fb, (i + j) * melbw + melmin); + /* Round them to DFT points if requested */ + if (mel_fb->round_filters) + freqs[j] = ((int) (freqs[j] / fftfreq + 0.5)) * fftfreq; + } + + for (j = 0; j < mel_fb->filt_width[i]; ++j) { + float32 hz, loslope, hislope; + + hz = (mel_fb->spec_start[i] + j) * fftfreq; + if (hz < freqs[0] || hz > freqs[2]) { + E_FATAL + ("Failed to create filterbank, frequency range does not match. " + "Sample rate %f, FFT size %d, lowerf %f < freq %f > upperf %f.\n", + mel_fb->sampling_rate, mel_fb->fft_size, freqs[0], hz, + freqs[2]); + } + loslope = (hz - freqs[0]) / (freqs[1] - freqs[0]); + hislope = (freqs[2] - hz) / (freqs[2] - freqs[1]); + if (mel_fb->unit_area) { + loslope *= 2 / (freqs[2] - freqs[0]); + hislope *= 2 / (freqs[2] - freqs[0]); + } + if (loslope < hislope) { +#ifdef FIXED_POINT + mel_fb->filt_coeffs[n_coeffs] = fe_log(loslope); +#else + mel_fb->filt_coeffs[n_coeffs] = loslope; +#endif + } + else { +#ifdef FIXED_POINT + mel_fb->filt_coeffs[n_coeffs] = fe_log(hislope); +#else + mel_fb->filt_coeffs[n_coeffs] = hislope; +#endif + } + ++n_coeffs; + } + } + + return FE_SUCCESS; +} + +int32 +fe_compute_melcosine(melfb_t * mel_fb) +{ + + float64 freqstep; + int32 i, j; + + mel_fb->mel_cosine = + (mfcc_t **) ckd_calloc_2d(mel_fb->num_cepstra, + mel_fb->num_filters, sizeof(mfcc_t)); + + freqstep = M_PI / mel_fb->num_filters; + /* NOTE: The first row vector is actually unnecessary but we leave + * it in to avoid confusion. */ + for (i = 0; i < mel_fb->num_cepstra; i++) { + for (j = 0; j < mel_fb->num_filters; j++) { + float64 cosine; + + cosine = cos(freqstep * i * (j + 0.5)); + mel_fb->mel_cosine[i][j] = FLOAT2COS(cosine); + } + } + + /* Also precompute normalization constants for unitary DCT. */ + mel_fb->sqrt_inv_n = FLOAT2COS(sqrt(1.0 / mel_fb->num_filters)); + mel_fb->sqrt_inv_2n = FLOAT2COS(sqrt(2.0 / mel_fb->num_filters)); + + /* And liftering weights */ + if (mel_fb->lifter_val) { + mel_fb->lifter = + calloc(mel_fb->num_cepstra, sizeof(*mel_fb->lifter)); + for (i = 0; i < mel_fb->num_cepstra; ++i) { + mel_fb->lifter[i] = FLOAT2MFCC(1 + mel_fb->lifter_val / 2 + * sin(i * M_PI / + mel_fb->lifter_val)); + } + } + + return (0); +} + +static void +fe_pre_emphasis(int16 const *in, frame_t * out, int32 len, + float32 factor, int16 prior) +{ + int i; + +#if defined(FIXED_POINT) + fixed32 fxd_alpha = FLOAT2FIX(factor); + out[0] = ((fixed32) in[0] << DEFAULT_RADIX) - (prior * fxd_alpha); + for (i = 1; i < len; ++i) + out[i] = ((fixed32) in[i] << DEFAULT_RADIX) + - (fixed32) in[i - 1] * fxd_alpha; +#else + out[0] = (frame_t) in[0] - (frame_t) prior *factor; + for (i = 1; i < len; i++) + out[i] = (frame_t) in[i] - (frame_t) in[i - 1] * factor; +#endif +} + +static void +fe_short_to_frame(int16 const *in, frame_t * out, int32 len) +{ + int i; + +#if defined(FIXED_POINT) + for (i = 0; i < len; i++) + out[i] = (int32) in[i] << DEFAULT_RADIX; +#else /* FIXED_POINT */ + for (i = 0; i < len; i++) + out[i] = (frame_t) in[i]; +#endif /* FIXED_POINT */ +} + +void +fe_create_hamming(window_t * in, int32 in_len) +{ + int i; + + /* Symmetric, so we only create the first half of it. */ + for (i = 0; i < in_len / 2; i++) { + float64 hamm; + hamm = (0.54 - 0.46 * cos(2 * M_PI * i / + ((float64) in_len - 1.0))); + in[i] = FLOAT2COS(hamm); + } +} + +static void +fe_hamming_window(frame_t * in, window_t * window, int32 in_len, + int32 remove_dc) +{ + int i; + + if (remove_dc) { + frame_t mean = 0; + + for (i = 0; i < in_len; i++) + mean += in[i]; + mean /= in_len; + for (i = 0; i < in_len; i++) + in[i] -= (frame_t) mean; + } + + for (i = 0; i < in_len / 2; i++) { + in[i] = COSMUL(in[i], window[i]); + in[in_len - 1 - i] = COSMUL(in[in_len - 1 - i], window[i]); + } +} + +static int +fe_spch_to_frame(fe_t * fe, int len) +{ + /* Copy to the frame buffer. */ + if (fe->pre_emphasis_alpha != 0.0) { + fe_pre_emphasis(fe->spch, fe->frame, len, + fe->pre_emphasis_alpha, fe->pre_emphasis_prior); + if (len >= fe->frame_shift) + fe->pre_emphasis_prior = fe->spch[fe->frame_shift - 1]; + else + fe->pre_emphasis_prior = fe->spch[len - 1]; + } + else + fe_short_to_frame(fe->spch, fe->frame, len); + + /* Zero pad up to FFT size. */ + memset(fe->frame + len, 0, (fe->fft_size - len) * sizeof(*fe->frame)); + + /* Window. */ + fe_hamming_window(fe->frame, fe->hamming_window, fe->frame_size, + fe->remove_dc); + + return len; +} + +int +fe_read_frame(fe_t * fe, int16 const *in, int32 len) +{ + int i; + + if (len > fe->frame_size) + len = fe->frame_size; + + /* Read it into the raw speech buffer. */ + memcpy(fe->spch, in, len * sizeof(*in)); + /* Swap and dither if necessary. */ + if (fe->swap) + for (i = 0; i < len; ++i) + SWAP_INT16(&fe->spch[i]); + if (fe->dither) + for (i = 0; i < len; ++i) + fe->spch[i] += (int16) ((!(s3_rand_int31() % 4)) ? 1 : 0); + + return fe_spch_to_frame(fe, len); +} + +int +fe_shift_frame(fe_t * fe, int16 const *in, int32 len) +{ + int offset, i; + + if (len > fe->frame_shift) + len = fe->frame_shift; + offset = fe->frame_size - fe->frame_shift; + + /* Shift data into the raw speech buffer. */ + memmove(fe->spch, fe->spch + fe->frame_shift, + offset * sizeof(*fe->spch)); + memcpy(fe->spch + offset, in, len * sizeof(*fe->spch)); + /* Swap and dither if necessary. */ + if (fe->swap) + for (i = 0; i < len; ++i) + SWAP_INT16(&fe->spch[offset + i]); + if (fe->dither) + for (i = 0; i < len; ++i) + fe->spch[offset + i] + += (int16) ((!(s3_rand_int31() % 4)) ? 1 : 0); + + return fe_spch_to_frame(fe, offset + len); +} + +/** + * Create arrays of twiddle factors. + */ +void +fe_create_twiddle(fe_t * fe) +{ + int i; + + for (i = 0; i < fe->fft_size / 4; ++i) { + float64 a = 2 * M_PI * i / fe->fft_size; +#if defined(FIXED_POINT) + fe->ccc[i] = FLOAT2COS(cos(a)); + fe->sss[i] = FLOAT2COS(sin(a)); +#else + fe->ccc[i] = cos(a); + fe->sss[i] = sin(a); +#endif + } +} + + +static int +fe_fft_real(fe_t * fe) +{ + int i, j, k, m, n; + frame_t *x, xt; + + x = fe->frame; + m = fe->fft_order; + n = fe->fft_size; + + /* Bit-reverse the input. */ + j = 0; + for (i = 0; i < n - 1; ++i) { + if (i < j) { + xt = x[j]; + x[j] = x[i]; + x[i] = xt; + } + k = n / 2; + while (k <= j) { + j -= k; + k /= 2; + } + j += k; + } + + /* Basic butterflies (2-point FFT, real twiddle factors): + * x[i] = x[i] + 1 * x[i+1] + * x[i+1] = x[i] + -1 * x[i+1] + */ + for (i = 0; i < n; i += 2) { + xt = x[i]; + x[i] = (xt + x[i + 1]); + x[i + 1] = (xt - x[i + 1]); + } + + /* The rest of the butterflies, in stages from 1..m */ + for (k = 1; k < m; ++k) { + int n1, n2, n4; + + n4 = k - 1; + n2 = k; + n1 = k + 1; + /* Stride over each (1 << (k+1)) points */ + for (i = 0; i < n; i += (1 << n1)) { + /* Basic butterfly with real twiddle factors: + * x[i] = x[i] + 1 * x[i + (1<ccc[j << (m - n1)]; + ss = fe->sss[j << (m - n1)]; + + /* There are some symmetry properties which allow us + * to get away with only four multiplications here. */ + t1 = COSMUL(x[i3], cc) + COSMUL(x[i4], ss); + t2 = COSMUL(x[i3], ss) - COSMUL(x[i4], cc); + + x[i4] = (x[i2] - t2); + x[i3] = (-x[i2] - t2); + x[i2] = (x[i1] - t1); + x[i1] = (x[i1] + t1); + } + } + } + + /* This isn't used, but return it for completeness. */ + return m; +} + +static void +fe_spec_magnitude(fe_t * fe) +{ + frame_t *fft; + powspec_t *spec; + int32 j, scale, fftsize; + + /* Do FFT and get the scaling factor back (only actually used in + * fixed-point). Note the scaling factor is expressed in bits. */ + scale = fe_fft_real(fe); + + /* Convenience pointers to make things less awkward below. */ + fft = fe->frame; + spec = fe->spec; + fftsize = fe->fft_size; + + /* We need to scale things up the rest of the way to N. */ + scale = fe->fft_order - scale; + + /* The first point (DC coefficient) has no imaginary part */ + { +#if defined(FIXED_POINT) + spec[0] = FIXLN(abs(fft[0]) << scale) * 2; +#else + spec[0] = fft[0] * fft[0]; +#endif + } + + for (j = 1; j <= fftsize / 2; j++) { +#if defined(FIXED_POINT) + int32 rr = FIXLN(abs(fft[j]) << scale) * 2; + int32 ii = FIXLN(abs(fft[fftsize - j]) << scale) * 2; + spec[j] = fe_log_add(rr, ii); +#else + spec[j] = fft[j] * fft[j] + fft[fftsize - j] * fft[fftsize - j]; +#endif + } +} + +static void +fe_mel_spec(fe_t * fe) +{ + int whichfilt; + powspec_t *spec, *mfspec; + + /* Convenience poitners. */ + spec = fe->spec; + mfspec = fe->mfspec; + for (whichfilt = 0; whichfilt < fe->mel_fb->num_filters; whichfilt++) { + int spec_start, filt_start, i; + + spec_start = fe->mel_fb->spec_start[whichfilt]; + filt_start = fe->mel_fb->filt_start[whichfilt]; + +#ifdef FIXED_POINT + mfspec[whichfilt] = + spec[spec_start] + fe->mel_fb->filt_coeffs[filt_start]; + for (i = 1; i < fe->mel_fb->filt_width[whichfilt]; i++) { + mfspec[whichfilt] = fe_log_add(mfspec[whichfilt], + spec[spec_start + i] + + fe->mel_fb-> + filt_coeffs[filt_start + i]); + } +#else /* !FIXED_POINT */ + mfspec[whichfilt] = 0; + for (i = 0; i < fe->mel_fb->filt_width[whichfilt]; i++) + mfspec[whichfilt] += + spec[spec_start + i] * fe->mel_fb->filt_coeffs[filt_start + + i]; +#endif /* !FIXED_POINT */ + } + +} + +#define LOG_FLOOR 1e-4 + +static void +fe_mel_cep(fe_t * fe, mfcc_t * mfcep) +{ + int32 i; + powspec_t *mfspec; + + /* Convenience pointer. */ + mfspec = fe->mfspec; + + for (i = 0; i < fe->mel_fb->num_filters; ++i) { +#ifndef FIXED_POINT /* It's already in log domain for fixed point */ + mfspec[i] = log(mfspec[i] + LOG_FLOOR); +#endif /* !FIXED_POINT */ + } + + /* If we are doing LOG_SPEC, then do nothing. */ + if (fe->log_spec == RAW_LOG_SPEC) { + for (i = 0; i < fe->feature_dimension; i++) { + mfcep[i] = (mfcc_t) mfspec[i]; + } + } + /* For smoothed spectrum, do DCT-II followed by (its inverse) DCT-III */ + else if (fe->log_spec == SMOOTH_LOG_SPEC) { + /* FIXME: This is probably broken for fixed-point. */ + fe_dct2(fe, mfspec, mfcep, 0); + fe_dct3(fe, mfcep, mfspec); + for (i = 0; i < fe->feature_dimension; i++) { + mfcep[i] = (mfcc_t) mfspec[i]; + } + } + else if (fe->transform == DCT_II) + fe_dct2(fe, mfspec, mfcep, FALSE); + else if (fe->transform == DCT_HTK) + fe_dct2(fe, mfspec, mfcep, TRUE); + else + fe_spec2cep(fe, mfspec, mfcep); + + return; +} + +void +fe_spec2cep(fe_t * fe, const powspec_t * mflogspec, mfcc_t * mfcep) +{ + int32 i, j, beta; + + /* Compute C0 separately (its basis vector is 1) to avoid + * costly multiplications. */ + mfcep[0] = mflogspec[0] / 2; /* beta = 0.5 */ + for (j = 1; j < fe->mel_fb->num_filters; j++) + mfcep[0] += mflogspec[j]; /* beta = 1.0 */ + mfcep[0] /= (frame_t) fe->mel_fb->num_filters; + + for (i = 1; i < fe->num_cepstra; ++i) { + mfcep[i] = 0; + for (j = 0; j < fe->mel_fb->num_filters; j++) { + if (j == 0) + beta = 1; /* 0.5 */ + else + beta = 2; /* 1.0 */ + mfcep[i] += COSMUL(mflogspec[j], + fe->mel_fb->mel_cosine[i][j]) * beta; + } + /* Note that this actually normalizes by num_filters, like the + * original Sphinx front-end, due to the doubled 'beta' factor + * above. */ + mfcep[i] /= (frame_t) fe->mel_fb->num_filters * 2; + } +} + +void +fe_dct2(fe_t * fe, const powspec_t * mflogspec, mfcc_t * mfcep, int htk) +{ + int32 i, j; + + /* Compute C0 separately (its basis vector is 1) to avoid + * costly multiplications. */ + mfcep[0] = mflogspec[0]; + for (j = 1; j < fe->mel_fb->num_filters; j++) + mfcep[0] += mflogspec[j]; + if (htk) + mfcep[0] = COSMUL(mfcep[0], fe->mel_fb->sqrt_inv_2n); + else /* sqrt(1/N) = sqrt(2/N) * 1/sqrt(2) */ + mfcep[0] = COSMUL(mfcep[0], fe->mel_fb->sqrt_inv_n); + + for (i = 1; i < fe->num_cepstra; ++i) { + mfcep[i] = 0; + for (j = 0; j < fe->mel_fb->num_filters; j++) { + mfcep[i] += COSMUL(mflogspec[j], fe->mel_fb->mel_cosine[i][j]); + } + mfcep[i] = COSMUL(mfcep[i], fe->mel_fb->sqrt_inv_2n); + } +} + +void +fe_lifter(fe_t * fe, mfcc_t * mfcep) +{ + int32 i; + + if (fe->mel_fb->lifter_val == 0) + return; + + for (i = 0; i < fe->num_cepstra; ++i) { + mfcep[i] = MFCCMUL(mfcep[i], fe->mel_fb->lifter[i]); + } +} + +void +fe_dct3(fe_t * fe, const mfcc_t * mfcep, powspec_t * mflogspec) +{ + int32 i, j; + + for (i = 0; i < fe->mel_fb->num_filters; ++i) { + mflogspec[i] = COSMUL(mfcep[0], SQRT_HALF); + for (j = 1; j < fe->num_cepstra; j++) { + mflogspec[i] += COSMUL(mfcep[j], fe->mel_fb->mel_cosine[j][i]); + } + mflogspec[i] = COSMUL(mflogspec[i], fe->mel_fb->sqrt_inv_2n); + } +} + +void +fe_write_frame(fe_t * fe, mfcc_t * feat, int32 store_pcm) +{ + int32 is_speech; + + fe_spec_magnitude(fe); + fe_mel_spec(fe); + fe_track_snr(fe, &is_speech); + fe_mel_cep(fe, feat); + fe_lifter(fe, feat); + fe_vad_hangover(fe, feat, is_speech, store_pcm); +} + + +void * +fe_create_2d(int32 d1, int32 d2, int32 elem_size) +{ + return (void *) ckd_calloc_2d(d1, d2, elem_size); +} + +void +fe_free_2d(void *arr) +{ + ckd_free_2d((void **) arr); +} diff --git a/src/libsphinxbase/fe/fe_type.h b/src/libsphinxbase/fe/fe_type.h new file mode 100644 index 000000000..0e72f5c6c --- /dev/null +++ b/src/libsphinxbase/fe/fe_type.h @@ -0,0 +1,59 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef FE_TYPE_H +#define FE_TYPE_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sphinxbase/fe.h" +#include "sphinxbase/fixpoint.h" + +#if defined(FIXED_POINT) +typedef fixed32 frame_t; +typedef int32 powspec_t; +typedef fixed32 window_t; +typedef struct { fixed32 r, i; } complex; +#else /* FIXED_POINT */ +typedef float64 frame_t; +typedef float64 powspec_t; +typedef float64 window_t; +typedef struct { float64 r, i; } complex; +#endif /* FIXED_POINT */ + +#endif /* FE_TYPE_H */ diff --git a/src/libsphinxbase/fe/fe_warp.c b/src/libsphinxbase/fe/fe_warp.c new file mode 100644 index 000000000..e409bea76 --- /dev/null +++ b/src/libsphinxbase/fe/fe_warp.c @@ -0,0 +1,252 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp.c + * + * Description: + * Allows a caller to choose a warping function. + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $";*/ + +#include "fe_warp_inverse_linear.h" +#include "fe_warp_affine.h" +#include "fe_warp_piecewise_linear.h" +#include "fe_warp.h" + +#include "sphinxbase/err.h" + +#include +#include +#include +#include + +/* This is for aliases for each of the entries below. Currently not + used. +*/ +static char *__name2id[] = { + "inverse", + "linear", + "piecewise", + NULL +}; + +static char *name2id[] = { + "inverse_linear", + "affine", + "piecewise_linear", + NULL +}; + +static fe_warp_conf_t fe_warp_conf[FE_WARP_ID_MAX + 1] = { + {fe_warp_inverse_linear_set_parameters, + fe_warp_inverse_linear_doc, + fe_warp_inverse_linear_id, + fe_warp_inverse_linear_n_param, + fe_warp_inverse_linear_warped_to_unwarped, + fe_warp_inverse_linear_unwarped_to_warped, + fe_warp_inverse_linear_print}, /* Inverse linear warping */ + {fe_warp_affine_set_parameters, + fe_warp_affine_doc, + fe_warp_affine_id, + fe_warp_affine_n_param, + fe_warp_affine_warped_to_unwarped, + fe_warp_affine_unwarped_to_warped, + fe_warp_affine_print}, /* Affine warping */ + {fe_warp_piecewise_linear_set_parameters, + fe_warp_piecewise_linear_doc, + fe_warp_piecewise_linear_id, + fe_warp_piecewise_linear_n_param, + fe_warp_piecewise_linear_warped_to_unwarped, + fe_warp_piecewise_linear_unwarped_to_warped, + fe_warp_piecewise_linear_print}, /* Piecewise_Linear warping */ +}; + +int +fe_warp_set(melfb_t *mel, const char *id_name) +{ + uint32 i; + + for (i = 0; name2id[i]; i++) { + if (strcmp(id_name, name2id[i]) == 0) { + mel->warp_id = i; + break; + } + } + + if (name2id[i] == NULL) { + for (i = 0; __name2id[i]; i++) { + if (strcmp(id_name, __name2id[i]) == 0) { + mel->warp_id = i; + break; + } + } + if (__name2id[i] == NULL) { + E_ERROR("Unimplemented warping function %s\n", id_name); + E_ERROR("Implemented functions are:\n"); + for (i = 0; name2id[i]; i++) { + fprintf(stderr, "\t%s\n", name2id[i]); + } + mel->warp_id = FE_WARP_ID_NONE; + + return FE_START_ERROR; + } + } + + return FE_SUCCESS; +} + +void +fe_warp_set_parameters(melfb_t *mel, char const *param_str, float sampling_rate) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + fe_warp_conf[mel->warp_id].set_parameters(param_str, sampling_rate); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("feat module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } +} + +const char * +fe_warp_doc(melfb_t *mel) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].doc(); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return NULL; +} + +uint32 +fe_warp_id(melfb_t *mel) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + assert(mel->warp_id == fe_warp_conf[mel->warp_id].id()); + return mel->warp_id; + } + else if (mel->warp_id != FE_WARP_ID_NONE) { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return FE_WARP_ID_NONE; +} + +uint32 +fe_warp_n_param(melfb_t *mel) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].n_param(); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return 0; +} + +float +fe_warp_warped_to_unwarped(melfb_t *mel, float nonlinear) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].warped_to_unwarped(nonlinear); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return 0; +} + +float +fe_warp_unwarped_to_warped(melfb_t *mel,float linear) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].unwarped_to_warped(linear); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return 0; +} + +void +fe_warp_print(melfb_t *mel, const char *label) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + fe_warp_conf[mel->warp_id].print(label); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } +} diff --git a/src/libsphinxbase/fe/fe_warp.h b/src/libsphinxbase/fe/fe_warp.h new file mode 100644 index 000000000..f2fd14550 --- /dev/null +++ b/src/libsphinxbase/fe/fe_warp.h @@ -0,0 +1,90 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_H +#define FE_WARP_H + +#include "fe_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define FE_WARP_ID_INVERSE_LINEAR 0 +#define FE_WARP_ID_AFFINE 1 +#define FE_WARP_ID_PIECEWISE_LINEAR 2 +#define FE_WARP_ID_EIDE_GISH 3 +#define FE_WARP_ID_MAX 2 +#define FE_WARP_ID_NONE 0xffffffff + +typedef struct { + void (*set_parameters)(char const *param_str, float sampling_rate); + const char * (*doc)(void); + uint32 (*id)(void); + uint32 (*n_param)(void); + float (*warped_to_unwarped)(float nonlinear); + float (*unwarped_to_warped)(float linear); + void (*print)(const char *label); +} fe_warp_conf_t; + +int fe_warp_set(melfb_t *mel, const char *id_name); + +uint32 fe_warp_id(melfb_t *mel); + +const char * fe_warp_doc(melfb_t *mel); + +void fe_warp_set_parameters(melfb_t *mel, char const *param_str, float sampling_rate); + +uint32 fe_warp_n_param(melfb_t *mel); + +float fe_warp_warped_to_unwarped(melfb_t *mel, float nonlinear); + +float fe_warp_unwarped_to_warped(melfb_t *mel, float linear); + +void fe_warp_print(melfb_t *mel, const char *label); + +#define FE_WARP_NO_SIZE 0xffffffff + +#ifdef __cplusplus +} +#endif + + +#endif /* FE_WARP_H */ diff --git a/src/libsphinxbase/fe/fe_warp_affine.c b/src/libsphinxbase/fe/fe_warp_affine.c new file mode 100644 index 000000000..398611917 --- /dev/null +++ b/src/libsphinxbase/fe/fe_warp_affine.c @@ -0,0 +1,181 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp_affine.c + * + * Description: + * Warp the frequency axis according to an affine function, i.e.: + * + * w' = a * w + b + * + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp_affine.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $"; */ + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/err.h" + +#include "fe_warp.h" +#include "fe_warp_affine.h" + +#define N_PARAM 2 +#define YES 1 +#define NO 0 + +/* + * params[0] : a + * params[1] : b + */ +static float params[N_PARAM] = { 1.0f, 0.0f }; +static int32 is_neutral = YES; +static char p_str[256] = ""; +static float nyquist_frequency = 0.0f; + + +const char * +fe_warp_affine_doc() +{ + return "affine :== < w' = a * x + b >"; +} + +uint32 +fe_warp_affine_id() +{ + return FE_WARP_ID_AFFINE; +} + +uint32 +fe_warp_affine_n_param() +{ + return N_PARAM; +} + +void +fe_warp_affine_set_parameters(char const *param_str, float sampling_rate) +{ + char *tok; + char *seps = " \t"; + char temp_param_str[256]; + int param_index = 0; + + nyquist_frequency = sampling_rate / 2; + if (param_str == NULL) { + is_neutral = YES; + return; + } + /* The new parameters are the same as the current ones, so do nothing. */ + if (strcmp(param_str, p_str) == 0) { + return; + } + is_neutral = NO; + strcpy(temp_param_str, param_str); + memset(params, 0, N_PARAM * sizeof(float)); + strcpy(p_str, param_str); + /* FIXME: strtok() is not re-entrant... */ + tok = strtok(temp_param_str, seps); + while (tok != NULL) { + params[param_index++] = (float) atof_c(tok); + tok = strtok(NULL, seps); + if (param_index >= N_PARAM) { + break; + } + } + if (tok != NULL) { + E_INFO + ("Affine warping takes up to two arguments, %s ignored.\n", + tok); + } + if (params[0] == 0) { + is_neutral = YES; + E_INFO + ("Affine warping cannot have slope zero, warping not applied.\n"); + } +} + +float +fe_warp_affine_warped_to_unwarped(float nonlinear) +{ + if (is_neutral) { + return nonlinear; + } + else { + /* linear = (nonlinear - b) / a */ + float temp = nonlinear - params[1]; + temp /= params[0]; + if (temp > nyquist_frequency) { + E_WARN + ("Warp factor %g results in frequency (%.1f) higher than Nyquist (%.1f)\n", + params[0], temp, nyquist_frequency); + } + return temp; + } +} + +float +fe_warp_affine_unwarped_to_warped(float linear) +{ + if (is_neutral) { + return linear; + } + else { + /* nonlinear = a * linear - b */ + float temp = linear * params[0]; + temp += params[1]; + return temp; + } +} + +void +fe_warp_affine_print(const char *label) +{ + uint32 i; + + for (i = 0; i < N_PARAM; i++) { + printf("%s[%04u]: %6.3f ", label, i, params[i]); + } + printf("\n"); +} diff --git a/src/libsphinxbase/fe/fe_warp_affine.h b/src/libsphinxbase/fe/fe_warp_affine.h new file mode 100644 index 000000000..44027d97a --- /dev/null +++ b/src/libsphinxbase/fe/fe_warp_affine.h @@ -0,0 +1,76 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_AFFINE_H +#define FE_WARP_AFFINE_H + +#include "sphinxbase/fe.h" + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +const char * +fe_warp_affine_doc(void); + +uint32 +fe_warp_affine_id(void); + +uint32 +fe_warp_affine_n_param(void); + +void +fe_warp_affine_set_parameters(char const *param_str, float sampling_rate); + +float +fe_warp_affine_warped_to_unwarped(float nonlinear); + +float +fe_warp_affine_unwarped_to_warped(float linear); + +void +fe_warp_affine_print(const char *label); + +#ifdef __cplusplus +} +#endif + +#endif /* FE_WARP_AFFINE_H */ diff --git a/src/libsphinxbase/fe/fe_warp_inverse_linear.c b/src/libsphinxbase/fe/fe_warp_inverse_linear.c new file mode 100644 index 000000000..85e42986b --- /dev/null +++ b/src/libsphinxbase/fe/fe_warp_inverse_linear.c @@ -0,0 +1,178 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp_inverse_linear.c + * + * Description: + * Warp the frequency axis according to an inverse_linear function, i.e.: + * + * w' = w / a + * + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp_inverse_linear.c,v 1.3 2006/02/23 19:40:11 eht Exp $"; */ + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/err.h" + +#include "fe_warp.h" +#include "fe_warp_inverse_linear.h" + +#define N_PARAM 1 +#define YES 1 +#define NO 0 + +/* + * params[0] : a + */ +static float params[N_PARAM] = { 1.0f }; +static int32 is_neutral = YES; +static char p_str[256] = ""; +static float nyquist_frequency = 0.0f; + + +const char * +fe_warp_inverse_linear_doc() +{ + return "inverse_linear :== < w' = x / a >"; +} + +uint32 +fe_warp_inverse_linear_id() +{ + return FE_WARP_ID_INVERSE_LINEAR; +} + +uint32 +fe_warp_inverse_linear_n_param() +{ + return N_PARAM; +} + +void +fe_warp_inverse_linear_set_parameters(char const *param_str, float sampling_rate) +{ + char *tok; + char *seps = " \t"; + char temp_param_str[256]; + int param_index = 0; + + nyquist_frequency = sampling_rate / 2; + if (param_str == NULL) { + is_neutral = YES; + return; + } + /* The new parameters are the same as the current ones, so do nothing. */ + if (strcmp(param_str, p_str) == 0) { + return; + } + is_neutral = NO; + strcpy(temp_param_str, param_str); + memset(params, 0, N_PARAM * sizeof(float)); + strcpy(p_str, param_str); + /* FIXME: strtok() is not re-entrant... */ + tok = strtok(temp_param_str, seps); + while (tok != NULL) { + params[param_index++] = (float) atof_c(tok); + tok = strtok(NULL, seps); + if (param_index >= N_PARAM) { + break; + } + } + if (tok != NULL) { + E_INFO + ("Inverse linear warping takes only one argument, %s ignored.\n", + tok); + } + if (params[0] == 0) { + is_neutral = YES; + E_INFO + ("Inverse linear warping cannot have slope zero, warping not applied.\n"); + } +} + +float +fe_warp_inverse_linear_warped_to_unwarped(float nonlinear) +{ + if (is_neutral) { + return nonlinear; + } + else { + /* linear = nonlinear * a */ + float temp = nonlinear * params[0]; + if (temp > nyquist_frequency) { + E_WARN + ("Warp factor %g results in frequency (%.1f) higher than Nyquist (%.1f)\n", + params[0], temp, nyquist_frequency); + } + return temp; + } +} + +float +fe_warp_inverse_linear_unwarped_to_warped(float linear) +{ + if (is_neutral) { + return linear; + } + else { + /* nonlinear = a / linear */ + float temp = linear / params[0]; + return temp; + } +} + +void +fe_warp_inverse_linear_print(const char *label) +{ + uint32 i; + + for (i = 0; i < N_PARAM; i++) { + printf("%s[%04u]: %6.3f ", label, i, params[i]); + } + printf("\n"); +} diff --git a/src/libsphinxbase/fe/fe_warp_inverse_linear.h b/src/libsphinxbase/fe/fe_warp_inverse_linear.h new file mode 100644 index 000000000..8d4a76725 --- /dev/null +++ b/src/libsphinxbase/fe/fe_warp_inverse_linear.h @@ -0,0 +1,77 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_inverse_linear_H +#define FE_WARP_inverse_linear_H + +#include "sphinxbase/fe.h" + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +const char * +fe_warp_inverse_linear_doc(void); + +uint32 +fe_warp_inverse_linear_id(void); + +uint32 +fe_warp_inverse_linear_n_param(void); + +void +fe_warp_inverse_linear_set_parameters(char const *param_str, float sampling_rate); + +float +fe_warp_inverse_linear_warped_to_unwarped(float nonlinear); + +float +fe_warp_inverse_linear_unwarped_to_warped(float linear); + +void +fe_warp_inverse_linear_print(const char *label); + +#ifdef __cplusplus +} +#endif + + +#endif /* FE_WARP_inverse_linear_H */ diff --git a/src/libsphinxbase/fe/fe_warp_piecewise_linear.c b/src/libsphinxbase/fe/fe_warp_piecewise_linear.c new file mode 100644 index 000000000..34570120f --- /dev/null +++ b/src/libsphinxbase/fe/fe_warp_piecewise_linear.c @@ -0,0 +1,223 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp_piecewise_linear.c + * + * Description: + * + * Warp the frequency axis according to an piecewise linear + * function. The function is linear up to a frequency F, where + * the slope changes so that the Nyquist frequency in the warped + * axis maps to the Nyquist frequency in the unwarped. + * + * w' = a * w, w < F + * w' = a' * w + b, W > F + * w'(0) = 0 + * w'(F) = F + * w'(Nyq) = Nyq + * + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp_piecewise_linear.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $"; */ + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/err.h" + +#include "fe_warp.h" +#include "fe_warp_piecewise_linear.h" + +#define N_PARAM 2 +#define YES 1 +#define NO 0 + +/* + * params[0] : a + * params[1] : F (the non-differentiable point) + */ +static float params[N_PARAM] = { 1.0f, 6800.0f }; +static float final_piece[2]; +static int32 is_neutral = YES; +static char p_str[256] = ""; +static float nyquist_frequency = 0.0f; + + +const char * +fe_warp_piecewise_linear_doc() +{ + return "piecewise_linear :== < w' = a * w, w < F >"; +} + +uint32 +fe_warp_piecewise_linear_id() +{ + return FE_WARP_ID_PIECEWISE_LINEAR; +} + +uint32 +fe_warp_piecewise_linear_n_param() +{ + return N_PARAM; +} + +void +fe_warp_piecewise_linear_set_parameters(char const *param_str, + float sampling_rate) +{ + char *tok; + char *seps = " \t"; + char temp_param_str[256]; + int param_index = 0; + + nyquist_frequency = sampling_rate / 2; + if (param_str == NULL) { + is_neutral = YES; + return; + } + /* The new parameters are the same as the current ones, so do nothing. */ + if (strcmp(param_str, p_str) == 0) { + return; + } + is_neutral = NO; + strcpy(temp_param_str, param_str); + memset(params, 0, N_PARAM * sizeof(float)); + memset(final_piece, 0, 2 * sizeof(float)); + strcpy(p_str, param_str); + /* FIXME: strtok() is not re-entrant... */ + tok = strtok(temp_param_str, seps); + while (tok != NULL) { + params[param_index++] = (float) atof_c(tok); + tok = strtok(NULL, seps); + if (param_index >= N_PARAM) { + break; + } + } + if (tok != NULL) { + E_INFO + ("Piecewise linear warping takes up to two arguments, %s ignored.\n", + tok); + } + if (params[1] < sampling_rate) { + /* Precompute these. These are the coefficients of a + * straight line that contains the points (F, aF) and (N, + * N), where a = params[0], F = params[1], N = Nyquist + * frequency. + */ + if (params[1] == 0) { + params[1] = sampling_rate * 0.85f; + } + final_piece[0] = + (nyquist_frequency - + params[0] * params[1]) / (nyquist_frequency - params[1]); + final_piece[1] = + nyquist_frequency * params[1] * (params[0] - + 1.0f) / (nyquist_frequency - + params[1]); + } + else { + memset(final_piece, 0, 2 * sizeof(float)); + } + if (params[0] == 0) { + is_neutral = YES; + E_INFO + ("Piecewise linear warping cannot have slope zero, warping not applied.\n"); + } +} + +float +fe_warp_piecewise_linear_warped_to_unwarped(float nonlinear) +{ + if (is_neutral) { + return nonlinear; + } + else { + /* linear = (nonlinear - b) / a */ + float temp; + if (nonlinear < params[0] * params[1]) { + temp = nonlinear / params[0]; + } + else { + temp = nonlinear - final_piece[1]; + temp /= final_piece[0]; + } + if (temp > nyquist_frequency) { + E_WARN + ("Warp factor %g results in frequency (%.1f) higher than Nyquist (%.1f)\n", + params[0], temp, nyquist_frequency); + } + return temp; + } +} + +float +fe_warp_piecewise_linear_unwarped_to_warped(float linear) +{ + if (is_neutral) { + return linear; + } + else { + float temp; + /* nonlinear = a * linear - b */ + if (linear < params[1]) { + temp = linear * params[0]; + } + else { + temp = final_piece[0] * linear + final_piece[1]; + } + return temp; + } +} + +void +fe_warp_piecewise_linear_print(const char *label) +{ + uint32 i; + + for (i = 0; i < N_PARAM; i++) { + printf("%s[%04u]: %6.3f ", label, i, params[i]); + } + printf("\n"); +} diff --git a/src/libsphinxbase/fe/fe_warp_piecewise_linear.h b/src/libsphinxbase/fe/fe_warp_piecewise_linear.h new file mode 100644 index 000000000..f15cb251e --- /dev/null +++ b/src/libsphinxbase/fe/fe_warp_piecewise_linear.h @@ -0,0 +1,77 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_PIECEWIDE_LINEAR_H +#define FE_WARP_PIECEWIDE_LINEAR_H + +#include "sphinxbase/fe.h" + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +const char * +fe_warp_piecewise_linear_doc(void); + +uint32 +fe_warp_piecewise_linear_id(void); + +uint32 +fe_warp_piecewise_linear_n_param(void); + +void +fe_warp_piecewise_linear_set_parameters(char const *param_str, float sampling_rate); + +float +fe_warp_piecewise_linear_warped_to_unwarped(float nonlinear); + +float +fe_warp_piecewise_linear_unwarped_to_warped(float linear); + +void +fe_warp_piecewise_linear_print(const char *label); + +#ifdef __cplusplus +} +#endif + + +#endif /* FE_WARP_PIECEWIDE_LINEAR_H */ diff --git a/src/libsphinxbase/fe/fixlog.c b/src/libsphinxbase/fe/fixlog.c new file mode 100644 index 000000000..459c9ffd6 --- /dev/null +++ b/src/libsphinxbase/fe/fixlog.c @@ -0,0 +1,229 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + * File: fixlog.c + * + * Description: Fast approximate fixed-point logarithms + * + * Author: David Huggins-Daines + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/fixpoint.h" + +#include "fe_internal.h" + +/* Table of log2(x/128)*(1<= 4 + y = __builtin_clz(x); + x <<= y; + y = (31 - y); +#else + for (y = 31; y > 0; --y) { + if (x & 0x80000000) + break; + x <<= 1; + } +#endif + y <<= DEFAULT_RADIX; + /* Do a table lookup for the MSB of the mantissa. */ + x = (x >> 24) & 0x7f; + return y + logtable[x]; +} + +int +fixlog(uint32 x) +{ + int32 y; + y = fixlog2(x); + return FIXMUL(y, FIXLN_2); +} diff --git a/src/libsphinxbase/fe/make_log_sub_table.py b/src/libsphinxbase/fe/make_log_sub_table.py new file mode 100644 index 000000000..cf01c8ac8 --- /dev/null +++ b/src/libsphinxbase/fe/make_log_sub_table.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +import math + +radix = 8 +scale = 1< 0: + stop = int(round(math.log(-math.expm1(-byx/scale)) * out_scale)) + if stop == 0: + break + + byx = byx + 1. + +print "static const uint16 logsub_table[] = {" +for i in range(0,len(logtab),10): + if i+10 <= len(logtab): + print ", ".join(str(x) for x in logtab[i:i+10]) + "," + else: + print ", ".join(str(x) for x in logtab[i:]) +print "};" diff --git a/src/libsphinxbase/fe/make_log_table.py b/src/libsphinxbase/fe/make_log_table.py new file mode 100644 index 000000000..7a3ed5997 --- /dev/null +++ b/src/libsphinxbase/fe/make_log_table.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +import math + +radix = 8 +scale = 1< + */ + +/* This implements part of the YIN algorithm: + * + * "YIN, a fundamental frequency estimator for speech and music". + * Alain de Cheveigné and Hideki Kawahara. Journal of the Acoustical + * Society of America, 111 (4), April 2002. + */ + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/fixpoint.h" + +#include "sphinxbase/yin.h" + +#include +#include + +struct yin_s { + uint16 frame_size; /** Size of analysis frame. */ + uint16 search_threshold; /**< Threshold for finding period, in Q15 */ + uint16 search_range; /**< Range around best local estimate to search, in Q15 */ + uint16 nfr; /**< Number of frames read so far. */ + + unsigned char wsize; /**< Size of smoothing window. */ + unsigned char wstart; /**< First frame in window. */ + unsigned char wcur; /**< Current frame of analysis. */ + unsigned char endut; /**< Hoch Hech! Are we at the utterance end? */ + + fixed32 **diff_window; /**< Window of difference function outputs. */ + uint16 *period_window; /**< Window of best period estimates. */ +}; + +/** + * The core of YIN: cumulative mean normalized difference function. + */ +static void +cmn_diff(int16 const *signal, int32 *out_diff, int ndiff) +{ + uint32 cum, cshift; + int32 t, tscale; + + out_diff[0] = 32768; + cum = 0; + cshift = 0; + + /* Determine how many bits we can scale t up by below. */ + for (tscale = 0; tscale < 32; ++tscale) + if (ndiff & (1<<(31-tscale))) + break; + --tscale; /* Avoid teh overflowz. */ + /* printf("tscale is %d (ndiff - 1) << tscale is %d\n", + tscale, (ndiff-1) << tscale); */ + + /* Somewhat elaborate block floating point implementation. + * The fp implementation of this is really a lot simpler. */ + for (t = 1; t < ndiff; ++t) { + uint32 dd, dshift, norm; + int j; + + dd = 0; + dshift = 0; + for (j = 0; j < ndiff; ++j) { + int diff = signal[j] - signal[t + j]; + /* Guard against overflows. */ + if (dd > (1UL<>= 1; + ++dshift; + } + dd += (diff * diff) >> dshift; + } + /* Make sure the diffs and cum are shifted to the same + * scaling factor (usually dshift will be zero) */ + if (dshift > cshift) { + cum += dd << (dshift-cshift); + } + else { + cum += dd >> (cshift-dshift); + } + + /* Guard against overflows and also ensure that (t< cum. */ + while (cum > (1UL<>= 1; + ++cshift; + } + /* Avoid divide-by-zero! */ + if (cum == 0) cum = 1; + /* Calculate the normalizer in high precision. */ + norm = (t << tscale) / cum; + /* Do a long multiply and shift down to Q15. */ + out_diff[t] = (int32)(((long long)dd * norm) + >> (tscale - 15 + cshift - dshift)); + /* printf("dd %d cshift %d dshift %d scaledt %d cum %d norm %d cmn %d\n", + dd, cshift, dshift, (t<frame_size = frame_size; + pe->search_threshold = (uint16)(search_threshold * 32768); + pe->search_range = (uint16)(search_range * 32768); + pe->wsize = smooth_window * 2 + 1; + pe->diff_window = ckd_calloc_2d(pe->wsize, + pe->frame_size / 2, + sizeof(**pe->diff_window)); + pe->period_window = ckd_calloc(pe->wsize, + sizeof(*pe->period_window)); + return pe; +} + +void +yin_free(yin_t *pe) +{ + ckd_free_2d(pe->diff_window); + ckd_free(pe->period_window); + ckd_free(pe); +} + +void +yin_start(yin_t *pe) +{ + /* Reset the circular window pointers. */ + pe->wstart = pe->endut = 0; + pe->nfr = 0; +} + +void +yin_end(yin_t *pe) +{ + pe->endut = 1; +} + +int +thresholded_search(int32 *diff_window, fixed32 threshold, int start, int end) +{ + int i, min, argmin; + + min = INT_MAX; + argmin = 0; + for (i = start; i < end; ++i) { + int diff = diff_window[i]; + + if (diff < threshold) { + min = diff; + argmin = i; + break; + } + if (diff < min) { + min = diff; + argmin = i; + } + } + return argmin; +} + +void +yin_write(yin_t *pe, int16 const *frame) +{ + int outptr, difflen; + + /* Rotate the window one frame forward. */ + ++pe->wstart; + /* Fill in the frame before wstart. */ + outptr = pe->wstart - 1; + /* Wrap around the window pointer. */ + if (pe->wstart == pe->wsize) + pe->wstart = 0; + + /* Now calculate normalized difference function. */ + difflen = pe->frame_size / 2; + cmn_diff(frame, pe->diff_window[outptr], difflen); + + /* Find the first point under threshold. If not found, then + * use the absolute minimum. */ + pe->period_window[outptr] + = thresholded_search(pe->diff_window[outptr], + pe->search_threshold, 0, difflen); + + /* Increment total number of frames. */ + ++pe->nfr; +} + +int +yin_read(yin_t *pe, uint16 *out_period, uint16 *out_bestdiff) +{ + int wstart, wlen, half_wsize, i; + int best, best_diff, search_width, low_period, high_period; + + half_wsize = (pe->wsize-1)/2; + /* Without any smoothing, just return the current value (don't + * need to do anything to the current poitner either). */ + if (half_wsize == 0) { + if (pe->endut) + return 0; + *out_period = pe->period_window[0]; + *out_bestdiff = pe->diff_window[0][pe->period_window[0]]; + return 1; + } + + /* We can't do anything unless we have at least (wsize-1)/2 + 1 + * frames, unless we're at the end of the utterance. */ + if (pe->endut == 0 && pe->nfr < half_wsize + 1) { + /* Don't increment the current pointer either. */ + return 0; + } + + /* Establish the smoothing window. */ + /* End of utterance. */ + if (pe->endut) { + /* We are done (no more data) when pe->wcur = pe->wstart. */ + if (pe->wcur == pe->wstart) + return 0; + /* I.e. pe->wcur (circular minus) half_wsize. */ + wstart = (pe->wcur + pe->wsize - half_wsize) % pe->wsize; + /* Number of frames from wstart up to pe->wstart. */ + wlen = pe->wstart - wstart; + if (wlen < 0) wlen += pe->wsize; + /*printf("ENDUT! ");*/ + } + /* Beginning of utterance. */ + else if (pe->nfr < pe->wsize) { + wstart = 0; + wlen = pe->nfr; + } + /* Normal case, it is what it is. */ + else { + wstart = pe->wstart; + wlen = pe->wsize; + } + + /* Now (finally) look for the best local estimate. */ + /* printf("Searching for local estimate in %d frames around %d\n", + wlen, pe->nfr + 1 - wlen); */ + best = pe->period_window[pe->wcur]; + best_diff = pe->diff_window[pe->wcur][best]; + for (i = 0; i < wlen; ++i) { + int j = wstart + i; + int diff; + + j %= pe->wsize; + diff = pe->diff_window[j][pe->period_window[j]]; + /* printf("%.2f,%.2f ", 1.0 - (double)diff/32768, + pe->period_window[j] ? 8000.0/pe->period_window[j] : 8000.0); */ + if (diff < best_diff) { + best_diff = diff; + best = pe->period_window[j]; + } + } + /* printf("best: %.2f, %.2f\n", 1.0 - (double)best_diff/32768, + best ? 8000.0/best : 8000.0); */ + /* If it's the same as the current one then return it. */ + if (best == pe->period_window[pe->wcur]) { + /* Increment the current pointer. */ + if (++pe->wcur == pe->wsize) + pe->wcur = 0; + *out_period = best; + *out_bestdiff = best_diff; + return 1; + } + /* Otherwise, redo the search inside a narrower range. */ + search_width = best * pe->search_range / 32768; + /* printf("Search width = %d * %.2f = %d\n", + best, (double)pe->search_range/32768, search_width); */ + if (search_width == 0) search_width = 1; + low_period = best - search_width; + high_period = best + search_width; + if (low_period < 0) low_period = 0; + if (high_period > pe->frame_size / 2) high_period = pe->frame_size / 2; + /* printf("Searching from %d to %d\n", low_period, high_period); */ + best = thresholded_search(pe->diff_window[pe->wcur], + pe->search_threshold, + low_period, high_period); + best_diff = pe->diff_window[pe->wcur][best]; + + if (out_period) + *out_period = (best > 32768) ? 32768 : best; + if (out_bestdiff) + *out_bestdiff = (best_diff > 32768) ? 32768 : best_diff; + + /* Increment the current pointer. */ + if (++pe->wcur == pe->wsize) + pe->wcur = 0; + return 1; +} diff --git a/src/libsphinxbase/feat/Makefile.am b/src/libsphinxbase/feat/Makefile.am new file mode 100644 index 000000000..84341f289 --- /dev/null +++ b/src/libsphinxbase/feat/Makefile.am @@ -0,0 +1,14 @@ +noinst_LTLIBRARIES = libsphinxfeat.la + +libsphinxfeat_la_SOURCES = \ + agc.c \ + cmn.c \ + cmn_live.c \ + lda.c \ + feat.c + +AM_CFLAGS =-I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include + +LIBOBJS = @LIBOBJS@ diff --git a/src/libsphinxbase/feat/agc.c b/src/libsphinxbase/feat/agc.c new file mode 100644 index 000000000..271baf49d --- /dev/null +++ b/src/libsphinxbase/feat/agc.c @@ -0,0 +1,227 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * agc.c -- Various forms of automatic gain control (AGC) + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.5 2005/06/21 19:25:41 arthchan2003 + * 1, Fixed doxygen documentation. 2, Added $ keyword. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 04-Nov-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/agc.h" + +/* NOTE! These must match the enum in agc.h */ +const char *agc_type_str[] = { + "none", + "max", + "emax", + "noise" +}; +static const int n_agc_type_str = sizeof(agc_type_str)/sizeof(agc_type_str[0]); + +agc_type_t +agc_type_from_str(const char *str) +{ + int i; + + for (i = 0; i < n_agc_type_str; ++i) { + if (0 == strcmp(str, agc_type_str[i])) + return (agc_type_t)i; + } + E_FATAL("Unknown AGC type '%s'\n", str); + return AGC_NONE; +} + +agc_t *agc_init(void) +{ + agc_t *agc; + agc = ckd_calloc(1, sizeof(*agc)); + agc->noise_thresh = FLOAT2MFCC(2.0); + + return agc; +} + +void agc_free(agc_t *agc) +{ + ckd_free(agc); +} + +/** + * Normalize c0 for all frames such that max(c0) = 0. + */ +void +agc_max(agc_t *agc, mfcc_t **mfc, int32 n_frame) +{ + int32 i; + + if (n_frame <= 0) + return; + agc->obs_max = mfc[0][0]; + for (i = 1; i < n_frame; i++) { + if (mfc[i][0] > agc->obs_max) { + agc->obs_max = mfc[i][0]; + agc->obs_frame = 1; + } + } + + E_INFO("AGCMax: obs=max= %.2f\n", agc->obs_max); + for (i = 0; i < n_frame; i++) + mfc[i][0] -= agc->obs_max; +} + +void +agc_emax_set(agc_t *agc, float32 m) +{ + agc->max = FLOAT2MFCC(m); + E_INFO("AGCEMax: max= %.2f\n", m); +} + +float32 +agc_emax_get(agc_t *agc) +{ + return MFCC2FLOAT(agc->max); +} + +void +agc_emax(agc_t *agc, mfcc_t **mfc, int32 n_frame) +{ + int i; + + if (n_frame <= 0) + return; + for (i = 0; i < n_frame; ++i) { + if (mfc[i][0] > agc->obs_max) { + agc->obs_max = mfc[i][0]; + agc->obs_frame = 1; + } + mfc[i][0] -= agc->max; + } +} + +/* Update estimated max for next utterance */ +void +agc_emax_update(agc_t *agc) +{ + if (agc->obs_frame) { /* Update only if some data observed */ + agc->obs_max_sum += agc->obs_max; + agc->obs_utt++; + + /* Re-estimate max over past history; decay the history */ + agc->max = agc->obs_max_sum / agc->obs_utt; + if (agc->obs_utt == 16) { + agc->obs_max_sum /= 2; + agc->obs_utt = 8; + } + } + E_INFO("AGCEMax: obs= %.2f, new= %.2f\n", agc->obs_max, agc->max); + + /* Reset the accumulators for the next utterance. */ + agc->obs_frame = 0; + agc->obs_max = FLOAT2MFCC(-1000.0); /* Less than any real C0 value (hopefully!!) */ +} + +void +agc_noise(agc_t *agc, + mfcc_t **cep, + int32 nfr) +{ + mfcc_t min_energy; /* Minimum log-energy */ + mfcc_t noise_level; /* Average noise_level */ + int32 i; /* frame index */ + int32 noise_frames; /* Number of noise frames */ + + /* Determine minimum log-energy in utterance */ + min_energy = cep[0][0]; + for (i = 0; i < nfr; ++i) { + if (cep[i][0] < min_energy) + min_energy = cep[i][0]; + } + + /* Average all frames between min_energy and min_energy + agc->noise_thresh */ + noise_frames = 0; + noise_level = 0; + min_energy += agc->noise_thresh; + for (i = 0; i < nfr; ++i) { + if (cep[i][0] < min_energy) { + noise_level += cep[i][0]; + noise_frames++; + } + } + + if (noise_frames > 0) { + noise_level /= noise_frames; + E_INFO("AGC NOISE: max= %6.3f\n", MFCC2FLOAT(noise_level)); + /* Subtract noise_level from all log_energy values */ + for (i = 0; i < nfr; i++) { + cep[i][0] -= noise_level; + } + } +} + +void +agc_set_threshold(agc_t *agc, float32 threshold) +{ + agc->noise_thresh = FLOAT2MFCC(threshold); +} + +float32 +agc_get_threshold(agc_t *agc) +{ + return FLOAT2MFCC(agc->noise_thresh); +} diff --git a/src/libsphinxbase/feat/cmn.c b/src/libsphinxbase/feat/cmn.c new file mode 100644 index 000000000..071044b02 --- /dev/null +++ b/src/libsphinxbase/feat/cmn.c @@ -0,0 +1,188 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmn.c -- Various forms of cepstral mean normalization + */ + +#include +#include +#include +#include +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/err.h" +#include "sphinxbase/cmn.h" + +/* NOTE! These must match the enum in cmn.h */ +const char *cmn_type_str[] = { + "none", + "batch", + "live" +}; +const char *cmn_alt_type_str[] = { + "none", + "current", + "prior" +}; +static const int n_cmn_type_str = sizeof(cmn_type_str)/sizeof(cmn_type_str[0]); + +cmn_type_t +cmn_type_from_str(const char *str) +{ + int i; + + for (i = 0; i < n_cmn_type_str; ++i) { + if (0 == strcmp(str, cmn_type_str[i]) || 0 == strcmp(str, cmn_alt_type_str[i])) + return (cmn_type_t)i; + } + E_FATAL("Unknown CMN type '%s'\n", str); + return CMN_NONE; +} + +cmn_t * +cmn_init(int32 veclen) +{ + cmn_t *cmn; + cmn = (cmn_t *) ckd_calloc(1, sizeof(cmn_t)); + cmn->veclen = veclen; + cmn->cmn_mean = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->cmn_var = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->sum = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->nframe = 0; + + return cmn; +} + + +void +cmn(cmn_t *cmn, mfcc_t ** mfc, int32 varnorm, int32 n_frame) +{ + mfcc_t *mfcp; + mfcc_t t; + int32 i, f; + int32 n_pos_frame; + + assert(mfc != NULL); + + if (n_frame <= 0) + return; + + /* If cmn->cmn_mean wasn't NULL, we need to zero the contents */ + memset(cmn->cmn_mean, 0, cmn->veclen * sizeof(mfcc_t)); + + /* Find mean cep vector for this utterance */ + for (f = 0, n_pos_frame = 0; f < n_frame; f++) { + mfcp = mfc[f]; + + /* Skip zero energy frames */ + if (mfcp[0] < 0) + continue; + + for (i = 0; i < cmn->veclen; i++) { + cmn->cmn_mean[i] += mfcp[i]; + } + + n_pos_frame++; + } + + for (i = 0; i < cmn->veclen; i++) + cmn->cmn_mean[i] /= n_pos_frame; + + E_INFO("CMN: "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT("\n"); + if (!varnorm) { + /* Subtract mean from each cep vector */ + for (f = 0; f < n_frame; f++) { + mfcp = mfc[f]; + for (i = 0; i < cmn->veclen; i++) + mfcp[i] -= cmn->cmn_mean[i]; + } + } + else { + /* Scale cep vectors to have unit variance along each dimension, and subtract means */ + /* If cmn->cmn_var wasn't NULL, we need to zero the contents */ + memset(cmn->cmn_var, 0, cmn->veclen * sizeof(mfcc_t)); + + for (f = 0; f < n_frame; f++) { + mfcp = mfc[f]; + + for (i = 0; i < cmn->veclen; i++) { + t = mfcp[i] - cmn->cmn_mean[i]; + cmn->cmn_var[i] += MFCCMUL(t, t); + } + } + for (i = 0; i < cmn->veclen; i++) + /* Inverse Std. Dev, RAH added type case from sqrt */ + cmn->cmn_var[i] = FLOAT2MFCC(sqrt((float64)n_frame / MFCC2FLOAT(cmn->cmn_var[i]))); + + for (f = 0; f < n_frame; f++) { + mfcp = mfc[f]; + for (i = 0; i < cmn->veclen; i++) + mfcp[i] = MFCCMUL((mfcp[i] - cmn->cmn_mean[i]), cmn->cmn_var[i]); + } + } +} + +/* + * RAH, free previously allocated memory + */ +void +cmn_free(cmn_t * cmn) +{ + if (cmn != NULL) { + if (cmn->cmn_var) + ckd_free((void *) cmn->cmn_var); + + if (cmn->cmn_mean) + ckd_free((void *) cmn->cmn_mean); + + if (cmn->sum) + ckd_free((void *) cmn->sum); + + ckd_free((void *) cmn); + } +} diff --git a/src/libsphinxbase/feat/cmn_live.c b/src/libsphinxbase/feat/cmn_live.c new file mode 100644 index 000000000..d5591aa6c --- /dev/null +++ b/src/libsphinxbase/feat/cmn_live.c @@ -0,0 +1,173 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/err.h" +#include "sphinxbase/cmn.h" + +void +cmn_live_set(cmn_t *cmn, mfcc_t const * vec) +{ + int32 i; + + E_INFO("Update from < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); + + for (i = 0; i < cmn->veclen; i++) { + cmn->cmn_mean[i] = vec[i]; + cmn->sum[i] = vec[i] * CMN_WIN; + } + cmn->nframe = CMN_WIN; + + E_INFO("Update to < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); +} + +void +cmn_live_get(cmn_t *cmn, mfcc_t * vec) +{ + int32 i; + + for (i = 0; i < cmn->veclen; i++) + vec[i] = cmn->cmn_mean[i]; + +} + +static void +cmn_live_shiftwin(cmn_t *cmn) +{ + mfcc_t sf; + int32 i; + + E_INFO("Update from < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); + + sf = FLOAT2MFCC(1.0) / cmn->nframe; + for (i = 0; i < cmn->veclen; i++) + cmn->cmn_mean[i] = cmn->sum[i] / cmn->nframe; /* sum[i] * sf */ + + /* Make the accumulation decay exponentially */ + if (cmn->nframe >= CMN_WIN_HWM) { + sf = CMN_WIN * sf; + for (i = 0; i < cmn->veclen; i++) + cmn->sum[i] = MFCCMUL(cmn->sum[i], sf); + cmn->nframe = CMN_WIN; + } + + E_INFO("Update to < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); +} + +void +cmn_live_update(cmn_t *cmn) +{ + mfcc_t sf; + int32 i; + + if (cmn->nframe <= 0) + return; + + E_INFO("Update from < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); + + /* Update mean buffer */ + sf = FLOAT2MFCC(1.0) / cmn->nframe; + for (i = 0; i < cmn->veclen; i++) + cmn->cmn_mean[i] = cmn->sum[i] / cmn->nframe; /* sum[i] * sf; */ + + /* Make the accumulation decay exponentially */ + if (cmn->nframe > CMN_WIN_HWM) { + sf = CMN_WIN * sf; + for (i = 0; i < cmn->veclen; i++) + cmn->sum[i] = MFCCMUL(cmn->sum[i], sf); + cmn->nframe = CMN_WIN; + } + + E_INFO("Update to < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); +} + +void +cmn_live(cmn_t *cmn, mfcc_t **incep, int32 varnorm, int32 nfr) +{ + int32 i, j; + + if (nfr <= 0) + return; + + if (varnorm) + E_FATAL + ("Variance normalization not implemented in live mode decode\n"); + + for (i = 0; i < nfr; i++) { + + /* Skip zero energy frames */ + if (incep[i][0] < 0) + continue; + + for (j = 0; j < cmn->veclen; j++) { + cmn->sum[j] += incep[i][j]; + incep[i][j] -= cmn->cmn_mean[j]; + } + + ++cmn->nframe; + } + + /* Shift buffer down if we have more than CMN_WIN_HWM frames */ + if (cmn->nframe > CMN_WIN_HWM) + cmn_live_shiftwin(cmn); +} diff --git a/src/libsphinxbase/feat/feat.c b/src/libsphinxbase/feat/feat.c new file mode 100644 index 000000000..93164885d --- /dev/null +++ b/src/libsphinxbase/feat/feat.c @@ -0,0 +1,1497 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * feat.c -- Feature vector description and cepstra->feature computation. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.22 2006/02/23 03:59:40 arthchan2003 + * Merged from branch SPHINX3_5_2_RCI_IRII_BRANCH: a, Free buffers correctly. b, Fixed dox-doc. + * + * Revision 1.21.4.3 2005/10/17 04:45:57 arthchan2003 + * Free stuffs in cmn and feat corectly. + * + * Revision 1.21.4.2 2005/09/26 02:19:57 arthchan2003 + * Add message to show the directory which the feature is searched for. + * + * Revision 1.21.4.1 2005/07/03 22:55:50 arthchan2003 + * More correct deallocation in feat.c. The cmn deallocation is still not correct at this point. + * + * Revision 1.21 2005/06/22 03:29:35 arthchan2003 + * Makefile.am s for all subdirectory of libs3decoder/ + * + * Revision 1.4 2005/04/21 23:50:26 archan + * Some more refactoring on the how reporting of structures inside kbcore_t is done, it is now 50% nice. Also added class-based LM test case into test-decode.sh.in. At this moment, everything in search mode 5 is already done. It is time to test the idea whether the search can really be used. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 20.Apr.2001 RAH (rhoughton@mediasite.com, ricky.houghton@cs.cmu.edu) + * Adding feat_free() to free allocated memory + * + * 02-Jan-2001 Rita Singh (rsingh@cs.cmu.edu) at Carnegie Mellon University + * Modified feat_s2mfc2feat_block() to handle empty buffers at + * the end of an utterance + * + * 30-Dec-2000 Rita Singh (rsingh@cs.cmu.edu) at Carnegie Mellon University + * Added feat_s2mfc2feat_block() to allow feature computation + * from sequences of blocks of cepstral vectors + * + * 12-Jun-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Major changes to accommodate arbitrary feature input types. Added + * feat_read(), moved various cep2feat functions from other files into + * this one. Also, made this module object-oriented with the feat_t type. + * Changed definition of s2mfc_read to let the caller manage MFC buffers. + * + * 03-Oct-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added unistd.h include. + * + * 02-Oct-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added check for sf argument to s2mfc_read being within file size. + * + * 18-Sep-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added sf, ef parameters to s2mfc_read(). + * + * 10-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added feat_cepsize(). + * Added different feature-handling (s2_4x, s3_1x39 at this point). + * Moved feature-dependent functions to feature-dependent files. + * + * 09-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Moved constant declarations from feat.h into here. + * + * 04-Nov-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +/* + * This module encapsulates different feature streams used by the Sphinx group. New + * stream types can be added by augmenting feat_init() and providing an accompanying + * compute_feat function. It also provides a "generic" feature vector definition for + * handling "arbitrary" speech input feature types (see the last section in feat_init()). + * In this case the speech input data should already be feature vectors; no computation, + * such as MFC->feature conversion, is available or needed. + */ + +#include +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244 4996) +#endif + +#include "sphinxbase/fe.h" +#include "sphinxbase/feat.h" +#include "sphinxbase/bio.h" +#include "sphinxbase/pio.h" +#include "sphinxbase/cmn.h" +#include "sphinxbase/agc.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/prim_type.h" +#include "sphinxbase/glist.h" + +#define FEAT_VERSION "1.0" +#define FEAT_DCEP_WIN 2 + +#ifdef DUMP_FEATURES +static void +cep_dump_dbg(feat_t *fcb, mfcc_t **mfc, int32 nfr, const char *text) +{ + int32 i, j; + + E_INFO("%s\n", text); + for (i = 0; i < nfr; i++) { + for (j = 0; j < fcb->cepsize; j++) { + fprintf(stderr, "%f ", MFCC2FLOAT(mfc[i][j])); + } + fprintf(stderr, "\n"); + } +} +static void +feat_print_dbg(feat_t *fcb, mfcc_t ***feat, int32 nfr, const char *text) +{ + E_INFO("%s\n", text); + feat_print(fcb, feat, nfr, stderr); +} +#else /* !DUMP_FEATURES */ +#define cep_dump_dbg(fcb,mfc,nfr,text) +#define feat_print_dbg(fcb,mfc,nfr,text) +#endif + +int32 ** +parse_subvecs(char const *str) +{ + char const *strp; + int32 n, n2, l; + glist_t dimlist; /* List of dimensions in one subvector */ + glist_t veclist; /* List of dimlists (subvectors) */ + int32 **subvec; + gnode_t *gn, *gn2; + + veclist = NULL; + + strp = str; + for (;;) { + dimlist = NULL; + + for (;;) { + if (sscanf(strp, "%d%n", &n, &l) != 1) + E_FATAL("'%s': Couldn't read int32 @pos %d\n", str, + strp - str); + strp += l; + + if (*strp == '-') { + strp++; + + if (sscanf(strp, "%d%n", &n2, &l) != 1) + E_FATAL("'%s': Couldn't read int32 @pos %d\n", str, + strp - str); + strp += l; + } + else + n2 = n; + + if ((n < 0) || (n > n2)) + E_FATAL("'%s': Bad subrange spec ending @pos %d\n", str, + strp - str); + + for (; n <= n2; n++) { + gnode_t *gn; + for (gn = dimlist; gn; gn = gnode_next(gn)) + if (gnode_int32(gn) == n) + break; + if (gn != NULL) + E_FATAL("'%s': Duplicate dimension ending @pos %d\n", + str, strp - str); + + dimlist = glist_add_int32(dimlist, n); + } + + if ((*strp == '\0') || (*strp == '/')) + break; + + if (*strp != ',') + E_FATAL("'%s': Bad delimiter @pos %d\n", str, strp - str); + + strp++; + } + + veclist = glist_add_ptr(veclist, (void *) dimlist); + + if (*strp == '\0') + break; + + assert(*strp == '/'); + strp++; + } + + /* Convert the glists to arrays; remember the glists are in reverse order of the input! */ + n = glist_count(veclist); /* #Subvectors */ + subvec = (int32 **) ckd_calloc(n + 1, sizeof(int32 *)); /* +1 for sentinel */ + subvec[n] = NULL; /* sentinel */ + + for (--n, gn = veclist; (n >= 0) && gn; gn = gnode_next(gn), --n) { + gn2 = (glist_t) gnode_ptr(gn); + + n2 = glist_count(gn2); /* Length of this subvector */ + if (n2 <= 0) + E_FATAL("'%s': 0-length subvector\n", str); + + subvec[n] = (int32 *) ckd_calloc(n2 + 1, sizeof(int32)); /* +1 for sentinel */ + subvec[n][n2] = -1; /* sentinel */ + + for (--n2; (n2 >= 0) && gn2; gn2 = gnode_next(gn2), --n2) + subvec[n][n2] = gnode_int32(gn2); + assert((n2 < 0) && (!gn2)); + } + assert((n < 0) && (!gn)); + + /* Free the glists */ + for (gn = veclist; gn; gn = gnode_next(gn)) { + gn2 = (glist_t) gnode_ptr(gn); + glist_free(gn2); + } + glist_free(veclist); + + return subvec; +} + +void +subvecs_free(int32 **subvecs) +{ + int32 **sv; + + for (sv = subvecs; sv && *sv; ++sv) + ckd_free(*sv); + ckd_free(subvecs); +} + +int +feat_set_subvecs(feat_t *fcb, int32 **subvecs) +{ + int32 **sv; + uint32 n_sv, n_dim, i; + + if (subvecs == NULL) { + subvecs_free(fcb->subvecs); + ckd_free(fcb->sv_buf); + ckd_free(fcb->sv_len); + fcb->n_sv = 0; + fcb->subvecs = NULL; + fcb->sv_len = NULL; + fcb->sv_buf = NULL; + fcb->sv_dim = 0; + return 0; + } + + if (fcb->n_stream != 1) { + E_ERROR("Subvector specifications require single-stream features!"); + return -1; + } + + n_sv = 0; + n_dim = 0; + for (sv = subvecs; sv && *sv; ++sv) { + int32 *d; + + for (d = *sv; d && *d != -1; ++d) { + ++n_dim; + } + ++n_sv; + } + if (n_dim > feat_dimension(fcb)) { + E_ERROR("Total dimensionality of subvector specification %d " + "> feature dimensionality %d\n", n_dim, feat_dimension(fcb)); + return -1; + } + + fcb->n_sv = n_sv; + fcb->subvecs = subvecs; + fcb->sv_len = (uint32 *)ckd_calloc(n_sv, sizeof(*fcb->sv_len)); + fcb->sv_buf = (mfcc_t *)ckd_calloc(n_dim, sizeof(*fcb->sv_buf)); + fcb->sv_dim = n_dim; + for (i = 0; i < n_sv; ++i) { + int32 *d; + for (d = subvecs[i]; d && *d != -1; ++d) { + ++fcb->sv_len[i]; + } + } + + return 0; +} + +/** + * Project feature components to subvectors (if any). + */ +static void +feat_subvec_project(feat_t *fcb, mfcc_t ***inout_feat, uint32 nfr) +{ + uint32 i; + + if (fcb->subvecs == NULL) + return; + for (i = 0; i < nfr; ++i) { + mfcc_t *out; + int32 j; + + out = fcb->sv_buf; + for (j = 0; j < fcb->n_sv; ++j) { + int32 *d; + for (d = fcb->subvecs[j]; d && *d != -1; ++d) { + *out++ = inout_feat[i][0][*d]; + } + } + memcpy(inout_feat[i][0], fcb->sv_buf, fcb->sv_dim * sizeof(*fcb->sv_buf)); + } +} + +mfcc_t *** +feat_array_alloc(feat_t * fcb, int32 nfr) +{ + int32 i, j, k; + mfcc_t *data, *d, ***feat; + + assert(fcb); + assert(nfr > 0); + assert(feat_dimension(fcb) > 0); + + /* Make sure to use the dimensionality of the features *before* + LDA and subvector projection. */ + k = 0; + for (i = 0; i < fcb->n_stream; ++i) + k += fcb->stream_len[i]; + assert(k >= feat_dimension(fcb)); + assert(k >= fcb->sv_dim); + + feat = + (mfcc_t ***) ckd_calloc_2d(nfr, feat_dimension1(fcb), sizeof(mfcc_t *)); + data = (mfcc_t *) ckd_calloc(nfr * k, sizeof(mfcc_t)); + + for (i = 0; i < nfr; i++) { + d = data + i * k; + for (j = 0; j < feat_dimension1(fcb); j++) { + feat[i][j] = d; + d += feat_dimension2(fcb, j); + } + } + + return feat; +} + +mfcc_t *** +feat_array_realloc(feat_t *fcb, mfcc_t ***old_feat, int32 ofr, int32 nfr) +{ + int32 i, k, cf; + mfcc_t*** new_feat; + + assert(fcb); + assert(nfr > 0); + assert(ofr > 0); + assert(feat_dimension(fcb) > 0); + + /* Make sure to use the dimensionality of the features *before* + LDA and subvector projection. */ + k = 0; + for (i = 0; i < fcb->n_stream; ++i) + k += fcb->stream_len[i]; + assert(k >= feat_dimension(fcb)); + assert(k >= fcb->sv_dim); + + new_feat = feat_array_alloc(fcb, nfr); + + cf = (nfr < ofr) ? nfr : ofr; + memcpy(new_feat[0][0], old_feat[0][0], cf * k * sizeof(mfcc_t)); + + feat_array_free(old_feat); + + return new_feat; +} + +void +feat_array_free(mfcc_t ***feat) +{ + ckd_free(feat[0][0]); + ckd_free_2d((void **)feat); +} + +static void +feat_s2_4x_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i, j; + + assert(fcb); + assert(feat_cepsize(fcb) == 13); + assert(feat_n_stream(fcb) == 4); + assert(feat_stream_len(fcb, 0) == 12); + assert(feat_stream_len(fcb, 1) == 24); + assert(feat_stream_len(fcb, 2) == 3); + assert(feat_stream_len(fcb, 3) == 12); + assert(feat_window_size(fcb) == 4); + + /* CEP; skip C0 */ + memcpy(feat[0], mfc[0] + 1, (feat_cepsize(fcb) - 1) * sizeof(mfcc_t)); + + /* + * DCEP(SHORT): mfc[2] - mfc[-2] + * DCEP(LONG): mfc[4] - mfc[-4] + */ + w = mfc[2] + 1; /* +1 to skip C0 */ + _w = mfc[-2] + 1; + + f = feat[1]; + for (i = 0; i < feat_cepsize(fcb) - 1; i++) /* Short-term */ + f[i] = w[i] - _w[i]; + + w = mfc[4] + 1; /* +1 to skip C0 */ + _w = mfc[-4] + 1; + + for (j = 0; j < feat_cepsize(fcb) - 1; i++, j++) /* Long-term */ + f[i] = w[j] - _w[j]; + + /* D2CEP: (mfc[3] - mfc[-1]) - (mfc[1] - mfc[-3]) */ + w1 = mfc[3] + 1; /* Final +1 to skip C0 */ + _w1 = mfc[-1] + 1; + w_1 = mfc[1] + 1; + _w_1 = mfc[-3] + 1; + + f = feat[3]; + for (i = 0; i < feat_cepsize(fcb) - 1; i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } + + /* POW: C0, DC0, D2C0; differences computed as above for rest of cep */ + f = feat[2]; + f[0] = mfc[0][0]; + f[1] = mfc[2][0] - mfc[-2][0]; + + d1 = mfc[3][0] - mfc[-1][0]; + d2 = mfc[1][0] - mfc[-3][0]; + f[2] = d1 - d2; +} + + +static void +feat_s3_1x39_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i; + + assert(fcb); + assert(feat_cepsize(fcb) == 13); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == 39); + assert(feat_window_size(fcb) == 3); + + /* CEP; skip C0 */ + memcpy(feat[0], mfc[0] + 1, (feat_cepsize(fcb) - 1) * sizeof(mfcc_t)); + /* + * DCEP: mfc[2] - mfc[-2]; + */ + f = feat[0] + feat_cepsize(fcb) - 1; + w = mfc[2] + 1; /* +1 to skip C0 */ + _w = mfc[-2] + 1; + + for (i = 0; i < feat_cepsize(fcb) - 1; i++) + f[i] = w[i] - _w[i]; + + /* POW: C0, DC0, D2C0 */ + f += feat_cepsize(fcb) - 1; + + f[0] = mfc[0][0]; + f[1] = mfc[2][0] - mfc[-2][0]; + + d1 = mfc[3][0] - mfc[-1][0]; + d2 = mfc[1][0] - mfc[-3][0]; + f[2] = d1 - d2; + + /* D2CEP: (mfc[3] - mfc[-1]) - (mfc[1] - mfc[-3]) */ + f += 3; + + w1 = mfc[3] + 1; /* Final +1 to skip C0 */ + _w1 = mfc[-1] + 1; + w_1 = mfc[1] + 1; + _w_1 = mfc[-3] + 1; + + for (i = 0; i < feat_cepsize(fcb) - 1; i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } +} + + +static void +feat_s3_cep(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_window_size(fcb) == 0); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); +} + +static void +feat_s3_cep_dcep(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + int32 i; + + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == feat_cepsize(fcb) * 2); + assert(feat_window_size(fcb) == 2); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); + + /* + * DCEP: mfc[2] - mfc[-2]; + */ + f = feat[0] + feat_cepsize(fcb); + w = mfc[2]; + _w = mfc[-2]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; +} + +static void +feat_1s_c_d_dd_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i; + + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == feat_cepsize(fcb) * 3); + assert(feat_window_size(fcb) == FEAT_DCEP_WIN + 1); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); + + /* + * DCEP: mfc[w] - mfc[-w], where w = FEAT_DCEP_WIN; + */ + f = feat[0] + feat_cepsize(fcb); + w = mfc[FEAT_DCEP_WIN]; + _w = mfc[-FEAT_DCEP_WIN]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; + + /* + * D2CEP: (mfc[w+1] - mfc[-w+1]) - (mfc[w-1] - mfc[-w-1]), + * where w = FEAT_DCEP_WIN + */ + f += feat_cepsize(fcb); + + w1 = mfc[FEAT_DCEP_WIN + 1]; + _w1 = mfc[-FEAT_DCEP_WIN + 1]; + w_1 = mfc[FEAT_DCEP_WIN - 1]; + _w_1 = mfc[-FEAT_DCEP_WIN - 1]; + + for (i = 0; i < feat_cepsize(fcb); i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } +} + +static void +feat_1s_c_d_ld_dd_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i; + + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == feat_cepsize(fcb) * 4); + assert(feat_window_size(fcb) == FEAT_DCEP_WIN * 2); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); + + /* + * DCEP: mfc[w] - mfc[-w], where w = FEAT_DCEP_WIN; + */ + f = feat[0] + feat_cepsize(fcb); + w = mfc[FEAT_DCEP_WIN]; + _w = mfc[-FEAT_DCEP_WIN]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; + + /* + * LDCEP: mfc[w] - mfc[-w], where w = FEAT_DCEP_WIN * 2; + */ + f += feat_cepsize(fcb); + w = mfc[FEAT_DCEP_WIN * 2]; + _w = mfc[-FEAT_DCEP_WIN * 2]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; + + /* + * D2CEP: (mfc[w+1] - mfc[-w+1]) - (mfc[w-1] - mfc[-w-1]), + * where w = FEAT_DCEP_WIN + */ + f += feat_cepsize(fcb); + + w1 = mfc[FEAT_DCEP_WIN + 1]; + _w1 = mfc[-FEAT_DCEP_WIN + 1]; + w_1 = mfc[FEAT_DCEP_WIN - 1]; + _w_1 = mfc[-FEAT_DCEP_WIN - 1]; + + for (i = 0; i < feat_cepsize(fcb); i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } +} + +static void +feat_copy(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + int32 win, i, j; + + win = feat_window_size(fcb); + + /* Concatenate input features */ + for (i = -win; i <= win; ++i) { + uint32 spos = 0; + + for (j = 0; j < feat_n_stream(fcb); ++j) { + uint32 stream_len; + + /* Unscale the stream length by the window. */ + stream_len = feat_stream_len(fcb, j) / (2 * win + 1); + memcpy(feat[j] + ((i + win) * stream_len), + mfc[i] + spos, + stream_len * sizeof(mfcc_t)); + spos += stream_len; + } + } +} + +feat_t * +feat_init(char const *type, cmn_type_t cmn, int32 varnorm, + agc_type_t agc, int32 breport, int32 cepsize) +{ + feat_t *fcb; + + if (cepsize == 0) + cepsize = 13; + if (breport) + E_INFO + ("Initializing feature stream to type: '%s', ceplen=%d, CMN='%s', VARNORM='%s', AGC='%s'\n", + type, cepsize, cmn_type_str[cmn], varnorm ? "yes" : "no", agc_type_str[agc]); + + fcb = (feat_t *) ckd_calloc(1, sizeof(feat_t)); + fcb->refcount = 1; + fcb->name = (char *) ckd_salloc(type); + if (strcmp(type, "s2_4x") == 0) { + /* Sphinx-II format 4-stream feature (Hack!! hardwired constants below) */ + if (cepsize != 13) { + E_ERROR("s2_4x features require cepsize == 13\n"); + ckd_free(fcb); + return NULL; + } + fcb->cepsize = 13; + fcb->n_stream = 4; + fcb->stream_len = (uint32 *) ckd_calloc(4, sizeof(uint32)); + fcb->stream_len[0] = 12; + fcb->stream_len[1] = 24; + fcb->stream_len[2] = 3; + fcb->stream_len[3] = 12; + fcb->out_dim = 51; + fcb->window_size = 4; + fcb->compute_feat = feat_s2_4x_cep2feat; + } + else if ((strcmp(type, "s3_1x39") == 0) || (strcmp(type, "1s_12c_12d_3p_12dd") == 0)) { + /* 1-stream cep/dcep/pow/ddcep (Hack!! hardwired constants below) */ + if (cepsize != 13) { + E_ERROR("s2_4x features require cepsize == 13\n"); + ckd_free(fcb); + return NULL; + } + fcb->cepsize = 13; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = 39; + fcb->out_dim = 39; + fcb->window_size = 3; + fcb->compute_feat = feat_s3_1x39_cep2feat; + } + else if (strncmp(type, "1s_c_d_dd", 9) == 0) { + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = cepsize * 3; + fcb->out_dim = cepsize * 3; + fcb->window_size = FEAT_DCEP_WIN + 1; /* ddcep needs the extra 1 */ + fcb->compute_feat = feat_1s_c_d_dd_cep2feat; + } + else if (strncmp(type, "1s_c_d_ld_dd", 12) == 0) { + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = cepsize * 4; + fcb->out_dim = cepsize * 4; + fcb->window_size = FEAT_DCEP_WIN * 2; + fcb->compute_feat = feat_1s_c_d_ld_dd_cep2feat; + } + else if (strncmp(type, "cep_dcep", 8) == 0 || strncmp(type, "1s_c_d", 6) == 0) { + /* 1-stream cep/dcep */ + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = feat_cepsize(fcb) * 2; + fcb->out_dim = fcb->stream_len[0]; + fcb->window_size = 2; + fcb->compute_feat = feat_s3_cep_dcep; + } + else if (strncmp(type, "cep", 3) == 0 || strncmp(type, "1s_c", 4) == 0) { + /* 1-stream cep */ + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = feat_cepsize(fcb); + fcb->out_dim = fcb->stream_len[0]; + fcb->window_size = 0; + fcb->compute_feat = feat_s3_cep; + } + else if (strncmp(type, "1s_3c", 5) == 0 || strncmp(type, "1s_4c", 5) == 0) { + /* 1-stream cep with frames concatenated, so called cepwin features */ + if (strncmp(type, "1s_3c", 5) == 0) + fcb->window_size = 3; + else + fcb->window_size = 4; + + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = feat_cepsize(fcb) * (2 * fcb->window_size + 1); + fcb->out_dim = fcb->stream_len[0]; + fcb->compute_feat = feat_copy; + } + else { + int32 i, k, l; + size_t len; + char *strp; + char *mtype = ckd_salloc(type); + char *wd = ckd_salloc(type); + /* + * Generic definition: Format should be %d,%d,%d,...,%d (i.e., + * comma separated list of feature stream widths; #items = + * #streams). An optional window size (frames will be + * concatenated) is also allowed, which can be specified with + * a colon after the list of feature streams. + */ + len = strlen(mtype); + k = 0; + for (i = 1; i < len - 1; i++) { + if (mtype[i] == ',') { + mtype[i] = ' '; + k++; + } + else if (mtype[i] == ':') { + mtype[i] = '\0'; + fcb->window_size = atoi(mtype + i + 1); + break; + } + } + k++; /* Presumably there are (#commas+1) streams */ + fcb->n_stream = k; + fcb->stream_len = (uint32 *) ckd_calloc(k, sizeof(uint32)); + + /* Scan individual feature stream lengths */ + strp = mtype; + i = 0; + fcb->out_dim = 0; + fcb->cepsize = 0; + while (sscanf(strp, "%s%n", wd, &l) == 1) { + strp += l; + if ((i >= fcb->n_stream) + || (sscanf(wd, "%u", &(fcb->stream_len[i])) != 1) + || (fcb->stream_len[i] <= 0)) + E_FATAL("Bad feature type argument\n"); + /* Input size before windowing */ + fcb->cepsize += fcb->stream_len[i]; + if (fcb->window_size > 0) + fcb->stream_len[i] *= (fcb->window_size * 2 + 1); + /* Output size after windowing */ + fcb->out_dim += fcb->stream_len[i]; + i++; + } + if (i != fcb->n_stream) + E_FATAL("Bad feature type argument\n"); + if (fcb->cepsize != cepsize) + E_FATAL("Bad feature type argument\n"); + + /* Input is already the feature stream */ + fcb->compute_feat = feat_copy; + ckd_free(mtype); + ckd_free(wd); + } + + if (cmn != CMN_NONE) + fcb->cmn_struct = cmn_init(feat_cepsize(fcb)); + fcb->cmn = cmn; + fcb->varnorm = varnorm; + if (agc != AGC_NONE) { + fcb->agc_struct = agc_init(); + /* + * No need to check if agc is set to EMAX; agc_emax_set() changes only emax related things + * Moreover, if agc is not NONE and block mode is used, feat_agc() SILENTLY + * switches to EMAX + */ + /* HACK: hardwired initial estimates based on use of CMN (from Sphinx2) */ + agc_emax_set(fcb->agc_struct, (cmn != CMN_NONE) ? 5.0 : 10.0); + } + fcb->agc = agc; + /* + * Make sure this buffer is large enough to be used in feat_s2mfc2feat_block_utt() + */ + fcb->cepbuf = (mfcc_t **) ckd_calloc_2d((LIVEBUFBLOCKSIZE < feat_window_size(fcb) * 2) ? feat_window_size(fcb) * 2 : LIVEBUFBLOCKSIZE, + feat_cepsize(fcb), + sizeof(mfcc_t)); + /* This one is actually just an array of pointers to "flatten out" + * wraparounds. */ + fcb->tmpcepbuf = (mfcc_t** )ckd_calloc(2 * feat_window_size(fcb) + 1, + sizeof(*fcb->tmpcepbuf)); + + return fcb; +} + + +void +feat_print(feat_t * fcb, mfcc_t *** feat, int32 nfr, FILE * fp) +{ + uint32 i, j, k; + + for (i = 0; i < nfr; i++) { + fprintf(fp, "%8d:\n", i); + + for (j = 0; j < feat_dimension1(fcb); j++) { + fprintf(fp, "\t%2d:", j); + + for (k = 0; k < feat_dimension2(fcb, j); k++) + fprintf(fp, " %8.4f", MFCC2FLOAT(feat[i][j][k])); + fprintf(fp, "\n"); + } + } + + fflush(fp); +} + +static void +feat_cmn(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 beginutt, int32 endutt) +{ + cmn_type_t cmn_type = fcb->cmn; + + if (!(beginutt && endutt) + && cmn_type != CMN_NONE) /* Only cmn_prior in block computation mode. */ + fcb->cmn = cmn_type = CMN_LIVE; + + switch (cmn_type) { + case CMN_BATCH: + cmn(fcb->cmn_struct, mfc, fcb->varnorm, nfr); + break; + case CMN_LIVE: + cmn_live(fcb->cmn_struct, mfc, fcb->varnorm, nfr); + if (endutt) + cmn_live_update(fcb->cmn_struct); + break; + default: + ; + } + cep_dump_dbg(fcb, mfc, nfr, "After CMN"); +} + +static void +feat_agc(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 beginutt, int32 endutt) +{ + agc_type_t agc_type = fcb->agc; + + if (!(beginutt && endutt) + && agc_type != AGC_NONE) /* Only agc_emax in block computation mode. */ + agc_type = AGC_EMAX; + + switch (agc_type) { + case AGC_MAX: + agc_max(fcb->agc_struct, mfc, nfr); + break; + case AGC_EMAX: + agc_emax(fcb->agc_struct, mfc, nfr); + if (endutt) + agc_emax_update(fcb->agc_struct); + break; + case AGC_NOISE: + agc_noise(fcb->agc_struct, mfc, nfr); + break; + default: + ; + } + cep_dump_dbg(fcb, mfc, nfr, "After AGC"); +} + +static void +feat_compute_utt(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 win, mfcc_t ***feat) +{ + int32 i; + + cep_dump_dbg(fcb, mfc, nfr, "Incoming features (after padding)"); + + /* Create feature vectors */ + for (i = win; i < nfr - win; i++) { + fcb->compute_feat(fcb, mfc + i, feat[i - win]); + } + + feat_print_dbg(fcb, feat, nfr - win * 2, "After dynamic feature computation"); + + if (fcb->lda) { + feat_lda_transform(fcb, feat, nfr - win * 2); + feat_print_dbg(fcb, feat, nfr - win * 2, "After LDA"); + } + + if (fcb->subvecs) { + feat_subvec_project(fcb, feat, nfr - win * 2); + feat_print_dbg(fcb, feat, nfr - win * 2, "After subvector projection"); + } +} + + +/** + * Read Sphinx-II format mfc file (s2mfc = Sphinx-II format MFC data). + * If out_mfc is NULL, no actual reading will be done, and the number of + * frames (plus padding) that would be read is returned. + * + * It's important that normalization is done before padding because + * frames outside the data we are interested in shouldn't be taken + * into normalization stats. + * + * @return # frames read (plus padding) if successful, -1 if + * error (e.g., mfc array too small). + */ +static int32 +feat_s2mfc_read_norm_pad(feat_t *fcb, char *file, int32 win, + int32 sf, int32 ef, + mfcc_t ***out_mfc, + int32 maxfr, + int32 cepsize) +{ + FILE *fp; + int32 n_float32; + float32 *float_feat; + struct stat statbuf; + int32 i, n, byterev; + int32 start_pad, end_pad; + mfcc_t **mfc; + + /* Initialize the output pointer to NULL, so that any attempts to + free() it if we fail before allocating it will not segfault! */ + if (out_mfc) + *out_mfc = NULL; + E_INFO("Reading mfc file: '%s'[%d..%d]\n", file, sf, ef); + if (ef >= 0 && ef <= sf) { + E_ERROR("%s: End frame (%d) <= Start frame (%d)\n", file, ef, sf); + return -1; + } + + /* Find filesize; HACK!! To get around intermittent NFS failures, use stat_retry */ + if ((stat_retry(file, &statbuf) < 0) + || ((fp = fopen(file, "rb")) == NULL)) { + E_ERROR_SYSTEM("Failed to open file '%s' for reading", file); + return -1; + } + + /* Read #floats in header */ + if (fread_retry(&n_float32, sizeof(int32), 1, fp) != 1) { + E_ERROR("%s: fread(#floats) failed\n", file); + fclose(fp); + return -1; + } + + /* Check if n_float32 matches file size */ + byterev = 0; + if ((int32) (n_float32 * sizeof(float32) + 4) != (int32) statbuf.st_size) { /* RAH, typecast both sides to remove compile warning */ + n = n_float32; + SWAP_INT32(&n); + + if ((int32) (n * sizeof(float32) + 4) != (int32) (statbuf.st_size)) { /* RAH, typecast both sides to remove compile warning */ + E_ERROR + ("%s: Header size field: %d(%08x); filesize: %d(%08x)\n", + file, n_float32, n_float32, statbuf.st_size, + statbuf.st_size); + fclose(fp); + return -1; + } + + n_float32 = n; + byterev = 1; + } + if (n_float32 <= 0) { + E_ERROR("%s: Header size field (#floats) = %d\n", file, n_float32); + fclose(fp); + return -1; + } + + /* Convert n to #frames of input */ + n = n_float32 / cepsize; + if (n * cepsize != n_float32) { + E_ERROR("Header size field: %d; not multiple of %d\n", n_float32, + cepsize); + fclose(fp); + return -1; + } + + /* Check start and end frames */ + if (sf > 0) { + if (sf >= n) { + E_ERROR("%s: Start frame (%d) beyond file size (%d)\n", file, + sf, n); + fclose(fp); + return -1; + } + } + if (ef < 0) + ef = n-1; + else if (ef >= n) { + E_WARN("%s: End frame (%d) beyond file size (%d), will truncate\n", + file, ef, n); + ef = n-1; + } + + /* Add window to start and end frames */ + sf -= win; + ef += win; + if (sf < 0) { + start_pad = -sf; + sf = 0; + } + else + start_pad = 0; + if (ef >= n) { + end_pad = ef - n + 1; + ef = n - 1; + } + else + end_pad = 0; + + /* Limit n if indicated by [sf..ef] */ + if ((ef - sf + 1) < n) + n = (ef - sf + 1); + if (maxfr > 0 && n + start_pad + end_pad > maxfr) { + E_ERROR("%s: Maximum output size(%d frames) < actual #frames(%d)\n", + file, maxfr, n + start_pad + end_pad); + fclose(fp); + return -1; + } + + /* If no output buffer was supplied, then skip the actual data reading. */ + if (out_mfc != NULL) { + /* Position at desired start frame and read actual MFC data */ + mfc = (mfcc_t **)ckd_calloc_2d(n + start_pad + end_pad, cepsize, sizeof(mfcc_t)); + if (sf > 0) + fseek(fp, sf * cepsize * sizeof(float32), SEEK_CUR); + n_float32 = n * cepsize; +#ifdef FIXED_POINT + float_feat = ckd_calloc(n_float32, sizeof(float32)); +#else + float_feat = mfc[start_pad]; +#endif + if (fread_retry(float_feat, sizeof(float32), n_float32, fp) != n_float32) { + E_ERROR("%s: fread(%dx%d) (MFC data) failed\n", file, n, cepsize); + ckd_free_2d(mfc); + fclose(fp); + return -1; + } + if (byterev) { + for (i = 0; i < n_float32; i++) { + SWAP_FLOAT32(&float_feat[i]); + } + } +#ifdef FIXED_POINT + for (i = 0; i < n_float32; ++i) { + mfc[start_pad][i] = FLOAT2MFCC(float_feat[i]); + } + ckd_free(float_feat); +#endif + + /* Normalize */ + feat_cmn(fcb, mfc + start_pad, n, 1, 1); + feat_agc(fcb, mfc + start_pad, n, 1, 1); + + /* Replicate start and end frames if necessary. */ + for (i = 0; i < start_pad; ++i) + memcpy(mfc[i], mfc[start_pad], cepsize * sizeof(mfcc_t)); + for (i = 0; i < end_pad; ++i) + memcpy(mfc[start_pad + n + i], mfc[start_pad + n - 1], + cepsize * sizeof(mfcc_t)); + + *out_mfc = mfc; + } + + fclose(fp); + return n + start_pad + end_pad; +} + + + +int32 +feat_s2mfc2feat(feat_t * fcb, const char *file, const char *dir, const char *cepext, + int32 sf, int32 ef, mfcc_t *** feat, int32 maxfr) +{ + char *path; + char *ps = "/"; + int32 win, nfr; + size_t file_length, cepext_length, path_length = 0; + mfcc_t **mfc; + + if (fcb->cepsize <= 0) { + E_ERROR("Bad cepsize: %d\n", fcb->cepsize); + return -1; + } + + if (cepext == NULL) + cepext = ""; + + /* + * Create mfc filename, combining file, dir and extension if + * necessary + */ + + /* + * First we decide about the path. If dir is defined, then use + * it. Otherwise assume the filename already contains the path. + */ + if (dir == NULL) { + dir = ""; + ps = ""; + /* + * This is not true but some 3rd party apps + * may parse the output explicitly checking for this line + */ + E_INFO("At directory . (current directory)\n"); + } + else { + E_INFO("At directory %s\n", dir); + /* + * Do not forget the path separator! + */ + path_length += strlen(dir) + 1; + } + + /* + * Include cepext, if it's not already part of the filename. + */ + file_length = strlen(file); + cepext_length = strlen(cepext); + if ((file_length > cepext_length) + && (strcmp(file + file_length - cepext_length, cepext) == 0)) { + cepext = ""; + cepext_length = 0; + } + + /* + * Do not forget the '\0' + */ + path_length += file_length + cepext_length + 1; + path = (char*) ckd_calloc(path_length, sizeof(char)); + +#ifdef HAVE_SNPRINTF + /* + * Paranoia is our best friend... + */ + while ((file_length = snprintf(path, path_length, "%s%s%s%s", dir, ps, file, cepext)) > path_length) { + path_length = file_length; + path = (char*) ckd_realloc(path, path_length * sizeof(char)); + } +#else + sprintf(path, "%s%s%s%s", dir, ps, file, cepext); +#endif + + win = feat_window_size(fcb); + /* Pad maxfr with win, so we read enough raw feature data to + * calculate the requisite number of dynamic features. */ + if (maxfr >= 0) + maxfr += win * 2; + + if (feat != NULL) { + /* Read mfc file including window or padding if necessary. */ + nfr = feat_s2mfc_read_norm_pad(fcb, path, win, sf, ef, &mfc, maxfr, fcb->cepsize); + ckd_free(path); + if (nfr < 0) { + ckd_free_2d((void **) mfc); + return -1; + } + + /* Actually compute the features */ + feat_compute_utt(fcb, mfc, nfr, win, feat); + + ckd_free_2d((void **) mfc); + } + else { + /* Just calculate the number of frames we would need. */ + nfr = feat_s2mfc_read_norm_pad(fcb, path, win, sf, ef, NULL, maxfr, fcb->cepsize); + ckd_free(path); + if (nfr < 0) + return nfr; + } + + + return (nfr - win * 2); +} + +static int32 +feat_s2mfc2feat_block_utt(feat_t * fcb, mfcc_t ** uttcep, + int32 nfr, mfcc_t *** ofeat) +{ + mfcc_t **cepbuf; + int32 i, win, cepsize; + + win = feat_window_size(fcb); + cepsize = feat_cepsize(fcb); + + /* Copy and pad out the utterance (this requires that the + * feature computation functions always access the buffer via + * the frame pointers, which they do) */ + cepbuf = (mfcc_t **)ckd_calloc(nfr + win * 2, sizeof(mfcc_t *)); + memcpy(cepbuf + win, uttcep, nfr * sizeof(mfcc_t *)); + + /* Do normalization before we interpolate on the boundary */ + feat_cmn(fcb, cepbuf + win, nfr, 1, 1); + feat_agc(fcb, cepbuf + win, nfr, 1, 1); + + /* Now interpolate */ + for (i = 0; i < win; ++i) { + cepbuf[i] = fcb->cepbuf[i]; + memcpy(cepbuf[i], uttcep[0], cepsize * sizeof(mfcc_t)); + cepbuf[nfr + win + i] = fcb->cepbuf[win + i]; + memcpy(cepbuf[nfr + win + i], uttcep[nfr - 1], cepsize * sizeof(mfcc_t)); + } + /* Compute as usual. */ + feat_compute_utt(fcb, cepbuf, nfr + win * 2, win, ofeat); + ckd_free(cepbuf); + return nfr; +} + +int32 +feat_s2mfc2feat_live(feat_t * fcb, mfcc_t ** uttcep, int32 *inout_ncep, + int32 beginutt, int32 endutt, mfcc_t *** ofeat) +{ + int32 win, cepsize, nbufcep; + int32 i, j, nfeatvec; + int32 zero = 0; + + /* Avoid having to check this everywhere. */ + if (inout_ncep == NULL) inout_ncep = &zero; + + /* Special case for entire utterances. */ + if (beginutt && endutt && *inout_ncep > 0) + return feat_s2mfc2feat_block_utt(fcb, uttcep, *inout_ncep, ofeat); + + win = feat_window_size(fcb); + cepsize = feat_cepsize(fcb); + + /* Empty the input buffer on start of utterance. */ + if (beginutt) + fcb->bufpos = fcb->curpos; + + /* Calculate how much data is in the buffer already. */ + nbufcep = fcb->bufpos - fcb->curpos; + if (nbufcep < 0) + nbufcep = fcb->bufpos + LIVEBUFBLOCKSIZE - fcb->curpos; + /* Add any data that we have to replicate. */ + if (beginutt && *inout_ncep > 0) + nbufcep += win; + if (endutt) + nbufcep += win; + + /* Only consume as much input as will fit in the buffer. */ + if (nbufcep + *inout_ncep > LIVEBUFBLOCKSIZE) { + /* We also can't overwrite the trailing window, hence the + * reason why win is subtracted here. */ + *inout_ncep = LIVEBUFBLOCKSIZE - nbufcep - win; + /* Cancel end of utterance processing. */ + endutt = FALSE; + } + + /* FIXME: Don't modify the input! */ + feat_cmn(fcb, uttcep, *inout_ncep, beginutt, endutt); + feat_agc(fcb, uttcep, *inout_ncep, beginutt, endutt); + + /* Replicate first frame into the first win frames if we're at the + * beginning of the utterance and there was some actual input to + * deal with. (FIXME: Not entirely sure why that condition) */ + if (beginutt && *inout_ncep > 0) { + for (i = 0; i < win; i++) { + memcpy(fcb->cepbuf[fcb->bufpos++], uttcep[0], + cepsize * sizeof(mfcc_t)); + fcb->bufpos %= LIVEBUFBLOCKSIZE; + } + /* Move the current pointer past this data. */ + fcb->curpos = fcb->bufpos; + nbufcep -= win; + } + + /* Copy in frame data to the circular buffer. */ + for (i = 0; i < *inout_ncep; ++i) { + memcpy(fcb->cepbuf[fcb->bufpos++], uttcep[i], + cepsize * sizeof(mfcc_t)); + fcb->bufpos %= LIVEBUFBLOCKSIZE; + ++nbufcep; + } + + /* Replicate last frame into the last win frames if we're at the + * end of the utterance (even if there was no input, so we can + * flush the output). */ + if (endutt) { + int32 tpos; /* Index of last input frame. */ + if (fcb->bufpos == 0) + tpos = LIVEBUFBLOCKSIZE - 1; + else + tpos = fcb->bufpos - 1; + for (i = 0; i < win; ++i) { + memcpy(fcb->cepbuf[fcb->bufpos++], fcb->cepbuf[tpos], + cepsize * sizeof(mfcc_t)); + fcb->bufpos %= LIVEBUFBLOCKSIZE; + } + } + + /* We have to leave the trailing window of frames. */ + nfeatvec = nbufcep - win; + if (nfeatvec <= 0) + return 0; /* Do nothing. */ + + for (i = 0; i < nfeatvec; ++i) { + /* Handle wraparound cases. */ + if (fcb->curpos - win < 0 || fcb->curpos + win >= LIVEBUFBLOCKSIZE) { + /* Use tmpcepbuf for this case. Actually, we just need the pointers. */ + for (j = -win; j <= win; ++j) { + int32 tmppos = + (fcb->curpos + j + LIVEBUFBLOCKSIZE) % LIVEBUFBLOCKSIZE; + fcb->tmpcepbuf[win + j] = fcb->cepbuf[tmppos]; + } + fcb->compute_feat(fcb, fcb->tmpcepbuf + win, ofeat[i]); + } + else { + fcb->compute_feat(fcb, fcb->cepbuf + fcb->curpos, ofeat[i]); + } + /* Move the read pointer forward. */ + ++fcb->curpos; + fcb->curpos %= LIVEBUFBLOCKSIZE; + } + + if (fcb->lda) + feat_lda_transform(fcb, ofeat, nfeatvec); + + if (fcb->subvecs) + feat_subvec_project(fcb, ofeat, nfeatvec); + + return nfeatvec; +} + +void +feat_update_stats(feat_t *fcb) +{ + if (fcb->cmn == CMN_LIVE) { + cmn_live_update(fcb->cmn_struct); + } + if (fcb->agc == AGC_EMAX || fcb->agc == AGC_MAX) { + agc_emax_update(fcb->agc_struct); + } +} + +feat_t * +feat_retain(feat_t *f) +{ + ++f->refcount; + return f; +} + +int +feat_free(feat_t * f) +{ + if (f == NULL) + return 0; + if (--f->refcount > 0) + return f->refcount; + + if (f->cepbuf) + ckd_free_2d((void **) f->cepbuf); + ckd_free(f->tmpcepbuf); + + if (f->name) { + ckd_free((void *) f->name); + } + if (f->lda) + ckd_free_3d((void ***) f->lda); + + ckd_free(f->stream_len); + ckd_free(f->sv_len); + ckd_free(f->sv_buf); + subvecs_free(f->subvecs); + + cmn_free(f->cmn_struct); + agc_free(f->agc_struct); + + ckd_free(f); + return 0; +} + + +void +feat_report(feat_t * f) +{ + int i; + E_INFO_NOFN("Initialization of feat_t, report:\n"); + E_INFO_NOFN("Feature type = %s\n", f->name); + E_INFO_NOFN("Cepstral size = %d\n", f->cepsize); + E_INFO_NOFN("Number of streams = %d\n", f->n_stream); + for (i = 0; i < f->n_stream; i++) { + E_INFO_NOFN("Vector size of stream[%d]: %d\n", i, + f->stream_len[i]); + } + E_INFO_NOFN("Number of subvectors = %d\n", f->n_sv); + for (i = 0; i < f->n_sv; i++) { + int32 *sv; + + E_INFO_NOFN("Components of subvector[%d]:", i); + for (sv = f->subvecs[i]; sv && *sv != -1; ++sv) + E_INFOCONT(" %d", *sv); + E_INFOCONT("\n"); + } + E_INFO_NOFN("Whether CMN is used = %d\n", f->cmn); + E_INFO_NOFN("Whether AGC is used = %d\n", f->agc); + E_INFO_NOFN("Whether variance is normalized = %d\n", f->varnorm); + E_INFO_NOFN("\n"); +} diff --git a/src/libsphinxbase/feat/lda.c b/src/libsphinxbase/feat/lda.c new file mode 100644 index 000000000..182b029de --- /dev/null +++ b/src/libsphinxbase/feat/lda.c @@ -0,0 +1,158 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * lda.c -- Read and apply LDA matrices to features. + * + * Author: David Huggins-Daines + */ + +#include +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4018) +#endif + +#include "sphinxbase/feat.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/bio.h" +#include "sphinxbase/err.h" + +#define MATRIX_FILE_VERSION "0.1" + +int32 +feat_read_lda(feat_t *feat, const char *ldafile, int32 dim) +{ + FILE *fh; + int32 byteswap; + uint32 chksum, i, m, n; + char **argname, **argval; + + assert(feat); + if (feat->n_stream != 1) { + E_ERROR("LDA incompatible with multi-stream features (n_stream = %d)\n", + feat->n_stream); + return -1; + } + + if ((fh = fopen(ldafile, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open transform file '%s' for reading", ldafile); + return -1; + } + + if (bio_readhdr(fh, &argname, &argval, &byteswap) < 0) { + E_ERROR("Failed to read header from transform file '%s'\n", ldafile); + fclose(fh); + return -1; + } + + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + if (strcmp(argval[i], MATRIX_FILE_VERSION) != 0) + E_WARN("%s: Version mismatch: %s, expecting %s\n", + ldafile, argval[i], MATRIX_FILE_VERSION); + } + } + + bio_hdrarg_free(argname, argval); + argname = argval = NULL; + + chksum = 0; + + if (feat->lda) + ckd_free_3d((void ***)feat->lda); + + { + /* Use a temporary variable to avoid strict-aliasing problems. */ + void ***outlda; + + if (bio_fread_3d(&outlda, sizeof(float32), + &feat->n_lda, &m, &n, + fh, byteswap, &chksum) < 0) { + E_ERROR_SYSTEM("%s: bio_fread_3d(lda) failed\n", ldafile); + fclose(fh); + return -1; + } + feat->lda = (void *)outlda; + } + fclose(fh); + +#ifdef FIXED_POINT + /* FIXME: This is a fragile hack that depends on mfcc_t and + * float32 being the same size (which they are, but...) */ + for (i = 0; i < feat->n_lda * m * n; ++i) { + feat->lda[0][0][i] = FLOAT2MFCC(((float *)feat->lda[0][0])[i]); + } +#endif + + /* Note that SphinxTrain stores the eigenvectors as row vectors. */ + if (n != feat->stream_len[0]) + E_FATAL("LDA matrix dimension %d doesn't match feature stream size %d\n", n, feat->stream_len[0]); + + /* Override dim from file if it is 0 or greater than m. */ + if (dim > m || dim <= 0) { + dim = m; + } + feat->out_dim = dim; + + return 0; +} + +void +feat_lda_transform(feat_t *fcb, mfcc_t ***inout_feat, uint32 nfr) +{ + mfcc_t *tmp; + uint32 i, j, k; + + tmp = ckd_calloc(fcb->stream_len[0], sizeof(mfcc_t)); + for (i = 0; i < nfr; ++i) { + /* Do the matrix multiplication inline here since fcb->lda + * is transposed (eigenvectors in rows not columns). */ + /* FIXME: In the future we ought to use the BLAS. */ + memset(tmp, 0, sizeof(mfcc_t) * fcb->stream_len[0]); + for (j = 0; j < feat_dimension(fcb); ++j) { + for (k = 0; k < fcb->stream_len[0]; ++k) { + tmp[j] += MFCCMUL(inout_feat[i][0][k], fcb->lda[0][j][k]); + } + } + memcpy(inout_feat[i][0], tmp, fcb->stream_len[0] * sizeof(mfcc_t)); + } + ckd_free(tmp); +} diff --git a/src/libsphinxbase/lm/Makefile.am b/src/libsphinxbase/lm/Makefile.am new file mode 100644 index 000000000..c985deff1 --- /dev/null +++ b/src/libsphinxbase/lm/Makefile.am @@ -0,0 +1,36 @@ +noinst_LTLIBRARIES = libsphinxlm.la + +AM_YFLAGS = -d +BUILT_SOURCES = jsgf_parser.h jsgf_parser.c + +libsphinxlm_la_SOURCES = \ + ngrams_raw.c \ + lm_trie.c \ + lm_trie_quant.c \ + ngram_model.c \ + ngram_model_set.c \ + ngram_model_trie.c \ + fsg_model.c \ + jsgf.c \ + jsgf_scanner.c \ + jsgf_parser.y + +libsphinxlm_la_LIBADD = $(LIBICONV) + +noinst_HEADERS = ngram_model_internal.h \ + ngram_model_set.h \ + ngram_model_trie.h \ + ngrams_raw.h \ + lm_trie.h \ + lm_trie_quant.h \ + jsgf_internal.h \ + jsgf_scanner.h \ + jsgf_parser.h + +AM_CFLAGS =-I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include + +# Warning: you need flex 2.6.1 at least, command line is +# flex --nounistd -o jsgf_scanner.c _jsgf_scanner.l +EXTRA_DIST = _jsgf_scanner.l diff --git a/src/libsphinxbase/lm/_jsgf_scanner.l b/src/libsphinxbase/lm/_jsgf_scanner.l new file mode 100644 index 000000000..43e29ba40 --- /dev/null +++ b/src/libsphinxbase/lm/_jsgf_scanner.l @@ -0,0 +1,87 @@ +/* -*- mode: text -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* YOU MUST USE FLEX 2.6.1 OR NEWER TO PROCESS THIS FILE!!! */ +%{ + +#include "jsgf_internal.h" +#include "jsgf_parser.h" + +%} + +%option 8bit reentrant bison-bridge noyywrap yylineno never-interactive nounput nounistd +%option header-file="jsgf_scanner.h" +%s COMMENT +%s DECL +%s DECLCOMMENT + +ws [ \t\r\n] +rulename \<[^<>]+\> +tag \{(\\.|[^\}]+)*\} +weight \/[0-9]*(\.[0-9]+)?(e-)?[0-9]*\/ +token [^ \t\r\n=;|*+<>()\[\]{}*/]+ +qstring \"(\\.|[^"]+)*\" +bom [\xEF][\xBB][\xBF] + +%% + +{ws} ; /* ignore whitespace */ +\/\/.*\n ; /* single-line comments */ +\/\* { BEGIN(COMMENT); } /* C-style comments */ +\*\/ { BEGIN(INITIAL); } +. ; /* Ignore stuff in comment mode */ + +\/\/.*\n ; /* single-line comments inside decl */ +\/\* { BEGIN(DECLCOMMENT); } /* C-style comments inside decl */ +\*\/ { BEGIN(DECL); } +. ; /* Ignore stuff in comment mode */ + +{bom}?#JSGF {BEGIN(DECL); return HEADER;} +grammar {BEGIN(DECL); return GRAMMAR;} +import {BEGIN(DECL); return IMPORT;} +public {BEGIN(DECL); return PUBLIC;} + +{rulename} { BEGIN(DECL); yylval->name = strdup(yytext); return RULENAME; } +{rulename} { yylval->name = strdup(yytext); return RULENAME; } + +{tag} { yylval->name = strdup(yytext); return TAG; } +{token} { yylval->name = strdup(yytext); return TOKEN; } +; { BEGIN(INITIAL); return yytext[0]; } +{qstring} { yylval->name = strdup(yytext); return TOKEN; } +{weight} { yylval->weight = atof_c(yytext+1); return WEIGHT; } +. return yytext[0]; /* Single-character tokens */ + +%% diff --git a/src/libsphinxbase/lm/fsg_model.c b/src/libsphinxbase/lm/fsg_model.c new file mode 100644 index 000000000..ac80ef9a4 --- /dev/null +++ b/src/libsphinxbase/lm/fsg_model.c @@ -0,0 +1,939 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include + +/* SphinxBase headers. */ +#include "sphinxbase/err.h" +#include "sphinxbase/pio.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/prim_type.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/hash_table.h" +#include "sphinxbase/fsg_model.h" +#include "sphinxbase/bitvec.h" + +/** + * Adjacency list (opaque) for a state in an FSG. + * + * Actually we use hash tables so that random access is a bit faster. + * Plus it allows us to make the lookup code a bit less ugly. + */ + +struct trans_list_s { + hash_table_t *null_trans; /* Null transitions keyed by state. */ + hash_table_t *trans; /* Lists of non-null transitions keyed by state. */ +}; + +/** + * Implementation of arc iterator. + */ +struct fsg_arciter_s { + hash_iter_t *itor, *null_itor; + gnode_t *gn; +}; + +#define FSG_MODEL_BEGIN_DECL "FSG_BEGIN" +#define FSG_MODEL_END_DECL "FSG_END" +#define FSG_MODEL_N_DECL "N" +#define FSG_MODEL_NUM_STATES_DECL "NUM_STATES" +#define FSG_MODEL_S_DECL "S" +#define FSG_MODEL_START_STATE_DECL "START_STATE" +#define FSG_MODEL_F_DECL "F" +#define FSG_MODEL_FINAL_STATE_DECL "FINAL_STATE" +#define FSG_MODEL_T_DECL "T" +#define FSG_MODEL_TRANSITION_DECL "TRANSITION" +#define FSG_MODEL_COMMENT_CHAR '#' + + +static int32 +nextline_str2words(FILE * fp, int32 * lineno, + char **lineptr, char ***wordptr) +{ + for (;;) { + size_t len; + int32 n; + + ckd_free(*lineptr); + if ((*lineptr = fread_line(fp, &len)) == NULL) + return -1; + + (*lineno)++; + + if ((*lineptr)[0] == FSG_MODEL_COMMENT_CHAR) + continue; /* Skip comment lines */ + + n = str2words(*lineptr, NULL, 0); + if (n == 0) + continue; /* Skip blank lines */ + + /* Abuse of realloc(), but this doesn't have to be fast. */ + if (*wordptr == NULL) + *wordptr = ckd_calloc(n, sizeof(**wordptr)); + else + *wordptr = ckd_realloc(*wordptr, n * sizeof(**wordptr)); + return str2words(*lineptr, *wordptr, n); + } +} + +void +fsg_model_trans_add(fsg_model_t * fsg, + int32 from, int32 to, int32 logp, int32 wid) +{ + fsg_link_t *link; + glist_t gl; + gnode_t *gn; + + if (fsg->trans[from].trans == NULL) + fsg->trans[from].trans = hash_table_new(5, HASH_CASE_YES); + + /* Check for duplicate link (i.e., link already exists with label=wid) */ + for (gn = gl = fsg_model_trans(fsg, from, to); gn; gn = gnode_next(gn)) { + link = (fsg_link_t *) gnode_ptr(gn); + if (link->wid == wid) { + if (link->logs2prob < logp) + link->logs2prob = logp; + return; + } + } + + /* Create transition object */ + link = listelem_malloc(fsg->link_alloc); + link->from_state = from; + link->to_state = to; + link->logs2prob = logp; + link->wid = wid; + + /* Add it to the list of transitions and update the hash table */ + gl = glist_add_ptr(gl, (void *) link); + hash_table_replace_bkey(fsg->trans[from].trans, + (char const *) &link->to_state, + sizeof(link->to_state), gl); +} + +int32 +fsg_model_tag_trans_add(fsg_model_t * fsg, int32 from, int32 to, + int32 logp, int32 wid) +{ + fsg_link_t *link, *link2; + + /* Check for transition probability */ + if (logp > 0) { + E_FATAL("Null transition prob must be <= 1.0 (state %d -> %d)\n", + from, to); + } + + /* Self-loop null transitions (with prob <= 1.0) are redundant */ + if (from == to) + return -1; + + if (fsg->trans[from].null_trans == NULL) + fsg->trans[from].null_trans = hash_table_new(5, HASH_CASE_YES); + + /* Check for a duplicate link; if found, keep the higher prob */ + link = fsg_model_null_trans(fsg, from, to); + if (link) { + if (link->logs2prob < logp) { + link->logs2prob = logp; + return 0; + } + else + return -1; + } + + /* Create null transition object */ + link = listelem_malloc(fsg->link_alloc); + link->from_state = from; + link->to_state = to; + link->logs2prob = logp; + link->wid = -1; + + link2 = (fsg_link_t *) + hash_table_enter_bkey(fsg->trans[from].null_trans, + (char const *) &link->to_state, + sizeof(link->to_state), link); + assert(link == link2); + + return 1; +} + +int32 +fsg_model_null_trans_add(fsg_model_t * fsg, int32 from, int32 to, + int32 logp) +{ + return fsg_model_tag_trans_add(fsg, from, to, logp, -1); +} + +glist_t +fsg_model_null_trans_closure(fsg_model_t * fsg, glist_t nulls) +{ + gnode_t *gn1; + int updated; + fsg_link_t *tl1, *tl2; + int32 k, n; + + E_INFO("Computing transitive closure for null transitions\n"); + + /* If our caller didn't give us a list of null-transitions, + make such a list. Just loop through all the FSG states, + and all the null-transitions in that state (which are kept in + their own hash table). */ + if (nulls == NULL) { + int i; + for (i = 0; i < fsg->n_state; ++i) { + hash_iter_t *itor; + hash_table_t *null_trans = fsg->trans[i].null_trans; + if (null_trans == NULL) + continue; + for (itor = hash_table_iter(null_trans); + itor != NULL; itor = hash_table_iter_next(itor)) { + nulls = glist_add_ptr(nulls, hash_entry_val(itor->ent)); + } + } + } + + /* + * Probably not the most efficient closure implementation, in general, but + * probably reasonably efficient for a sparse null transition matrix. + */ + n = 0; + do { + updated = FALSE; + + for (gn1 = nulls; gn1; gn1 = gnode_next(gn1)) { + hash_iter_t *itor; + + tl1 = (fsg_link_t *) gnode_ptr(gn1); + assert(tl1->wid < 0); + + if (fsg->trans[tl1->to_state].null_trans == NULL) + continue; + + for (itor = + hash_table_iter(fsg->trans[tl1->to_state].null_trans); + itor; itor = hash_table_iter_next(itor)) { + + tl2 = (fsg_link_t *) hash_entry_val(itor->ent); + + k = fsg_model_null_trans_add(fsg, + tl1->from_state, + tl2->to_state, + tl1->logs2prob + + tl2->logs2prob); + if (k >= 0) { + updated = TRUE; + if (k > 0) { + nulls = glist_add_ptr(nulls, (void *) + fsg_model_null_trans + (fsg, tl1->from_state, + tl2->to_state)); + n++; + } + } + } + } + } while (updated); + + E_INFO("%d null transitions added\n", n); + + return nulls; +} + +glist_t +fsg_model_trans(fsg_model_t * fsg, int32 i, int32 j) +{ + void *val; + + if (fsg->trans[i].trans == NULL) + return NULL; + if (hash_table_lookup_bkey(fsg->trans[i].trans, (char const *) &j, + sizeof(j), &val) < 0) + return NULL; + return (glist_t) val; +} + +fsg_link_t * +fsg_model_null_trans(fsg_model_t * fsg, int32 i, int32 j) +{ + void *val; + + if (fsg->trans[i].null_trans == NULL) + return NULL; + if (hash_table_lookup_bkey(fsg->trans[i].null_trans, (char const *) &j, + sizeof(j), &val) < 0) + return NULL; + return (fsg_link_t *) val; +} + +fsg_arciter_t * +fsg_model_arcs(fsg_model_t * fsg, int32 i) +{ + fsg_arciter_t *itor; + + if (fsg->trans[i].trans == NULL && fsg->trans[i].null_trans == NULL) + return NULL; + itor = ckd_calloc(1, sizeof(*itor)); + if (fsg->trans[i].null_trans) + itor->null_itor = hash_table_iter(fsg->trans[i].null_trans); + if (fsg->trans[i].trans) + itor->itor = hash_table_iter(fsg->trans[i].trans); + if (itor->itor != NULL) + itor->gn = hash_entry_val(itor->itor->ent); + return itor; +} + +fsg_link_t * +fsg_arciter_get(fsg_arciter_t * itor) +{ + /* Iterate over non-null arcs first. */ + if (itor->gn) + return (fsg_link_t *) gnode_ptr(itor->gn); + else if (itor->null_itor) + return (fsg_link_t *) hash_entry_val(itor->null_itor->ent); + else + return NULL; +} + +fsg_arciter_t * +fsg_arciter_next(fsg_arciter_t * itor) +{ + /* Iterate over non-null arcs first. */ + if (itor->gn) { + itor->gn = gnode_next(itor->gn); + /* Move to the next destination arc. */ + if (itor->gn == NULL) { + itor->itor = hash_table_iter_next(itor->itor); + if (itor->itor != NULL) + itor->gn = hash_entry_val(itor->itor->ent); + else if (itor->null_itor == NULL) + goto stop_iteration; + } + } + else { + if (itor->null_itor == NULL) + goto stop_iteration; + itor->null_itor = hash_table_iter_next(itor->null_itor); + if (itor->null_itor == NULL) + goto stop_iteration; + } + return itor; + stop_iteration: + fsg_arciter_free(itor); + return NULL; + +} + +void +fsg_arciter_free(fsg_arciter_t * itor) +{ + if (itor == NULL) + return; + hash_table_iter_free(itor->null_itor); + hash_table_iter_free(itor->itor); + ckd_free(itor); +} + +int +fsg_model_word_id(fsg_model_t * fsg, char const *word) +{ + int wid; + + /* Search for an existing word matching this. */ + for (wid = 0; wid < fsg->n_word; ++wid) { + if (0 == strcmp(fsg->vocab[wid], word)) + break; + } + /* If not found, add this to the vocab. */ + if (wid == fsg->n_word) + return -1; + return wid; +} + +int +fsg_model_word_add(fsg_model_t * fsg, char const *word) +{ + int wid, old_size; + + /* Search for an existing word matching this. */ + wid = fsg_model_word_id(fsg, word); + /* If not found, add this to the vocab. */ + if (wid == -1) { + wid = fsg->n_word; + if (fsg->n_word == fsg->n_word_alloc) { + old_size = fsg->n_word_alloc; + fsg->n_word_alloc += 10; + fsg->vocab = ckd_realloc(fsg->vocab, + fsg->n_word_alloc * + sizeof(*fsg->vocab)); + if (fsg->silwords) + fsg->silwords = + bitvec_realloc(fsg->silwords, old_size, + fsg->n_word_alloc); + if (fsg->altwords) + fsg->altwords = + bitvec_realloc(fsg->altwords, old_size, + fsg->n_word_alloc); + } + ++fsg->n_word; + fsg->vocab[wid] = ckd_salloc(word); + } + return wid; +} + +int +fsg_model_add_silence(fsg_model_t * fsg, char const *silword, + int state, float32 silprob) +{ + int32 logsilp; + int n_trans, silwid, src; + + E_INFO("Adding silence transitions for %s to FSG\n", silword); + + silwid = fsg_model_word_add(fsg, silword); + logsilp = (int32) (logmath_log(fsg->lmath, silprob) * fsg->lw); + if (fsg->silwords == NULL) + fsg->silwords = bitvec_alloc(fsg->n_word_alloc); + bitvec_set(fsg->silwords, silwid); + + n_trans = 0; + if (state == -1) { + for (src = 0; src < fsg->n_state; src++) { + fsg_model_trans_add(fsg, src, src, logsilp, silwid); + ++n_trans; + } + } + else { + fsg_model_trans_add(fsg, state, state, logsilp, silwid); + ++n_trans; + } + + E_INFO("Added %d silence word transitions\n", n_trans); + return n_trans; +} + +int +fsg_model_add_alt(fsg_model_t * fsg, char const *baseword, + char const *altword) +{ + int i, basewid, altwid; + int ntrans; + + /* FIXME: This will get slow, eventually... */ + for (basewid = 0; basewid < fsg->n_word; ++basewid) + if (0 == strcmp(fsg->vocab[basewid], baseword)) + break; + if (basewid == fsg->n_word) { + E_ERROR("Base word %s not present in FSG vocabulary!\n", baseword); + return -1; + } + altwid = fsg_model_word_add(fsg, altword); + if (fsg->altwords == NULL) + fsg->altwords = bitvec_alloc(fsg->n_word_alloc); + bitvec_set(fsg->altwords, altwid); + if (fsg_model_is_filler(fsg, basewid)) { + if (fsg->silwords == NULL) + fsg->silwords = bitvec_alloc(fsg->n_word_alloc); + bitvec_set(fsg->silwords, altwid); + } + + E_DEBUG("Adding alternate word transitions (%s,%s) to FSG\n", + baseword, altword); + + /* Look for all transitions involving baseword and duplicate them. */ + /* FIXME: This will also get slow, eventually... */ + ntrans = 0; + for (i = 0; i < fsg->n_state; ++i) { + hash_iter_t *itor; + if (fsg->trans[i].trans == NULL) + continue; + for (itor = hash_table_iter(fsg->trans[i].trans); itor; + itor = hash_table_iter_next(itor)) { + glist_t trans; + gnode_t *gn; + + trans = hash_entry_val(itor->ent); + for (gn = trans; gn; gn = gnode_next(gn)) { + fsg_link_t *fl = gnode_ptr(gn); + if (fl->wid == basewid) { + fsg_link_t *link; + + /* Create transition object */ + link = listelem_malloc(fsg->link_alloc); + link->from_state = fl->from_state; + link->to_state = fl->to_state; + link->logs2prob = fl->logs2prob; /* FIXME!!!??? */ + link->wid = altwid; + + trans = glist_add_ptr(trans, (void *) link); + ++ntrans; + } + } + hash_entry_val(itor->ent) = trans; + } + } + + E_DEBUG("Added %d alternate word transitions\n", ntrans); + return ntrans; +} + + +fsg_model_t * +fsg_model_init(char const *name, logmath_t * lmath, float32 lw, + int32 n_state) +{ + fsg_model_t *fsg; + + /* Allocate basic stuff. */ + fsg = ckd_calloc(1, sizeof(*fsg)); + fsg->refcount = 1; + fsg->link_alloc = listelem_alloc_init(sizeof(fsg_link_t)); + fsg->lmath = lmath; + fsg->name = name ? ckd_salloc(name) : NULL; + fsg->n_state = n_state; + fsg->lw = lw; + + fsg->trans = ckd_calloc(fsg->n_state, sizeof(*fsg->trans)); + + return fsg; +} + +fsg_model_t * +fsg_model_read(FILE * fp, logmath_t * lmath, float32 lw) +{ + fsg_model_t *fsg; + hash_table_t *vocab; + hash_iter_t *itor; + int32 lastwid; + char **wordptr; + char *lineptr; + char *fsgname; + int32 lineno; + int32 n, i, j; + int n_state, n_trans, n_null_trans; + glist_t nulls; + float32 p; + + lineno = 0; + vocab = hash_table_new(32, FALSE); + wordptr = NULL; + lineptr = NULL; + nulls = NULL; + fsgname = NULL; + fsg = NULL; + + /* Scan upto FSG_BEGIN header */ + for (;;) { + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if (n < 0) { + E_ERROR("%s declaration missing\n", FSG_MODEL_BEGIN_DECL); + goto parse_error; + } + + if ((strcmp(wordptr[0], FSG_MODEL_BEGIN_DECL) == 0)) { + if (n > 2) { + E_ERROR("Line[%d]: malformed FSG_BEGIN declaration\n", + lineno); + goto parse_error; + } + break; + } + } + /* Save FSG name, or it will get clobbered below :(. + * If name is missing, try the default. + */ + if (n == 2) { + fsgname = ckd_salloc(wordptr[1]); + } + else { + E_WARN("FSG name is missing\n"); + fsgname = ckd_salloc("unknown"); + } + + /* Read #states */ + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if ((n != 2) + || ((strcmp(wordptr[0], FSG_MODEL_N_DECL) != 0) + && (strcmp(wordptr[0], FSG_MODEL_NUM_STATES_DECL) != 0)) + || (sscanf(wordptr[1], "%d", &n_state) != 1) + || (n_state <= 0)) { + E_ERROR + ("Line[%d]: #states declaration line missing or malformed\n", + lineno); + goto parse_error; + } + + /* Now create the FSG. */ + fsg = fsg_model_init(fsgname, lmath, lw, n_state); + ckd_free(fsgname); + fsgname = NULL; + + /* Read start state */ + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if ((n != 2) + || ((strcmp(wordptr[0], FSG_MODEL_S_DECL) != 0) + && (strcmp(wordptr[0], FSG_MODEL_START_STATE_DECL) != 0)) + || (sscanf(wordptr[1], "%d", &(fsg->start_state)) != 1) + || (fsg->start_state < 0) + || (fsg->start_state >= fsg->n_state)) { + E_ERROR + ("Line[%d]: start state declaration line missing or malformed\n", + lineno); + goto parse_error; + } + + /* Read final state */ + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if ((n != 2) + || ((strcmp(wordptr[0], FSG_MODEL_F_DECL) != 0) + && (strcmp(wordptr[0], FSG_MODEL_FINAL_STATE_DECL) != 0)) + || (sscanf(wordptr[1], "%d", &(fsg->final_state)) != 1) + || (fsg->final_state < 0) + || (fsg->final_state >= fsg->n_state)) { + E_ERROR + ("Line[%d]: final state declaration line missing or malformed\n", + lineno); + goto parse_error; + } + + /* Read transitions */ + lastwid = 0; + n_trans = n_null_trans = 0; + for (;;) { + int32 wid, tprob; + + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if (n <= 0) { + E_ERROR("Line[%d]: transition or FSG_END statement expected\n", + lineno); + goto parse_error; + } + + if ((strcmp(wordptr[0], FSG_MODEL_END_DECL) == 0)) { + break; + } + + if ((strcmp(wordptr[0], FSG_MODEL_T_DECL) == 0) + || (strcmp(wordptr[0], FSG_MODEL_TRANSITION_DECL) == 0)) { + + + if (((n != 4) && (n != 5)) + || (sscanf(wordptr[1], "%d", &i) != 1) + || (sscanf(wordptr[2], "%d", &j) != 1) + || (i < 0) || (i >= fsg->n_state) + || (j < 0) || (j >= fsg->n_state)) { + E_ERROR + ("Line[%d]: transition spec malformed; Expecting: from-state to-state trans-prob [word]\n", + lineno); + goto parse_error; + } + + p = atof_c(wordptr[3]); + if ((p <= 0.0) || (p > 1.0)) { + E_ERROR + ("Line[%d]: transition spec malformed; Expecting float as transition probability\n", + lineno); + goto parse_error; + } + } + else { + E_ERROR("Line[%d]: transition or FSG_END statement expected\n", + lineno); + goto parse_error; + } + + tprob = (int32) (logmath_log(lmath, p) * fsg->lw); + /* Add word to "dictionary". */ + if (n > 4) { + if (hash_table_lookup_int32(vocab, wordptr[4], &wid) < 0) { + (void) hash_table_enter_int32(vocab, + ckd_salloc(wordptr[4]), + lastwid); + wid = lastwid; + ++lastwid; + } + fsg_model_trans_add(fsg, i, j, tprob, wid); + ++n_trans; + } + else { + if (fsg_model_null_trans_add(fsg, i, j, tprob) == 1) { + ++n_null_trans; + nulls = + glist_add_ptr(nulls, fsg_model_null_trans(fsg, i, j)); + } + } + } + + E_INFO("FSG: %d states, %d unique words, %d transitions (%d null)\n", + fsg->n_state, hash_table_inuse(vocab), n_trans, n_null_trans); + + + /* Now create a string table from the "dictionary" */ + fsg->n_word = hash_table_inuse(vocab); + fsg->n_word_alloc = fsg->n_word + 10; /* Pad it a bit. */ + fsg->vocab = ckd_calloc(fsg->n_word_alloc, sizeof(*fsg->vocab)); + for (itor = hash_table_iter(vocab); itor; + itor = hash_table_iter_next(itor)) { + char const *word = hash_entry_key(itor->ent); + int32 wid = (int32) (long) hash_entry_val(itor->ent); + fsg->vocab[wid] = (char *) word; + } + hash_table_free(vocab); + + /* Do transitive closure on null transitions */ + nulls = fsg_model_null_trans_closure(fsg, nulls); + glist_free(nulls); + + ckd_free(lineptr); + ckd_free(wordptr); + + return fsg; + + parse_error: + for (itor = hash_table_iter(vocab); itor; + itor = hash_table_iter_next(itor)) + ckd_free((char *) hash_entry_key(itor->ent)); + glist_free(nulls); + hash_table_free(vocab); + ckd_free(fsgname); + ckd_free(lineptr); + ckd_free(wordptr); + fsg_model_free(fsg); + return NULL; +} + + +fsg_model_t * +fsg_model_readfile(const char *file, logmath_t * lmath, float32 lw) +{ + FILE *fp; + fsg_model_t *fsg; + + if ((fp = fopen(file, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open FSG file '%s' for reading", file); + return NULL; + } + fsg = fsg_model_read(fp, lmath, lw); + fclose(fp); + return fsg; +} + +fsg_model_t * +fsg_model_retain(fsg_model_t * fsg) +{ + ++fsg->refcount; + return fsg; +} + +static void +trans_list_free(fsg_model_t * fsg, int32 i) +{ + hash_iter_t *itor; + + /* FIXME (maybe): FSG links will all get freed when we call + * listelem_alloc_free() so don't bother freeing them explicitly + * here. */ + if (fsg->trans[i].trans) { + for (itor = hash_table_iter(fsg->trans[i].trans); + itor; itor = hash_table_iter_next(itor)) { + glist_t gl = (glist_t) hash_entry_val(itor->ent); + glist_free(gl); + } + } + hash_table_free(fsg->trans[i].trans); + hash_table_free(fsg->trans[i].null_trans); +} + +int +fsg_model_free(fsg_model_t * fsg) +{ + int i; + + if (fsg == NULL) + return 0; + + if (--fsg->refcount > 0) + return fsg->refcount; + + for (i = 0; i < fsg->n_word; ++i) + ckd_free(fsg->vocab[i]); + for (i = 0; i < fsg->n_state; ++i) + trans_list_free(fsg, i); + ckd_free(fsg->trans); + ckd_free(fsg->vocab); + listelem_alloc_free(fsg->link_alloc); + bitvec_free(fsg->silwords); + bitvec_free(fsg->altwords); + ckd_free(fsg->name); + ckd_free(fsg); + return 0; +} + + +void +fsg_model_write(fsg_model_t * fsg, FILE * fp) +{ + int32 i; + + fprintf(fp, "%s %s\n", FSG_MODEL_BEGIN_DECL, + fsg->name ? fsg->name : ""); + fprintf(fp, "%s %d\n", FSG_MODEL_NUM_STATES_DECL, fsg->n_state); + fprintf(fp, "%s %d\n", FSG_MODEL_START_STATE_DECL, fsg->start_state); + fprintf(fp, "%s %d\n", FSG_MODEL_FINAL_STATE_DECL, fsg->final_state); + + for (i = 0; i < fsg->n_state; i++) { + fsg_arciter_t *itor; + + for (itor = fsg_model_arcs(fsg, i); itor; + itor = fsg_arciter_next(itor)) { + fsg_link_t *tl = fsg_arciter_get(itor); + + fprintf(fp, "%s %d %d %f %s\n", FSG_MODEL_TRANSITION_DECL, + tl->from_state, tl->to_state, + logmath_exp(fsg->lmath, + (int32) (tl->logs2prob / fsg->lw)), + (tl->wid < 0) ? "" : fsg_model_word_str(fsg, tl->wid)); + } + } + + fprintf(fp, "%s\n", FSG_MODEL_END_DECL); + + fflush(fp); +} + +void +fsg_model_writefile(fsg_model_t * fsg, char const *file) +{ + FILE *fp; + + assert(fsg); + + E_INFO("Writing FSG file '%s'\n", file); + + if ((fp = fopen(file, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open FSG file '%s' for reading", file); + return; + } + + fsg_model_write(fsg, fp); + + fclose(fp); +} + +static void +fsg_model_write_fsm_trans(fsg_model_t * fsg, int i, FILE * fp) +{ + fsg_arciter_t *itor; + + for (itor = fsg_model_arcs(fsg, i); itor; + itor = fsg_arciter_next(itor)) { + fsg_link_t *tl = fsg_arciter_get(itor); + fprintf(fp, "%d %d %s %f\n", + tl->from_state, tl->to_state, + (tl->wid < 0) ? "" : fsg_model_word_str(fsg, tl->wid), + -logmath_log_to_ln(fsg->lmath, tl->logs2prob / fsg->lw)); + } +} + +void +fsg_model_write_fsm(fsg_model_t * fsg, FILE * fp) +{ + int i; + + /* Write transitions from initial state first. */ + fsg_model_write_fsm_trans(fsg, fsg_model_start_state(fsg), fp); + + /* Other states. */ + for (i = 0; i < fsg->n_state; i++) { + if (i == fsg_model_start_state(fsg)) + continue; + fsg_model_write_fsm_trans(fsg, i, fp); + } + + /* Final state. */ + fprintf(fp, "%d 0\n", fsg_model_final_state(fsg)); + + fflush(fp); +} + +void +fsg_model_writefile_fsm(fsg_model_t * fsg, char const *file) +{ + FILE *fp; + + assert(fsg); + + E_INFO("Writing FSM file '%s'\n", file); + + if ((fp = fopen(file, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open fsm file '%s' for writing", file); + return; + } + + fsg_model_write_fsm(fsg, fp); + + fclose(fp); +} + +void +fsg_model_write_symtab(fsg_model_t * fsg, FILE * file) +{ + int i; + + fprintf(file, " 0\n"); + for (i = 0; i < fsg_model_n_word(fsg); ++i) { + fprintf(file, "%s %d\n", fsg_model_word_str(fsg, i), i + 1); + } + fflush(file); +} + +void +fsg_model_writefile_symtab(fsg_model_t * fsg, char const *file) +{ + FILE *fp; + + assert(fsg); + + E_INFO("Writing FSM symbol table '%s'\n", file); + + if ((fp = fopen(file, "w")) == NULL) { + E_ERROR("Failed to open symbol table '%s' for writing", file); + return; + } + + fsg_model_write_symtab(fsg, fp); + + fclose(fp); +} diff --git a/src/libsphinxbase/lm/jsgf.c b/src/libsphinxbase/lm/jsgf.c new file mode 100644 index 000000000..ab123734e --- /dev/null +++ b/src/libsphinxbase/lm/jsgf.c @@ -0,0 +1,966 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/hash_table.h" +#include "sphinxbase/filename.h" +#include "sphinxbase/err.h" +#include "sphinxbase/jsgf.h" + +#include "jsgf_internal.h" +#include "jsgf_parser.h" +#include "jsgf_scanner.h" + +extern int yyparse(void *scanner, jsgf_t * jsgf); + +/** + * \file jsgf.c + * + * This file implements the data structures for parsing JSGF grammars + * into Sphinx finite-state grammars. + **/ + +static int expand_rule(jsgf_t * grammar, jsgf_rule_t * rule, + int rule_entry, int rule_exit); + +jsgf_atom_t * +jsgf_atom_new(char *name, float weight) +{ + jsgf_atom_t *atom; + + atom = ckd_calloc(1, sizeof(*atom)); + atom->name = ckd_salloc(name); + atom->weight = weight; + return atom; +} + +int +jsgf_atom_free(jsgf_atom_t * atom) +{ + if (atom == NULL) + return 0; + ckd_free(atom->name); + ckd_free(atom); + return 0; +} + +jsgf_t * +jsgf_grammar_new(jsgf_t * parent) +{ + jsgf_t *grammar; + + grammar = ckd_calloc(1, sizeof(*grammar)); + /* If this is an imported/subgrammar, then we will share a global + * namespace with the parent grammar. */ + if (parent) { + grammar->rules = parent->rules; + grammar->imports = parent->imports; + grammar->searchpath = parent->searchpath; + grammar->parent = parent; + } + else { + grammar->rules = hash_table_new(64, 0); + grammar->imports = hash_table_new(16, 0); + } + + return grammar; +} + +void +jsgf_grammar_free(jsgf_t * jsgf) +{ + /* FIXME: Probably should just use refcounting instead. */ + if (jsgf->parent == NULL) { + hash_iter_t *itor; + gnode_t *gn; + + for (itor = hash_table_iter(jsgf->rules); itor; + itor = hash_table_iter_next(itor)) { + ckd_free((char *) itor->ent->key); + jsgf_rule_free((jsgf_rule_t *) itor->ent->val); + } + hash_table_free(jsgf->rules); + for (itor = hash_table_iter(jsgf->imports); itor; + itor = hash_table_iter_next(itor)) { + ckd_free((char *) itor->ent->key); + jsgf_grammar_free((jsgf_t *) itor->ent->val); + } + hash_table_free(jsgf->imports); + for (gn = jsgf->searchpath; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(jsgf->searchpath); + for (gn = jsgf->links; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(jsgf->links); + } + ckd_free(jsgf->name); + ckd_free(jsgf->version); + ckd_free(jsgf->charset); + ckd_free(jsgf->locale); + ckd_free(jsgf); +} + +static void +jsgf_rhs_free(jsgf_rhs_t * rhs) +{ + gnode_t *gn; + + if (rhs == NULL) + return; + + jsgf_rhs_free(rhs->alt); + for (gn = rhs->atoms; gn; gn = gnode_next(gn)) + jsgf_atom_free(gnode_ptr(gn)); + glist_free(rhs->atoms); + ckd_free(rhs); +} + +jsgf_atom_t * +jsgf_kleene_new(jsgf_t * jsgf, jsgf_atom_t * atom, int plus) +{ + jsgf_rule_t *rule; + jsgf_atom_t *rule_atom; + jsgf_rhs_t *rhs; + + /* Generate an "internal" rule of the form ( | ) */ + /* Or if plus is true, ( | ) */ + rhs = ckd_calloc(1, sizeof(*rhs)); + if (plus) + rhs->atoms = glist_add_ptr(NULL, jsgf_atom_new(atom->name, 1.0)); + else + rhs->atoms = glist_add_ptr(NULL, jsgf_atom_new("", 1.0)); + rule = jsgf_define_rule(jsgf, NULL, rhs, 0); + rule_atom = jsgf_atom_new(rule->name, 1.0); + rhs = ckd_calloc(1, sizeof(*rhs)); + rhs->atoms = glist_add_ptr(NULL, rule_atom); + rhs->atoms = glist_add_ptr(rhs->atoms, atom); + rule->rhs->alt = rhs; + + return jsgf_atom_new(rule->name, 1.0); +} + +jsgf_rule_t * +jsgf_optional_new(jsgf_t * jsgf, jsgf_rhs_t * exp) +{ + jsgf_rhs_t *rhs = ckd_calloc(1, sizeof(*rhs)); + jsgf_atom_t *atom = jsgf_atom_new("", 1.0); + rhs->alt = exp; + rhs->atoms = glist_add_ptr(NULL, atom); + return jsgf_define_rule(jsgf, NULL, rhs, 0); +} + +void +jsgf_add_link(jsgf_t * grammar, jsgf_atom_t * atom, int from, int to) +{ + jsgf_link_t *link; + + link = ckd_calloc(1, sizeof(*link)); + link->from = from; + link->to = to; + link->atom = atom; + grammar->links = glist_add_ptr(grammar->links, link); +} + +static char * +extract_grammar_name(char *rule_name) +{ + char *dot_pos; + char *grammar_name = ckd_salloc(rule_name + 1); + if ((dot_pos = strrchr(grammar_name + 1, '.')) == NULL) { + ckd_free(grammar_name); + return NULL; + } + *dot_pos = '\0'; + return grammar_name; +} + +char const * +jsgf_grammar_name(jsgf_t * jsgf) +{ + return jsgf->name; +} + +static char * +jsgf_fullname(jsgf_t * jsgf, const char *name) +{ + char *fullname; + + /* Check if it is already qualified */ + if (strchr(name + 1, '.')) + return ckd_salloc(name); + + /* Skip leading < in name */ + fullname = ckd_malloc(strlen(jsgf->name) + strlen(name) + 4); + sprintf(fullname, "<%s.%s", jsgf->name, name + 1); + return fullname; +} + +static char * +jsgf_fullname_from_rule(jsgf_rule_t * rule, const char *name) +{ + char *fullname, *grammar_name; + + /* Check if it is already qualified */ + if (strchr(name + 1, '.')) + return ckd_salloc(name); + + /* Skip leading < in name */ + if ((grammar_name = extract_grammar_name(rule->name)) == NULL) + return ckd_salloc(name); + fullname = ckd_malloc(strlen(grammar_name) + strlen(name) + 4); + sprintf(fullname, "<%s.%s", grammar_name, name + 1); + ckd_free(grammar_name); + + return fullname; +} + +/* Extract as rulename everything after the secondlast dot, if existent. + * Because everything before the secondlast dot is the path-specification. */ +static char * +importname2rulename(char *importname) +{ + char *rulename = ckd_salloc(importname); + char *last_dotpos; + char *secondlast_dotpos; + + if ((last_dotpos = strrchr(rulename + 1, '.')) != NULL) { + *last_dotpos = '\0'; + if ((secondlast_dotpos = strrchr(rulename + 1, '.')) != NULL) { + *last_dotpos = '.'; + *secondlast_dotpos = '<'; + secondlast_dotpos = ckd_salloc(secondlast_dotpos); + ckd_free(rulename); + return secondlast_dotpos; + } + else { + *last_dotpos = '.'; + return rulename; + } + } + else { + return rulename; + } +} + +#define NO_NODE -1 +#define RECURSIVE_NODE -2 + +/** + * + * Expand a right-hand-side of a rule (i.e. a single alternate). + * + * @returns the FSG state at the end of this rule, NO_NODE if there's an + * error, and RECURSIVE_NODE if the right-hand-side ended in right-recursion (i.e. + * a link to an earlier FSG state). + */ +static int +expand_rhs(jsgf_t * grammar, jsgf_rule_t * rule, jsgf_rhs_t * rhs, + int rule_entry, int rule_exit) +{ + gnode_t *gn; + int lastnode; + + /* Last node expanded in this sequence. */ + lastnode = rule_entry; + + /* Iterate over atoms in rhs and generate links/nodes */ + for (gn = rhs->atoms; gn; gn = gnode_next(gn)) { + jsgf_atom_t *atom = gnode_ptr(gn); + + if (jsgf_atom_is_rule(atom)) { + jsgf_rule_t *subrule; + char *fullname; + gnode_t *subnode; + jsgf_rule_stack_t *rule_stack_entry = NULL; + + /* Special case for and pseudo-rules + If this is the only atom in the rhs, and it's the + first rhs in the rule, then emit a null transition, + creating an exit state if needed. */ + if (0 == strcmp(atom->name, "")) { + if (gn == rhs->atoms && gnode_next(gn) == NULL) { + if (rule_exit == NO_NODE) { + jsgf_add_link(grammar, atom, + lastnode, grammar->nstate); + rule_exit = lastnode = grammar->nstate; + ++grammar->nstate; + } + else { + jsgf_add_link(grammar, atom, lastnode, rule_exit); + } + } + continue; + } + else if (0 == strcmp(atom->name, "")) { + /* Make this entire RHS unspeakable */ + return NO_NODE; + } + + fullname = jsgf_fullname_from_rule(rule, atom->name); + if (hash_table_lookup + (grammar->rules, fullname, (void **) &subrule) == -1) { + E_ERROR("Undefined rule in RHS: %s\n", fullname); + ckd_free(fullname); + return NO_NODE; + } + ckd_free(fullname); + + /* Look for this subrule in the stack of expanded rules */ + for (subnode = grammar->rulestack; subnode; + subnode = gnode_next(subnode)) { + rule_stack_entry = + (jsgf_rule_stack_t *) gnode_ptr(subnode); + if (rule_stack_entry->rule == subrule) + break; + } + + if (subnode != NULL) { + /* Allow right-recursion only. */ + if (gnode_next(gn) != NULL) { + E_ERROR + ("Only right-recursion is permitted (in %s.%s)\n", + grammar->name, rule->name); + return NO_NODE; + } + /* Add a link back to the beginning of this rule instance */ + E_INFO("Right recursion %s %d => %d\n", atom->name, + lastnode, rule_stack_entry->entry); + jsgf_add_link(grammar, atom, lastnode, + rule_stack_entry->entry); + + /* Let our caller know that this rhs didn't reach an + end state. */ + lastnode = RECURSIVE_NODE; + } + else { + /* If this is the last atom in this rhs, link its + expansion to the parent rule's exit state. + Otherwise, create a new exit state for it. */ + int subruleexit = NO_NODE; + if (gnode_next(gn) == NULL && rule_exit >= 0) + subruleexit = rule_exit; + + /* Expand the subrule */ + lastnode = + expand_rule(grammar, subrule, lastnode, subruleexit); + + if (lastnode == NO_NODE) + return NO_NODE; + } + } + else { + /* An exit-state is created if this isn't the last atom + in the rhs, or if the containing rule doesn't have an + exit state yet. + Otherwise, the rhs's exit state becomes the containing + rule's exit state. */ + int exitstate; + if (gnode_next(gn) == NULL && rule_exit >= 0) { + exitstate = rule_exit; + } + else { + exitstate = grammar->nstate; + ++grammar->nstate; + } + + /* Add a link for this token */ + jsgf_add_link(grammar, atom, lastnode, exitstate); + lastnode = exitstate; + } + } + + return lastnode; +} + +static int +expand_rule(jsgf_t * grammar, jsgf_rule_t * rule, int rule_entry, + int rule_exit) +{ + jsgf_rule_stack_t *rule_stack_entry; + jsgf_rhs_t *rhs; + + /* Push this rule onto the stack */ + rule_stack_entry = + (jsgf_rule_stack_t *) ckd_calloc(1, sizeof(jsgf_rule_stack_t)); + rule_stack_entry->rule = rule; + rule_stack_entry->entry = rule_entry; + grammar->rulestack = glist_add_ptr(grammar->rulestack, + rule_stack_entry); + + for (rhs = rule->rhs; rhs; rhs = rhs->alt) { + int lastnode; + + lastnode = expand_rhs(grammar, rule, rhs, rule_entry, rule_exit); + + if (lastnode == NO_NODE) { + return NO_NODE; + } + else if (lastnode == RECURSIVE_NODE) { + /* The rhs ended with right-recursion, i.e. a transition to + an earlier state. Nothing needs to happen at this level. */ + ; + } + else if (rule_exit == NO_NODE) { + /* If this rule doesn't have an exit state yet, use the exit + state of its first right-hand-side. + All other right-hand-sides will use this exit state. */ + assert(lastnode >= 0); + rule_exit = lastnode; + } + } + + /* If no exit-state was created, use the entry-state. */ + if (rule_exit == NO_NODE) { + rule_exit = rule_entry; + } + + /* Pop this rule from the rule stack */ + ckd_free(gnode_ptr(grammar->rulestack)); + grammar->rulestack = gnode_free(grammar->rulestack, NULL); + + return rule_exit; +} + +jsgf_rule_iter_t * +jsgf_rule_iter(jsgf_t * grammar) +{ + return hash_table_iter(grammar->rules); +} + +jsgf_rule_t * +jsgf_get_rule(jsgf_t * grammar, char const *name) +{ + void *val; + char *fullname; + + fullname = string_join("<", name, ">", NULL); + if (hash_table_lookup(grammar->rules, fullname, &val) < 0) { + ckd_free(fullname); + return NULL; + } + ckd_free(fullname); + return (jsgf_rule_t *) val; +} + +jsgf_rule_t * +jsgf_get_public_rule(jsgf_t * grammar) +{ + jsgf_rule_iter_t *itor; + jsgf_rule_t *public_rule = NULL; + + for (itor = jsgf_rule_iter(grammar); itor; + itor = jsgf_rule_iter_next(itor)) { + jsgf_rule_t *rule = jsgf_rule_iter_rule(itor); + if (jsgf_rule_public(rule)) { + const char *rule_name = jsgf_rule_name(rule); + char *dot_pos; + if ((dot_pos = strrchr(rule_name + 1, '.')) == NULL) { + public_rule = rule; + jsgf_rule_iter_free(itor); + break; + } + if (0 == + strncmp(rule_name + 1, jsgf_grammar_name(grammar), + dot_pos - rule_name - 1)) { + public_rule = rule; + jsgf_rule_iter_free(itor); + break; + } + } + } + return public_rule; +} + +char const * +jsgf_rule_name(jsgf_rule_t * rule) +{ + return rule->name; +} + +int +jsgf_rule_public(jsgf_rule_t * rule) +{ + return rule->is_public; +} + +static fsg_model_t * +jsgf_build_fsg_internal(jsgf_t * grammar, jsgf_rule_t * rule, + logmath_t * lmath, float32 lw, int do_closure) +{ + fsg_model_t *fsg; + glist_t nulls; + gnode_t *gn; + int rule_entry, rule_exit; + + if (grammar == NULL || rule == NULL) + return NULL; + + /* Clear previous links */ + for (gn = grammar->links; gn; gn = gnode_next(gn)) { + ckd_free(gnode_ptr(gn)); + } + glist_free(grammar->links); + grammar->links = NULL; + grammar->nstate = 0; + + /* Create the top-level entry state, and expand the + top-level rule. */ + rule_entry = grammar->nstate++; + rule_exit = expand_rule(grammar, rule, rule_entry, NO_NODE); + + /* If no exit-state was created, create one. */ + if (rule_exit == NO_NODE) { + rule_exit = grammar->nstate++; + jsgf_add_link(grammar, NULL, rule_entry, rule_exit); + } + + fsg = fsg_model_init(rule->name, lmath, lw, grammar->nstate); + fsg->start_state = rule_entry; + fsg->final_state = rule_exit; + grammar->links = glist_reverse(grammar->links); + for (gn = grammar->links; gn; gn = gnode_next(gn)) { + jsgf_link_t *link = gnode_ptr(gn); + + if (link->atom) { + if (jsgf_atom_is_rule(link->atom)) { + fsg_model_null_trans_add(fsg, link->from, link->to, + logmath_log(lmath, + link->atom->weight)); + } + else { + int wid = fsg_model_word_add(fsg, link->atom->name); + fsg_model_trans_add(fsg, link->from, link->to, + logmath_log(lmath, link->atom->weight), + wid); + } + } + else { + fsg_model_null_trans_add(fsg, link->from, link->to, 0); + } + } + if (do_closure) { + nulls = fsg_model_null_trans_closure(fsg, NULL); + glist_free(nulls); + } + + return fsg; +} + +fsg_model_t * +jsgf_build_fsg(jsgf_t * grammar, jsgf_rule_t * rule, + logmath_t * lmath, float32 lw) +{ + return jsgf_build_fsg_internal(grammar, rule, lmath, lw, TRUE); +} + +fsg_model_t * +jsgf_build_fsg_raw(jsgf_t * grammar, jsgf_rule_t * rule, + logmath_t * lmath, float32 lw) +{ + return jsgf_build_fsg_internal(grammar, rule, lmath, lw, FALSE); +} + +fsg_model_t * +jsgf_read_file(const char *file, logmath_t * lmath, float32 lw) +{ + fsg_model_t *fsg; + jsgf_rule_t *rule; + jsgf_t *jsgf; + jsgf_rule_iter_t *itor; + + if ((jsgf = jsgf_parse_file(file, NULL)) == NULL) { + E_ERROR("Error parsing file: %s\n", file); + return NULL; + } + + rule = NULL; + for (itor = jsgf_rule_iter(jsgf); itor; + itor = jsgf_rule_iter_next(itor)) { + rule = jsgf_rule_iter_rule(itor); + if (jsgf_rule_public(rule)) { + jsgf_rule_iter_free(itor); + break; + } + } + if (rule == NULL) { + E_ERROR("No public rules found in %s\n", file); + return NULL; + } + fsg = jsgf_build_fsg(jsgf, rule, lmath, lw); + jsgf_grammar_free(jsgf); + return fsg; +} + +fsg_model_t * +jsgf_read_string(const char *string, logmath_t * lmath, float32 lw) +{ + fsg_model_t *fsg; + jsgf_rule_t *rule; + jsgf_t *jsgf; + jsgf_rule_iter_t *itor; + + if ((jsgf = jsgf_parse_string(string, NULL)) == NULL) { + E_ERROR("Error parsing input string\n"); + return NULL; + } + + rule = NULL; + for (itor = jsgf_rule_iter(jsgf); itor; + itor = jsgf_rule_iter_next(itor)) { + rule = jsgf_rule_iter_rule(itor); + if (jsgf_rule_public(rule)) { + jsgf_rule_iter_free(itor); + break; + } + } + if (rule == NULL) { + jsgf_grammar_free(jsgf); + E_ERROR("No public rules found in input string\n"); + return NULL; + } + fsg = jsgf_build_fsg(jsgf, rule, lmath, lw); + jsgf_grammar_free(jsgf); + return fsg; +} + + +int +jsgf_write_fsg(jsgf_t * grammar, jsgf_rule_t * rule, FILE * outfh) +{ + fsg_model_t *fsg; + logmath_t *lmath = logmath_init(1.0001, 0, 0); + + if ((fsg = jsgf_build_fsg_raw(grammar, rule, lmath, 1.0)) == NULL) + goto error_out; + + fsg_model_write(fsg, outfh); + logmath_free(lmath); + return 0; + + error_out: + logmath_free(lmath); + return -1; +} + +jsgf_rule_t * +jsgf_define_rule(jsgf_t * jsgf, char *name, jsgf_rhs_t * rhs, + int is_public) +{ + jsgf_rule_t *rule; + void *val; + + if (name == NULL) { + name = ckd_malloc(strlen(jsgf->name) + 16); + sprintf(name, "<%s.g%05d>", jsgf->name, + hash_table_inuse(jsgf->rules)); + } + else { + char *newname; + + newname = jsgf_fullname(jsgf, name); + name = newname; + } + + rule = ckd_calloc(1, sizeof(*rule)); + rule->refcnt = 1; + rule->name = ckd_salloc(name); + rule->rhs = rhs; + rule->is_public = is_public; + + E_INFO("Defined rule: %s%s\n", + rule->is_public ? "PUBLIC " : "", rule->name); + val = hash_table_enter(jsgf->rules, name, rule); + if (val != (void *) rule) { + E_WARN("Multiply defined symbol: %s\n", name); + } + return rule; +} + +jsgf_rule_t * +jsgf_rule_retain(jsgf_rule_t * rule) +{ + ++rule->refcnt; + return rule; +} + +int +jsgf_rule_free(jsgf_rule_t * rule) +{ + if (rule == NULL) + return 0; + if (--rule->refcnt > 0) + return rule->refcnt; + jsgf_rhs_free(rule->rhs); + ckd_free(rule->name); + ckd_free(rule); + return 0; +} + + +/* FIXME: This should go in libsphinxutil */ +static char * +path_list_search(glist_t paths, char *path) +{ + gnode_t *gn; + + for (gn = paths; gn; gn = gnode_next(gn)) { + char *fullpath; + FILE *tmp; + + fullpath = string_join(gnode_ptr(gn), "/", path, NULL); + tmp = fopen(fullpath, "r"); + if (tmp != NULL) { + fclose(tmp); + return fullpath; + } + else { + ckd_free(fullpath); + } + } + return NULL; +} + +jsgf_rule_t * +jsgf_import_rule(jsgf_t * jsgf, char *name) +{ + char *c, *path, *newpath; + size_t namelen, packlen; + void *val; + jsgf_t *imp; + int import_all; + + /* Trim the leading and trailing <> */ + namelen = strlen(name); + path = ckd_malloc(namelen - 2 + 6); /* room for a trailing .gram */ + strcpy(path, name + 1); + /* Split off the first part of the name */ + c = strrchr(path, '.'); + if (c == NULL) { + E_ERROR("Imported rule is not qualified: %s\n", name); + ckd_free(path); + return NULL; + } + packlen = c - path; + *c = '\0'; + + /* Look for import foo.* */ + import_all = (strlen(name) > 2 + && 0 == strcmp(name + namelen - 3, ".*>")); + + /* Construct a filename. */ + for (c = path; *c; ++c) + if (*c == '.') + *c = '/'; + strcat(path, ".gram"); + newpath = path_list_search(jsgf->searchpath, path); + if (newpath == NULL) { + E_ERROR("Failed to find grammar %s\n", path); + ckd_free(path); + return NULL; + } + ckd_free(path); + + path = newpath; + E_INFO("Importing %s from %s to %s\n", name, path, jsgf->name); + + /* FIXME: Also, we need to make sure that path is fully qualified + * here, by adding any prefixes from jsgf->name to it. */ + /* See if we have parsed it already */ + if (hash_table_lookup(jsgf->imports, path, &val) == 0) { + E_INFO("Already imported %s\n", path); + imp = val; + ckd_free(path); + } + else { + /* If not, parse it. */ + imp = jsgf_parse_file(path, jsgf); + val = hash_table_enter(jsgf->imports, path, imp); + if (val != (void *) imp) { + E_WARN("Multiply imported file: %s\n", path); + } + } + if (imp != NULL) { + hash_iter_t *itor; + /* Look for public rules matching rulename. */ + for (itor = hash_table_iter(imp->rules); itor; + itor = hash_table_iter_next(itor)) { + hash_entry_t *he = itor->ent; + jsgf_rule_t *rule = hash_entry_val(he); + int rule_matches; + char *rule_name = importname2rulename(name); + + if (import_all) { + /* Match package name (symbol table is shared) */ + rule_matches = + !strncmp(rule_name, rule->name, packlen + 1); + } + else { + /* Exact match */ + rule_matches = !strcmp(rule_name, rule->name); + } + ckd_free(rule_name); + if (rule->is_public && rule_matches) { + void *val; + char *newname; + + /* Link this rule into the current namespace. */ + c = strrchr(rule->name, '.'); + assert(c != NULL); + newname = jsgf_fullname(jsgf, c); + + E_INFO("Imported %s\n", newname); + val = hash_table_enter(jsgf->rules, newname, + jsgf_rule_retain(rule)); + if (val != (void *) rule) { + E_WARN("Multiply defined symbol: %s\n", newname); + } + if (!import_all) { + hash_table_iter_free(itor); + return rule; + } + } + } + } + + return NULL; +} + +static void +jsgf_set_search_path(jsgf_t * jsgf, const char *filename) +{ + char *jsgf_path; + +#if !defined(_WIN32_WCE) + if ((jsgf_path = getenv("JSGF_PATH")) != NULL) { + char *word, *c; + /* FIXME: This should be a function in libsphinxbase. */ + word = jsgf_path = ckd_salloc(jsgf_path); + while ((c = strchr(word, ':'))) { + *c = '\0'; + jsgf->searchpath = glist_add_ptr(jsgf->searchpath, word); + word = c + 1; + } + jsgf->searchpath = glist_add_ptr(jsgf->searchpath, word); + jsgf->searchpath = glist_reverse(jsgf->searchpath); + return; + } +#endif + + if (!filename) { + jsgf->searchpath = + glist_add_ptr(jsgf->searchpath, ckd_salloc(".")); + return; + } + + jsgf_path = ckd_salloc(filename); + path2dirname(filename, jsgf_path); + jsgf->searchpath = glist_add_ptr(jsgf->searchpath, jsgf_path); +} + +jsgf_t * +jsgf_parse_file(const char *filename, jsgf_t * parent) +{ + yyscan_t yyscanner; + jsgf_t *jsgf; + int yyrv; + FILE *in = NULL; + + yylex_init(&yyscanner); + if (filename == NULL) { + yyset_in(stdin, yyscanner); + } + else { + in = fopen(filename, "r"); + if (in == NULL) { + E_ERROR_SYSTEM("Failed to open %s for parsing", filename); + return NULL; + } + yyset_in(in, yyscanner); + } + + jsgf = jsgf_grammar_new(parent); + + if (!parent) + jsgf_set_search_path(jsgf, filename); + + yyrv = yyparse(yyscanner, jsgf); + if (yyrv != 0) { + E_ERROR("Failed to parse JSGF grammar from '%s'\n", + filename ? filename : "(stdin)"); + jsgf_grammar_free(jsgf); + yylex_destroy(yyscanner); + return NULL; + } + if (in) + fclose(in); + yylex_destroy(yyscanner); + + return jsgf; +} + +jsgf_t * +jsgf_parse_string(const char *string, jsgf_t * parent) +{ + yyscan_t yyscanner; + jsgf_t *jsgf; + int yyrv; + YY_BUFFER_STATE buf; + + yylex_init(&yyscanner); + buf = yy_scan_string(string, yyscanner); + + jsgf = jsgf_grammar_new(parent); + if (!parent) + jsgf_set_search_path(jsgf, NULL); + + yyrv = yyparse(yyscanner, jsgf); + if (yyrv != 0) { + E_ERROR("Failed to parse JSGF grammar from input string\n"); + jsgf_grammar_free(jsgf); + yy_delete_buffer(buf, yyscanner); + yylex_destroy(yyscanner); + return NULL; + } + yy_delete_buffer(buf, yyscanner); + yylex_destroy(yyscanner); + + return jsgf; +} diff --git a/src/libsphinxbase/lm/jsgf_internal.h b/src/libsphinxbase/lm/jsgf_internal.h new file mode 100644 index 000000000..a5cbc9833 --- /dev/null +++ b/src/libsphinxbase/lm/jsgf_internal.h @@ -0,0 +1,140 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __JSGF_INTERNAL_H__ +#define __JSGF_INTERNAL_H__ + +/** + * @file jsgf_internal.h Internal definitions for JSGF grammar compiler + */ + +#include + +#include +#include +#include +#include +#include +#include + + +/* Flex uses strdup which is missing on WinCE */ +#if defined(_WIN32) || defined(_WIN32_WCE) +#define strdup _strdup +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define YY_NO_INPUT /* Silence a compiler warning. */ + +typedef struct jsgf_rhs_s jsgf_rhs_t; +typedef struct jsgf_atom_s jsgf_atom_t; +typedef struct jsgf_link_s jsgf_link_t; +typedef struct jsgf_rule_stack_s jsgf_rule_stack_t; + +struct jsgf_s { + char *version; /**< JSGF version (from header) */ + char *charset; /**< JSGF charset (default UTF-8) */ + char *locale; /**< JSGF locale (default C) */ + char *name; /**< Grammar name */ + + hash_table_t *rules; /**< Defined or imported rules in this grammar. */ + hash_table_t *imports; /**< Pointers to imported grammars. */ + jsgf_t *parent; /**< Parent grammar (if this is an imported one) */ + glist_t searchpath; /**< List of directories to search for grammars. */ + + /* Scratch variables for FSG conversion. */ + int nstate; /**< Number of generated states. */ + glist_t links; /**< Generated FSG links. */ + glist_t rulestack; /**< Stack of currently expanded rules. */ +}; + +/* A type to keep track of the stack of rules currently being expanded. */ +struct jsgf_rule_stack_s { + jsgf_rule_t *rule; /**< The rule being expanded */ + int entry; /**< The entry-state for this expansion */ +}; + +struct jsgf_rule_s { + int refcnt; /**< Reference count. */ + char *name; /**< Rule name (NULL for an alternation/grouping) */ + int is_public; /**< Is this rule marked 'public'? */ + jsgf_rhs_t *rhs; /**< Expansion */ +}; + +struct jsgf_rhs_s { + glist_t atoms; /**< Sequence of items */ + jsgf_rhs_t *alt; /**< Linked list of alternates */ +}; + +struct jsgf_atom_s { + char *name; /**< Rule or token name */ + glist_t tags; /**< Tags, if any (glist_t of char *) */ + float weight; /**< Weight (default 1) */ +}; + +struct jsgf_link_s { + jsgf_atom_t *atom; /**< Name, tags, weight */ + int from; /**< From state */ + int to; /**< To state */ +}; + +#define jsgf_atom_is_rule(atom) ((atom)->name[0] == '<') + +void jsgf_add_link(jsgf_t *grammar, jsgf_atom_t *atom, int from, int to); +jsgf_atom_t *jsgf_atom_new(char *name, float weight); +jsgf_atom_t *jsgf_kleene_new(jsgf_t *jsgf, jsgf_atom_t *atom, int plus); +jsgf_rule_t *jsgf_optional_new(jsgf_t *jsgf, jsgf_rhs_t *exp); +jsgf_rule_t *jsgf_define_rule(jsgf_t *jsgf, char *name, jsgf_rhs_t *rhs, int is_public); +jsgf_rule_t *jsgf_import_rule(jsgf_t *jsgf, char *name); + +int jsgf_atom_free(jsgf_atom_t *atom); +int jsgf_rule_free(jsgf_rule_t *rule); +jsgf_rule_t *jsgf_rule_retain(jsgf_rule_t *rule); + +#ifdef __cplusplus +} +#endif + + +#endif /* __JSGF_H__ */ diff --git a/src/libsphinxbase/lm/jsgf_parser.c b/src/libsphinxbase/lm/jsgf_parser.c new file mode 100644 index 000000000..20acbb9d9 --- /dev/null +++ b/src/libsphinxbase/lm/jsgf_parser.c @@ -0,0 +1,1799 @@ + +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.4.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Copy the first part of user declarations. */ + +/* Line 189 of yacc.c */ +#line 37 "jsgf_parser.y" + +#define YYERROR_VERBOSE + +#include +#include + +#include +#include +#include + +#include "jsgf_internal.h" +#include "jsgf_parser.h" +#include "jsgf_scanner.h" + +/* Suppress warnings from generated code */ +#if defined _MSC_VER +#pragma warning(disable: 4273) +#endif + +void yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s); + + + +/* Line 189 of yacc.c */ +#line 97 "jsgf_parser.c" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + HEADER = 258, + GRAMMAR = 259, + IMPORT = 260, + PUBLIC = 261, + TOKEN = 262, + RULENAME = 263, + TAG = 264, + WEIGHT = 265 + }; +#endif +/* Tokens. */ +#define HEADER 258 +#define GRAMMAR 259 +#define IMPORT 260 +#define PUBLIC 261 +#define TOKEN 262 +#define RULENAME 263 +#define TAG 264 +#define WEIGHT 265 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 214 of yacc.c */ +#line 65 "jsgf_parser.y" + + char *name; + float weight; + jsgf_rule_t *rule; + jsgf_rhs_t *rhs; + jsgf_atom_t *atom; + + + +/* Line 214 of yacc.c */ +#line 163 "jsgf_parser.c" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 264 of yacc.c */ +#line 175 "jsgf_parser.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 7 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 54 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 20 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 16 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 33 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 58 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 265 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 14, 15, 18, 19, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, + 2, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 16, 2, 17, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 13, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint8 yyprhs[] = +{ + 0, 0, 3, 5, 8, 12, 15, 18, 22, 27, + 33, 37, 39, 42, 46, 48, 51, 56, 62, 64, + 68, 70, 73, 75, 78, 80, 83, 87, 91, 93, + 95, 97, 99, 102 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 21, 0, -1, 22, -1, 22, 27, -1, 22, 25, + 27, -1, 23, 24, -1, 3, 11, -1, 3, 7, + 11, -1, 3, 7, 7, 11, -1, 3, 7, 7, + 7, 11, -1, 4, 7, 11, -1, 26, -1, 25, + 26, -1, 5, 8, 11, -1, 28, -1, 27, 28, + -1, 8, 12, 29, 11, -1, 6, 8, 12, 29, + 11, -1, 30, -1, 29, 13, 30, -1, 31, -1, + 30, 31, -1, 32, -1, 31, 9, -1, 35, -1, + 10, 35, -1, 14, 29, 15, -1, 16, 29, 17, + -1, 7, -1, 8, -1, 33, -1, 34, -1, 35, + 18, -1, 35, 19, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint8 yyrline[] = +{ + 0, 82, 82, 83, 84, 87, 90, 91, 92, 93, + 97, 100, 101, 104, 107, 108, 111, 112, 115, 116, + 121, 123, 127, 128, 132, 133, 136, 139, 142, 143, + 144, 145, 146, 147 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "HEADER", "GRAMMAR", "IMPORT", "PUBLIC", + "TOKEN", "RULENAME", "TAG", "WEIGHT", "';'", "'='", "'|'", "'('", "')'", + "'['", "']'", "'*'", "'+'", "$accept", "grammar", "header", + "jsgf_header", "grammar_header", "import_header", "import_statement", + "rule_list", "rule", "alternate_list", "rule_expansion", + "tagged_rule_item", "rule_item", "rule_group", "rule_optional", + "rule_atom", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 59, 61, 124, 40, 41, 91, 93, 42, 43 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 20, 21, 21, 21, 22, 23, 23, 23, 23, + 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, + 30, 30, 31, 31, 32, 32, 33, 34, 35, 35, + 35, 35, 35, 35 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 2, 3, 2, 2, 3, 4, 5, + 3, 1, 2, 3, 1, 2, 4, 5, 1, 3, + 1, 2, 1, 2, 1, 2, 3, 3, 1, 1, + 1, 1, 2, 2 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 0, 0, 0, 2, 0, 0, 6, 1, 0, 0, + 0, 0, 11, 3, 14, 0, 5, 0, 7, 0, + 0, 0, 12, 4, 15, 0, 0, 8, 13, 0, + 28, 29, 0, 0, 0, 0, 18, 20, 22, 30, + 31, 24, 10, 9, 0, 25, 0, 0, 16, 0, + 21, 23, 32, 33, 17, 26, 27, 19 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 2, 3, 4, 16, 11, 12, 13, 14, 35, + 36, 37, 38, 39, 40, 41 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -37 +static const yytype_int8 yypact[] = +{ + -1, -2, 36, 22, 35, 8, -37, -37, 32, 33, + 30, 22, -37, 17, -37, 37, -37, 13, -37, 34, + 31, -4, -37, 17, -37, 38, 39, -37, -37, -4, + -37, -37, 0, -4, -4, 18, -4, 42, -37, -37, + -37, 19, -37, -37, 21, 19, 20, 9, -37, -4, + 42, -37, -37, -37, -37, -37, -37, -4 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -37, -37, -37, -37, -37, -37, 41, 43, -12, -16, + -3, -36, -37, -37, -37, 15 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const yytype_uint8 yytable[] = +{ + 50, 24, 1, 30, 31, 5, 32, 30, 31, 6, + 33, 24, 34, 44, 33, 17, 34, 46, 47, 18, + 26, 50, 49, 9, 27, 10, 56, 8, 9, 48, + 10, 49, 54, 49, 49, 55, 7, 52, 53, 15, + 19, 20, 21, 29, 25, 28, 57, 45, 0, 42, + 43, 51, 22, 0, 23 +}; + +static const yytype_int8 yycheck[] = +{ + 36, 13, 3, 7, 8, 7, 10, 7, 8, 11, + 14, 23, 16, 29, 14, 7, 16, 33, 34, 11, + 7, 57, 13, 6, 11, 8, 17, 5, 6, 11, + 8, 13, 11, 13, 13, 15, 0, 18, 19, 4, + 8, 8, 12, 12, 7, 11, 49, 32, -1, 11, + 11, 9, 11, -1, 11 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 3, 21, 22, 23, 7, 11, 0, 5, 6, + 8, 25, 26, 27, 28, 4, 24, 7, 11, 8, + 8, 12, 26, 27, 28, 7, 7, 11, 11, 12, + 7, 8, 10, 14, 16, 29, 30, 31, 32, 33, + 34, 35, 11, 11, 29, 35, 29, 29, 11, 13, + 31, 9, 18, 19, 11, 15, 17, 30 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (yyscanner, jsgf, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, yyscanner) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, yyscanner, jsgf); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void* yyscanner, jsgf_t *jsgf) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep, yyscanner, jsgf) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + if (!yyvaluep) + return; + YYUSE (yyscanner); + YYUSE (jsgf); +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void* yyscanner, jsgf_t *jsgf) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep, yyscanner, jsgf) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep, yyscanner, jsgf); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule, void* yyscanner, jsgf_t *jsgf) +#else +static void +yy_reduce_print (yyvsp, yyrule, yyscanner, jsgf) + YYSTYPE *yyvsp; + int yyrule; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , yyscanner, jsgf); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule, yyscanner, jsgf); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, void* yyscanner, jsgf_t *jsgf) +#else +static void +yydestruct (yymsg, yytype, yyvaluep, yyscanner, jsgf) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + YYUSE (yyvaluep); + YYUSE (yyscanner); + YYUSE (jsgf); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + +/* Prevent warnings from -Wmissing-prototypes. */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void* yyscanner, jsgf_t *jsgf); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + +/*-------------------------. +| yyparse or yypush_parse. | +`-------------------------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void* yyscanner, jsgf_t *jsgf) +#else +int +yyparse (yyscanner, jsgf) + void* yyscanner; + jsgf_t *jsgf; +#endif +#endif +{ +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + + /* Number of syntax errors so far. */ + int yynerrs; + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 5: + +/* Line 1455 of yacc.c */ +#line 87 "jsgf_parser.y" + { jsgf->name = (yyvsp[(2) - (2)].name); } + break; + + case 7: + +/* Line 1455 of yacc.c */ +#line 91 "jsgf_parser.y" + { jsgf->version = (yyvsp[(2) - (3)].name); } + break; + + case 8: + +/* Line 1455 of yacc.c */ +#line 92 "jsgf_parser.y" + { jsgf->version = (yyvsp[(2) - (4)].name); jsgf->charset = (yyvsp[(3) - (4)].name); } + break; + + case 9: + +/* Line 1455 of yacc.c */ +#line 93 "jsgf_parser.y" + { jsgf->version = (yyvsp[(2) - (5)].name); jsgf->charset = (yyvsp[(3) - (5)].name); + jsgf->locale = (yyvsp[(4) - (5)].name); } + break; + + case 10: + +/* Line 1455 of yacc.c */ +#line 97 "jsgf_parser.y" + { (yyval.name) = (yyvsp[(2) - (3)].name); } + break; + + case 13: + +/* Line 1455 of yacc.c */ +#line 104 "jsgf_parser.y" + { jsgf_import_rule(jsgf, (yyvsp[(2) - (3)].name)); ckd_free((yyvsp[(2) - (3)].name)); } + break; + + case 16: + +/* Line 1455 of yacc.c */ +#line 111 "jsgf_parser.y" + { jsgf_define_rule(jsgf, (yyvsp[(1) - (4)].name), (yyvsp[(3) - (4)].rhs), 0); ckd_free((yyvsp[(1) - (4)].name)); } + break; + + case 17: + +/* Line 1455 of yacc.c */ +#line 112 "jsgf_parser.y" + { jsgf_define_rule(jsgf, (yyvsp[(2) - (5)].name), (yyvsp[(4) - (5)].rhs), 1); ckd_free((yyvsp[(2) - (5)].name)); } + break; + + case 18: + +/* Line 1455 of yacc.c */ +#line 115 "jsgf_parser.y" + { (yyval.rhs) = (yyvsp[(1) - (1)].rhs); (yyval.rhs)->atoms = glist_reverse((yyval.rhs)->atoms); } + break; + + case 19: + +/* Line 1455 of yacc.c */ +#line 116 "jsgf_parser.y" + { (yyval.rhs) = (yyvsp[(3) - (3)].rhs); + (yyval.rhs)->atoms = glist_reverse((yyval.rhs)->atoms); + (yyval.rhs)->alt = (yyvsp[(1) - (3)].rhs); } + break; + + case 20: + +/* Line 1455 of yacc.c */ +#line 121 "jsgf_parser.y" + { (yyval.rhs) = ckd_calloc(1, sizeof(*(yyval.rhs))); + (yyval.rhs)->atoms = glist_add_ptr((yyval.rhs)->atoms, (yyvsp[(1) - (1)].atom)); } + break; + + case 21: + +/* Line 1455 of yacc.c */ +#line 123 "jsgf_parser.y" + { (yyval.rhs) = (yyvsp[(1) - (2)].rhs); + (yyval.rhs)->atoms = glist_add_ptr((yyval.rhs)->atoms, (yyvsp[(2) - (2)].atom)); } + break; + + case 23: + +/* Line 1455 of yacc.c */ +#line 128 "jsgf_parser.y" + { (yyval.atom) = (yyvsp[(1) - (2)].atom); + (yyval.atom)->tags = glist_add_ptr((yyval.atom)->tags, (yyvsp[(2) - (2)].name)); } + break; + + case 25: + +/* Line 1455 of yacc.c */ +#line 133 "jsgf_parser.y" + { (yyval.atom) = (yyvsp[(2) - (2)].atom); (yyval.atom)->weight = (yyvsp[(1) - (2)].weight); } + break; + + case 26: + +/* Line 1455 of yacc.c */ +#line 136 "jsgf_parser.y" + { (yyval.rule) = jsgf_define_rule(jsgf, NULL, (yyvsp[(2) - (3)].rhs), 0); } + break; + + case 27: + +/* Line 1455 of yacc.c */ +#line 139 "jsgf_parser.y" + { (yyval.rule) = jsgf_optional_new(jsgf, (yyvsp[(2) - (3)].rhs)); } + break; + + case 28: + +/* Line 1455 of yacc.c */ +#line 142 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].name), 1.0); ckd_free((yyvsp[(1) - (1)].name)); } + break; + + case 29: + +/* Line 1455 of yacc.c */ +#line 143 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].name), 1.0); ckd_free((yyvsp[(1) - (1)].name)); } + break; + + case 30: + +/* Line 1455 of yacc.c */ +#line 144 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].rule)->name, 1.0); } + break; + + case 31: + +/* Line 1455 of yacc.c */ +#line 145 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].rule)->name, 1.0); } + break; + + case 32: + +/* Line 1455 of yacc.c */ +#line 146 "jsgf_parser.y" + { (yyval.atom) = jsgf_kleene_new(jsgf, (yyvsp[(1) - (2)].atom), 0); } + break; + + case 33: + +/* Line 1455 of yacc.c */ +#line 147 "jsgf_parser.y" + { (yyval.atom) = jsgf_kleene_new(jsgf, (yyvsp[(1) - (2)].atom), 1); } + break; + + + +/* Line 1455 of yacc.c */ +#line 1580 "jsgf_parser.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (yyscanner, jsgf, YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yyscanner, jsgf, yymsg); + } + else + { + yyerror (yyscanner, jsgf, YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, yyscanner, jsgf); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp, yyscanner, jsgf); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (yyscanner, jsgf, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, yyscanner, jsgf); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp, yyscanner, jsgf); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + + +/* Line 1675 of yacc.c */ +#line 150 "jsgf_parser.y" + + +void +yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s) +{ + E_ERROR("%s at line %d current token '%s'\n", s, yyget_lineno(lex), yyget_text(lex)); +} + diff --git a/src/libsphinxbase/lm/jsgf_parser.h b/src/libsphinxbase/lm/jsgf_parser.h new file mode 100644 index 000000000..95f68e329 --- /dev/null +++ b/src/libsphinxbase/lm/jsgf_parser.h @@ -0,0 +1,90 @@ + +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + HEADER = 258, + GRAMMAR = 259, + IMPORT = 260, + PUBLIC = 261, + TOKEN = 262, + RULENAME = 263, + TAG = 264, + WEIGHT = 265 + }; +#endif +/* Tokens. */ +#define HEADER 258 +#define GRAMMAR 259 +#define IMPORT 260 +#define PUBLIC 261 +#define TOKEN 262 +#define RULENAME 263 +#define TAG 264 +#define WEIGHT 265 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 1676 of yacc.c */ +#line 65 "jsgf_parser.y" + + char *name; + float weight; + jsgf_rule_t *rule; + jsgf_rhs_t *rhs; + jsgf_atom_t *atom; + + + +/* Line 1676 of yacc.c */ +#line 82 "jsgf_parser.h" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + + + diff --git a/src/libsphinxbase/lm/jsgf_parser.y b/src/libsphinxbase/lm/jsgf_parser.y new file mode 100644 index 000000000..eedaa76d9 --- /dev/null +++ b/src/libsphinxbase/lm/jsgf_parser.y @@ -0,0 +1,156 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +%{ +#define YYERROR_VERBOSE + +#include +#include + +#include +#include +#include + +#include "jsgf_internal.h" +#include "jsgf_parser.h" +#include "jsgf_scanner.h" + +/* Suppress warnings from generated code */ +#if defined _MSC_VER +#pragma warning(disable: 4273) +#endif + +void yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s); + +%} + +%pure-parser +%lex-param { void* yyscanner } +%parse-param { void* yyscanner } +%parse-param { jsgf_t *jsgf } + +%union { + char *name; + float weight; + jsgf_rule_t *rule; + jsgf_rhs_t *rhs; + jsgf_atom_t *atom; +} + +%token HEADER GRAMMAR IMPORT PUBLIC +%token TOKEN RULENAME TAG +%token WEIGHT +%type rule_atom rule_item tagged_rule_item +%type rule_expansion alternate_list +%type grammar_header +%type rule_group rule_optional +%% + +grammar: header + | header rule_list + | header import_header rule_list + ; + +header: jsgf_header grammar_header { jsgf->name = $2; } + ; + +jsgf_header: HEADER ';' + | HEADER TOKEN ';' { jsgf->version = $2; } + | HEADER TOKEN TOKEN ';' { jsgf->version = $2; jsgf->charset = $3; } + | HEADER TOKEN TOKEN TOKEN ';' { jsgf->version = $2; jsgf->charset = $3; + jsgf->locale = $4; } + ; + +grammar_header: GRAMMAR TOKEN ';' { $$ = $2; } + ; + +import_header: import_statement + | import_header import_statement + ; + +import_statement: IMPORT RULENAME ';' { jsgf_import_rule(jsgf, $2); ckd_free($2); } + ; + +rule_list: rule + | rule_list rule + ; + +rule: RULENAME '=' alternate_list ';' { jsgf_define_rule(jsgf, $1, $3, 0); ckd_free($1); } +| PUBLIC RULENAME '=' alternate_list ';' { jsgf_define_rule(jsgf, $2, $4, 1); ckd_free($2); } + ; + +alternate_list: rule_expansion { $$ = $1; $$->atoms = glist_reverse($$->atoms); } + | alternate_list '|' rule_expansion { $$ = $3; + $$->atoms = glist_reverse($$->atoms); + $$->alt = $1; } + ; + +rule_expansion: tagged_rule_item { $$ = ckd_calloc(1, sizeof(*$$)); + $$->atoms = glist_add_ptr($$->atoms, $1); } + | rule_expansion tagged_rule_item { $$ = $1; + $$->atoms = glist_add_ptr($$->atoms, $2); } + ; + +tagged_rule_item: rule_item + | tagged_rule_item TAG { $$ = $1; + $$->tags = glist_add_ptr($$->tags, $2); } + ; + +rule_item: rule_atom + | WEIGHT rule_atom { $$ = $2; $$->weight = $1; } + ; + +rule_group: '(' alternate_list ')' { $$ = jsgf_define_rule(jsgf, NULL, $2, 0); } + ; + +rule_optional: '[' alternate_list ']' { $$ = jsgf_optional_new(jsgf, $2); } + ; + +rule_atom: TOKEN { $$ = jsgf_atom_new($1, 1.0); ckd_free($1); } + | RULENAME { $$ = jsgf_atom_new($1, 1.0); ckd_free($1); } + | rule_group { $$ = jsgf_atom_new($1->name, 1.0); } + | rule_optional { $$ = jsgf_atom_new($1->name, 1.0); } + | rule_atom '*' { $$ = jsgf_kleene_new(jsgf, $1, 0); } + | rule_atom '+' { $$ = jsgf_kleene_new(jsgf, $1, 1); } + ; + +%% + +void +yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s) +{ + E_ERROR("%s at line %d current token '%s'\n", s, yyget_lineno(lex), yyget_text(lex)); +} diff --git a/src/libsphinxbase/lm/jsgf_scanner.c b/src/libsphinxbase/lm/jsgf_scanner.c new file mode 100644 index 000000000..1a89d0621 --- /dev/null +++ b/src/libsphinxbase/lm/jsgf_scanner.c @@ -0,0 +1,2221 @@ +#line 2 "jsgf_scanner.c" + +#line 4 "jsgf_scanner.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 1 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yyg->yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yyg->yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ,yyscanner ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires + * access to the local variable yy_act. Since yyless() is a macro, it would break + * existing scanners that call yyless() from OUTSIDE yylex. + * One obvious solution it to make yy_act a global. I tried that, and saw + * a 5% performance hit in a non-yylineno scanner, because yy_act is + * normally declared as a register variable-- so it is not worth it. + */ + #define YY_LESS_LINENO(n) \ + do { \ + int yyl;\ + for ( yyl = n; yyl < yyleng; ++yyl )\ + if ( yytext[yyl] == '\n' )\ + --yylineno;\ + }while(0) + #define YY_LINENO_REWIND_TO(dst) \ + do {\ + const char *p;\ + for ( p = yy_cp-1; p >= (dst); --p)\ + if ( *p == '\n' )\ + --yylineno;\ + }while(0) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = yyg->yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ + ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] + +void yyrestart (FILE *input_file ,yyscan_t yyscanner ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void yypop_buffer_state (yyscan_t yyscanner ); + +static void yyensure_buffer_stack (yyscan_t yyscanner ); +static void yy_load_buffer_state (yyscan_t yyscanner ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *yyalloc (yy_size_t ,yyscan_t yyscanner ); +void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void yyfree (void * ,yyscan_t yyscanner ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define yywrap(yyscanner) (/*CONSTCOND*/1) +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +typedef int yy_state_type; + +#define yytext_ptr yytext_r + +static yy_state_type yy_get_previous_state (yyscan_t yyscanner ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner); +static int yy_get_next_buffer (yyscan_t yyscanner ); +static void yynoreturn yy_fatal_error (yyconst char* msg ,yyscan_t yyscanner ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yyg->yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yyg->yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yyg->yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 22 +#define YY_END_OF_BUFFER 23 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[98] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 23, 22, + 1, 22, 22, 22, 22, 22, 22, 22, 5, 1, + 5, 17, 1, 17, 21, 21, 18, 21, 21, 9, + 1, 9, 0, 3, 0, 0, 0, 0, 0, 0, + 4, 17, 17, 0, 17, 17, 7, 0, 20, 0, + 0, 0, 0, 0, 16, 8, 0, 0, 2, 14, + 0, 0, 0, 0, 19, 0, 17, 0, 17, 17, + 0, 0, 6, 20, 0, 15, 0, 0, 16, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 10, 0, + 0, 0, 0, 12, 13, 11, 0 + + } ; + +static yyconst YY_CHAR yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 4, 5, 1, 1, 1, 1, 6, + 6, 7, 6, 1, 8, 9, 10, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 1, 12, 13, + 6, 14, 1, 1, 1, 1, 1, 1, 1, 15, + 16, 1, 1, 17, 1, 1, 1, 1, 1, 1, + 1, 1, 18, 1, 1, 1, 1, 1, 1, 1, + 6, 19, 6, 1, 1, 1, 20, 21, 22, 1, + + 23, 1, 24, 1, 25, 1, 1, 26, 27, 1, + 28, 29, 1, 30, 1, 31, 32, 1, 1, 1, + 1, 1, 33, 6, 34, 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, 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, 35, 1, 1, 1, + 36, 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, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst YY_CHAR yy_meta[38] = + { 0, + 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, + 1, 2, 3, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 1, 1, 1 + } ; + +static yyconst flex_uint16_t yy_base[113] = + { 0, + 0, 36, 4, 12, 72, 105, 14, 20, 135, 312, + 312, 117, 2, 0, 103, 105, 99, 95, 312, 312, + 119, 0, 312, 138, 312, 21, 312, 0, 1, 312, + 312, 118, 109, 312, 123, 111, 104, 94, 101, 85, + 312, 0, 171, 14, 0, 204, 312, 109, 113, 41, + 106, 96, 21, 23, 312, 312, 88, 98, 312, 312, + 73, 71, 70, 89, 312, 44, 0, 39, 0, 237, + 43, 90, 312, 312, 57, 312, 37, 69, 43, 77, + 64, 57, 58, 64, 76, 94, 79, 59, 312, 39, + 14, 14, 4, 312, 312, 312, 312, 271, 274, 277, + + 280, 283, 0, 285, 288, 290, 293, 296, 299, 302, + 305, 308 + } ; + +static yyconst flex_int16_t yy_def[113] = + { 0, + 98, 98, 99, 99, 100, 100, 101, 101, 97, 97, + 97, 97, 97, 102, 97, 97, 97, 97, 97, 97, + 97, 103, 97, 104, 97, 97, 97, 105, 106, 97, + 97, 97, 97, 97, 107, 102, 97, 97, 97, 97, + 97, 103, 104, 108, 103, 109, 97, 97, 110, 97, + 97, 105, 106, 111, 97, 97, 97, 107, 97, 97, + 97, 97, 97, 97, 97, 112, 43, 108, 43, 109, + 97, 110, 97, 97, 97, 97, 106, 111, 106, 97, + 97, 97, 97, 97, 108, 112, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, + + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97 + } ; + +static yyconst flex_uint16_t yy_nxt[350] = + { 0, + 42, 11, 11, 97, 12, 20, 11, 97, 34, 13, + 21, 35, 14, 20, 11, 31, 11, 65, 21, 54, + 32, 31, 11, 15, 16, 53, 32, 47, 17, 48, + 49, 50, 66, 96, 55, 95, 18, 11, 11, 54, + 12, 78, 65, 51, 94, 13, 44, 85, 14, 48, + 74, 50, 74, 87, 55, 54, 79, 66, 93, 15, + 16, 54, 86, 51, 17, 51, 74, 88, 74, 88, + 55, 53, 18, 23, 11, 24, 55, 25, 25, 65, + 33, 26, 92, 27, 28, 25, 91, 78, 74, 87, + 90, 89, 73, 84, 66, 83, 44, 85, 82, 81, + + 59, 51, 79, 80, 29, 25, 23, 11, 24, 76, + 25, 25, 86, 75, 26, 73, 27, 28, 25, 71, + 64, 63, 62, 61, 60, 59, 57, 56, 41, 40, + 39, 38, 37, 33, 97, 97, 97, 29, 25, 44, + 44, 45, 97, 44, 44, 97, 97, 44, 97, 44, + 44, 44, 97, 97, 97, 97, 46, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 44, 44, 44, 44, 45, 97, 44, 44, 97, 97, + 44, 97, 44, 44, 44, 97, 97, 97, 97, 46, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + + 97, 97, 97, 44, 44, 68, 44, 69, 97, 68, + 68, 97, 97, 68, 97, 68, 68, 68, 97, 97, + 97, 97, 70, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 68, 68, 68, 44, + 69, 97, 68, 68, 97, 97, 68, 97, 68, 68, + 68, 97, 97, 97, 97, 70, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 68, + 68, 10, 10, 10, 19, 19, 19, 22, 22, 22, + 30, 30, 30, 36, 36, 43, 43, 43, 52, 52, + 53, 53, 53, 58, 58, 58, 44, 44, 44, 67, + + 67, 67, 72, 72, 72, 77, 77, 77, 68, 68, + 68, 9, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97 + } ; + +static yyconst flex_int16_t yy_chk[350] = + { 0, + 103, 1, 1, 0, 1, 3, 3, 0, 13, 1, + 3, 13, 1, 4, 4, 7, 7, 44, 4, 29, + 7, 8, 8, 1, 1, 54, 8, 26, 1, 26, + 26, 26, 44, 93, 29, 92, 1, 2, 2, 53, + 2, 54, 68, 26, 91, 2, 66, 66, 2, 50, + 50, 50, 71, 71, 53, 77, 54, 68, 90, 2, + 2, 79, 66, 50, 2, 71, 75, 75, 88, 88, + 77, 78, 2, 5, 5, 5, 79, 5, 5, 85, + 84, 5, 83, 5, 5, 5, 82, 78, 87, 87, + 81, 80, 72, 64, 85, 63, 86, 86, 62, 61, + + 58, 87, 78, 57, 5, 5, 6, 6, 6, 52, + 6, 6, 86, 51, 6, 49, 6, 6, 6, 48, + 40, 39, 38, 37, 36, 35, 33, 32, 21, 18, + 17, 16, 15, 12, 9, 0, 0, 6, 6, 24, + 24, 24, 0, 24, 24, 0, 0, 24, 0, 24, + 24, 24, 0, 0, 0, 0, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 43, 43, 43, 0, 43, 43, 0, 0, + 43, 0, 43, 43, 43, 0, 0, 0, 0, 43, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 43, 43, 46, 46, 46, 0, 46, + 46, 0, 0, 46, 0, 46, 46, 46, 0, 0, + 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46, 46, 70, 70, + 70, 0, 70, 70, 0, 0, 70, 0, 70, 70, + 70, 0, 0, 0, 0, 70, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, + 70, 98, 98, 98, 99, 99, 99, 100, 100, 100, + 101, 101, 101, 102, 102, 104, 104, 104, 105, 105, + 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, + + 109, 109, 110, 110, 110, 111, 111, 111, 112, 112, + 112, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97 + } ; + +/* Table of booleans, true if rule could match eol. */ +static yyconst flex_int32_t yy_rule_can_match_eol[23] = + { 0, +1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, + 0, 0, 0, }; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +#line 1 "_jsgf_scanner.l" +/* -*- mode: text -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* YOU MUST USE FLEX 2.6.1 OR NEWER TO PROCESS THIS FILE!!! */ +#line 39 "_jsgf_scanner.l" + +#include "jsgf_internal.h" +#include "jsgf_parser.h" + +#define YY_NO_UNISTD_H 1 + + + +#line 612 "jsgf_scanner.c" + +#define INITIAL 0 +#define COMMENT 1 +#define DECL 2 +#define DECLCOMMENT 3 + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Holds the entire state of the reentrant scanner. */ +struct yyguts_t + { + + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *yyin_r, *yyout_r; + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ + char yy_hold_char; + int yy_n_chars; + int yyleng_r; + char *yy_c_buf_p; + int yy_init; + int yy_start; + int yy_did_buffer_switch_on_eof; + int yy_start_stack_ptr; + int yy_start_stack_depth; + int *yy_start_stack; + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + int yylineno_r; + int yy_flex_debug_r; + + char *yytext_r; + int yy_more_flag; + int yy_more_len; + + YYSTYPE * yylval_r; + + }; /* end struct yyguts_t */ + +static int yy_init_globals (yyscan_t yyscanner ); + + /* This must go here because YYSTYPE and YYLTYPE are included + * from bison output in section 1.*/ + # define yylval yyg->yylval_r + +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (yyscan_t yyscanner ); + +int yyget_debug (yyscan_t yyscanner ); + +void yyset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *yyget_in (yyscan_t yyscanner ); + +void yyset_in (FILE * _in_str ,yyscan_t yyscanner ); + +FILE *yyget_out (yyscan_t yyscanner ); + +void yyset_out (FILE * _out_str ,yyscan_t yyscanner ); + + int yyget_leng (yyscan_t yyscanner ); + +char *yyget_text (yyscan_t yyscanner ); + +int yyget_lineno (yyscan_t yyscanner ); + +void yyset_lineno (int _line_number ,yyscan_t yyscanner ); + +int yyget_column (yyscan_t yyscanner ); + +void yyset_column (int _column_no ,yyscan_t yyscanner ); + +YYSTYPE * yyget_lval (yyscan_t yyscanner ); + +void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (yyscan_t yyscanner ); +#else +extern int yywrap (yyscan_t yyscanner ); +#endif +#endif + +#ifndef YY_NO_UNPUT + +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (yyscan_t yyscanner ); +#else +static int input (yyscan_t yyscanner ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex \ + (YYSTYPE * yylval_param ,yyscan_t yyscanner); + +#define YY_DECL int yylex \ + (YYSTYPE * yylval_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK /*LINTED*/break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yylval = yylval_param; + + if ( !yyg->yy_init ) + { + yyg->yy_init = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yyg->yy_start ) + yyg->yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); + } + + yy_load_buffer_state(yyscanner ); + } + + { +#line 59 "_jsgf_scanner.l" + + +#line 883 "jsgf_scanner.c" + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + { + yy_cp = yyg->yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yyg->yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yyg->yy_start; +yy_match: + do + { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 98 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + ++yy_cp; + } + while ( yy_current_state != 97 ); + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) + { + yy_size_t yyl; + for ( yyl = 0; yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + + do{ yylineno++; + yycolumn=0; + }while(0) +; + } + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yyg->yy_hold_char; + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + +case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP +#line 61 "_jsgf_scanner.l" +; /* ignore whitespace */ + YY_BREAK +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +#line 62 "_jsgf_scanner.l" +; /* single-line comments */ + YY_BREAK +case 3: +YY_RULE_SETUP +#line 63 "_jsgf_scanner.l" +{ BEGIN(COMMENT); } /* C-style comments */ + YY_BREAK +case 4: +YY_RULE_SETUP +#line 64 "_jsgf_scanner.l" +{ BEGIN(INITIAL); } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 65 "_jsgf_scanner.l" +; /* Ignore stuff in comment mode */ + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 67 "_jsgf_scanner.l" +; /* single-line comments inside decl */ + YY_BREAK +case 7: +YY_RULE_SETUP +#line 68 "_jsgf_scanner.l" +{ BEGIN(DECLCOMMENT); } /* C-style comments inside decl */ + YY_BREAK +case 8: +YY_RULE_SETUP +#line 69 "_jsgf_scanner.l" +{ BEGIN(DECL); } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 70 "_jsgf_scanner.l" +; /* Ignore stuff in comment mode */ + YY_BREAK +case 10: +YY_RULE_SETUP +#line 72 "_jsgf_scanner.l" +{BEGIN(DECL); return HEADER;} + YY_BREAK +case 11: +YY_RULE_SETUP +#line 73 "_jsgf_scanner.l" +{BEGIN(DECL); return GRAMMAR;} + YY_BREAK +case 12: +YY_RULE_SETUP +#line 74 "_jsgf_scanner.l" +{BEGIN(DECL); return IMPORT;} + YY_BREAK +case 13: +YY_RULE_SETUP +#line 75 "_jsgf_scanner.l" +{BEGIN(DECL); return PUBLIC;} + YY_BREAK +case 14: +/* rule 14 can match eol */ +YY_RULE_SETUP +#line 77 "_jsgf_scanner.l" +{ BEGIN(DECL); yylval->name = strdup(yytext); return RULENAME; } + YY_BREAK +case 15: +/* rule 15 can match eol */ +YY_RULE_SETUP +#line 78 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return RULENAME; } + YY_BREAK +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +#line 80 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return TAG; } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 81 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return TOKEN; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 82 "_jsgf_scanner.l" +{ BEGIN(INITIAL); return yytext[0]; } + YY_BREAK +case 19: +/* rule 19 can match eol */ +YY_RULE_SETUP +#line 83 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return TOKEN; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 84 "_jsgf_scanner.l" +{ yylval->weight = atof_c(yytext+1); return WEIGHT; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 85 "_jsgf_scanner.l" +return yytext[0]; /* Single-character tokens */ + YY_BREAK +case 22: +YY_RULE_SETUP +#line 87 "_jsgf_scanner.l" +ECHO; + YY_BREAK +#line 1065 "jsgf_scanner.c" +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(COMMENT): +case YY_STATE_EOF(DECL): +case YY_STATE_EOF(DECLCOMMENT): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yyg->yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); + + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yyg->yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_END_OF_FILE: + { + yyg->yy_did_buffer_switch_on_eof = 0; + + if ( yywrap(yyscanner ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = + yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yyg->yy_c_buf_p = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = yyg->yytext_ptr; + yy_size_t number_to_move, i; + int ret_val; + + if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (yy_size_t) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) (yyg->yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = NULL; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + yyg->yy_n_chars, num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + if ( yyg->yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ,yyscanner); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((int) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + yyg->yy_n_chars += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (yyscan_t yyscanner) +{ + yy_state_type yy_current_state; + char *yy_cp; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_current_state = yyg->yy_start; + + for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) + { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 98 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) +{ + int yy_is_jam; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ + char *yy_cp = yyg->yy_c_buf_p; + + YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 98 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + yy_is_jam = (yy_current_state == 97); + + (void)yyg; + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_UNPUT + +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (yyscan_t yyscanner) +#else + static int input (yyscan_t yyscanner) +#endif + +{ + int c; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + *yyg->yy_c_buf_p = yyg->yy_hold_char; + + if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + /* This was really a NUL. */ + *yyg->yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yyg->yy_c_buf_p - yyg->yytext_ptr; + ++yyg->yy_c_buf_p; + + switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ,yyscanner); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap(yyscanner ) ) + return 0; + + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(yyscanner); +#else + return input(yyscanner); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = yyg->yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ + *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ + yyg->yy_hold_char = *++yyg->yy_c_buf_p; + + if ( c == '\n' ) + + do{ yylineno++; + yycolumn=0; + }while(0) +; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * @param yyscanner The scanner object. + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner); + yy_load_buffer_state(yyscanner ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * @param yyscanner The scanner object. + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (yyscanner); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state(yyscanner ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yyg->yy_did_buffer_switch_on_eof = 1; +} + +static void yy_load_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + yyg->yy_hold_char = *yyg->yy_c_buf_p; +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * @param yyscanner The scanner object. + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = (yy_size_t)size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ,yyscanner ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ,yyscanner); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * @param yyscanner The scanner object. + */ + void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ,yyscanner ); + + yyfree((void *) b ,yyscanner ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) + +{ + int oerrno = errno; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_flush_buffer(b ,yyscanner); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * @param yyscanner The scanner object. + */ + void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state(yyscanner ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * @param yyscanner The scanner object. + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(yyscanner); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + yyg->yy_buffer_stack_top++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state(yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * @param yyscanner The scanner object. + */ +void yypop_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (yyg->yy_buffer_stack_top > 0) + --yyg->yy_buffer_stack_top; + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state(yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (yyscan_t yyscanner) +{ + int num_to_alloc; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (!yyg->yy_buffer_stack) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + yyg->yy_buffer_stack_max = num_to_alloc; + yyg->yy_buffer_stack_top = 0; + return; + } + + if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = yyg->yy_buffer_stack_max + grow_size; + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc + (yyg->yy_buffer_stack, + num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); + yyg->yy_buffer_stack_max = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return NULL; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ,yyscanner ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr , yyscan_t yyscanner) +{ + + return yy_scan_bytes(yystr,(int) strlen(yystr) ,yyscanner); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + yy_size_t i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) _yybytes_len + 2; + buf = (char *) yyalloc(n ,yyscanner ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ,yyscanner); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yynoreturn yy_fatal_error (yyconst char* msg , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = yyg->yy_hold_char; \ + yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ + yyg->yy_hold_char = *yyg->yy_c_buf_p; \ + *yyg->yy_c_buf_p = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the user-defined data for this scanner. + * @param yyscanner The scanner object. + */ +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyextra; +} + +/** Get the current line number. + * @param yyscanner The scanner object. + */ +int yyget_lineno (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yylineno; +} + +/** Get the current column number. + * @param yyscanner The scanner object. + */ +int yyget_column (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yycolumn; +} + +/** Get the input stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_in (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyin; +} + +/** Get the output stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_out (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyout; +} + +/** Get the length of the current token. + * @param yyscanner The scanner object. + */ +int yyget_leng (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyleng; +} + +/** Get the current token. + * @param yyscanner The scanner object. + */ + +char *yyget_text (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yytext; +} + +/** Set the user-defined data. This data is never touched by the scanner. + * @param user_defined The data to be associated with this scanner. + * @param yyscanner The scanner object. + */ +void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyextra = user_defined ; +} + +/** Set the current line number. + * @param _line_number line number + * @param yyscanner The scanner object. + */ +void yyset_lineno (int _line_number , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* lineno is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); + + yylineno = _line_number; +} + +/** Set the current column. + * @param _column_no column number + * @param yyscanner The scanner object. + */ +void yyset_column (int _column_no , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* column is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + YY_FATAL_ERROR( "yyset_column called with no buffer" ); + + yycolumn = _column_no; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param _in_str A readable stream. + * @param yyscanner The scanner object. + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * _in_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyin = _in_str ; +} + +void yyset_out (FILE * _out_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyout = _out_str ; +} + +int yyget_debug (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yy_flex_debug; +} + +void yyset_debug (int _bdebug , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yy_flex_debug = _bdebug ; +} + +/* Accessor methods for yylval and yylloc */ + +YYSTYPE * yyget_lval (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yylval; +} + +void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yylval = yylval_param; +} + +/* User-visible API */ + +/* yylex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ + +int yylex_init(yyscan_t* ptr_yy_globals) + +{ + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + return yy_init_globals ( *ptr_yy_globals ); +} + +/* yylex_init_extra has the same functionality as yylex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to yyalloc in + * the yyextra field. + */ + +int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals ) + +{ + struct yyguts_t dummy_yyguts; + + yyset_extra (yy_user_defined, &dummy_yyguts); + + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + yyset_extra (yy_user_defined, *ptr_yy_globals); + + return yy_init_globals ( *ptr_yy_globals ); +} + +static int yy_init_globals (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + yyg->yy_buffer_stack = NULL; + yyg->yy_buffer_stack_top = 0; + yyg->yy_buffer_stack_max = 0; + yyg->yy_c_buf_p = NULL; + yyg->yy_init = 0; + yyg->yy_start = 0; + + yyg->yy_start_stack_ptr = 0; + yyg->yy_start_stack_depth = 0; + yyg->yy_start_stack = NULL; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = NULL; + yyout = NULL; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(yyscanner); + } + + /* Destroy the stack itself. */ + yyfree(yyg->yy_buffer_stack ,yyscanner); + yyg->yy_buffer_stack = NULL; + + /* Destroy the start condition stack. */ + yyfree(yyg->yy_start_stack ,yyscanner ); + yyg->yy_start_stack = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( yyscanner); + + /* Destroy the main struct (reentrant only). */ + yyfree ( yyscanner , yyscanner ); + yyscanner = NULL; + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + return malloc(size); +} + +void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); +} + +void yyfree (void * ptr , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 87 "_jsgf_scanner.l" + + + diff --git a/src/libsphinxbase/lm/jsgf_scanner.h b/src/libsphinxbase/lm/jsgf_scanner.h new file mode 100644 index 000000000..8ccc56e3d --- /dev/null +++ b/src/libsphinxbase/lm/jsgf_scanner.h @@ -0,0 +1,342 @@ +#ifndef yyHEADER_H +#define yyHEADER_H 1 +#define yyIN_HEADER 1 + +#line 6 "jsgf_scanner.h" + +#line 8 "jsgf_scanner.h" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 1 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +void yyrestart (FILE *input_file ,yyscan_t yyscanner ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void yypop_buffer_state (yyscan_t yyscanner ); + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *yyalloc (yy_size_t ,yyscan_t yyscanner ); +void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void yyfree (void * ,yyscan_t yyscanner ); + +/* Begin user sect3 */ + +#define yywrap(yyscanner) (/*CONSTCOND*/1) +#define YY_SKIP_YYWRAP + +#define yytext_ptr yytext_r + +#ifdef YY_HEADER_EXPORT_START_CONDITIONS +#define INITIAL 0 +#define COMMENT 1 +#define DECL 2 +#define DECLCOMMENT 3 + +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (yyscan_t yyscanner ); + +int yyget_debug (yyscan_t yyscanner ); + +void yyset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *yyget_in (yyscan_t yyscanner ); + +void yyset_in (FILE * _in_str ,yyscan_t yyscanner ); + +FILE *yyget_out (yyscan_t yyscanner ); + +void yyset_out (FILE * _out_str ,yyscan_t yyscanner ); + + int yyget_leng (yyscan_t yyscanner ); + +char *yyget_text (yyscan_t yyscanner ); + +int yyget_lineno (yyscan_t yyscanner ); + +void yyset_lineno (int _line_number ,yyscan_t yyscanner ); + +int yyget_column (yyscan_t yyscanner ); + +void yyset_column (int _column_no ,yyscan_t yyscanner ); + +YYSTYPE * yyget_lval (yyscan_t yyscanner ); + +void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (yyscan_t yyscanner ); +#else +extern int yywrap (yyscan_t yyscanner ); +#endif +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex \ + (YYSTYPE * yylval_param ,yyscan_t yyscanner); + +#define YY_DECL int yylex \ + (YYSTYPE * yylval_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif + +#line 87 "_jsgf_scanner.l" + + +#line 341 "jsgf_scanner.h" +#undef yyIN_HEADER +#endif /* yyHEADER_H */ diff --git a/src/libsphinxbase/lm/lm_trie.c b/src/libsphinxbase/lm/lm_trie.c new file mode 100644 index 000000000..12e93b7af --- /dev/null +++ b/src/libsphinxbase/lm/lm_trie.c @@ -0,0 +1,867 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include "lm_trie.h" +#include "lm_trie_quant.h" + +static void lm_trie_alloc_ngram(lm_trie_t * trie, uint32 * counts, int order); + +static uint32 +base_size(uint32 entries, uint32 max_vocab, uint8 remaining_bits) +{ + uint8 total_bits = bitarr_required_bits(max_vocab) + remaining_bits; + /* Extra entry for next pointer at the end. + * +7 then / 8 to round up bits and convert to bytes + * +sizeof(uint64) so that ReadInt57 etc don't go segfault. + * Note that this waste is O(order), not O(number of ngrams).*/ + return ((1 + entries) * total_bits + 7) / 8 + sizeof(uint64); +} + +uint32 +middle_size(uint8 quant_bits, uint32 entries, uint32 max_vocab, + uint32 max_ptr) +{ + return base_size(entries, max_vocab, + quant_bits + bitarr_required_bits(max_ptr)); +} + +uint32 +longest_size(uint8 quant_bits, uint32 entries, uint32 max_vocab) +{ + return base_size(entries, max_vocab, quant_bits); +} + +static void +base_init(base_t * base, void *base_mem, uint32 max_vocab, + uint8 remaining_bits) +{ + base->word_bits = bitarr_required_bits(max_vocab); + base->word_mask = (1U << base->word_bits) - 1U; + if (base->word_bits > 25) + E_ERROR + ("Sorry, word indices more than %d are not implemented. Edit util/bit_packing.hh and fix the bit packing functions\n", + (1U << 25)); + base->total_bits = base->word_bits + remaining_bits; + + base->base = (uint8 *) base_mem; + base->insert_index = 0; + base->max_vocab = max_vocab; +} + +void +middle_init(middle_t * middle, void *base_mem, uint8 quant_bits, + uint32 entries, uint32 max_vocab, uint32 max_next, + void *next_source) +{ + middle->quant_bits = quant_bits; + bitarr_mask_from_max(&middle->next_mask, max_next); + middle->next_source = next_source; + if (entries + 1 >= (1U << 25) || (max_next >= (1U << 25))) + E_ERROR + ("Sorry, this does not support more than %d n-grams of a particular order. Edit util/bit_packing.hh and fix the bit packing functions\n", + (1U << 25)); + base_init(&middle->base, base_mem, max_vocab, + quant_bits + middle->next_mask.bits); +} + +void +longest_init(longest_t * longest, void *base_mem, uint8 quant_bits, + uint32 max_vocab) +{ + base_init(&longest->base, base_mem, max_vocab, quant_bits); +} + +static bitarr_address_t +middle_insert(middle_t * middle, uint32 word, int order, int max_order) +{ + uint32 at_pointer; + uint32 next; + bitarr_address_t address; + assert(word <= middle->base.word_mask); + address.base = middle->base.base; + address.offset = middle->base.insert_index * middle->base.total_bits; + bitarr_write_int25(address, middle->base.word_bits, word); + address.offset += middle->base.word_bits; + at_pointer = address.offset; + address.offset += middle->quant_bits; + if (order == max_order - 1) { + next = ((longest_t *) middle->next_source)->base.insert_index; + } + else { + next = ((middle_t *) middle->next_source)->base.insert_index; + } + + bitarr_write_int25(address, middle->next_mask.bits, next); + middle->base.insert_index++; + address.offset = at_pointer; + return address; +} + +static bitarr_address_t +longest_insert(longest_t * longest, uint32 index) +{ + bitarr_address_t address; + assert(index <= longest->base.word_mask); + address.base = longest->base.base; + address.offset = longest->base.insert_index * longest->base.total_bits; + bitarr_write_int25(address, longest->base.word_bits, index); + address.offset += longest->base.word_bits; + longest->base.insert_index++; + return address; +} + +static void +middle_finish_loading(middle_t * middle, uint32 next_end) +{ + bitarr_address_t address; + address.base = middle->base.base; + address.offset = + (middle->base.insert_index + 1) * middle->base.total_bits - + middle->next_mask.bits; + bitarr_write_int25(address, middle->next_mask.bits, next_end); +} + +static uint32 +unigram_next(lm_trie_t * trie, int order) +{ + return order == + 2 ? trie->longest->base.insert_index : trie->middle_begin->base. + insert_index; +} + +void +lm_trie_fix_counts(ngram_raw_t ** raw_ngrams, uint32 * counts, + uint32 * fixed_counts, int order) +{ + priority_queue_t *ngrams = + priority_queue_create(order - 1, &ngram_ord_comparator); + uint32 raw_ngram_ptrs[NGRAM_MAX_ORDER - 1]; + uint32 words[NGRAM_MAX_ORDER]; + int i; + + memset(words, -1, sizeof(words)); + memcpy(fixed_counts, counts, order * sizeof(*fixed_counts)); + for (i = 2; i <= order; i++) { + ngram_raw_t *tmp_ngram; + + if (counts[i - 1] <= 0) + continue; + + raw_ngram_ptrs[i - 2] = 0; + + tmp_ngram = + (ngram_raw_t *) ckd_calloc(1, sizeof(*tmp_ngram)); + *tmp_ngram = raw_ngrams[i - 2][0]; + tmp_ngram->order = i; + priority_queue_add(ngrams, tmp_ngram); + } + + for (;;) { + int32 to_increment = TRUE; + ngram_raw_t *top; + if (priority_queue_size(ngrams) == 0) { + break; + } + top = (ngram_raw_t *) priority_queue_poll(ngrams); + if (top->order == 2) { + memcpy(words, top->words, 2 * sizeof(*words)); + } + else { + for (i = 0; i < top->order - 1; i++) { + if (words[i] != top->words[i]) { + int num; + num = (i == 0) ? 1 : i; + memcpy(words, top->words, + (num + 1) * sizeof(*words)); + fixed_counts[num]++; + to_increment = FALSE; + break; + } + } + words[top->order - 1] = top->words[top->order - 1]; + } + if (to_increment) { + raw_ngram_ptrs[top->order - 2]++; + } + if (raw_ngram_ptrs[top->order - 2] < counts[top->order - 1]) { + *top = raw_ngrams[top->order - 2][raw_ngram_ptrs[top->order - 2]]; + priority_queue_add(ngrams, top); + } + else { + ckd_free(top); + } + } + + assert(priority_queue_size(ngrams) == 0); + priority_queue_free(ngrams, NULL); +} + + +static void +recursive_insert(lm_trie_t * trie, ngram_raw_t ** raw_ngrams, + uint32 * counts, int order) +{ + uint32 unigram_idx = 0; + uint32 *words; + float *probs; + const uint32 unigram_count = (uint32) counts[0]; + priority_queue_t *ngrams = + priority_queue_create(order, &ngram_ord_comparator); + ngram_raw_t *ngram; + uint32 *raw_ngrams_ptr; + int i; + + words = (uint32 *) ckd_calloc(order, sizeof(*words)); + probs = (float *) ckd_calloc(order - 1, sizeof(*probs)); + ngram = (ngram_raw_t *) ckd_calloc(1, sizeof(*ngram)); + ngram->order = 1; + ngram->words = &unigram_idx; + priority_queue_add(ngrams, ngram); + raw_ngrams_ptr = + (uint32 *) ckd_calloc(order - 1, sizeof(*raw_ngrams_ptr)); + for (i = 2; i <= order; ++i) { + ngram_raw_t *tmp_ngram; + + if (counts[i - 1] <= 0) + continue; + + raw_ngrams_ptr[i - 2] = 0; + tmp_ngram = + (ngram_raw_t *) ckd_calloc(1, sizeof(*tmp_ngram)); + *tmp_ngram = raw_ngrams[i - 2][0]; + tmp_ngram->order = i; + + priority_queue_add(ngrams, tmp_ngram); + } + + for (;;) { + ngram_raw_t *top = + (ngram_raw_t *) priority_queue_poll(ngrams); + + if (top->order == 1) { + trie->unigrams[unigram_idx].next = unigram_next(trie, order); + words[0] = unigram_idx; + probs[0] = trie->unigrams[unigram_idx].prob; + if (++unigram_idx == unigram_count + 1) { + ckd_free(top); + break; + } + priority_queue_add(ngrams, top); + } + else { + for (i = 0; i < top->order - 1; i++) { + if (words[i] != top->words[i]) { + /* need to insert dummy suffixes to make ngram of higher order reachable */ + int j; + assert(i > 0); /* unigrams are not pruned without removing ngrams that contains them */ + for (j = i; j < top->order - 1; j++) { + middle_t *middle = &trie->middle_begin[j - 1]; + bitarr_address_t address = + middle_insert(middle, top->words[j], + j + 1, order); + /* calculate prob for blank */ + float calc_prob = + probs[j - 1] + + trie->unigrams[top->words[j]].bo; + probs[j] = calc_prob; + lm_trie_quant_mwrite(trie->quant, address, j - 1, + calc_prob, 0.0f); + } + } + } + memcpy(words, top->words, + top->order * sizeof(*words)); + if (top->order == order) { + bitarr_address_t address = + longest_insert(trie->longest, + top->words[top->order - 1]); + lm_trie_quant_lwrite(trie->quant, address, top->prob); + } + else { + middle_t *middle = &trie->middle_begin[top->order - 2]; + bitarr_address_t address = + middle_insert(middle, + top->words[top->order - 1], + top->order, order); + /* write prob and backoff */ + probs[top->order - 1] = top->prob; + lm_trie_quant_mwrite(trie->quant, address, top->order - 2, + top->prob, top->backoff); + } + raw_ngrams_ptr[top->order - 2]++; + if (raw_ngrams_ptr[top->order - 2] < counts[top->order - 1]) { + *top = raw_ngrams[top->order - + 2][raw_ngrams_ptr[top->order - 2]]; + + priority_queue_add(ngrams, top); + } + else { + ckd_free(top); + } + } + } + assert(priority_queue_size(ngrams) == 0); + priority_queue_free(ngrams, NULL); + ckd_free(raw_ngrams_ptr); + ckd_free(words); + ckd_free(probs); +} + +static lm_trie_t * +lm_trie_init(uint32 unigram_count) +{ + lm_trie_t *trie; + + trie = (lm_trie_t *) ckd_calloc(1, sizeof(*trie)); + memset(trie->hist_cache, -1, sizeof(trie->hist_cache)); /* prepare request history */ + memset(trie->backoff_cache, 0, sizeof(trie->backoff_cache)); + trie->unigrams = + (unigram_t *) ckd_calloc((unigram_count + 1), + sizeof(*trie->unigrams)); + trie->ngram_mem = NULL; + return trie; +} + +lm_trie_t * +lm_trie_create(uint32 unigram_count, int order) +{ + lm_trie_t *trie = lm_trie_init(unigram_count); + trie->quant = + (order > 1) ? lm_trie_quant_create(order) : 0; + return trie; +} + +lm_trie_t * +lm_trie_read_bin(uint32 * counts, int order, FILE * fp) +{ + lm_trie_t *trie = lm_trie_init(counts[0]); + trie->quant = (order > 1) ? lm_trie_quant_read_bin(fp, order) : NULL; + fread(trie->unigrams, sizeof(*trie->unigrams), (counts[0] + 1), fp); + if (order > 1) { + lm_trie_alloc_ngram(trie, counts, order); + fread(trie->ngram_mem, 1, trie->ngram_mem_size, fp); + } + return trie; +} + +void +lm_trie_write_bin(lm_trie_t * trie, uint32 unigram_count, FILE * fp) +{ + + if (trie->quant) + lm_trie_quant_write_bin(trie->quant, fp); + fwrite(trie->unigrams, sizeof(*trie->unigrams), (unigram_count + 1), + fp); + if (trie->ngram_mem) + fwrite(trie->ngram_mem, 1, trie->ngram_mem_size, fp); +} + +void +lm_trie_free(lm_trie_t * trie) +{ + if (trie->ngram_mem) { + ckd_free(trie->ngram_mem); + ckd_free(trie->middle_begin); + ckd_free(trie->longest); + } + if (trie->quant) + lm_trie_quant_free(trie->quant); + ckd_free(trie->unigrams); + ckd_free(trie); +} + +static void +lm_trie_alloc_ngram(lm_trie_t * trie, uint32 * counts, int order) +{ + int i; + uint8 *mem_ptr; + uint8 **middle_starts; + + trie->ngram_mem_size = 0; + for (i = 1; i < order - 1; i++) { + trie->ngram_mem_size += + middle_size(lm_trie_quant_msize(trie->quant), counts[i], + counts[0], counts[i + 1]); + } + trie->ngram_mem_size += + longest_size(lm_trie_quant_lsize(trie->quant), counts[order - 1], + counts[0]); + trie->ngram_mem = + (uint8 *) ckd_calloc(trie->ngram_mem_size, + sizeof(*trie->ngram_mem)); + mem_ptr = trie->ngram_mem; + trie->middle_begin = + (middle_t *) ckd_calloc(order - 2, sizeof(*trie->middle_begin)); + trie->middle_end = trie->middle_begin + (order - 2); + middle_starts = + (uint8 **) ckd_calloc(order - 2, sizeof(*middle_starts)); + for (i = 2; i < order; i++) { + middle_starts[i - 2] = mem_ptr; + mem_ptr += + middle_size(lm_trie_quant_msize(trie->quant), counts[i - 1], + counts[0], counts[i]); + } + trie->longest = (longest_t *) ckd_calloc(1, sizeof(*trie->longest)); + /* Crazy backwards thing so we initialize using pointers to ones that have already been initialized */ + for (i = order - 1; i >= 2; --i) { + middle_t *middle_ptr = &trie->middle_begin[i - 2]; + middle_init(middle_ptr, middle_starts[i - 2], + lm_trie_quant_msize(trie->quant), counts[i - 1], + counts[0], counts[i], + (i == + order - + 1) ? (void *) trie->longest : (void *) &trie-> + middle_begin[i - 1]); + } + ckd_free(middle_starts); + longest_init(trie->longest, mem_ptr, lm_trie_quant_lsize(trie->quant), + counts[0]); +} + +void +lm_trie_build(lm_trie_t * trie, ngram_raw_t ** raw_ngrams, uint32 * counts, uint32 *out_counts, + int order) +{ + int i; + + lm_trie_fix_counts(raw_ngrams, counts, out_counts, order); + lm_trie_alloc_ngram(trie, out_counts, order); + + if (order > 1) + E_INFO("Training quantizer\n"); + for (i = 2; i < order; i++) { + lm_trie_quant_train(trie->quant, i, counts[i - 1], + raw_ngrams[i - 2]); + } + lm_trie_quant_train_prob(trie->quant, order, counts[order - 1], + raw_ngrams[order - 2]); + + E_INFO("Building LM trie\n"); + recursive_insert(trie, raw_ngrams, counts, order); + /* Set ending offsets so the last entry will be sized properly */ + /* Last entry for unigrams was already set. */ + if (trie->middle_begin != trie->middle_end) { + middle_t *middle_ptr; + for (middle_ptr = trie->middle_begin; + middle_ptr != trie->middle_end - 1; ++middle_ptr) { + middle_t *next_middle_ptr = middle_ptr + 1; + middle_finish_loading(middle_ptr, + next_middle_ptr->base.insert_index); + } + middle_ptr = trie->middle_end - 1; + middle_finish_loading(middle_ptr, + trie->longest->base.insert_index); + } +} + +unigram_t * +unigram_find(unigram_t * u, uint32 word, node_range_t * next) +{ + unigram_t *ptr = &u[word]; + next->begin = ptr->next; + next->end = (ptr + 1)->next; + return ptr; +} + +static size_t +calc_pivot(uint32 off, uint32 range, uint32 width) +{ + return (size_t) ((off * width) / (range + 1)); +} + +static uint8 +uniform_find(void *base, uint8 total_bits, uint8 key_bits, uint32 key_mask, + uint32 before_it, uint32 before_v, + uint32 after_it, uint32 after_v, uint32 key, uint32 * out) +{ + bitarr_address_t address; + address.base = base; + + /* If we look for unigram added later */ + if (key > after_v) + return FALSE; + + while (after_it - before_it > 1) { + uint32 mid; + uint32 pivot = + before_it + (1 + + calc_pivot(key - before_v, after_v - before_v, + after_it - before_it - 1)); + /* access by pivot */ + address.offset = pivot * (uint32) total_bits; + mid = bitarr_read_int25(address, key_bits, key_mask); + if (mid < key) { + before_it = pivot; + before_v = mid; + } + else if (mid > key) { + after_it = pivot; + after_v = mid; + } + else { + *out = pivot; + return TRUE; + } + } + return FALSE; +} + +static bitarr_address_t +middle_find(middle_t * middle, uint32 word, node_range_t * range) +{ + uint32 at_pointer; + bitarr_address_t address; + + /* finding BitPacked with uniform find */ + if (!uniform_find + ((void *) middle->base.base, middle->base.total_bits, + middle->base.word_bits, middle->base.word_mask, range->begin - 1, + 0, range->end, middle->base.max_vocab, word, &at_pointer)) { + address.base = NULL; + address.offset = 0; + return address; + } + + address.base = middle->base.base; + at_pointer *= middle->base.total_bits; + at_pointer += middle->base.word_bits; + address.offset = at_pointer + middle->quant_bits; + range->begin = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + address.offset += middle->base.total_bits; + range->end = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + address.offset = at_pointer; + + return address; +} + +static bitarr_address_t +longest_find(longest_t * longest, uint32 word, node_range_t * range) +{ + uint32 at_pointer; + bitarr_address_t address; + + /* finding BitPacked with uniform find */ + if (!uniform_find + ((void *) longest->base.base, longest->base.total_bits, + longest->base.word_bits, longest->base.word_mask, + range->begin - 1, 0, range->end, longest->base.max_vocab, word, + &at_pointer)) { + address.base = NULL; + address.offset = 0; + return address; + } + address.base = longest->base.base; + address.offset = + at_pointer * longest->base.total_bits + longest->base.word_bits; + return address; +} + +static float +get_available_prob(lm_trie_t * trie, int32 wid, int32 * hist, + int max_order, int32 n_hist, int32 * n_used) +{ + float prob; + node_range_t node; + bitarr_address_t address; + int order_minus_2; + uint8 independent_left; + int32 *hist_iter, *hist_end; + + *n_used = 1; + prob = unigram_find(trie->unigrams, wid, &node)->prob; + if (n_hist == 0) { + return prob; + } + + /* find ngrams of higher order if any */ + order_minus_2 = 0; + independent_left = (node.begin == node.end); + hist_iter = hist; + hist_end = hist + n_hist; + for (;; order_minus_2++, hist_iter++) { + if (hist_iter == hist_end) + return prob; + if (independent_left) + return prob; + if (order_minus_2 == max_order - 2) + break; + + address = + middle_find(&trie->middle_begin[order_minus_2], *hist_iter, + &node); + independent_left = (address.base == NULL) + || (node.begin == node.end); + + /* didn't find entry */ + if (address.base == NULL) + return prob; + prob = lm_trie_quant_mpread(trie->quant, address, order_minus_2); + *n_used = order_minus_2 + 2; + } + + address = longest_find(trie->longest, *hist_iter, &node); + if (address.base != NULL) { + prob = lm_trie_quant_lpread(trie->quant, address); + *n_used = max_order; + } + return prob; +} + +static float +get_available_backoff(lm_trie_t * trie, int32 start, int32 * hist, + int32 n_hist) +{ + float backoff = 0.0f; + int order_minus_2; + int32 *hist_iter; + node_range_t node; + unigram_t *first_hist = unigram_find(trie->unigrams, hist[0], &node); + if (start <= 1) { + backoff += first_hist->bo; + start = 2; + } + order_minus_2 = start - 2; + for (hist_iter = hist + start - 1; hist_iter < hist + n_hist; + hist_iter++, order_minus_2++) { + bitarr_address_t address = + middle_find(&trie->middle_begin[order_minus_2], *hist_iter, + &node); + if (address.base == NULL) + break; + backoff += + lm_trie_quant_mboread(trie->quant, address, order_minus_2); + } + return backoff; +} + +static float +lm_trie_nobo_score(lm_trie_t * trie, int32 wid, int32 * hist, + int max_order, int32 n_hist, int32 * n_used) +{ + float prob = + get_available_prob(trie, wid, hist, max_order, n_hist, n_used); + if (n_hist < *n_used) + return prob; + return prob + get_available_backoff(trie, *n_used, hist, n_hist); +} + +static float +lm_trie_hist_score(lm_trie_t * trie, int32 wid, int32 * hist, int32 n_hist, + int32 * n_used) +{ + float prob; + int i, j; + node_range_t node; + bitarr_address_t address; + + *n_used = 1; + prob = unigram_find(trie->unigrams, wid, &node)->prob; + if (n_hist == 0) + return prob; + for (i = 0; i < n_hist - 1; i++) { + address = middle_find(&trie->middle_begin[i], hist[i], &node); + if (address.base == NULL) { + for (j = i; j < n_hist; j++) { + prob += trie->backoff_cache[j]; + } + return prob; + } + else { + (*n_used)++; + prob = lm_trie_quant_mpread(trie->quant, address, i); + } + } + address = longest_find(trie->longest, hist[n_hist - 1], &node); + if (address.base == NULL) { + return prob + trie->backoff_cache[n_hist - 1]; + } + else { + (*n_used)++; + return lm_trie_quant_lpread(trie->quant, address); + } +} + +static uint8 +history_matches(int32 * hist, int32 * prev_hist, int32 n_hist) +{ + int i; + for (i = 0; i < n_hist; i++) { + if (hist[i] != prev_hist[i]) { + return FALSE; + } + } + return TRUE; +} + +static void +update_backoff(lm_trie_t * trie, int32 * hist, int32 n_hist) +{ + int i; + node_range_t node; + bitarr_address_t address; + + memset(trie->backoff_cache, 0, sizeof(trie->backoff_cache)); + trie->backoff_cache[0] = unigram_find(trie->unigrams, hist[0], &node)->bo; + for (i = 1; i < n_hist; i++) { + address = middle_find(&trie->middle_begin[i - 1], hist[i], &node); + if (address.base == NULL) { + break; + } + trie->backoff_cache[i] = + lm_trie_quant_mboread(trie->quant, address, i - 1); + } + memcpy(trie->hist_cache, hist, n_hist * sizeof(*hist)); +} + +float +lm_trie_score(lm_trie_t * trie, int order, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used) +{ + if (n_hist < order - 1) { + return lm_trie_nobo_score(trie, wid, hist, order, n_hist, n_used); + } + else { + assert(n_hist == order - 1); + if (!history_matches(hist, (int32 *) trie->hist_cache, n_hist)) { + update_backoff(trie, hist, n_hist); + } + return lm_trie_hist_score(trie, wid, hist, n_hist, n_used); + } +} + +void +lm_trie_fill_raw_ngram(lm_trie_t * trie, + ngram_raw_t * raw_ngrams, uint32 * raw_ngram_idx, + uint32 * counts, node_range_t range, uint32 * hist, + int n_hist, int order, int max_order) +{ + if (n_hist > 0 && range.begin == range.end) { + return; + } + if (n_hist == 0) { + uint32 i; + for (i = 0; i < counts[0]; i++) { + node_range_t node; + unigram_find(trie->unigrams, i, &node); + hist[0] = i; + lm_trie_fill_raw_ngram(trie, raw_ngrams, raw_ngram_idx, counts, + node, hist, 1, order, max_order); + } + } + else if (n_hist < order - 1) { + uint32 ptr; + node_range_t node; + bitarr_address_t address; + uint32 new_word; + middle_t *middle = &trie->middle_begin[n_hist - 1]; + for (ptr = range.begin; ptr < range.end; ptr++) { + address.base = middle->base.base; + address.offset = ptr * middle->base.total_bits; + new_word = + bitarr_read_int25(address, middle->base.word_bits, + middle->base.word_mask); + hist[n_hist] = new_word; + address.offset += middle->base.word_bits + middle->quant_bits; + node.begin = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + address.offset = + (ptr + 1) * middle->base.total_bits + + middle->base.word_bits + middle->quant_bits; + node.end = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + lm_trie_fill_raw_ngram(trie, raw_ngrams, raw_ngram_idx, counts, + node, hist, n_hist + 1, order, max_order); + } + } + else { + bitarr_address_t address; + uint32 ptr; + float prob, backoff; + int i; + assert(n_hist == order - 1); + for (ptr = range.begin; ptr < range.end; ptr++) { + ngram_raw_t *raw_ngram = &raw_ngrams[*raw_ngram_idx]; + if (order == max_order) { + longest_t *longest = trie->longest; + address.base = longest->base.base; + address.offset = ptr * longest->base.total_bits; + hist[n_hist] = + bitarr_read_int25(address, longest->base.word_bits, + longest->base.word_mask); + address.offset += longest->base.word_bits; + prob = lm_trie_quant_lpread(trie->quant, address); + } + else { + middle_t *middle = &trie->middle_begin[n_hist - 1]; + address.base = middle->base.base; + address.offset = ptr * middle->base.total_bits; + hist[n_hist] = + bitarr_read_int25(address, middle->base.word_bits, + middle->base.word_mask); + address.offset += middle->base.word_bits; + prob = + lm_trie_quant_mpread(trie->quant, address, n_hist - 1); + backoff = + lm_trie_quant_mboread(trie->quant, address, + n_hist - 1); + raw_ngram->backoff = backoff; + } + raw_ngram->prob = prob; + raw_ngram->words = + (uint32 *) ckd_calloc(order, sizeof(*raw_ngram->words)); + for (i = 0; i <= n_hist; i++) { + raw_ngram->words[i] = hist[n_hist - i]; + } + (*raw_ngram_idx)++; + } + } +} diff --git a/src/libsphinxbase/lm/lm_trie.h b/src/libsphinxbase/lm/lm_trie.h new file mode 100644 index 000000000..c5bf460c5 --- /dev/null +++ b/src/libsphinxbase/lm/lm_trie.h @@ -0,0 +1,114 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __LM_TRIE_H__ +#define __LM_TRIE_H__ + +#include +#include + +#include "ngram_model_internal.h" +#include "lm_trie_quant.h" + +typedef struct unigram_s { + float prob; + float bo; + uint32 next; +} unigram_t; + +typedef struct node_range_s { + uint32 begin; + uint32 end; +} node_range_t; + +typedef struct base_s { + uint8 word_bits; + uint8 total_bits; + uint32 word_mask; + uint8 *base; + uint32 insert_index; + uint32 max_vocab; +} base_t; + +typedef struct middle_s { + base_t base; + bitarr_mask_t next_mask; + uint8 quant_bits; + void *next_source; +} middle_t; + +typedef struct longest_s { + base_t base; + uint8 quant_bits; +} longest_t; + +typedef struct lm_trie_s { + uint8 *ngram_mem; + size_t ngram_mem_size; + unigram_t *unigrams; + middle_t *middle_begin; + middle_t *middle_end; + longest_t *longest; + lm_trie_quant_t *quant; + + float backoff_cache[NGRAM_MAX_ORDER]; + uint32 hist_cache[NGRAM_MAX_ORDER - 1]; +} lm_trie_t; + +/** + * Creates lm_trie structure. Fills it if binary file with correspondent data is provided + */ +lm_trie_t *lm_trie_create(uint32 unigram_count, int order); + +lm_trie_t *lm_trie_read_bin(uint32 * counts, int order, FILE * fp); + +void lm_trie_write_bin(lm_trie_t * trie, uint32 unigram_count, FILE * fp); + +void lm_trie_free(lm_trie_t * trie); + +void lm_trie_build(lm_trie_t * trie, ngram_raw_t ** raw_ngrams, + uint32 * counts, uint32 *out_counts, int order); + +void lm_trie_fill_raw_ngram(lm_trie_t * trie, + ngram_raw_t * raw_ngrams, uint32 * raw_ngram_idx, + uint32 * counts, node_range_t range, uint32 * hist, + int n_hist, int order, int max_order); + +float lm_trie_score(lm_trie_t * trie, int order, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used); + +#endif /* __LM_TRIE_H__ */ diff --git a/src/libsphinxbase/lm/lm_trie_quant.c b/src/libsphinxbase/lm/lm_trie_quant.c new file mode 100644 index 000000000..525e69daa --- /dev/null +++ b/src/libsphinxbase/lm/lm_trie_quant.c @@ -0,0 +1,321 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include + +#include +#include +#include + +#include "ngram_model_internal.h" +#include "lm_trie_quant.h" + +#define FLOAT_INF (0x7f800000) + +typedef struct bins_s { + float *begin; + const float *end; +} bins_t; + +struct lm_trie_quant_s { + bins_t tables[NGRAM_MAX_ORDER - 1][2]; + bins_t *longest; + uint8 *mem; + size_t mem_size; + uint8 prob_bits; + uint8 bo_bits; + uint32 prob_mask; + uint32 bo_mask; +}; + +static void +bins_create(bins_t * bins, uint8 bits, float *begin) +{ + bins->begin = begin; + bins->end = bins->begin + (1ULL << bits); +} + +static float * +lower_bound(float *first, const float *last, float val) +{ + int count, step; + float *it; + + count = last - first; + while (count > 0) { + it = first; + step = count / 2; + it += step; + if (*it < val) { + first = ++it; + count -= step + 1; + } + else { + count = step; + } + } + return first; +} + +static uint64 +bins_encode(bins_t * bins, float value) +{ + float *above = lower_bound(bins->begin, bins->end, value); + if (above == bins->begin) + return 0; + if (above == bins->end) + return bins->end - bins->begin - 1; + return above - bins->begin - (value - *(above - 1) < *above - value); +} + +static float +bins_decode(bins_t * bins, size_t off) +{ + return bins->begin[off]; +} + +static size_t +quant_size(int order) +{ + int prob_bits = 16; + int bo_bits = 16; + size_t longest_table = (1U << prob_bits) * sizeof(float); + size_t middle_table = (1U << bo_bits) * sizeof(float) + longest_table; + /* unigrams are currently not quantized so no need for a table. */ + return (order - 2) * middle_table + longest_table; +} + +lm_trie_quant_t * +lm_trie_quant_create(int order) +{ + float *start; + int i; + lm_trie_quant_t *quant = + (lm_trie_quant_t *) ckd_calloc(1, sizeof(*quant)); + quant->mem_size = quant_size(order); + quant->mem = + (uint8 *) ckd_calloc(quant->mem_size, sizeof(*quant->mem)); + + quant->prob_bits = 16; + quant->bo_bits = 16; + quant->prob_mask = (1U << quant->prob_bits) - 1; + quant->bo_mask = (1U << quant->bo_bits) - 1; + + start = (float *) (quant->mem); + for (i = 0; i < order - 2; i++) { + bins_create(&quant->tables[i][0], quant->prob_bits, start); + start += (1ULL << quant->prob_bits); + bins_create(&quant->tables[i][1], quant->bo_bits, start); + start += (1ULL << quant->bo_bits); + } + bins_create(&quant->tables[order - 2][0], quant->prob_bits, start); + quant->longest = &quant->tables[order - 2][0]; + return quant; +} + + +lm_trie_quant_t * +lm_trie_quant_read_bin(FILE * fp, int order) +{ + int dummy; + lm_trie_quant_t *quant; + + fread(&dummy, sizeof(dummy), 1, fp); + quant = lm_trie_quant_create(order); + fread(quant->mem, sizeof(*quant->mem), quant->mem_size, fp); + + return quant; +} + +void +lm_trie_quant_write_bin(lm_trie_quant_t * quant, FILE * fp) +{ + /* Before it was quantization type */ + int dummy = 1; + fwrite(&dummy, sizeof(dummy), 1, fp); + fwrite(quant->mem, sizeof(*quant->mem), quant->mem_size, fp); +} + +void +lm_trie_quant_free(lm_trie_quant_t * quant) +{ + if (quant->mem) + ckd_free(quant->mem); + ckd_free(quant); +} + +uint8 +lm_trie_quant_msize(lm_trie_quant_t * quant) +{ + return 32; +} + +uint8 +lm_trie_quant_lsize(lm_trie_quant_t * quant) +{ + return 16; +} + +static int +weights_comparator(const void *a, const void *b) +{ + return (int) (*(float *) a - *(float *) b); +} + +static void +make_bins(float *values, uint32 values_num, float *centers, uint32 bins) +{ + float *finish, *start; + uint32 i; + + qsort(values, values_num, sizeof(*values), &weights_comparator); + start = values; + for (i = 0; i < bins; i++, centers++, start = finish) { + finish = values + (size_t) ((uint64) values_num * (i + 1) / bins); + if (finish == start) { + /* zero length bucket. */ + *centers = i ? *(centers - 1) : -FLOAT_INF; + } + else { + float sum = 0.0f; + float *ptr; + for (ptr = start; ptr != finish; ptr++) { + sum += *ptr; + } + *centers = sum / (float) (finish - start); + } + } +} + +void +lm_trie_quant_train(lm_trie_quant_t * quant, int order, uint32 counts, + ngram_raw_t * raw_ngrams) +{ + float *probs; + float *backoffs; + float *centers; + uint32 backoff_num; + uint32 prob_num; + ngram_raw_t *raw_ngrams_end; + + probs = (float *) ckd_calloc(counts, sizeof(*probs)); + backoffs = (float *) ckd_calloc(counts, sizeof(*backoffs)); + raw_ngrams_end = raw_ngrams + counts; + + for (backoff_num = 0, prob_num = 0; raw_ngrams != raw_ngrams_end; + raw_ngrams++) { + probs[prob_num++] = raw_ngrams->prob; + backoffs[backoff_num++] = raw_ngrams->backoff; + } + + make_bins(probs, prob_num, quant->tables[order - 2][0].begin, + 1ULL << quant->prob_bits); + centers = quant->tables[order - 2][1].begin; + make_bins(backoffs, backoff_num, centers, (1ULL << quant->bo_bits)); + ckd_free(probs); + ckd_free(backoffs); +} + +void +lm_trie_quant_train_prob(lm_trie_quant_t * quant, int order, uint32 counts, + ngram_raw_t * raw_ngrams) +{ + float *probs; + uint32 prob_num; + ngram_raw_t *raw_ngrams_end; + + probs = (float *) ckd_calloc(counts, sizeof(*probs)); + raw_ngrams_end = raw_ngrams + counts; + + for (prob_num = 0; raw_ngrams != raw_ngrams_end; raw_ngrams++) { + probs[prob_num++] = raw_ngrams->prob; + } + + make_bins(probs, prob_num, quant->tables[order - 2][0].begin, + 1ULL << quant->prob_bits); + ckd_free(probs); +} + +void +lm_trie_quant_mwrite(lm_trie_quant_t * quant, bitarr_address_t address, + int order_minus_2, float prob, float backoff) +{ + bitarr_write_int57(address, quant->prob_bits + quant->bo_bits, + (uint64) ((bins_encode + (&quant->tables[order_minus_2][0], + prob) << quant-> + bo_bits) | bins_encode(&quant-> + tables + [order_minus_2] + [1], + backoff))); +} + +void +lm_trie_quant_lwrite(lm_trie_quant_t * quant, bitarr_address_t address, + float prob) +{ + bitarr_write_int25(address, quant->prob_bits, + (uint32) bins_encode(quant->longest, prob)); +} + +float +lm_trie_quant_mboread(lm_trie_quant_t * quant, bitarr_address_t address, + int order_minus_2) +{ + return bins_decode(&quant->tables[order_minus_2][1], + bitarr_read_int25(address, quant->bo_bits, + quant->bo_mask)); +} + +float +lm_trie_quant_mpread(lm_trie_quant_t * quant, bitarr_address_t address, + int order_minus_2) +{ + address.offset += quant->bo_bits; + return bins_decode(&quant->tables[order_minus_2][0], + bitarr_read_int25(address, quant->prob_bits, + quant->prob_mask)); +} + +float +lm_trie_quant_lpread(lm_trie_quant_t * quant, bitarr_address_t address) +{ + return bins_decode(quant->longest, + bitarr_read_int25(address, quant->prob_bits, + quant->prob_mask)); +} diff --git a/src/libsphinxbase/lm/lm_trie_quant.h b/src/libsphinxbase/lm/lm_trie_quant.h new file mode 100644 index 000000000..5e88bee94 --- /dev/null +++ b/src/libsphinxbase/lm/lm_trie_quant.h @@ -0,0 +1,121 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef __LM_TRIE_QUANT_H__ +#define __LM_TRIE_QUANT_H__ + +#include + +#include "ngrams_raw.h" + +typedef struct lm_trie_quant_s lm_trie_quant_t; + +/** + * Create qunatizing + */ +lm_trie_quant_t *lm_trie_quant_create(int order); + +/** + * Write quant data to binary file + */ +lm_trie_quant_t *lm_trie_quant_read_bin(FILE * fp, int order); + +/** + * Write quant data to binary file + */ +void lm_trie_quant_write_bin(lm_trie_quant_t * quant, FILE * fp); + +/** + * Free quant + */ +void lm_trie_quant_free(lm_trie_quant_t * quant); + +/** + * Memory required for storing weights of middle-order ngrams. + * Both backoff and probability should be stored + */ +uint8 lm_trie_quant_msize(lm_trie_quant_t * quant); + +/** + * Memory required for storing weights of largest-order ngrams. + * Only probability should be stored + */ +uint8 lm_trie_quant_lsize(lm_trie_quant_t * quant); + +/** + * Trains prob and backoff quantizer for specified ngram order on provided raw ngram list + */ +void lm_trie_quant_train(lm_trie_quant_t * quant, int order, uint32 counts, + ngram_raw_t * raw_ngrams); + +/** + * Trains only prob quantizer for specified ngram order on provided raw ngram list + */ +void lm_trie_quant_train_prob(lm_trie_quant_t * quant, int order, + uint32 counts, ngram_raw_t * raw_ngrams); + +/** + * Writes specified weight for middle-order ngram. Quantize it if needed + */ +void lm_trie_quant_mwrite(lm_trie_quant_t * quant, + bitarr_address_t address, int order_minus_2, + float prob, float backoff); + +/** + * Writes specified weight for largest-order ngram. Quantize it if needed + */ +void lm_trie_quant_lwrite(lm_trie_quant_t * quant, + bitarr_address_t address, float prob); + +/** + * Reads and decodes if needed backoff for middle-order ngram + */ +float lm_trie_quant_mboread(lm_trie_quant_t * quant, + bitarr_address_t address, int order_minus_2); + +/** + * Reads and decodes if needed prob for middle-order ngram + */ +float lm_trie_quant_mpread(lm_trie_quant_t * quant, + bitarr_address_t address, int order_minus_2); + +/** + * Reads and decodes if needed prob for largest-order ngram + */ +float lm_trie_quant_lpread(lm_trie_quant_t * quant, + bitarr_address_t address); + +#endif /* __LM_TRIE_QUANT_H__ */ diff --git a/src/libsphinxbase/lm/ngram_model.c b/src/libsphinxbase/lm/ngram_model.c new file mode 100644 index 000000000..5e4f2853d --- /dev/null +++ b/src/libsphinxbase/lm/ngram_model.c @@ -0,0 +1,1063 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * \file ngram_model.c N-Gram language models. + * + * Author: David Huggins-Daines, much code taken from sphinx3/src/libs3decoder/liblm + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "sphinxbase/ngram_model.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/filename.h" +#include "sphinxbase/pio.h" +#include "sphinxbase/err.h" +#include "sphinxbase/logmath.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/case.h" + +#include "ngram_model_internal.h" +#include "ngram_model_trie.h" + +ngram_file_type_t +ngram_file_name_to_type(const char *file_name) +{ + const char *ext; + + ext = strrchr(file_name, '.'); + if (ext == NULL) { + return NGRAM_INVALID; + } + if (0 == strcmp_nocase(ext, ".gz")) { + while (--ext >= file_name) { + if (*ext == '.') + break; + } + if (ext < file_name) { + return NGRAM_INVALID; + } + } + else if (0 == strcmp_nocase(ext, ".bz2")) { + while (--ext >= file_name) { + if (*ext == '.') + break; + } + if (ext < file_name) { + return NGRAM_INVALID; + } + } + /* We use strncmp because there might be a .gz on the end. */ + if (0 == strncmp_nocase(ext, ".ARPA", 5)) + return NGRAM_ARPA; + if (0 == strncmp_nocase(ext, ".DMP", 4) + || 0 == strncmp_nocase(ext, ".BIN", 4)) + return NGRAM_BIN; + return NGRAM_INVALID; +} + +ngram_file_type_t +ngram_str_to_type(const char *str_name) +{ + if (0 == strcmp_nocase(str_name, "arpa")) + return NGRAM_ARPA; + if (0 == strcmp_nocase(str_name, "dmp") + || 0 == strcmp_nocase(str_name, "bin")) + return NGRAM_BIN; + return NGRAM_INVALID; +} + +char const * +ngram_type_to_str(int type) +{ + switch (type) { + case NGRAM_ARPA: + return "arpa"; + case NGRAM_BIN: + return "dmp/bin"; + default: + return NULL; + } +} + + +ngram_model_t * +ngram_model_read(cmd_ln_t * config, + const char *file_name, + ngram_file_type_t file_type, logmath_t * lmath) +{ + ngram_model_t *model = NULL; + switch (file_type) { + case NGRAM_AUTO:{ + if ((model = + ngram_model_trie_read_bin(config, file_name, + lmath)) != NULL) + break; + if ((model = + ngram_model_trie_read_arpa(config, file_name, + lmath)) != NULL) + break; + if ((model = + ngram_model_trie_read_dmp(config, file_name, + lmath)) != NULL) + break; + return NULL; + } + case NGRAM_ARPA: + model = ngram_model_trie_read_arpa(config, file_name, lmath); + break; + case NGRAM_BIN: + if ((model = + ngram_model_trie_read_bin(config, file_name, lmath)) != NULL) + break; + if ((model = + ngram_model_trie_read_dmp(config, file_name, lmath)) != NULL) + break; + return NULL; + default: + E_ERROR("language model file type not supported\n"); + return NULL; + } + + /* Now set weights based on config if present. */ + if (config) { + float32 lw = 1.0; + float32 wip = 1.0; + + if (cmd_ln_exists_r(config, "-lw")) + lw = cmd_ln_float32_r(config, "-lw"); + if (cmd_ln_exists_r(config, "-wip")) + wip = cmd_ln_float32_r(config, "-wip"); + + ngram_model_apply_weights(model, lw, wip); + } + + return model; +} + +int +ngram_model_write(ngram_model_t * model, const char *file_name, + ngram_file_type_t file_type) +{ + switch (file_type) { + case NGRAM_AUTO:{ + file_type = ngram_file_name_to_type(file_name); + /* Default to ARPA (catches .lm and other things) */ + if (file_type == NGRAM_INVALID) + file_type = NGRAM_ARPA; + return ngram_model_write(model, file_name, file_type); + } + case NGRAM_ARPA: + return ngram_model_trie_write_arpa(model, file_name); + case NGRAM_BIN: + return ngram_model_trie_write_bin(model, file_name); + default: + E_ERROR("language model file type not supported\n"); + return -1; + } + E_ERROR("language model file type not supported\n"); + return -1; +} + +int32 +ngram_model_init(ngram_model_t * base, + ngram_funcs_t * funcs, + logmath_t * lmath, int32 n, int32 n_unigram) +{ + base->refcount = 1; + base->funcs = funcs; + base->n = n; + /* If this was previously initialized... */ + if (base->n_counts == NULL) + base->n_counts = (uint32 *) ckd_calloc(n, sizeof(*base->n_counts)); + /* Don't reset weights if logmath object hasn't changed. */ + if (base->lmath != lmath) { + /* Set default values for weights. */ + base->lw = 1.0; + base->log_wip = 0; /* i.e. 1.0 */ + base->log_zero = logmath_get_zero(lmath); + base->lmath = lmath; + } + /* Allocate or reallocate space for word strings. */ + if (base->word_str) { + /* Free all previous word strings if they were allocated. */ + if (base->writable) { + int32 i; + for (i = 0; i < base->n_words; ++i) { + ckd_free(base->word_str[i]); + base->word_str[i] = NULL; + } + } + base->word_str = + (char **) ckd_realloc(base->word_str, + n_unigram * sizeof(char *)); + } + else { + base->word_str = (char **) ckd_calloc(n_unigram, sizeof(char *)); + } + /* NOTE: They are no longer case-insensitive since we are allowing + * other encodings for word strings. Beware. */ + if (base->wid) + hash_table_empty(base->wid); + else + base->wid = hash_table_new(n_unigram, FALSE); + base->n_counts[0] = base->n_1g_alloc = base->n_words = n_unigram; + + return 0; +} + +ngram_model_t * +ngram_model_retain(ngram_model_t * model) +{ + ++model->refcount; + return model; +} + +void +ngram_model_flush(ngram_model_t * model) +{ + if (model->funcs && model->funcs->flush) + (*model->funcs->flush) (model); +} + +int +ngram_model_free(ngram_model_t * model) +{ + int i; + + if (model == NULL) + return 0; + if (--model->refcount > 0) + return model->refcount; + if (model->funcs && model->funcs->free) + (*model->funcs->free) (model); + if (model->writable) { + /* Free all words. */ + for (i = 0; i < model->n_words; ++i) { + ckd_free(model->word_str[i]); + } + } + else { + /* Free all class words. */ + for (i = 0; i < model->n_classes; ++i) { + ngram_class_t *lmclass; + int32 j; + + lmclass = model->classes[i]; + for (j = 0; j < lmclass->n_words; ++j) { + ckd_free(model->word_str[lmclass->start_wid + j]); + } + for (j = 0; j < lmclass->n_hash; ++j) { + if (lmclass->nword_hash[j].wid != -1) { + ckd_free(model->word_str[lmclass->nword_hash[j].wid]); + } + } + } + } + for (i = 0; i < model->n_classes; ++i) { + ngram_class_free(model->classes[i]); + } + ckd_free(model->classes); + hash_table_free(model->wid); + ckd_free(model->word_str); + ckd_free(model->n_counts); + ckd_free(model); + return 0; +} + +int +ngram_model_casefold(ngram_model_t * model, int kase) +{ + int writable, i; + hash_table_t *new_wid; + + /* Were word strings already allocated? */ + writable = model->writable; + /* Either way, we are going to allocate some word strings. */ + model->writable = TRUE; + + /* And, don't forget, we need to rebuild the word to unigram ID + * mapping. */ + new_wid = hash_table_new(model->n_words, FALSE); + for (i = 0; i < model->n_words; ++i) { + char *outstr; + if (writable) { + outstr = model->word_str[i]; + } + else { + outstr = ckd_salloc(model->word_str[i]); + } + /* Don't case-fold or [classes] */ + if (outstr[0] == '<' || outstr[0] == '[') { + } + else { + switch (kase) { + case NGRAM_UPPER: + ucase(outstr); + break; + case NGRAM_LOWER: + lcase(outstr); + break; + default: + ; + } + } + model->word_str[i] = outstr; + + /* Now update the hash table. We might have terrible + * collisions here, so warn about them. */ + if (hash_table_enter_int32(new_wid, model->word_str[i], i) != i) { + E_WARN("Duplicate word in dictionary after conversion: %s\n", + model->word_str[i]); + } + } + /* Swap out the hash table. */ + hash_table_free(model->wid); + model->wid = new_wid; + return 0; +} + +int +ngram_model_apply_weights(ngram_model_t * model, float32 lw, float32 wip) +{ + return (*model->funcs->apply_weights) (model, lw, wip); +} + +float32 +ngram_model_get_weights(ngram_model_t * model, int32 * out_log_wip) +{ + if (out_log_wip) + *out_log_wip = model->log_wip; + return model->lw; +} + + +int32 +ngram_ng_score(ngram_model_t * model, int32 wid, int32 * history, + int32 n_hist, int32 * n_used) +{ + int32 score, class_weight = 0; + int i; + + /* Closed vocabulary, OOV word probability is zero */ + if (wid == NGRAM_INVALID_WID) + return model->log_zero; + + /* "Declassify" wid and history */ + if (NGRAM_IS_CLASSWID(wid)) { + ngram_class_t *lmclass = model->classes[NGRAM_CLASSID(wid)]; + + class_weight = ngram_class_prob(lmclass, wid); + if (class_weight == 1) /* Meaning, not found in class. */ + return model->log_zero; + wid = lmclass->tag_wid; + } + for (i = 0; i < n_hist; ++i) { + if (history[i] != NGRAM_INVALID_WID + && NGRAM_IS_CLASSWID(history[i])) + history[i] = + model->classes[NGRAM_CLASSID(history[i])]->tag_wid; + } + score = (*model->funcs->score) (model, wid, history, n_hist, n_used); + + /* Multiply by unigram in-class weight. */ + return score + class_weight; +} + +int32 +ngram_score(ngram_model_t * model, const char *word, ...) +{ + va_list history; + const char *hword; + int32 *histid; + int32 n_hist; + int32 n_used; + int32 prob; + + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) + ++n_hist; + va_end(history); + + histid = ckd_calloc(n_hist, sizeof(*histid)); + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) { + histid[n_hist] = ngram_wid(model, hword); + ++n_hist; + } + va_end(history); + + prob = ngram_ng_score(model, ngram_wid(model, word), + histid, n_hist, &n_used); + ckd_free(histid); + return prob; +} + +int32 +ngram_tg_score(ngram_model_t * model, int32 w3, int32 w2, int32 w1, + int32 * n_used) +{ + int32 hist[2]; + hist[0] = w2; + hist[1] = w1; + return ngram_ng_score(model, w3, hist, 2, n_used); +} + +int32 +ngram_bg_score(ngram_model_t * model, int32 w2, int32 w1, int32 * n_used) +{ + return ngram_ng_score(model, w2, &w1, 1, n_used); +} + +int32 +ngram_ng_prob(ngram_model_t * model, int32 wid, int32 * history, + int32 n_hist, int32 * n_used) +{ + int32 prob, class_weight = 0; + int i; + + /* Closed vocabulary, OOV word probability is zero */ + if (wid == NGRAM_INVALID_WID) + return model->log_zero; + + /* "Declassify" wid and history */ + if (NGRAM_IS_CLASSWID(wid)) { + ngram_class_t *lmclass = model->classes[NGRAM_CLASSID(wid)]; + + class_weight = ngram_class_prob(lmclass, wid); + if (class_weight == 1) /* Meaning, not found in class. */ + return class_weight; + wid = lmclass->tag_wid; + } + for (i = 0; i < n_hist; ++i) { + if (history[i] != NGRAM_INVALID_WID + && NGRAM_IS_CLASSWID(history[i])) + history[i] = + model->classes[NGRAM_CLASSID(history[i])]->tag_wid; + } + prob = (*model->funcs->raw_score) (model, wid, history, + n_hist, n_used); + /* Multiply by unigram in-class weight. */ + return prob + class_weight; +} + +int32 +ngram_probv(ngram_model_t * model, const char *word, ...) +{ + va_list history; + const char *hword; + int32 *histid; + int32 n_hist; + int32 n_used; + int32 prob; + + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) + ++n_hist; + va_end(history); + + histid = ckd_calloc(n_hist, sizeof(*histid)); + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) { + histid[n_hist] = ngram_wid(model, hword); + ++n_hist; + } + va_end(history); + + prob = ngram_ng_prob(model, ngram_wid(model, word), + histid, n_hist, &n_used); + ckd_free(histid); + return prob; +} + +int32 +ngram_prob(ngram_model_t * model, const char* const *words, int32 n) +{ + int32 *ctx_id; + int32 nused; + int32 prob; + int32 wid; + uint32 i; + + ctx_id = (int32 *) ckd_calloc(n - 1, sizeof(*ctx_id)); + for (i = 1; i < (uint32) n; ++i) + ctx_id[i - 1] = ngram_wid(model, words[i]); + + wid = ngram_wid(model, *words); + prob = ngram_ng_prob(model, wid, ctx_id, n - 1, &nused); + ckd_free(ctx_id); + + return prob; +} + +int32 +ngram_score_to_prob(ngram_model_t * base, int32 score) +{ + int32 prob; + + /* Undo insertion penalty. */ + prob = score - base->log_wip; + /* Undo language weight. */ + prob = (int32) (prob / base->lw); + + return prob; +} + +int32 +ngram_unknown_wid(ngram_model_t * model) +{ + int32 val; + + /* FIXME: This could be memoized for speed if necessary. */ + /* Look up , if not found return NGRAM_INVALID_WID. */ + if (hash_table_lookup_int32(model->wid, "", &val) == -1) + return NGRAM_INVALID_WID; + else + return val; +} + +int32 +ngram_zero(ngram_model_t * model) +{ + return model->log_zero; +} + +int32 +ngram_model_get_size(ngram_model_t * model) +{ + if (model != NULL) + return model->n; + return 0; +} + +uint32 const * +ngram_model_get_counts(ngram_model_t * model) +{ + if (model != NULL) + return model->n_counts; + return NULL; +} + +int32 +ngram_wid(ngram_model_t * model, const char *word) +{ + int32 val; + + if (hash_table_lookup_int32(model->wid, word, &val) == -1) + return ngram_unknown_wid(model); + else + return val; +} + +const char * +ngram_word(ngram_model_t * model, int32 wid) +{ + /* Remove any class tag */ + wid = NGRAM_BASEWID(wid); + if (wid >= model->n_words) + return NULL; + return model->word_str[wid]; +} + +/** + * Add a word to the word string and ID mapping. + */ +int32 +ngram_add_word_internal(ngram_model_t * model, + const char *word, int32 classid) +{ + + /* Check for hash collisions. */ + int32 wid; + if (hash_table_lookup_int32(model->wid, word, &wid) == 0) { + E_WARN("Omit duplicate word '%s'\n", word); + return wid; + } + + /* Take the next available word ID */ + wid = model->n_words; + if (classid >= 0) { + wid = NGRAM_CLASSWID(wid, classid); + } + + /* Reallocate word_str if necessary. */ + if (model->n_words >= model->n_1g_alloc) { + model->n_1g_alloc += UG_ALLOC_STEP; + model->word_str = ckd_realloc(model->word_str, + sizeof(*model->word_str) * + model->n_1g_alloc); + } + /* Add the word string in the appropriate manner. */ + /* Class words are always dynamically allocated. */ + model->word_str[model->n_words] = ckd_salloc(word); + /* Now enter it into the hash table. */ + if (hash_table_enter_int32 + (model->wid, model->word_str[model->n_words], wid) != wid) { + E_ERROR + ("Hash insertion failed for word %s => %p (should not happen)\n", + model->word_str[model->n_words], (void *) (long) (wid)); + } + /* Increment number of words. */ + ++model->n_words; + return wid; +} + +int32 +ngram_model_add_word(ngram_model_t * model, + const char *word, float32 weight) +{ + int32 wid, prob = model->log_zero; + + /* If we add word to unwritable model, we need to make it writable */ + if (!model->writable) { + E_WARN("Can't add word '%s' to read-only language model. " + "Disable mmap with '-mmap no' to make it writable\n", word); + return -1; + } + + wid = ngram_add_word_internal(model, word, -1); + if (wid == NGRAM_INVALID_WID) + return wid; + + /* Do what needs to be done to add the word to the unigram. */ + if (model->funcs && model->funcs->add_ug) + prob = + (*model->funcs->add_ug) (model, wid, + logmath_log(model->lmath, weight)); + if (prob == 0) + return -1; + + return wid; +} + +ngram_class_t * +ngram_class_new(ngram_model_t * model, int32 tag_wid, int32 start_wid, + glist_t classwords) +{ + ngram_class_t *lmclass; + gnode_t *gn; + float32 tprob; + int i; + + lmclass = ckd_calloc(1, sizeof(*lmclass)); + lmclass->tag_wid = tag_wid; + /* wid_base is the wid (minus class tag) of the first word in the list. */ + lmclass->start_wid = start_wid; + lmclass->n_words = glist_count(classwords); + lmclass->prob1 = ckd_calloc(lmclass->n_words, sizeof(*lmclass->prob1)); + lmclass->nword_hash = NULL; + lmclass->n_hash = 0; + tprob = 0.0; + for (gn = classwords; gn; gn = gnode_next(gn)) { + tprob += gnode_float32(gn); + } + if (tprob > 1.1 || tprob < 0.9) { + E_INFO("Total class probability is %f, will normalize\n", tprob); + for (gn = classwords; gn; gn = gnode_next(gn)) { + gn->data.fl /= tprob; + } + } + for (i = 0, gn = classwords; gn; ++i, gn = gnode_next(gn)) { + lmclass->prob1[i] = logmath_log(model->lmath, gnode_float32(gn)); + } + + return lmclass; +} + +int32 +ngram_class_add_word(ngram_class_t * lmclass, int32 wid, int32 lweight) +{ + int32 hash; + + if (lmclass->nword_hash == NULL) { + /* Initialize everything in it to -1 */ + lmclass->nword_hash = + ckd_malloc(NGRAM_HASH_SIZE * sizeof(*lmclass->nword_hash)); + memset(lmclass->nword_hash, 0xff, + NGRAM_HASH_SIZE * sizeof(*lmclass->nword_hash)); + lmclass->n_hash = NGRAM_HASH_SIZE; + lmclass->n_hash_inuse = 0; + } + /* Stupidest possible hash function. This will work pretty well + * when this function is called repeatedly with contiguous word + * IDs, though... */ + hash = wid & (lmclass->n_hash - 1); + if (lmclass->nword_hash[hash].wid == -1) { + /* Good, no collision. */ + lmclass->nword_hash[hash].wid = wid; + lmclass->nword_hash[hash].prob1 = lweight; + ++lmclass->n_hash_inuse; + return hash; + } + else { + int32 next; /**< Next available bucket. */ + /* Collision... Find the end of the hash chain. */ + while (lmclass->nword_hash[hash].next != -1) + hash = lmclass->nword_hash[hash].next; + assert(hash != -1); + /* Does we has any more bukkit? */ + if (lmclass->n_hash_inuse == lmclass->n_hash) { + /* Oh noes! Ok, we makes more. */ + lmclass->nword_hash = ckd_realloc(lmclass->nword_hash, + lmclass->n_hash * 2 * + sizeof(*lmclass-> + nword_hash)); + memset(lmclass->nword_hash + lmclass->n_hash, 0xff, + lmclass->n_hash * sizeof(*lmclass->nword_hash)); + /* Just use the next allocated one (easy) */ + next = lmclass->n_hash; + lmclass->n_hash *= 2; + } + else { + /* Look for any available bucket. We hope this doesn't happen. */ + for (next = 0; next < lmclass->n_hash; ++next) + if (lmclass->nword_hash[next].wid == -1) + break; + /* This should absolutely not happen. */ + assert(next != lmclass->n_hash); + } + lmclass->nword_hash[next].wid = wid; + lmclass->nword_hash[next].prob1 = lweight; + lmclass->nword_hash[hash].next = next; + ++lmclass->n_hash_inuse; + return next; + } +} + +void +ngram_class_free(ngram_class_t * lmclass) +{ + ckd_free(lmclass->nword_hash); + ckd_free(lmclass->prob1); + ckd_free(lmclass); +} + +int32 +ngram_model_add_class_word(ngram_model_t * model, + const char *classname, + const char *word, float32 weight) +{ + ngram_class_t *lmclass; + int32 classid, tag_wid, wid, i, scale; + float32 fprob; + + /* Find the class corresponding to classname. Linear search + * probably okay here since there won't be very many classes, and + * this doesn't have to be fast. */ + tag_wid = ngram_wid(model, classname); + if (tag_wid == NGRAM_INVALID_WID) { + E_ERROR("No such word or class tag: %s\n", classname); + return tag_wid; + } + for (classid = 0; classid < model->n_classes; ++classid) { + if (model->classes[classid]->tag_wid == tag_wid) + break; + } + /* Hmm, no such class. It's probably not a good idea to create one. */ + if (classid == model->n_classes) { + E_ERROR + ("Word %s is not a class tag (call ngram_model_add_class() first)\n", + classname); + return NGRAM_INVALID_WID; + } + lmclass = model->classes[classid]; + + /* Add this word to the model's set of words. */ + wid = ngram_add_word_internal(model, word, classid); + if (wid == NGRAM_INVALID_WID) + return wid; + + /* This is the fixed probability of the new word. */ + fprob = weight * 1.0f / (lmclass->n_words + lmclass->n_hash_inuse + 1); + /* Now normalize everything else to fit it in. This is + * accomplished by simply scaling all the other probabilities + * by (1-fprob). */ + scale = logmath_log(model->lmath, 1.0 - fprob); + for (i = 0; i < lmclass->n_words; ++i) + lmclass->prob1[i] += scale; + for (i = 0; i < lmclass->n_hash; ++i) + if (lmclass->nword_hash[i].wid != -1) + lmclass->nword_hash[i].prob1 += scale; + + /* Now add it to the class hash table. */ + return ngram_class_add_word(lmclass, wid, + logmath_log(model->lmath, fprob)); +} + +int32 +ngram_model_add_class(ngram_model_t * model, + const char *classname, + float32 classweight, + char **words, const float32 * weights, int32 n_words) +{ + ngram_class_t *lmclass; + glist_t classwords = NULL; + int32 i, start_wid = -1; + int32 classid, tag_wid; + + /* Check if classname already exists in model. If not, add it. */ + if ((tag_wid = + ngram_wid(model, classname)) == ngram_unknown_wid(model)) { + tag_wid = ngram_model_add_word(model, classname, classweight); + if (tag_wid == NGRAM_INVALID_WID) + return -1; + } + + if (model->n_classes == 128) { + E_ERROR("Number of classes cannot exceed 128 (sorry)\n"); + return -1; + } + classid = model->n_classes; + for (i = 0; i < n_words; ++i) { + int32 wid; + + wid = ngram_add_word_internal(model, words[i], classid); + if (wid == NGRAM_INVALID_WID) + return -1; + if (start_wid == -1) + start_wid = NGRAM_BASEWID(wid); + classwords = glist_add_float32(classwords, weights[i]); + } + classwords = glist_reverse(classwords); + lmclass = ngram_class_new(model, tag_wid, start_wid, classwords); + glist_free(classwords); + if (lmclass == NULL) + return -1; + + ++model->n_classes; + if (model->classes == NULL) + model->classes = ckd_calloc(1, sizeof(*model->classes)); + else + model->classes = ckd_realloc(model->classes, + model->n_classes * + sizeof(*model->classes)); + model->classes[classid] = lmclass; + return classid; +} + +int32 +ngram_class_prob(ngram_class_t * lmclass, int32 wid) +{ + int32 base_wid = NGRAM_BASEWID(wid); + + if (base_wid < lmclass->start_wid + || base_wid > lmclass->start_wid + lmclass->n_words) { + int32 hash; + + /* Look it up in the hash table. */ + hash = wid & (lmclass->n_hash - 1); + while (hash != -1 && lmclass->nword_hash[hash].wid != wid) + hash = lmclass->nword_hash[hash].next; + if (hash == -1) + return 1; + return lmclass->nword_hash[hash].prob1; + } + else { + return lmclass->prob1[base_wid - lmclass->start_wid]; + } +} + +int32 +read_classdef_file(hash_table_t * classes, const char *file_name) +{ + FILE *fp; + int32 is_pipe; + int inclass; /**< Are we currently reading a list of class words? */ + int32 rv = -1; + gnode_t *gn; + glist_t classwords = NULL; + glist_t classprobs = NULL; + char *classname = NULL; + + if ((fp = fopen_comp(file_name, "r", &is_pipe)) == NULL) { + E_ERROR("File %s not found\n", file_name); + return -1; + } + + inclass = FALSE; + while (!feof(fp)) { + char line[512]; + char *wptr[2]; + int n_words; + + if (fgets(line, sizeof(line), fp) == NULL) + break; + + n_words = str2words(line, wptr, 2); + if (n_words <= 0) + continue; + + if (inclass) { + /* Look for an end of class marker. */ + if (n_words == 2 && 0 == strcmp(wptr[0], "END")) { + classdef_t *classdef; + gnode_t *word, *weight; + int32 i; + + if (classname == NULL || 0 != strcmp(wptr[1], classname)) + goto error_out; + inclass = FALSE; + + /* Construct a class from the list of words collected. */ + classdef = ckd_calloc(1, sizeof(*classdef)); + classwords = glist_reverse(classwords); + classprobs = glist_reverse(classprobs); + classdef->n_words = glist_count(classwords); + classdef->words = ckd_calloc(classdef->n_words, + sizeof(*classdef->words)); + classdef->weights = ckd_calloc(classdef->n_words, + sizeof(*classdef->weights)); + word = classwords; + weight = classprobs; + for (i = 0; i < classdef->n_words; ++i) { + classdef->words[i] = gnode_ptr(word); + classdef->weights[i] = gnode_float32(weight); + word = gnode_next(word); + weight = gnode_next(weight); + } + + /* Add this class to the hash table. */ + if (hash_table_enter(classes, classname, classdef) != + classdef) { + classdef_free(classdef); + goto error_out; + } + + /* Reset everything. */ + glist_free(classwords); + glist_free(classprobs); + classwords = NULL; + classprobs = NULL; + classname = NULL; + } + else { + float32 fprob; + + if (n_words == 2) + fprob = atof_c(wptr[1]); + else + fprob = 1.0f; + /* Add it to the list of words for this class. */ + classwords = + glist_add_ptr(classwords, ckd_salloc(wptr[0])); + classprobs = glist_add_float32(classprobs, fprob); + } + } + else { + /* Start a new LM class if the LMCLASS marker is seen */ + if (n_words == 2 && 0 == strcmp(wptr[0], "LMCLASS")) { + if (inclass) + goto error_out; + inclass = TRUE; + classname = ckd_salloc(wptr[1]); + } + /* Otherwise, just ignore whatever junk we got */ + } + } + rv = 0; /* Success. */ + + error_out: + /* Free all the stuff we might have allocated. */ + fclose_comp(fp, is_pipe); + for (gn = classwords; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(classwords); + glist_free(classprobs); + ckd_free(classname); + + return rv; +} + +void +classdef_free(classdef_t * classdef) +{ + int32 i; + for (i = 0; i < classdef->n_words; ++i) + ckd_free(classdef->words[i]); + ckd_free(classdef->words); + ckd_free(classdef->weights); + ckd_free(classdef); +} + + +int32 +ngram_model_read_classdef(ngram_model_t * model, const char *file_name) +{ + hash_table_t *classes; + glist_t hl = NULL; + gnode_t *gn; + int32 rv = -1; + + classes = hash_table_new(0, FALSE); + if (read_classdef_file(classes, file_name) < 0) { + hash_table_free(classes); + return -1; + } + + /* Create a new class in the language model for each classdef. */ + hl = hash_table_tolist(classes, NULL); + for (gn = hl; gn; gn = gnode_next(gn)) { + hash_entry_t *he = gnode_ptr(gn); + classdef_t *classdef = he->val; + + if (ngram_model_add_class(model, he->key, 1.0, + classdef->words, + classdef->weights, + classdef->n_words) < 0) + goto error_out; + } + rv = 0; + + error_out: + for (gn = hl; gn; gn = gnode_next(gn)) { + hash_entry_t *he = gnode_ptr(gn); + ckd_free((char *) he->key); + classdef_free(he->val); + } + glist_free(hl); + hash_table_free(classes); + return rv; +} diff --git a/src/libsphinxbase/lm/ngram_model_internal.h b/src/libsphinxbase/lm/ngram_model_internal.h new file mode 100644 index 000000000..2e50bcb8a --- /dev/null +++ b/src/libsphinxbase/lm/ngram_model_internal.h @@ -0,0 +1,197 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * \file ngram_model_internal.h Internal structures for N-Gram models + * + * Author: David Huggins-Daines + */ + +#ifndef __NGRAM_MODEL_INTERNAL_H__ +#define __NGRAM_MODEL_INTERNAL_H__ + +#include "sphinxbase/ngram_model.h" +#include "sphinxbase/hash_table.h" + +/** + * Common implementation of ngram_model_t. + * + * The details of bigram, trigram, and higher-order N-gram storage, if any, can + * vary somewhat depending on the file format in use. + */ +struct ngram_model_s { + int refcount; /**< Reference count */ + uint32 *n_counts; /**< Counts for 1, 2, 3, ... grams */ + int32 n_1g_alloc; /**< Number of allocated word strings (for new word addition) */ + int32 n_words; /**< Number of actual word strings (NOT the same as the + number of unigrams, due to class words). */ + + uint8 n; /**< This is an n-gram model (1, 2, 3, ...). */ + uint8 n_classes; /**< Number of classes (maximum 128) */ + uint8 writable; /**< Are word strings writable? */ + uint8 flags; /**< Any other flags we might care about + (FIXME: Merge this and writable) */ + logmath_t *lmath; /**< Log-math object */ + float32 lw; /**< Language model scaling factor */ + int32 log_wip; /**< Log of word insertion penalty */ + int32 log_zero; /**< Zero probability, cached here for quick lookup */ + char **word_str; /**< Unigram names */ + hash_table_t *wid; /**< Mapping of unigram names to word IDs. */ + int32 *tmp_wids; /**< Temporary array of word IDs for ngram_model_get_ngram() */ + struct ngram_class_s **classes; /**< Word class definitions. */ + struct ngram_funcs_s *funcs; /**< Implementation-specific methods. */ +}; + +/** + * Implementation of ngram_class_t. + */ +struct ngram_class_s { + int32 tag_wid; /**< Base word ID for this class tag */ + int32 start_wid; /**< Starting base word ID for this class' words */ + int32 n_words; /**< Number of base words for this class */ + int32 *prob1; /**< Probability table for base words */ + /** + * Custom hash table for additional words. + */ + struct ngram_hash_s { + int32 wid; /**< Word ID of this bucket */ + int32 prob1; /**< Probability for this word */ + int32 next; /**< Index of next bucket (or -1 for no collision) */ + } *nword_hash; + int32 n_hash; /**< Number of buckets in nword_hash (power of 2) */ + int32 n_hash_inuse; /**< Number of words in nword_hash */ +}; + +#define NGRAM_MAX_ORDER 5 + +#define NGRAM_HASH_SIZE 128 + +#define NGRAM_BASEWID(wid) ((wid)&0xffffff) +#define NGRAM_CLASSID(wid) (((wid)>>24) & 0x7f) +#define NGRAM_CLASSWID(wid,classid) (((classid)<<24) | 0x80000000 | (wid)) +#define NGRAM_IS_CLASSWID(wid) ((wid)&0x80000000) + +#define UG_ALLOC_STEP 10 + +/** Implementation-specific functions for operating on ngram_model_t objects */ +typedef struct ngram_funcs_s { + /** + * Implementation-specific function for freeing an ngram_model_t. + */ + void (*free) (ngram_model_t * model); + /** + * Implementation-specific function for applying language model weights. + */ + int (*apply_weights) (ngram_model_t * model, float32 lw, float32 wip); + /** + * Implementation-specific function for querying language model score. + */ + int32(*score) (ngram_model_t * model, + int32 wid, + int32 * history, int32 n_hist, int32 * n_used); + /** + * Implementation-specific function for querying raw language + * model probability. + */ + int32(*raw_score) (ngram_model_t * model, + int32 wid, + int32 * history, int32 n_hist, int32 * n_used); + /** + * Implementation-specific function for adding unigrams. + * + * This function updates the internal structures of a language + * model to add the given unigram with the given weight (defined + * as a log-factor applied to the uniform distribution). This + * includes reallocating or otherwise resizing the set of unigrams. + * + * @return The language model score (not raw log-probability) of + * the new word, or 0 for failure. + */ + int32(*add_ug) (ngram_model_t * model, int32 wid, int32 lweight); + + /** + * Implementation-specific function for purging N-Gram cache + */ + void (*flush) (ngram_model_t * model); +} ngram_funcs_t; + +/** + * One class definition from a classdef file. + */ +typedef struct classdef_s { + char **words; + float32 *weights; + int32 n_words; +} classdef_t; + +/** + * Initialize the base ngram_model_t structure. + */ +int32 +ngram_model_init(ngram_model_t * model, + ngram_funcs_t * funcs, + logmath_t * lmath, int32 n, int32 n_unigram); + +/** + * Read a probdef file. + */ +int32 read_classdef_file(hash_table_t * classes, + const char *classdef_file); + +/** + * Free a class definition. + */ +void classdef_free(classdef_t * classdef); + +/** + * Allocate and initialize an N-Gram class. + */ +ngram_class_t *ngram_class_new(ngram_model_t * model, int32 tag_wid, + int32 start_wid, glist_t classwords); + +/** + * Deallocate an N-Gram class. + */ +void ngram_class_free(ngram_class_t * lmclass); + +/** + * Get the in-class log probability for a word in an N-Gram class. + * + * @return This probability, or 1 if word not found. + */ +int32 ngram_class_prob(ngram_class_t * lmclass, int32 wid); + +#endif /* __NGRAM_MODEL_INTERNAL_H__ */ diff --git a/src/libsphinxbase/lm/ngram_model_set.c b/src/libsphinxbase/lm/ngram_model_set.c new file mode 100644 index 000000000..4623693b7 --- /dev/null +++ b/src/libsphinxbase/lm/ngram_model_set.c @@ -0,0 +1,866 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file ngram_model_set.c Set of language models. + * @author David Huggins-Daines + */ + +#include +#include + +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/filename.h" + +#include "ngram_model_set.h" + +static ngram_funcs_t ngram_model_set_funcs; + +static int +my_compare(const void *a, const void *b) +{ + /* Make sure floats to the beginning. */ + if (strcmp(*(char *const *) a, "") == 0) + return -1; + else if (strcmp(*(char *const *) b, "") == 0) + return 1; + else + return strcmp(*(char *const *) a, *(char *const *) b); +} + +static void +build_widmap(ngram_model_t * base, logmath_t * lmath, int32 n) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + ngram_model_t **models = set->lms; + hash_table_t *vocab; + glist_t hlist; + gnode_t *gn; + int32 i; + + /* Construct a merged vocabulary and a set of word-ID mappings. */ + vocab = hash_table_new(models[0]->n_words, FALSE); + /* Create the set of merged words. */ + for (i = 0; i < set->n_models; ++i) { + int32 j; + for (j = 0; j < models[i]->n_words; ++j) { + /* Ignore collisions. */ + (void) hash_table_enter_int32(vocab, models[i]->word_str[j], + j); + } + } + /* Create the array of words, then sort it. */ + if (hash_table_lookup(vocab, "", NULL) != 0) + (void) hash_table_enter_int32(vocab, "", 0); + /* Now we know the number of unigrams, initialize the base model. */ + ngram_model_init(base, &ngram_model_set_funcs, lmath, n, + hash_table_inuse(vocab)); + base->writable = FALSE; /* We will reuse the pointers from the submodels. */ + i = 0; + hlist = hash_table_tolist(vocab, NULL); + for (gn = hlist; gn; gn = gnode_next(gn)) { + hash_entry_t *ent = gnode_ptr(gn); + base->word_str[i++] = (char *) ent->key; + } + glist_free(hlist); + qsort(base->word_str, base->n_words, sizeof(*base->word_str), + my_compare); + + /* Now create the word ID mappings. */ + if (set->widmap) + ckd_free_2d((void **) set->widmap); + set->widmap = (int32 **) ckd_calloc_2d(base->n_words, set->n_models, + sizeof(**set->widmap)); + for (i = 0; i < base->n_words; ++i) { + int32 j; + /* Also create the master wid mapping. */ + (void) hash_table_enter_int32(base->wid, base->word_str[i], i); + /* printf("%s: %d => ", base->word_str[i], i); */ + for (j = 0; j < set->n_models; ++j) { + set->widmap[i][j] = ngram_wid(models[j], base->word_str[i]); + /* printf("%d ", set->widmap[i][j]); */ + } + /* printf("\n"); */ + } + hash_table_free(vocab); +} + +ngram_model_t * +ngram_model_set_init(cmd_ln_t * config, + ngram_model_t ** models, + char **names, const float32 * weights, int32 n_models) +{ + ngram_model_set_t *model; + ngram_model_t *base; + logmath_t *lmath; + int32 i, n; + + if (n_models == 0) /* WTF */ + return NULL; + + /* Do consistency checking on the models. They must all use the + * same logbase and shift. */ + lmath = models[0]->lmath; + for (i = 1; i < n_models; ++i) { + if (logmath_get_base(models[i]->lmath) != logmath_get_base(lmath) + || logmath_get_shift(models[i]->lmath) != + logmath_get_shift(lmath)) { + E_ERROR + ("Log-math parameters don't match, will not create LM set\n"); + return NULL; + } + } + + /* Allocate the combined model, initialize it. */ + model = ckd_calloc(1, sizeof(*model)); + base = &model->base; + model->n_models = n_models; + model->lms = ckd_calloc(n_models, sizeof(*model->lms)); + model->names = ckd_calloc(n_models, sizeof(*model->names)); + /* Initialize weights to a uniform distribution */ + model->lweights = ckd_calloc(n_models, sizeof(*model->lweights)); + { + int32 uniform = logmath_log(lmath, 1.0 / n_models); + for (i = 0; i < n_models; ++i) + model->lweights[i] = uniform; + } + /* Default to interpolate if weights were given. */ + if (weights) + model->cur = -1; + + n = 0; + for (i = 0; i < n_models; ++i) { + model->lms[i] = ngram_model_retain(models[i]); + model->names[i] = ckd_salloc(names[i]); + if (weights) + model->lweights[i] = logmath_log(lmath, weights[i]); + /* N is the maximum of all merged models. */ + if (models[i]->n > n) + n = models[i]->n; + } + /* Allocate the history mapping table. */ + model->maphist = ckd_calloc(n - 1, sizeof(*model->maphist)); + + /* Now build the word-ID mapping and merged vocabulary. */ + build_widmap(base, lmath, n); + return base; +} + +ngram_model_t * +ngram_model_set_read(cmd_ln_t * config, + const char *lmctlfile, logmath_t * lmath) +{ + FILE *ctlfp; + glist_t lms = NULL; + glist_t lmnames = NULL; + __BIGSTACKVARIABLE__ char str[1024]; + ngram_model_t *set = NULL; + hash_table_t *classes; + char *basedir, *c; + + /* Read all the class definition files to accumulate a mapping of + * classnames to definitions. */ + classes = hash_table_new(0, FALSE); + if ((ctlfp = fopen(lmctlfile, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s", lmctlfile); + return NULL; + } + + /* Try to find the base directory to append to relative paths in + * the lmctl file. */ + if ((c = strrchr(lmctlfile, '/')) || (c = strrchr(lmctlfile, '\\'))) { + /* Include the trailing slash. */ + basedir = ckd_calloc(c - lmctlfile + 2, 1); + memcpy(basedir, lmctlfile, c - lmctlfile + 1); + } + else { + basedir = NULL; + } + E_INFO("Reading LM control file '%s'\n", lmctlfile); + if (basedir) + E_INFO("Will prepend '%s' to unqualified paths\n", basedir); + + if (fscanf(ctlfp, "%1023s", str) == 1) { + if (strcmp(str, "{") == 0) { + /* Load LMclass files */ + while ((fscanf(ctlfp, "%1023s", str) == 1) + && (strcmp(str, "}") != 0)) { + char *deffile; + if (basedir && !path_is_absolute(str)) + deffile = string_join(basedir, str, NULL); + else + deffile = ckd_salloc(str); + E_INFO("Reading classdef from '%s'\n", deffile); + if (read_classdef_file(classes, deffile) < 0) { + ckd_free(deffile); + goto error_out; + } + ckd_free(deffile); + } + + if (strcmp(str, "}") != 0) { + E_ERROR("Unexpected EOF in %s\n", lmctlfile); + goto error_out; + } + + /* This might be the first LM name. */ + if (fscanf(ctlfp, "%1023s", str) != 1) + str[0] = '\0'; + } + } + else + str[0] = '\0'; + + /* Read in one LM at a time and add classes to them as necessary. */ + while (str[0] != '\0') { + char *lmfile; + ngram_model_t *lm; + + if (basedir && str[0] != '/' && str[0] != '\\') + lmfile = string_join(basedir, str, NULL); + else + lmfile = ckd_salloc(str); + E_INFO("Reading lm from '%s'\n", lmfile); + lm = ngram_model_read(config, lmfile, NGRAM_AUTO, lmath); + if (lm == NULL) { + ckd_free(lmfile); + goto error_out; + } + if (fscanf(ctlfp, "%1023s", str) != 1) { + E_ERROR("LMname missing after LMFileName '%s'\n", lmfile); + ckd_free(lmfile); + goto error_out; + } + ckd_free(lmfile); + lms = glist_add_ptr(lms, lm); + lmnames = glist_add_ptr(lmnames, ckd_salloc(str)); + + if (fscanf(ctlfp, "%1023s", str) == 1) { + if (strcmp(str, "{") == 0) { + /* LM uses classes; read their names */ + while ((fscanf(ctlfp, "%1023s", str) == 1) && + (strcmp(str, "}") != 0)) { + void *val; + classdef_t *classdef; + + if (hash_table_lookup(classes, str, &val) == -1) { + E_ERROR("Unknown class %s in control file\n", str); + goto error_out; + } + classdef = val; + if (ngram_model_add_class(lm, str, 1.0, + classdef->words, + classdef->weights, + classdef->n_words) < 0) { + goto error_out; + } + E_INFO("Added class %s containing %d words\n", + str, classdef->n_words); + } + if (strcmp(str, "}") != 0) { + E_ERROR("Unexpected EOF in %s\n", lmctlfile); + goto error_out; + } + if (fscanf(ctlfp, "%1023s", str) != 1) + str[0] = '\0'; + } + } + else + str[0] = '\0'; + } + fclose(ctlfp); + + /* Now construct arrays out of lms and lmnames, and build an + * ngram_model_set. */ + lms = glist_reverse(lms); + lmnames = glist_reverse(lmnames); + { + int32 n_models; + ngram_model_t **lm_array; + char **name_array; + gnode_t *lm_node, *name_node; + int32 i; + + n_models = glist_count(lms); + lm_array = ckd_calloc(n_models, sizeof(*lm_array)); + name_array = ckd_calloc(n_models, sizeof(*name_array)); + lm_node = lms; + name_node = lmnames; + for (i = 0; i < n_models; ++i) { + lm_array[i] = gnode_ptr(lm_node); + name_array[i] = gnode_ptr(name_node); + lm_node = gnode_next(lm_node); + name_node = gnode_next(name_node); + } + set = ngram_model_set_init(config, lm_array, name_array, + NULL, n_models); + + for (i = 0; i < n_models; ++i) { + ngram_model_free(lm_array[i]); + } + ckd_free(lm_array); + ckd_free(name_array); + } + error_out: + { + gnode_t *gn; + glist_t hlist; + + if (set == NULL) { + for (gn = lms; gn; gn = gnode_next(gn)) { + ngram_model_free(gnode_ptr(gn)); + } + } + glist_free(lms); + for (gn = lmnames; gn; gn = gnode_next(gn)) { + ckd_free(gnode_ptr(gn)); + } + glist_free(lmnames); + hlist = hash_table_tolist(classes, NULL); + for (gn = hlist; gn; gn = gnode_next(gn)) { + hash_entry_t *he = gnode_ptr(gn); + ckd_free((char *) he->key); + classdef_free(he->val); + } + glist_free(hlist); + hash_table_free(classes); + ckd_free(basedir); + } + return set; +} + +int32 +ngram_model_set_count(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + return set->n_models; +} + +ngram_model_set_iter_t * +ngram_model_set_iter(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + ngram_model_set_iter_t *itor; + + if (set == NULL || set->n_models == 0) + return NULL; + itor = ckd_calloc(1, sizeof(*itor)); + itor->set = set; + return itor; +} + +ngram_model_set_iter_t * +ngram_model_set_iter_next(ngram_model_set_iter_t * itor) +{ + if (++itor->cur == itor->set->n_models) { + ngram_model_set_iter_free(itor); + return NULL; + } + return itor; +} + +void +ngram_model_set_iter_free(ngram_model_set_iter_t * itor) +{ + ckd_free(itor); +} + +ngram_model_t * +ngram_model_set_iter_model(ngram_model_set_iter_t * itor, + char const **lmname) +{ + if (lmname) + *lmname = itor->set->names[itor->cur]; + return itor->set->lms[itor->cur]; +} + +ngram_model_t * +ngram_model_set_lookup(ngram_model_t * base, const char *name) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + if (name == NULL) { + if (set->cur == -1) + return NULL; + else + return set->lms[set->cur]; + } + + /* There probably won't be very many submodels. */ + for (i = 0; i < set->n_models; ++i) + if (0 == strcmp(set->names[i], name)) + break; + if (i == set->n_models) + return NULL; + return set->lms[i]; +} + +ngram_model_t * +ngram_model_set_select(ngram_model_t * base, const char *name) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + /* There probably won't be very many submodels. */ + for (i = 0; i < set->n_models; ++i) + if (0 == strcmp(set->names[i], name)) + break; + if (i == set->n_models) + return NULL; + set->cur = i; + return set->lms[set->cur]; +} + +const char * +ngram_model_set_current(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + if (set->cur == -1) + return NULL; + else + return set->names[set->cur]; +} + +int32 +ngram_model_set_current_wid(ngram_model_t * base, int32 set_wid) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + if (set->cur == -1 || set_wid >= base->n_words) + return NGRAM_INVALID_WID; + else + return set->widmap[set_wid][set->cur]; +} + +int32 +ngram_model_set_known_wid(ngram_model_t * base, int32 set_wid) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + if (set_wid >= base->n_words) + return FALSE; + else if (set->cur == -1) { + int32 i; + for (i = 0; i < set->n_models; ++i) { + if (set->widmap[set_wid][i] != ngram_unknown_wid(set->lms[i])) + return TRUE; + } + return FALSE; + } + else + return (set->widmap[set_wid][set->cur] + != ngram_unknown_wid(set->lms[set->cur])); +} + +ngram_model_t * +ngram_model_set_interp(ngram_model_t * base, + const char **names, const float32 * weights) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + /* If we have a set of weights here, then set them. */ + if (names && weights) { + int32 i, j; + + /* We hope there aren't many models. */ + for (i = 0; i < set->n_models; ++i) { + for (j = 0; j < set->n_models; ++j) + if (0 == strcmp(names[i], set->names[j])) + break; + if (j == set->n_models) { + E_ERROR("Unknown LM name %s\n", names[i]); + return NULL; + } + set->lweights[j] = logmath_log(base->lmath, weights[i]); + } + } + else if (weights) { + memcpy(set->lweights, weights, + set->n_models * sizeof(*set->lweights)); + } + /* Otherwise just enable existing weights. */ + set->cur = -1; + return base; +} + +ngram_model_t * +ngram_model_set_add(ngram_model_t * base, + ngram_model_t * model, + const char *name, float32 weight, int reuse_widmap) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + float32 fprob; + int32 scale, i; + + /* Add it to the array of lms. */ + ++set->n_models; + set->lms = ckd_realloc(set->lms, set->n_models * sizeof(*set->lms)); + set->lms[set->n_models - 1] = model; + set->names = + ckd_realloc(set->names, set->n_models * sizeof(*set->names)); + set->names[set->n_models - 1] = ckd_salloc(name); + /* Expand the history mapping table if necessary. */ + if (model->n > base->n) { + base->n = model->n; + set->maphist = ckd_realloc(set->maphist, + (model->n - 1) * sizeof(*set->maphist)); + } + + /* Renormalize the interpolation weights. */ + fprob = weight * 1.0f / set->n_models; + set->lweights = ckd_realloc(set->lweights, + set->n_models * sizeof(*set->lweights)); + set->lweights[set->n_models - 1] = logmath_log(base->lmath, fprob); + /* Now normalize everything else to fit it in. This is + * accomplished by simply scaling all the other probabilities + * by (1-fprob). */ + scale = logmath_log(base->lmath, 1.0 - fprob); + for (i = 0; i < set->n_models - 1; ++i) + set->lweights[i] += scale; + + /* Reuse the old word ID mapping if requested. */ + if (reuse_widmap) { + int32 **new_widmap; + + /* Tack another column onto the widmap array. */ + new_widmap = (int32 **) ckd_calloc_2d(base->n_words, set->n_models, + sizeof(**new_widmap)); + for (i = 0; i < base->n_words; ++i) { + /* Copy all the existing mappings. */ + memcpy(new_widmap[i], set->widmap[i], + (set->n_models - 1) * sizeof(**new_widmap)); + /* Create the new mapping. */ + new_widmap[i][set->n_models - 1] = + ngram_wid(model, base->word_str[i]); + } + ckd_free_2d((void **) set->widmap); + set->widmap = new_widmap; + } + else { + build_widmap(base, base->lmath, base->n); + } + return model; +} + +ngram_model_t * +ngram_model_set_remove(ngram_model_t * base, + const char *name, int reuse_widmap) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + ngram_model_t *submodel; + int32 lmidx, scale, n, i; + float32 fprob; + + for (lmidx = 0; lmidx < set->n_models; ++lmidx) + if (0 == strcmp(name, set->names[lmidx])) + break; + if (lmidx == set->n_models) + return NULL; + submodel = set->lms[lmidx]; + + /* Renormalize the interpolation weights by scaling them by + * 1/(1-fprob) */ + fprob = (float32) logmath_exp(base->lmath, set->lweights[lmidx]); + scale = logmath_log(base->lmath, 1.0 - fprob); + + /* Remove it from the array of lms, renormalize remaining weights, + * and recalcluate n. */ + --set->n_models; + n = 0; + ckd_free(set->names[lmidx]); + set->names[lmidx] = NULL; + for (i = 0; i < set->n_models; ++i) { + if (i >= lmidx) { + set->lms[i] = set->lms[i + 1]; + set->names[i] = set->names[i + 1]; + set->lweights[i] = set->lweights[i + 1]; + } + set->lweights[i] -= scale; + if (set->lms[i]->n > n) + n = set->lms[i]->n; + } + /* There's no need to shrink these arrays. */ + set->lms[set->n_models] = NULL; + set->lweights[set->n_models] = base->log_zero; + /* No need to shrink maphist either. */ + + /* Reuse the existing word ID mapping if requested. */ + if (reuse_widmap) { + /* Just go through and shrink each row. */ + for (i = 0; i < base->n_words; ++i) { + memmove(set->widmap[i] + lmidx, set->widmap[i] + lmidx + 1, + (set->n_models - lmidx) * sizeof(**set->widmap)); + } + } + else { + build_widmap(base, base->lmath, n); + } + return submodel; +} + +void +ngram_model_set_map_words(ngram_model_t * base, + const char **words, int32 n_words) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + /* Recreate the word mapping. */ + if (base->writable) { + for (i = 0; i < base->n_words; ++i) { + ckd_free(base->word_str[i]); + } + } + ckd_free(base->word_str); + ckd_free_2d((void **) set->widmap); + base->writable = TRUE; + base->n_words = base->n_1g_alloc = n_words; + base->word_str = ckd_calloc(n_words, sizeof(*base->word_str)); + set->widmap = + (int32 **) ckd_calloc_2d(n_words, set->n_models, + sizeof(**set->widmap)); + hash_table_empty(base->wid); + for (i = 0; i < n_words; ++i) { + int32 j; + base->word_str[i] = ckd_salloc(words[i]); + (void) hash_table_enter_int32(base->wid, base->word_str[i], i); + for (j = 0; j < set->n_models; ++j) { + set->widmap[i][j] = ngram_wid(set->lms[j], base->word_str[i]); + } + } +} + +static int +ngram_model_set_apply_weights(ngram_model_t * base, float32 lw, + float32 wip) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + /* Apply weights to each sub-model. */ + for (i = 0; i < set->n_models; ++i) + ngram_model_apply_weights(set->lms[i], lw, wip); + return 0; +} + +static int32 +ngram_model_set_score(ngram_model_t * base, int32 wid, + int32 * history, int32 n_hist, int32 * n_used) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 mapwid; + int32 score; + int32 i; + + /* Truncate the history. */ + if (n_hist > base->n - 1) + n_hist = base->n - 1; + + /* Interpolate if there is no current. */ + if (set->cur == -1) { + score = base->log_zero; + for (i = 0; i < set->n_models; ++i) { + int32 j; + /* Map word and history IDs for each model. */ + mapwid = set->widmap[wid][i]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][i]; + } + score = logmath_add(base->lmath, score, + set->lweights[i] + + ngram_ng_score(set->lms[i], + mapwid, set->maphist, + n_hist, n_used)); + } + } + else { + int32 j; + /* Map word and history IDs (FIXME: do this in a function?) */ + mapwid = set->widmap[wid][set->cur]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][set->cur]; + } + score = ngram_ng_score(set->lms[set->cur], + mapwid, set->maphist, n_hist, n_used); + } + + return score; +} + +static int32 +ngram_model_set_raw_score(ngram_model_t * base, int32 wid, + int32 * history, int32 n_hist, int32 * n_used) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 mapwid; + int32 score; + int32 i; + + /* Truncate the history. */ + if (n_hist > base->n - 1) + n_hist = base->n - 1; + + /* Interpolate if there is no current. */ + if (set->cur == -1) { + score = base->log_zero; + for (i = 0; i < set->n_models; ++i) { + int32 j; + /* Map word and history IDs for each model. */ + mapwid = set->widmap[wid][i]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][i]; + } + score = logmath_add(base->lmath, score, + set->lweights[i] + + ngram_ng_prob(set->lms[i], + mapwid, set->maphist, n_hist, + n_used)); + } + } + else { + int32 j; + /* Map word and history IDs (FIXME: do this in a function?) */ + mapwid = set->widmap[wid][set->cur]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][set->cur]; + } + score = ngram_ng_prob(set->lms[set->cur], + mapwid, set->maphist, n_hist, n_used); + } + + return score; +} + +static int32 +ngram_model_set_add_ug(ngram_model_t * base, int32 wid, int32 lweight) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 *newwid; + int32 i, prob; + + /* At this point the word has already been added to the master + model and we have a new word ID for it. Add it to active + submodels and track the word IDs. */ + newwid = ckd_calloc(set->n_models, sizeof(*newwid)); + prob = base->log_zero; + for (i = 0; i < set->n_models; ++i) { + int32 wprob, n_hist; + + /* Only add to active models. */ + if (set->cur == -1 || set->cur == i) { + /* Did this word already exist? */ + newwid[i] = ngram_wid(set->lms[i], base->word_str[wid]); + if (newwid[i] == NGRAM_INVALID_WID) { + /* Add it to the submodel. */ + newwid[i] = + ngram_model_add_word(set->lms[i], base->word_str[wid], + (float32) logmath_exp(base->lmath, + lweight)); + if (newwid[i] == NGRAM_INVALID_WID) { + ckd_free(newwid); + return base->log_zero; + } + } + /* Now get the unigram probability for the new word and either + * interpolate it or use it (if this is the current model). */ + wprob = + ngram_ng_prob(set->lms[i], newwid[i], NULL, 0, &n_hist); + if (set->cur == i) + prob = wprob; + else if (set->cur == -1) + prob = + logmath_add(base->lmath, prob, + set->lweights[i] + wprob); + } + else { + newwid[i] = NGRAM_INVALID_WID; + } + } + /* Okay we have the word IDs for this in all the submodels. Now + do some complicated memory mangling to add this to the + widmap. */ + set->widmap = + ckd_realloc(set->widmap, base->n_words * sizeof(*set->widmap)); + set->widmap[0] = + ckd_realloc(set->widmap[0], + base->n_words * set->n_models * sizeof(**set->widmap)); + for (i = 0; i < base->n_words; ++i) + set->widmap[i] = set->widmap[0] + i * set->n_models; + memcpy(set->widmap[wid], newwid, set->n_models * sizeof(*newwid)); + ckd_free(newwid); + return prob; +} + +static void +ngram_model_set_free(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + for (i = 0; i < set->n_models; ++i) + ngram_model_free(set->lms[i]); + ckd_free(set->lms); + for (i = 0; i < set->n_models; ++i) + ckd_free(set->names[i]); + ckd_free(set->names); + ckd_free(set->lweights); + ckd_free(set->maphist); + ckd_free_2d((void **) set->widmap); +} + +static ngram_funcs_t ngram_model_set_funcs = { + ngram_model_set_free, /* free */ + ngram_model_set_apply_weights, /* apply_weights */ + ngram_model_set_score, /* score */ + ngram_model_set_raw_score, /* raw_score */ + ngram_model_set_add_ug, /* add_ug */ +}; diff --git a/src/libsphinxbase/lm/ngram_model_set.h b/src/libsphinxbase/lm/ngram_model_set.h new file mode 100644 index 000000000..fc628f9c8 --- /dev/null +++ b/src/libsphinxbase/lm/ngram_model_set.h @@ -0,0 +1,70 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file ngram_model_set.h Set of language models. + * @author David Huggins-Daines + */ + +#ifndef __NGRAM_MODEL_SET_H__ +#define __NGRAM_MODEL_SET_H__ + +#include "ngram_model_internal.h" + +/** + * Subclass of ngram_model for grouping language models. + */ +typedef struct ngram_model_set_s { + ngram_model_t base; /**< Base ngram_model_t structure. */ + + int32 n_models; /**< Number of models in this set. */ + int32 cur; /**< Currently selected model, or -1 for none. */ + ngram_model_t **lms; /**< Language models in this set. */ + char **names; /**< Names for language models. */ + int32 *lweights; /**< Log interpolation weights. */ + int32 **widmap; /**< Word ID mapping for submodels. */ + int32 *maphist; /**< Word ID mapping for N-Gram history. */ +} ngram_model_set_t; + +/** + * Iterator over a model set. + */ +struct ngram_model_set_iter_s { + ngram_model_set_t *set; + int32 cur; +}; + +#endif /* __NGRAM_MODEL_SET_H__ */ diff --git a/src/libsphinxbase/lm/ngram_model_trie.c b/src/libsphinxbase/lm/ngram_model_trie.c new file mode 100644 index 000000000..a4e841131 --- /dev/null +++ b/src/libsphinxbase/lm/ngram_model_trie.c @@ -0,0 +1,693 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include + +#include +#include +#include +#include +#include + +#include "ngram_model_trie.h" + +static const char trie_hdr[] = "Trie Language Model"; +static const char dmp_hdr[] = "Darpa Trigram LM"; +static ngram_funcs_t ngram_model_trie_funcs; + +/* + * Read and return #unigrams, #bigrams, #trigrams as stated in input file. + */ +static int +read_counts_arpa(lineiter_t ** li, uint32 * counts, int *order) +{ + int32 ngram, prev_ngram; + uint32 ngram_cnt; + + /* skip file until past the '\data\' marker */ + while (*li) { + if (strcmp((*li)->buf, "\\data\\") == 0) + break; + *li = lineiter_next(*li); + } + + if (*li == NULL || strcmp((*li)->buf, "\\data\\") != 0) { + E_INFO("No \\data\\ mark in LM file\n"); + return -1; + } + + prev_ngram = 0; + *order = 0; + while ((*li = lineiter_next(*li))) { + if (sscanf((*li)->buf, "ngram %d=%d", &ngram, &ngram_cnt) != 2) + break; + if (ngram != prev_ngram + 1) { + E_ERROR + ("Ngram counts in LM file is not in order. %d goes after %d\n", + ngram, prev_ngram); + return -1; + } + prev_ngram = ngram; + counts[*order] = ngram_cnt; + (*order)++; + } + + if (*li == NULL) { + E_ERROR("EOF while reading ngram counts\n"); + return -1; + } + + return 0; +} + +static int +read_1grams_arpa(lineiter_t ** li, uint32 count, ngram_model_t * base, + unigram_t * unigrams) +{ + uint32 i; + int n; + int n_parts; + char *wptr[3]; + + while (*li && strcmp((*li)->buf, "\\1-grams:") != 0) { + *li = lineiter_next(*li); + } + if (*li == NULL) { + E_ERROR_SYSTEM("Failed to read \\1-grams: mark"); + return -1; + } + + n_parts = 2; + for (i = 0; i < count; i++) { + unigram_t *unigram; + + *li = lineiter_next(*li); + if (*li == NULL) { + E_ERROR + ("Unexpected end of ARPA file. Failed to read unigram %d\n", + i + 1); + return -1; + } + if ((n = str2words((*li)->buf, wptr, 3)) < n_parts) { + E_ERROR("Format error at line %d, Failed to read unigrams\n", (*li)->lineno); + return -1; + } + + unigram = &unigrams[i]; + unigram->prob = + logmath_log10_to_log_float(base->lmath, atof_c(wptr[0])); + if (unigram->prob > 0) { + E_WARN("Unigram '%s' has positive probability\n", wptr[1]); + unigram->prob = 0; + } + if (n == n_parts + 1) { + unigram->bo = + logmath_log10_to_log_float(base->lmath, + atof_c(wptr[2])); + } + else { + unigram->bo = 0.0f; + } + + /* TODO: classify float with fpclassify and warn if bad value occurred */ + base->word_str[i] = ckd_salloc(wptr[1]); + } + + /* fill hash-table that maps unigram names to their word ids */ + for (i = 0; i < count; i++) { + if ((hash_table_enter + (base->wid, base->word_str[i], + (void *) (long) i)) != (void *) (long) i) { + E_WARN("Duplicate word in dictionary: %s\n", + base->word_str[i]); + } + } + return 0; +} + +ngram_model_t * +ngram_model_trie_read_arpa(cmd_ln_t * config, + const char *path, logmath_t * lmath) +{ + FILE *fp; + lineiter_t *li; + ngram_model_trie_t *model; + ngram_model_t *base; + ngram_raw_t **raw_ngrams; + int32 is_pipe; + uint32 counts[NGRAM_MAX_ORDER]; + int order; + int i; + + E_INFO("Trying to read LM in arpa format\n"); + if ((fp = fopen_comp(path, "r", &is_pipe)) == NULL) { + E_ERROR("File %s not found\n", path); + return NULL; + } + + model = (ngram_model_trie_t *) ckd_calloc(1, sizeof(*model)); + li = lineiter_start_clean(fp); + /* Read n-gram counts from file */ + if (read_counts_arpa(&li, counts, &order) == -1) { + ckd_free(model); + lineiter_free(li); + fclose_comp(fp, is_pipe); + return NULL; + } + + E_INFO("LM of order %d\n", order); + for (i = 0; i < order; i++) { + E_INFO("#%d-grams: %d\n", i + 1, counts[i]); + } + + base = &model->base; + ngram_model_init(base, &ngram_model_trie_funcs, lmath, order, + (int32) counts[0]); + base->writable = TRUE; + + model->trie = lm_trie_create(counts[0], order); + if (read_1grams_arpa(&li, counts[0], base, model->trie->unigrams) < 0) { + ngram_model_free(base); + lineiter_free(li); + fclose_comp(fp, is_pipe); + return NULL; + } + + if (order > 1) { + raw_ngrams = + ngrams_raw_read_arpa(&li, base->lmath, counts, order, + base->wid); + if (raw_ngrams == NULL) { + ngram_model_free(base); + lineiter_free(li); + fclose_comp(fp, is_pipe); + return NULL; + } + lm_trie_build(model->trie, raw_ngrams, counts, base->n_counts, order); + ngrams_raw_free(raw_ngrams, counts, order); + } + + lineiter_free(li); + fclose_comp(fp, is_pipe); + + return base; +} + +int +ngram_model_trie_write_arpa(ngram_model_t * base, const char *path) +{ + int i; + uint32 j; + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + FILE *fp = fopen(path, "w"); + if (!fp) { + E_ERROR("Unable to open %s to write arpa LM from trie\n", path); + return -1; + } + fprintf(fp, + "This is an ARPA-format language model file, generated by CMU Sphinx\n"); + /* Write N-gram counts. */ + fprintf(fp, "\\data\\\n"); + for (i = 0; i < base->n; ++i) { + fprintf(fp, "ngram %d=%d\n", i + 1, base->n_counts[i]); + } + /* Write 1-grams */ + fprintf(fp, "\n\\1-grams:\n"); + for (j = 0; j < base->n_counts[0]; j++) { + unigram_t *unigram = &model->trie->unigrams[j]; + fprintf(fp, "%.4f\t%s", + logmath_log_float_to_log10(base->lmath, unigram->prob), + base->word_str[j]); + if (base->n > 1) { + fprintf(fp, "\t%.4f", + logmath_log_float_to_log10(base->lmath, unigram->bo)); + } + fprintf(fp, "\n"); + } + /* Write ngrams */ + if (base->n > 1) { + for (i = 2; i <= base->n; ++i) { + ngram_raw_t *raw_ngrams = + (ngram_raw_t *) ckd_calloc((size_t) base->n_counts[i - 1], + sizeof(*raw_ngrams)); + uint32 raw_ngram_idx; + uint32 j; + uint32 hist[NGRAM_MAX_ORDER]; + node_range_t range; + raw_ngram_idx = 0; + range.begin = range.end = 0; + + /* we need to iterate over a trie here. recursion should do the job */ + lm_trie_fill_raw_ngram(model->trie, raw_ngrams, + &raw_ngram_idx, base->n_counts, range, hist, 0, + i, base->n); + assert(raw_ngram_idx == base->n_counts[i - 1]); + qsort(raw_ngrams, (size_t) base->n_counts[i - 1], + sizeof(ngram_raw_t), &ngram_ord_comparator); + + fprintf(fp, "\n\\%d-grams:\n", i); + for (j = 0; j < base->n_counts[i - 1]; j++) { + int k; + fprintf(fp, "%.4f", logmath_log_float_to_log10(base->lmath, raw_ngrams[j].prob)); + for (k = 0; k < i; k++) { + fprintf(fp, "\t%s", + base->word_str[raw_ngrams[j].words[k]]); + } + ckd_free(raw_ngrams[j].words); + if (i < base->n) { + fprintf(fp, "\t%.4f", logmath_log_float_to_log10(base->lmath, raw_ngrams[j].backoff)); + } + fprintf(fp, "\n"); + } + ckd_free(raw_ngrams); + } + } + fprintf(fp, "\n\\end\\\n"); + return fclose(fp); +} + +static void +read_word_str(ngram_model_t * base, FILE * fp) +{ + int32 k; + uint32 i, j; + char *tmp_word_str; + /* read ascii word strings */ + base->writable = TRUE; + fread(&k, sizeof(k), 1, fp); + tmp_word_str = (char *) ckd_calloc((size_t) k, 1); + fread(tmp_word_str, 1, (size_t) k, fp); + + /* First make sure string just read contains n_counts[0] words (PARANOIA!!) */ + for (i = 0, j = 0; i < (uint32) k; i++) + if (tmp_word_str[i] == '\0') + j++; + if (j != base->n_counts[0]) { + E_ERROR + ("Error reading word strings (%d doesn't match n_unigrams %d)\n", + j, base->n_counts[0]); + } + + /* Break up string just read into words */ + j = 0; + for (i = 0; i < base->n_counts[0]; i++) { + base->word_str[i] = ckd_salloc(tmp_word_str + j); + if (hash_table_enter(base->wid, base->word_str[i], + (void *) (long) i) != (void *) (long) i) { + E_WARN("Duplicate word in dictionary: %s\n", + base->word_str[i]); + } + j += strlen(base->word_str[i]) + 1; + } + free(tmp_word_str); +} + +ngram_model_t * +ngram_model_trie_read_bin(cmd_ln_t * config, + const char *path, logmath_t * lmath) +{ + int32 is_pipe; + FILE *fp; + size_t hdr_size; + char *hdr; + int cmp_res; + uint8 i, order; + uint32 counts[NGRAM_MAX_ORDER]; + ngram_model_trie_t *model; + ngram_model_t *base; + + E_INFO("Trying to read LM in trie binary format\n"); + if ((fp = fopen_comp(path, "rb", &is_pipe)) == NULL) { + E_ERROR("File %s not found\n", path); + return NULL; + } + hdr_size = strlen(trie_hdr); + hdr = (char *) ckd_calloc(hdr_size + 1, sizeof(*hdr)); + fread(hdr, sizeof(*hdr), hdr_size, fp); + cmp_res = strcmp(hdr, trie_hdr); + ckd_free(hdr); + if (cmp_res) { + E_INFO("Header doesn't match\n"); + fclose_comp(fp, is_pipe); + return NULL; + } + model = (ngram_model_trie_t *) ckd_calloc(1, sizeof(*model)); + base = &model->base; + fread(&order, sizeof(order), 1, fp); + for (i = 0; i < order; i++) { + fread(&counts[i], sizeof(counts[i]), 1, fp); + } + ngram_model_init(base, &ngram_model_trie_funcs, lmath, order, + (int32) counts[0]); + for (i = 0; i < order; i++) { + base->n_counts[i] = counts[i]; + } + + model->trie = lm_trie_read_bin(counts, order, fp); + read_word_str(base, fp); + fclose_comp(fp, is_pipe); + + return base; +} + +static void +write_word_str(FILE * fp, ngram_model_t * model) +{ + int32 k; + uint32 i; + + k = 0; + for (i = 0; i < model->n_counts[0]; i++) + k += strlen(model->word_str[i]) + 1; + fwrite(&k, sizeof(k), 1, fp); + for (i = 0; i < model->n_counts[0]; i++) + fwrite(model->word_str[i], 1, strlen(model->word_str[i]) + 1, fp); +} + +int +ngram_model_trie_write_bin(ngram_model_t * base, const char *path) +{ + int i; + int32 is_pipe; + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + FILE *fp = fopen_comp(path, "wb", &is_pipe); + if (!fp) { + E_ERROR("Unable to open %s to write binary trie LM\n", path); + return -1; + } + + fwrite(trie_hdr, sizeof(*trie_hdr), strlen(trie_hdr), fp); + fwrite(&model->base.n, sizeof(model->base.n), 1, fp); + for (i = 0; i < model->base.n; i++) { + fwrite(&model->base.n_counts[i], sizeof(model->base.n_counts[i]), + 1, fp); + } + lm_trie_write_bin(model->trie, base->n_counts[0], fp); + write_word_str(fp, base); + fclose_comp(fp, is_pipe); + return 0; +} + +ngram_model_t * +ngram_model_trie_read_dmp(cmd_ln_t * config, + const char *file_name, logmath_t * lmath) +{ + uint8 do_swap; + int32 is_pipe; + int32 k; + uint32 j; + int32 vn, ts; + int32 count; + uint32 counts[3]; + uint32 *unigram_next; + int order; + char str[1024]; + FILE *fp; + ngram_model_trie_t *model; + ngram_model_t *base; + ngram_raw_t **raw_ngrams; + + E_INFO("Trying to read LM in dmp format\n"); + if ((fp = fopen_comp(file_name, "rb", &is_pipe)) == NULL) { + E_ERROR("Dump file %s not found\n", file_name); + return NULL; + } + + do_swap = FALSE; + fread(&k, sizeof(k), 1, fp); + if (k != strlen(dmp_hdr) + 1) { + SWAP_INT32(&k); + if (k != strlen(dmp_hdr) + 1) { + E_ERROR + ("Wrong magic header size number %x: %s is not a dump file\n", + k, file_name); + return NULL; + } + do_swap = 1; + } + if (fread(str, 1, k, fp) != (size_t) k) { + E_ERROR("Cannot read header\n"); + return NULL; + } + if (strncmp(str, dmp_hdr, k) != 0) { + E_ERROR("Wrong header %s: %s is not a dump file\n", dmp_hdr); + return NULL; + } + + if (fread(&k, sizeof(k), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&k); + if (fread(str, 1, k, fp) != (size_t) k) { + E_ERROR("Cannot read LM filename in header\n"); + return NULL; + } + + /* read version#, if present (must be <= 0) */ + if (fread(&vn, sizeof(vn), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&vn); + if (vn <= 0) { + /* read and don't compare timestamps (we don't care) */ + if (fread(&ts, sizeof(ts), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&ts); + + /* read and skip format description */ + for (;;) { + if (fread(&k, sizeof(k), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&k); + if (k == 0) + break; + if (fread(str, 1, k, fp) != (size_t) k) { + E_ERROR("Failed to read word\n"); + return NULL; + } + } + /* read model->ucount */ + if (fread(&count, sizeof(count), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&count); + counts[0] = count; + } + else { + counts[0] = vn; + } + /* read model->bcount, tcount */ + if (fread(&count, sizeof(count), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&count); + counts[1] = count; + if (fread(&count, sizeof(count), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&count); + counts[2] = count; + E_INFO("ngrams 1=%d, 2=%d, 3=%d\n", counts[0], counts[1], counts[2]); + + model = (ngram_model_trie_t *) ckd_calloc(1, sizeof(*model)); + base = &model->base; + if (counts[2] > 0) + order = 3; + else if (counts[1] > 0) + order = 2; + else + order = 1; + ngram_model_init(base, &ngram_model_trie_funcs, lmath, order, + (int32) counts[0]); + + model->trie = lm_trie_create(counts[0], order); + + unigram_next = + (uint32 *) ckd_calloc((int32) counts[0] + 1, sizeof(unigram_next)); + for (j = 0; j <= (int32) counts[0]; j++) { + int32 bigrams; + int32 mapid; + dmp_weight_t weightp; + dmp_weight_t weightb; + + /* Skip over the mapping ID, we don't care about it. */ + /* Read the weights from actual unigram structure. */ + fread(&mapid, sizeof(int32), 1, fp); + fread(&weightp, sizeof(weightp), 1, fp); + fread(&weightb, sizeof(weightb), 1, fp); + fread(&bigrams, sizeof(int32), 1, fp); + if (do_swap) { + SWAP_INT32(&weightp.l); + SWAP_INT32(&weightb.l); + SWAP_INT32(&bigrams); + } + model->trie->unigrams[j].prob = logmath_log10_to_log_float(lmath, weightp.f); + model->trie->unigrams[j].bo = logmath_log10_to_log_float(lmath, weightb.f); + model->trie->unigrams[j].next = bigrams; + unigram_next[j] = bigrams; + } + + if (order > 1) { + raw_ngrams = + ngrams_raw_read_dmp(fp, lmath, counts, order, unigram_next, + do_swap); + if (raw_ngrams == NULL) { + ngram_model_free(base); + ckd_free(unigram_next); + fclose_comp(fp, is_pipe); + return NULL; + } + lm_trie_build(model->trie, raw_ngrams, counts, base->n_counts, order); + ngrams_raw_free(raw_ngrams, counts, order); + } + + /* Sentinel unigram and bigrams read before */ + ckd_free(unigram_next); + + /* read ascii word strings */ + read_word_str(base, fp); + + fclose_comp(fp, is_pipe); + return base; +} + +static void +ngram_model_trie_free(ngram_model_t * base) +{ + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + lm_trie_free(model->trie); +} + +static int +trie_apply_weights(ngram_model_t * base, float32 lw, float32 wip) +{ + /* just update weights that are going to be used on score calculation */ + base->lw = lw; + base->log_wip = logmath_log(base->lmath, wip); + return 0; +} + +static int32 +weight_score(ngram_model_t * base, int32 score) +{ + return (int32) (score * base->lw + base->log_wip); +} + +static int32 +ngram_model_trie_raw_score(ngram_model_t * base, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used) +{ + int32 i; + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + + if (n_hist > model->base.n - 1) + n_hist = model->base.n - 1; + for (i = 0; i < n_hist; i++) { + if (hist[i] < 0) { + n_hist = i; + break; + } + } + + return (int32) lm_trie_score(model->trie, model->base.n, wid, hist, + n_hist, n_used); +} + +static int32 +ngram_model_trie_score(ngram_model_t * base, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used) +{ + return weight_score(base, + ngram_model_trie_raw_score(base, wid, hist, n_hist, + n_used)); +} + +static int32 +lm_trie_add_ug(ngram_model_t * base, int32 wid, int32 lweight) +{ + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + + /* This would be very bad if this happened! */ + assert(!NGRAM_IS_CLASSWID(wid)); + + /* Reallocate unigram array. */ + model->trie->unigrams = + (unigram_t *) ckd_realloc(model->trie->unigrams, + sizeof(*model->trie->unigrams) * + (base->n_1g_alloc + 1)); + memset(model->trie->unigrams + (base->n_counts[0] + 1), 0, + (size_t) (base->n_1g_alloc - + base->n_counts[0]) * sizeof(*model->trie->unigrams)); + ++base->n_counts[0]; + lweight += logmath_log(base->lmath, 1.0 / base->n_counts[0]); + model->trie->unigrams[wid + 1].next = model->trie->unigrams[wid].next; + model->trie->unigrams[wid].prob = (float) lweight; + /* This unigram by definition doesn't participate in any bigrams, + * so its backoff weight is undefined and next pointer same as in finish unigram*/ + model->trie->unigrams[wid].bo = 0; + /* Finally, increase the unigram count */ + /* FIXME: Note that this can actually be quite bogus due to the + * presence of class words. If wid falls outside the unigram + * count, increase it to compensate, at the cost of no longer + * really knowing how many unigrams we have :( */ + if ((uint32) wid >= base->n_counts[0]) + base->n_counts[0] = wid + 1; + + return (int32) weight_score(base, lweight); +} + +static void +lm_trie_flush(ngram_model_t * base) +{ + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + lm_trie_t *trie = model->trie; + memset(trie->hist_cache, -1, sizeof(trie->hist_cache)); + memset(trie->backoff_cache, 0, sizeof(trie->backoff_cache)); + return; +} + +static ngram_funcs_t ngram_model_trie_funcs = { + ngram_model_trie_free, /* free */ + trie_apply_weights, /* apply_weights */ + ngram_model_trie_score, /* score */ + ngram_model_trie_raw_score, /* raw_score */ + lm_trie_add_ug, /* add_ug */ + lm_trie_flush /* flush */ +}; diff --git a/src/libsphinxbase/lm/ngram_model_trie.h b/src/libsphinxbase/lm/ngram_model_trie.h new file mode 100644 index 000000000..bc73df692 --- /dev/null +++ b/src/libsphinxbase/lm/ngram_model_trie.h @@ -0,0 +1,82 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef __NGRAM_MODEL_TRIE_H__ +#define __NGRAM_MODEL_TRIE_H__ + +#include +#include + +#include "ngram_model_internal.h" +#include "lm_trie.h" + +typedef struct ngram_model_trie_s { + ngram_model_t base; /**< Base ngram_model_t structure */ + lm_trie_t *trie; /**< Trie structure that stores ngram relations and weights */ +} ngram_model_trie_t; + +/** + * Read N-Gram model from and ARPABO text file and arrange it in trie structure + */ +ngram_model_t *ngram_model_trie_read_arpa(cmd_ln_t * config, + const char *path, + logmath_t * lmath); + +/** + * Write N-Gram model stored in trie structure in ARPABO format + */ +int ngram_model_trie_write_arpa(ngram_model_t * base, const char *path); + +/** + * Read N-Gram model from the binary file and arrange it in a trie structure + */ +ngram_model_t *ngram_model_trie_read_bin(cmd_ln_t * config, + const char *path, + logmath_t * lmath); + +/** + * Write trie to binary file + */ +int ngram_model_trie_write_bin(ngram_model_t * model, const char *path); + +/** + * Read N-Gram model from DMP file and arrange it in trie structure + */ +ngram_model_t *ngram_model_trie_read_dmp(cmd_ln_t * config, + const char *file_name, + logmath_t * lmath); + +#endif /* __NGRAM_MODEL_TRIE_H__ */ diff --git a/src/libsphinxbase/lm/ngrams_raw.c b/src/libsphinxbase/lm/ngrams_raw.c new file mode 100644 index 000000000..880fa8892 --- /dev/null +++ b/src/libsphinxbase/lm/ngrams_raw.c @@ -0,0 +1,387 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include + +#include +#include +#include +#include +#include + +#include "ngram_model_internal.h" +#include "ngrams_raw.h" + +int +ngram_ord_comparator(const void *a_raw, const void *b_raw) +{ + ngram_raw_t *a = (ngram_raw_t *) a_raw; + ngram_raw_t *b = (ngram_raw_t *) b_raw; + int a_w_ptr = 0; + int b_w_ptr = 0; + while (a_w_ptr < a->order && b_w_ptr < b->order) { + if (a->words[a_w_ptr] == b->words[b_w_ptr]) { + a_w_ptr++; + b_w_ptr++; + continue; + } + if (a->words[a_w_ptr] < b->words[b_w_ptr]) + return -1; + else + return 1; + } + return a->order - b->order; +} + +static int +ngrams_raw_read_line(lineiter_t *li, hash_table_t *wid, + logmath_t *lmath, int order, int order_max, + ngram_raw_t *raw_ngram) +{ + int n, i; + int words_expected; + char *wptr[NGRAM_MAX_ORDER + 1]; + uint32 *word_out; + + words_expected = order + 1; + if ((n = + str2words(li->buf, wptr, + NGRAM_MAX_ORDER + 1)) < words_expected) { + E_ERROR("Format error; %d-gram ignored at line %d\n", order, li->lineno); + return -1; + } + + raw_ngram->order = order; + + if (order == order_max) { + raw_ngram->prob = atof_c(wptr[0]); + if (raw_ngram->prob > 0) { + E_WARN("%d-gram '%s' has positive probability\n", order, wptr[1]); + raw_ngram->prob = 0.0f; + } + raw_ngram->prob = + logmath_log10_to_log_float(lmath, raw_ngram->prob); + } + else { + float weight, backoff; + + weight = atof_c(wptr[0]); + if (weight > 0) { + E_WARN("%d-gram '%s' has positive probability\n", order, wptr[1]); + raw_ngram->prob = 0.0f; + } + else { + raw_ngram->prob = + logmath_log10_to_log_float(lmath, weight); + } + + if (n == order + 1) { + raw_ngram->backoff = 0.0f; + } + else { + backoff = atof_c(wptr[order + 1]); + raw_ngram->backoff = + logmath_log10_to_log_float(lmath, backoff); + } + } + raw_ngram->words = + (uint32 *) ckd_calloc(order, sizeof(*raw_ngram->words)); + for (word_out = raw_ngram->words + order - 1, i = 1; + word_out >= raw_ngram->words; --word_out, i++) { + hash_table_lookup_int32(wid, wptr[i], (int32 *) word_out); + } + return 0; +} + +static int +ngrams_raw_read_section(ngram_raw_t ** raw_ngrams, lineiter_t ** li, + hash_table_t * wid, logmath_t * lmath, uint32 *count, + int order, int order_max) +{ + char expected_header[20]; + uint32 i, cur; + + sprintf(expected_header, "\\%d-grams:", order); + while (*li && strcmp((*li)->buf, expected_header) != 0) { + *li = lineiter_next(*li); + } + + if (*li == NULL) { + E_ERROR("Failed to find '%s', language model file truncated\n", expected_header); + return -1; + } + + *raw_ngrams = (ngram_raw_t *) ckd_calloc(*count, sizeof(ngram_raw_t)); + for (i = 0, cur = 0; i < *count && *li != NULL; i++) { + *li = lineiter_next(*li); + if (*li == NULL) { + E_ERROR("Unexpected end of ARPA file. Failed to read %d-gram\n", + order); + return -1; + } + if (ngrams_raw_read_line(*li, wid, lmath, order, order_max, + *raw_ngrams + cur) == 0) { + cur++; + } + } + *count = cur; + qsort(*raw_ngrams, *count, sizeof(ngram_raw_t), &ngram_ord_comparator); + return 0; +} + +ngram_raw_t ** +ngrams_raw_read_arpa(lineiter_t ** li, logmath_t * lmath, uint32 * counts, + int order, hash_table_t * wid) +{ + ngram_raw_t **raw_ngrams; + int order_it; + + raw_ngrams = + (ngram_raw_t **) ckd_calloc(order - 1, sizeof(*raw_ngrams)); + + for (order_it = 2; order_it <= order; order_it++) { + if (ngrams_raw_read_section(&raw_ngrams[order_it - 2], li, wid, lmath, + counts + order_it - 1, order_it, order) < 0) + break; + } + + /* Check if we found ARPA end-mark */ + if (*li == NULL) { + E_ERROR("ARPA file ends without end-mark\n"); + ngrams_raw_free(raw_ngrams, counts, order); + return NULL; + } else { + *li = lineiter_next(*li); + if (strcmp((*li)->buf, "\\end\\") != 0) { + E_WARN + ("Finished reading ARPA file. Expecting end mark but found '%s'\n", + (*li)->buf); + } + } + + return raw_ngrams; +} + +static void +read_dmp_weight_array(FILE * fp, logmath_t * lmath, uint8 do_swap, + int32 counts, ngram_raw_t * raw_ngrams, + int weight_idx) +{ + int32 i, k; + dmp_weight_t *tmp_weight_arr; + + fread(&k, sizeof(k), 1, fp); + if (do_swap) + SWAP_INT32(&k); + tmp_weight_arr = + (dmp_weight_t *) ckd_calloc(k, sizeof(*tmp_weight_arr)); + fread(tmp_weight_arr, sizeof(*tmp_weight_arr), k, fp); + for (i = 0; i < k; i++) { + if (do_swap) + SWAP_INT32(&tmp_weight_arr[i].l); + /* Convert values to log. */ + tmp_weight_arr[i].f = + logmath_log10_to_log_float(lmath, tmp_weight_arr[i].f); + } + /* replace indexes with real probs in raw bigrams */ + for (i = 0; i < counts; i++) { + if (weight_idx == 0) { + raw_ngrams[i].prob = + tmp_weight_arr[(int) raw_ngrams[i].prob].f; + } else { + raw_ngrams[i].backoff = + tmp_weight_arr[(int) raw_ngrams[i].backoff].f; + } + } + ckd_free(tmp_weight_arr); +} + +#define BIGRAM_SEGMENT_SIZE 9 + +ngram_raw_t ** +ngrams_raw_read_dmp(FILE * fp, logmath_t * lmath, uint32 * counts, + int order, uint32 * unigram_next, uint8 do_swap) +{ + uint32 j, ngram_idx; + uint16 *bigrams_next; + ngram_raw_t **raw_ngrams = + (ngram_raw_t **) ckd_calloc(order - 1, sizeof(*raw_ngrams)); + + /* read bigrams */ + raw_ngrams[0] = + (ngram_raw_t *) ckd_calloc((size_t) (counts[1] + 1), + sizeof(*raw_ngrams[0])); + bigrams_next = + (uint16 *) ckd_calloc((size_t) (counts[1] + 1), + sizeof(*bigrams_next)); + ngram_idx = 1; + for (j = 0; j <= (int32) counts[1]; j++) { + uint16 wid, prob_idx, bo_idx; + ngram_raw_t *raw_ngram = &raw_ngrams[0][j]; + + fread(&wid, sizeof(wid), 1, fp); + if (do_swap) + SWAP_INT16(&wid); + raw_ngram->order = 2; + while (ngram_idx < counts[0] && j == unigram_next[ngram_idx]) { + ngram_idx++; + } + + if (j != counts[1]) { + raw_ngram->words = + (uint32 *) ckd_calloc(2, sizeof(*raw_ngram->words)); + raw_ngram->words[0] = (uint32) wid; + raw_ngram->words[1] = (uint32) ngram_idx - 1; + } + + fread(&prob_idx, sizeof(prob_idx), 1, fp); + fread(&bo_idx, sizeof(bo_idx), 1, fp); + fread(&bigrams_next[j], sizeof(bigrams_next[j]), 1, fp); + if (do_swap) { + SWAP_INT16(&prob_idx); + SWAP_INT16(&bo_idx); + SWAP_INT16(&bigrams_next[j]); + } + + if (j != counts[1]) { + raw_ngram->prob = prob_idx + 0.5f; /* keep index in float. ugly but avoiding using extra memory */ + raw_ngram->backoff = bo_idx + 0.5f; + } + } + + if (ngram_idx < counts[0]) { + E_ERROR("Corrupted model, not enough unigrams %d %d\n", ngram_idx, counts[0]); + ckd_free(bigrams_next); + ngrams_raw_free(raw_ngrams, counts, order); + return NULL; + } + + /* read trigrams */ + if (order > 2) { + raw_ngrams[1] = + (ngram_raw_t *) ckd_calloc((size_t) counts[2], + sizeof(*raw_ngrams[1])); + for (j = 0; j < (int32) counts[2]; j++) { + uint16 wid, prob_idx; + ngram_raw_t *raw_ngram = &raw_ngrams[1][j]; + + fread(&wid, sizeof(wid), 1, fp); + fread(&prob_idx, sizeof(prob_idx), 1, fp); + if (do_swap) { + SWAP_INT16(&wid); + SWAP_INT16(&prob_idx); + } + + raw_ngram->order = 3; + raw_ngram->words = + (uint32 *) ckd_calloc(3, sizeof(*raw_ngram->words)); + raw_ngram->words[0] = (uint32) wid; + raw_ngram->prob = prob_idx + 0.5f; /* keep index in float. ugly but avoiding using extra memory */ + } + } + + /* read prob2 */ + read_dmp_weight_array(fp, lmath, do_swap, (int32) counts[1], + raw_ngrams[0], 0); + /* read bo2 */ + if (order > 2) { + int32 k; + int32 *tseg_base; + read_dmp_weight_array(fp, lmath, do_swap, (int32) counts[1], + raw_ngrams[0], 1); + /* read prob3 */ + read_dmp_weight_array(fp, lmath, do_swap, (int32) counts[2], + raw_ngrams[1], 0); + /* Read tseg_base size and tseg_base to fill trigram's first words */ + fread(&k, sizeof(k), 1, fp); + if (do_swap) + SWAP_INT32(&k); + tseg_base = (int32 *) ckd_calloc(k, sizeof(int32)); + fread(tseg_base, sizeof(int32), k, fp); + if (do_swap) { + for (j = 0; j < (uint32) k; j++) { + SWAP_INT32(&tseg_base[j]); + } + } + ngram_idx = 0; + for (j = 1; j <= counts[1]; j++) { + uint32 next_ngram_idx = + (uint32) (tseg_base[j >> BIGRAM_SEGMENT_SIZE] + + bigrams_next[j]); + while (ngram_idx < next_ngram_idx) { + raw_ngrams[1][ngram_idx].words[1] = + raw_ngrams[0][j - 1].words[0]; + raw_ngrams[1][ngram_idx].words[2] = + raw_ngrams[0][j - 1].words[1]; + ngram_idx++; + } + } + ckd_free(tseg_base); + + if (ngram_idx < counts[2]) { + E_ERROR("Corrupted model, some trigrams have no corresponding bigram\n"); + ckd_free(bigrams_next); + ngrams_raw_free(raw_ngrams, counts, order); + return NULL; + } + } + ckd_free(bigrams_next); + + /* sort raw ngrams for reverse trie */ + qsort(raw_ngrams[0], (size_t) counts[1], sizeof(*raw_ngrams[0]), + &ngram_ord_comparator); + if (order > 2) { + qsort(raw_ngrams[1], (size_t) counts[2], sizeof(*raw_ngrams[1]), + &ngram_ord_comparator); + } + return raw_ngrams; +} + +void +ngrams_raw_free(ngram_raw_t ** raw_ngrams, uint32 * counts, int order) +{ + uint32 num; + int order_it; + + for (order_it = 0; order_it < order - 1; order_it++) { + for (num = 0; num < counts[order_it + 1]; num++) { + ckd_free(raw_ngrams[order_it][num].words); + } + ckd_free(raw_ngrams[order_it]); + } + ckd_free(raw_ngrams); +} diff --git a/src/libsphinxbase/lm/ngrams_raw.h b/src/libsphinxbase/lm/ngrams_raw.h new file mode 100644 index 000000000..725d09aa5 --- /dev/null +++ b/src/libsphinxbase/lm/ngrams_raw.h @@ -0,0 +1,94 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __NGRAMS_RAW_H__ +#define __NGRAMS_RAW_H__ + +#include +#include +#include +#include +#include + +typedef struct ngram_raw_s { + uint32 *words; /* array of word indexes, length corresponds to ngram order */ + float32 prob; + float32 backoff; + uint32 order; +} ngram_raw_t; + +typedef union { + float32 f; + int32 l; +} dmp_weight_t; + +/** + * Raw ordered ngrams comparator + */ +int ngram_ord_comparator(const void *a_raw, const void *b_raw); + +/** + * Read ngrams of order > 1 from ARPA file + * @param li [in] sphinxbase file line iterator that point to bigram description in ARPA file + * @param wid [in] hashtable that maps string word representation to id + * @param lmath [in] log math used for log convertions + * @param counts [in] amount of ngrams for each order + * @param order [in] maximum order of ngrams + * @return raw ngrams of order bigger than 1 + */ +ngram_raw_t **ngrams_raw_read_arpa(lineiter_t ** li, logmath_t * lmath, + uint32 * counts, int order, + hash_table_t * wid); + +/** + * Reads ngrams of order > 1 from DMP file. + * @param fp [in] file to read from. Position in file corresponds to start of bigram description + * @param lmath [in] log math used for log convertions + * @param counts [in] amount of ngrams for each order + * @param order [in] maximum order of ngrams + * @param unigram_next [in] array of next word pointers for unigrams. Needed to define forst word of bigrams + * @param do_swap [in] wether to do swap of bits + * @return raw ngrams of order bigger than 1 + */ +ngram_raw_t **ngrams_raw_read_dmp(FILE * fp, logmath_t * lmath, + uint32 * counts, int order, + uint32 * unigram_next, uint8 do_swap); + +void ngrams_raw_free(ngram_raw_t ** raw_ngrams, uint32 * counts, + int order); + +#endif /* __LM_NGRAMS_RAW_H__ */ diff --git a/src/libsphinxbase/util/Makefile.am b/src/libsphinxbase/util/Makefile.am new file mode 100644 index 000000000..c7d191178 --- /dev/null +++ b/src/libsphinxbase/util/Makefile.am @@ -0,0 +1,46 @@ +noinst_LTLIBRARIES = libsphinxutil.la + +if LAPACK_LITE +LAPACK_LITE_SRCS = \ + slamch.c \ + slapack_lite.c \ + blas_lite.c \ + f2c_lite.c +endif + +libsphinxutil_la_SOURCES = \ + bitarr.c \ + bitvec.c \ + bio.c \ + case.c \ + ckd_alloc.c \ + dtoa.c \ + listelem_alloc.c \ + cmd_ln.c \ + err.c \ + filename.c \ + genrand.c \ + glist.c \ + hash_table.c \ + heap.c \ + logmath.c \ + mmio.c \ + pio.c \ + matrix.c \ + priority_queue.c \ + profile.c \ + sbthread.c \ + strfuncs.c \ + $(LAPACK_LITE_SRCS) + +EXTRA_DIST = \ + slamch.c \ + slapack_lite.c \ + blas_lite.c \ + f2c_lite.c + +AM_CFLAGS =-I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include + +LIBOBJS = @LIBOBJS@ diff --git a/src/libsphinxbase/util/README.python b/src/libsphinxbase/util/README.python new file mode 100644 index 000000000..6f89bc5f4 --- /dev/null +++ b/src/libsphinxbase/util/README.python @@ -0,0 +1,41 @@ +Regenerating lapack_lite source +=============================== + +:Author: David M. Cooke +:Modified by David Huggins-Daines for Sphinx + +``blas_lite.c``, ``slapack_lite.c``, are ``f2c``'d versions of the +LAPACK routines required by the ``LinearAlgebra`` module, and wrapped +by the ``lapack_lite`` module. The scripts in this directory can be +used to create these files automatically from a directory of LAPACK +source files. + +You'll need `Plex 1.1.4`_ installed to do the appropriate scrubbing. + +.. _Plex 1.1.4: http://www.cosc.canterbury.ac.nz/~greg/python/Plex/ + +The routines that ``lapack_litemodule.c`` wraps are listed in +``wrapped_routines``, along with a few exceptions that aren't picked up +properly. Assuming that you have an unpacked LAPACK source tree in +``~/LAPACK``, you generate the new routines in a directory ``new-lite/`` with:: + +$ python ./make_lite.py wrapped_routines ~/LAPACK new-lite/ + +This will grab the right routines, with dependencies, put them into the +appropiate ``blas_lite.f``, ``dlapack_lite.f``, or ``zlapack_lite.f`` files, +run ``f2c`` over them, then do some scrubbing similiar to that done to +generate the CLAPACK_ distribution. + +.. _CLAPACK: http://netlib.org/clapack/index.html + +The versions in CVS as of 2005-04-12 use the LAPACK source from the +`Debian package lapack3`_, version 3.0.20000531a-6. It was found that these +(being regularly maintained) worked better than the patches to the last +released version of LAPACK available at the LAPACK_ page. + +.. _Debian package lapack3: http://packages.debian.org/unstable/libs/lapack3 +.. _LAPACK: http://netlib.org/lapack/index.html + +A slightly-patched ``f2c`` was used to add parentheses around ``||`` expressions +and the arguments to ``<<`` to silence gcc warnings. Edit +the ``src/output.c`` in the ``f2c`` source to do this. diff --git a/src/libsphinxbase/util/bio.c b/src/libsphinxbase/util/bio.c new file mode 100644 index 000000000..56c620f68 --- /dev/null +++ b/src/libsphinxbase/util/bio.c @@ -0,0 +1,644 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * bio.c -- Sphinx-3 binary file I/O functions. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.4 2005/06/21 20:40:46 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add the $ keyword. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 02-Jul-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Bugfix: Added byteswapping in bio_verify_chksum(). + * + * 18-Dec-1996 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/bio.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" + + +#define BIO_HDRARG_MAX 32 +#define END_COMMENT "*end_comment*\n" + + +static void +bcomment_read(FILE * fp) +{ + __BIGSTACKVARIABLE__ char iline[16384]; + + while (fgets(iline, sizeof(iline), fp) != NULL) { + if (strcmp(iline, END_COMMENT) == 0) + return; + } + E_FATAL("Missing %s marker\n", END_COMMENT); +} + + +static int32 +swap_check(FILE * fp) +{ + uint32 magic; + + if (fread(&magic, sizeof(uint32), 1, fp) != 1) { + E_ERROR("Cannot read BYTEORDER MAGIC NO.\n"); + return -1; + } + + if (magic != BYTE_ORDER_MAGIC) { + /* either need to swap or got bogus magic number */ + SWAP_INT32(&magic); + + if (magic == BYTE_ORDER_MAGIC) + return 1; + + SWAP_INT32(&magic); + E_ERROR("Bad BYTEORDER MAGIC NO: %08x, expecting %08x\n", + magic, BYTE_ORDER_MAGIC); + return -1; + } + + return 0; +} + + +void +bio_hdrarg_free(char **argname, char **argval) +{ + int32 i; + + if (argname == NULL) + return; + for (i = 0; argname[i]; i++) { + ckd_free(argname[i]); + ckd_free(argval[i]); + } + ckd_free(argname); + ckd_free(argval); +} + + +int32 +bio_writehdr_version(FILE * fp, char *version) +{ + uint32 b; + + fprintf(fp, "s3\n"); + fprintf(fp, "version %s\n", version); + fprintf(fp, "endhdr\n"); + fflush(fp); + + b = (uint32) BYTE_ORDER_MAGIC; + fwrite(&b, sizeof(uint32), 1, fp); + fflush(fp); + + return 0; +} + + +int32 +bio_writehdr(FILE *fp, ...) +{ + char const *key; + va_list args; + uint32 b; + + fprintf(fp, "s3\n"); + va_start(args, fp); + while ((key = va_arg(args, char const *)) != NULL) { + char const *val = va_arg(args, char const *); + if (val == NULL) { + E_ERROR("Wrong number of arguments\n"); + va_end(args); + return -1; + } + fprintf(fp, "%s %s\n", key, val); + } + va_end(args); + + fprintf(fp, "endhdr\n"); + fflush(fp); + + b = (uint32) BYTE_ORDER_MAGIC; + if (fwrite(&b, sizeof(uint32), 1, fp) != 1) + return -1; + fflush(fp); + + return 0; +} + + +int32 +bio_readhdr(FILE * fp, char ***argname, char ***argval, int32 * swap) +{ + __BIGSTACKVARIABLE__ char line[16384], word[4096]; + int32 i, l; + int32 lineno; + + *argname = (char **) ckd_calloc(BIO_HDRARG_MAX + 1, sizeof(char *)); + *argval = (char **) ckd_calloc(BIO_HDRARG_MAX, sizeof(char *)); + + lineno = 0; + if (fgets(line, sizeof(line), fp) == NULL){ + E_ERROR("Premature EOF, line %d\n", lineno); + goto error_out; + } + lineno++; + + if ((line[0] == 's') && (line[1] == '3') && (line[2] == '\n')) { + /* New format (post Dec-1996, including checksums); read argument-value pairs */ + for (i = 0;;) { + if (fgets(line, sizeof(line), fp) == NULL) { + E_ERROR("Premature EOF, line %d\n", lineno); + goto error_out; + } + lineno++; + + if (sscanf(line, "%s%n", word, &l) != 1) { + E_ERROR("Header format error, line %d\n", lineno); + goto error_out; + } + if (strcmp(word, "endhdr") == 0) + break; + if (word[0] == '#') /* Skip comments */ + continue; + + if (i >= BIO_HDRARG_MAX) { + E_ERROR + ("Max arg-value limit(%d) exceeded; increase BIO_HDRARG_MAX\n", + BIO_HDRARG_MAX); + goto error_out; + } + + (*argname)[i] = ckd_salloc(word); + if (sscanf(line + l, "%s", word) != 1) { /* Multi-word values not allowed */ + E_ERROR("Header format error, line %d\n", lineno); + goto error_out; + } + (*argval)[i] = ckd_salloc(word); + i++; + } + } + else { + /* Old format (without checksums); the first entry must be the version# */ + if (sscanf(line, "%s", word) != 1) { + E_ERROR("Header format error, line %d\n", lineno); + goto error_out; + } + + (*argname)[0] = ckd_salloc("version"); + (*argval)[0] = ckd_salloc(word); + i = 1; + + bcomment_read(fp); + } + (*argname)[i] = NULL; + + if ((*swap = swap_check(fp)) < 0) { + E_ERROR("swap_check failed\n"); + goto error_out; + } + + return 0; +error_out: + bio_hdrarg_free(*argname, *argval); + *argname = *argval = NULL; + return -1; +} + + +static uint32 +chksum_accum(const void *buf, int32 el_sz, int32 n_el, uint32 sum) +{ + int32 i; + uint8 *i8; + uint16 *i16; + uint32 *i32; + + switch (el_sz) { + case 1: + i8 = (uint8 *) buf; + for (i = 0; i < n_el; i++) + sum = (sum << 5 | sum >> 27) + i8[i]; + break; + case 2: + i16 = (uint16 *) buf; + for (i = 0; i < n_el; i++) + sum = (sum << 10 | sum >> 22) + i16[i]; + break; + case 4: + i32 = (uint32 *) buf; + for (i = 0; i < n_el; i++) + sum = (sum << 20 | sum >> 12) + i32[i]; + break; + default: + E_FATAL("Unsupported elemsize for checksum: %d\n", el_sz); + break; + } + + return sum; +} + + +static void +swap_buf(void *buf, int32 el_sz, int32 n_el) +{ + int32 i; + uint16 *buf16; + uint32 *buf32; + + switch (el_sz) { + case 1: + break; + case 2: + buf16 = (uint16 *) buf; + for (i = 0; i < n_el; i++) + SWAP_INT16(buf16 + i); + break; + case 4: + buf32 = (uint32 *) buf; + for (i = 0; i < n_el; i++) + SWAP_INT32(buf32 + i); + break; + default: + E_FATAL("Unsupported elemsize for byteswapping: %d\n", el_sz); + break; + } +} + + +int32 +bio_fread(void *buf, int32 el_sz, int32 n_el, FILE * fp, int32 swap, + uint32 * chksum) +{ + if (fread(buf, el_sz, n_el, fp) != (size_t) n_el) + return -1; + + if (swap) + swap_buf(buf, el_sz, n_el); + + if (chksum) + *chksum = chksum_accum(buf, el_sz, n_el, *chksum); + + return n_el; +} + +int32 +bio_fwrite(const void *buf, int32 el_sz, int32 n_el, FILE *fp, + int32 swap, uint32 *chksum) +{ + if (chksum) + *chksum = chksum_accum(buf, el_sz, n_el, *chksum); + if (swap) { + void *nbuf; + int rv; + + nbuf = ckd_calloc(n_el, el_sz); + memcpy(nbuf, buf, n_el * el_sz); + swap_buf(nbuf, el_sz, n_el); + rv = fwrite(nbuf, el_sz, n_el, fp); + ckd_free(nbuf); + return rv; + } + else { + return fwrite(buf, el_sz, n_el, fp); + } +} + +int32 +bio_fread_1d(void **buf, size_t el_sz, uint32 * n_el, FILE * fp, + int32 sw, uint32 * ck) +{ + /* Read 1-d array size */ + if (bio_fread(n_el, sizeof(int32), 1, fp, sw, ck) != 1) + E_FATAL("fread(arraysize) failed\n"); + if (*n_el <= 0) + E_FATAL("Bad arraysize: %d\n", *n_el); + + /* Allocate memory for array data */ + *buf = (void *) ckd_calloc(*n_el, el_sz); + + /* Read array data */ + if (bio_fread(*buf, el_sz, *n_el, fp, sw, ck) != *n_el) + E_FATAL("fread(arraydata) failed\n"); + + return *n_el; +} + +int32 +bio_fread_2d(void ***arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + FILE *fp, + uint32 swap, + uint32 *chksum) +{ + uint32 l_d1, l_d2; + uint32 n; + size_t ret; + void *raw; + + ret = bio_fread(&l_d1, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_2d"); + } + return -1; + } + ret = bio_fread(&l_d2, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_2d"); + } + return -1; + } + if (bio_fread_1d(&raw, e_sz, &n, fp, swap, chksum) != n) + return -1; + + assert(n == l_d1*l_d2); + + *d1 = l_d1; + *d2 = l_d2; + *arr = ckd_alloc_2d_ptr(l_d1, l_d2, raw, e_sz); + + return n; +} + +int32 +bio_fread_3d(void ****arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + uint32 *d3, + FILE *fp, + uint32 swap, + uint32 *chksum) +{ + uint32 l_d1; + uint32 l_d2; + uint32 l_d3; + uint32 n; + void *raw; + size_t ret; + + ret = bio_fread(&l_d1, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_3d"); + } + return -1; + } + ret = bio_fread(&l_d2, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_3d"); + } + return -1; + } + ret = bio_fread(&l_d3, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_3d"); + } + return -1; + } + + if (bio_fread_1d(&raw, e_sz, &n, fp, swap, chksum) != n) { + return -1; + } + + assert(n == l_d1 * l_d2 * l_d3); + + *arr = ckd_alloc_3d_ptr(l_d1, l_d2, l_d3, raw, e_sz); + *d1 = l_d1; + *d2 = l_d2; + *d3 = l_d3; + + return n; +} + +void +bio_verify_chksum(FILE * fp, int32 byteswap, uint32 chksum) +{ + uint32 file_chksum; + + if (fread(&file_chksum, sizeof(uint32), 1, fp) != 1) + E_FATAL("fread(chksum) failed\n"); + if (byteswap) + SWAP_INT32(&file_chksum); + if (file_chksum != chksum) + E_FATAL + ("Checksum error; file-checksum %08x, computed %08x\n", + file_chksum, chksum); +} + +int +bio_fwrite_3d(void ***arr, + size_t e_sz, + uint32 d1, + uint32 d2, + uint32 d3, + FILE *fp, + uint32 *chksum) +{ + size_t ret; + + /* write out first dimension 1 */ + ret = bio_fwrite(&d1, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_3d"); + } + return -1; + } + + /* write out first dimension 2 */ + ret = bio_fwrite(&d2, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_3d"); + } + return -1; + } + + /* write out first dimension 3 */ + ret = bio_fwrite(&d3, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_3d"); + } + return -1; + } + + /* write out the data in the array as one big block */ + return bio_fwrite_1d(arr[0][0], e_sz, d1 * d2 * d3, fp, chksum); +} + +int +bio_fwrite_1d(void *arr, + size_t e_sz, + uint32 d1, + FILE *fp, + uint32 *chksum) +{ + size_t ret; + ret = bio_fwrite(&d1, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_1d"); + } + return -1; + } + + ret = bio_fwrite(arr, e_sz, d1, fp, 0, chksum); + if (ret != d1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_1d"); + } + + return -1; + } + + return ret; +} + +int16* +bio_read_wavfile(char const *directory, + char const *filename, + char const *extension, + int32 header, + int32 endian, + size_t *nsamps) +{ + FILE *uttfp; + char *inputfile; + size_t n, l; + int16 *data; + + n = strlen(extension); + l = strlen(filename); + if ((n <= l) && (0 == strcmp(filename + l - n, extension))) + extension = ""; + inputfile = ckd_calloc(strlen(directory) + l + n + 2, 1); + if (directory) { + sprintf(inputfile, "%s/%s%s", directory, filename, extension); + } else { + sprintf(inputfile, "%s%s", filename, extension); + } + + if ((uttfp = fopen(inputfile, "rb")) == NULL) { + E_FATAL_SYSTEM("Failed to open file '%s' for reading", inputfile); + } + fseek(uttfp, 0, SEEK_END); + n = ftell(uttfp); + fseek(uttfp, 0, SEEK_SET); + if (header > 0) { + if (fseek(uttfp, header, SEEK_SET) < 0) { + E_ERROR_SYSTEM("Failed to move to an offset %d in a file '%s'", header, inputfile); + fclose(uttfp); + ckd_free(inputfile); + return NULL; + } + n -= header; + } + n /= sizeof(int16); + data = ckd_calloc(n, sizeof(*data)); + if ((l = fread(data, sizeof(int16), n, uttfp)) < n) { + E_ERROR_SYSTEM("Failed to read %d samples from %s: %d", n, inputfile, l); + ckd_free(data); + ckd_free(inputfile); + fclose(uttfp); + return NULL; + } + ckd_free(inputfile); + fclose(uttfp); + if (nsamps) *nsamps = n; + + return data; +} diff --git a/src/libsphinxbase/util/bitarr.c b/src/libsphinxbase/util/bitarr.c new file mode 100644 index 000000000..a76b03315 --- /dev/null +++ b/src/libsphinxbase/util/bitarr.c @@ -0,0 +1,139 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * bitarr.c -- Bit array manipulations implementation. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include "sphinxbase/bitarr.h" + +#define SIGN_BIT (0x80000000) + +/** + * Shift bits depending on byte order in system. + * Fun fact: __BYTE_ORDER is wrong on Solaris Sparc, but the version without __ is correct. + * @param bit is an offset last byte + * @param length - amount of bits for required for digit that is going to be read + * @return shift forgiven architecture + */ +static uint8 get_shift(uint8 bit, uint8 length) +{ +#ifdef WORDS_BIGENDIAN + return 64 - length - bit; +#else + return bit; +#endif +} + +/** + * Read uint64 value from the given address + * @param address to read from + * @return uint64 value that was read + */ +static uint64 read_off(bitarr_address_t address) +{ +#if defined(__arm) || defined(__arm__) + uint64 value64; + const uint8 *base_off = (const uint8 *)(address.base) + (address.offset >> 3); + memcpy(&value64, base_off, sizeof(value64)); + return value64; +#else + return *(const uint64*)((const uint8 *)(address.base) + (address.offset >> 3)); +#endif +} + +uint64 bitarr_read_int57(bitarr_address_t address, uint8 length, uint64 mask) +{ + return (read_off(address) >> get_shift(address.offset & 7, length)) & mask; +} + +void bitarr_write_int57(bitarr_address_t address, uint8 length, uint64 value) +{ +#if defined(__arm) || defined(__arm__) + uint64 value64; + uint8 *base_off = (uint8 *)(address.base) + (address.offset >> 3); + memcpy(&value64, base_off, sizeof(value64)); + value64 |= (value << get_shift(address.offset & 7, length)); + memcpy(base_off, &value64, sizeof(value64)); +#else + *(uint64 *)((uint8 *)(address.base) + (address.offset >> 3)) |= (value << get_shift(address.offset & 7, length)); +#endif +} + +uint32 bitarr_read_int25(bitarr_address_t address, uint8 length, uint32 mask) +{ +#if defined(__arm) || defined(__arm__) + uint32 value32; + const uint8 *base_off = (const uint8*)(address.base) + (address.offset >> 3); + memcpy(&value32, base_off, sizeof(value32)); + return (value32 >> get_shift(address.offset & 7, length)) & mask; +#else + return (*(const uint32*)((const uint8*)(address.base) + (address.offset >> 3)) >> get_shift(address.offset & 7, length)) & mask; +#endif +} + +void bitarr_write_int25(bitarr_address_t address, uint8 length, uint32 value) +{ +#if defined(__arm) || defined(__arm__) + uint32 value32; + uint8 *base_off = (uint8 *)(address.base) + (address.offset >> 3); + memcpy(&value32, base_off, sizeof(value32)); + value32 |= (value << get_shift(address.offset & 7, length)); + memcpy(base_off, &value32, sizeof(value32)); +#else + *(uint32 *)((uint8 *)(address.base) + (address.offset >> 3)) |= (value << get_shift(address.offset & 7, length)); +#endif +} + +void bitarr_mask_from_max(bitarr_mask_t *bit_mask, uint32 max_value) +{ + bit_mask->bits = bitarr_required_bits(max_value); + bit_mask->mask = (uint32)((1ULL << bit_mask->bits) - 1); +} + +uint8 bitarr_required_bits(uint32 max_value) +{ + uint8 res; + + if (!max_value) return 0; + res = 1; + while (max_value >>= 1) res++; + return res; +} \ No newline at end of file diff --git a/src/libsphinxbase/util/bitvec.c b/src/libsphinxbase/util/bitvec.c new file mode 100644 index 000000000..2d139010e --- /dev/null +++ b/src/libsphinxbase/util/bitvec.c @@ -0,0 +1,101 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * bitvec.c -- Bit vector type. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: bitvec.c,v $ + * Revision 1.4 2005/06/22 02:58:22 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Started. + */ + + +#include "sphinxbase/bitvec.h" + +bitvec_t * +bitvec_realloc(bitvec_t *vec, + size_t old_len, + size_t new_len) +{ + bitvec_t *new_vec; + size_t old_size = bitvec_size(old_len); + size_t new_size = bitvec_size(new_len); + + new_vec = ckd_realloc(vec, new_size * sizeof(bitvec_t)); + if (new_size > old_size) + memset(new_vec + old_size, 0, (new_size - old_size) * sizeof(bitvec_t)); + + return new_vec; +} + +size_t +bitvec_count_set(bitvec_t *vec, size_t len) +{ + size_t words, bits, w, b, n; + bitvec_t *v; + + words = len / BITVEC_BITS; + bits = len % BITVEC_BITS; + v = vec; + n = 0; + for (w = 0; w < words; ++w, ++v) { + if (*v == 0) + continue; + for (b = 0; b < BITVEC_BITS; ++b) + if (*v & (1<= 97 && inta <= 122) { + inta += -32; + } + if (intb >= 97 && intb <= 122) { + intb += -32; + } + + } else if (zcode == 233 || zcode == 169) { + +/* + EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or + upper case 'Z'. +*/ + + if ((inta >= 129 && inta <= 137) || (inta >= 145 && inta <= 153) || + (inta >= 162 && inta <= 169)) { + inta += 64; + } + if ((intb >= 129 && intb <= 137) || (intb >= 145 && intb <= 153) || + (intb >= 162 && intb <= 169)) { + intb += 64; + } + + } else if (zcode == 218 || zcode == 250) { + +/* + ASCII is assumed, on Prime machines - ZCODE is the ASCII code + plus 128 of either lower or upper case 'Z'. +*/ + + if (inta >= 225 && inta <= 250) { + inta += -32; + } + if (intb >= 225 && intb <= 250) { + intb += -32; + } + } + ret_val = inta == intb; + +/* + RETURN + + End of LSAME +*/ + + return ret_val; +} /* lsame_ */ + +doublereal sdot_(integer *n, real *sx, integer *incx, real *sy, integer *incy) +{ + /* System generated locals */ + integer i__1; + real ret_val; + + /* Local variables */ + static integer i__, m, ix, iy, mp1; + static real stemp; + + +/* + forms the dot product of two vectors. + uses unrolled loops for increments equal to one. + jack dongarra, linpack, 3/11/78. + modified 12/3/93, array(1) declarations changed to array(*) +*/ + + + /* Parameter adjustments */ + --sy; + --sx; + + /* Function Body */ + stemp = 0.f; + ret_val = 0.f; + if (*n <= 0) { + return ret_val; + } + if (*incx == 1 && *incy == 1) { + goto L20; + } + +/* + code for unequal increments or equal increments + not equal to 1 +*/ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + stemp += sx[ix] * sy[iy]; + ix += *incx; + iy += *incy; +/* L10: */ + } + ret_val = stemp; + return ret_val; + +/* + code for both increments equal to 1 + + + clean-up loop +*/ + +L20: + m = *n % 5; + if (m == 0) { + goto L40; + } + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + stemp += sx[i__] * sy[i__]; +/* L30: */ + } + if (*n < 5) { + goto L60; + } +L40: + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 5) { + stemp = stemp + sx[i__] * sy[i__] + sx[i__ + 1] * sy[i__ + 1] + sx[ + i__ + 2] * sy[i__ + 2] + sx[i__ + 3] * sy[i__ + 3] + sx[i__ + + 4] * sy[i__ + 4]; +/* L50: */ + } +L60: + ret_val = stemp; + return ret_val; +} /* sdot_ */ + +/* Subroutine */ int sgemm_(char *transa, char *transb, integer *m, integer * + n, integer *k, real *alpha, real *a, integer *lda, real *b, integer * + ldb, real *beta, real *c__, integer *ldc) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; + + /* Local variables */ + static integer i__, j, l, info; + static logical nota, notb; + static real temp; + static integer ncola; + extern logical lsame_(char *, char *); + static integer nrowa, nrowb; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SGEMM performs one of the matrix-matrix operations + + C := alpha*op( A )*op( B ) + beta*C, + + where op( X ) is one of + + op( X ) = X or op( X ) = X', + + alpha and beta are scalars, and A, B and C are matrices, with op( A ) + an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. + + Parameters + ========== + + TRANSA - CHARACTER*1. + On entry, TRANSA specifies the form of op( A ) to be used in + the matrix multiplication as follows: + + TRANSA = 'N' or 'n', op( A ) = A. + + TRANSA = 'T' or 't', op( A ) = A'. + + TRANSA = 'C' or 'c', op( A ) = A'. + + Unchanged on exit. + + TRANSB - CHARACTER*1. + On entry, TRANSB specifies the form of op( B ) to be used in + the matrix multiplication as follows: + + TRANSB = 'N' or 'n', op( B ) = B. + + TRANSB = 'T' or 't', op( B ) = B'. + + TRANSB = 'C' or 'c', op( B ) = B'. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of the matrix + op( A ) and of the matrix C. M must be at least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of the matrix + op( B ) and the number of columns of the matrix C. N must be + at least zero. + Unchanged on exit. + + K - INTEGER. + On entry, K specifies the number of columns of the matrix + op( A ) and the number of rows of the matrix op( B ). K must + be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, ka ), where ka is + k when TRANSA = 'N' or 'n', and is m otherwise. + Before entry with TRANSA = 'N' or 'n', the leading m by k + part of the array A must contain the matrix A, otherwise + the leading k by m part of the array A must contain the + matrix A. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When TRANSA = 'N' or 'n' then + LDA must be at least max( 1, m ), otherwise LDA must be at + least max( 1, k ). + Unchanged on exit. + + B - REAL array of DIMENSION ( LDB, kb ), where kb is + n when TRANSB = 'N' or 'n', and is k otherwise. + Before entry with TRANSB = 'N' or 'n', the leading k by n + part of the array B must contain the matrix B, otherwise + the leading n by k part of the array B must contain the + matrix B. + Unchanged on exit. + + LDB - INTEGER. + On entry, LDB specifies the first dimension of B as declared + in the calling (sub) program. When TRANSB = 'N' or 'n' then + LDB must be at least max( 1, k ), otherwise LDB must be at + least max( 1, n ). + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. When BETA is + supplied as zero then C need not be set on input. + Unchanged on exit. + + C - REAL array of DIMENSION ( LDC, n ). + Before entry, the leading m by n part of the array C must + contain the matrix C, except when beta is zero, in which + case C need not be set on entry. + On exit, the array C is overwritten by the m by n matrix + ( alpha*op( A )*op( B ) + beta*C ). + + LDC - INTEGER. + On entry, LDC specifies the first dimension of C as declared + in the calling (sub) program. LDC must be at least + max( 1, m ). + Unchanged on exit. + + + Level 3 Blas routine. + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Set NOTA and NOTB as true if A and B respectively are not + transposed and set NROWA, NCOLA and NROWB as the number of rows + and columns of A and the number of rows of B respectively. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + nota = lsame_(transa, "N"); + notb = lsame_(transb, "N"); + if (nota) { + nrowa = *m; + ncola = *k; + } else { + nrowa = *k; + ncola = *m; + } + if (notb) { + nrowb = *k; + } else { + nrowb = *n; + } + +/* Test the input parameters. */ + + info = 0; + if (! nota && ! lsame_(transa, "C") && ! lsame_( + transa, "T")) { + info = 1; + } else if (! notb && ! lsame_(transb, "C") && ! + lsame_(transb, "T")) { + info = 2; + } else if (*m < 0) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*k < 0) { + info = 5; + } else if (*lda < max(1,nrowa)) { + info = 8; + } else if (*ldb < max(1,nrowb)) { + info = 10; + } else if (*ldc < max(1,*m)) { + info = 13; + } + if (info != 0) { + xerbla_("SGEMM ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || ((*alpha == 0.f || *k == 0) && *beta == 1.f)) { + return 0; + } + +/* And if alpha.eq.zero. */ + + if (*alpha == 0.f) { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + return 0; + } + +/* Start the operations. */ + + if (notb) { + if (nota) { + +/* Form C := alpha*A*B + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L50: */ + } + } else if (*beta != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L60: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (b[l + j * b_dim1] != 0.f) { + temp = *alpha * b[l + j * b_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L70: */ + } + } +/* L80: */ + } +/* L90: */ + } + } else { + +/* Form C := alpha*A'*B + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * b[l + j * b_dim1]; +/* L100: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L110: */ + } +/* L120: */ + } + } + } else { + if (nota) { + +/* Form C := alpha*A*B' + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L130: */ + } + } else if (*beta != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L140: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (b[j + l * b_dim1] != 0.f) { + temp = *alpha * b[j + l * b_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L150: */ + } + } +/* L160: */ + } +/* L170: */ + } + } else { + +/* Form C := alpha*A'*B' + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * b[j + l * b_dim1]; +/* L180: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L190: */ + } +/* L200: */ + } + } + } + + return 0; + +/* End of SGEMM . */ + +} /* sgemm_ */ + +/* Subroutine */ int sgemv_(char *trans, integer *m, integer *n, real *alpha, + real *a, integer *lda, real *x, integer *incx, real *beta, real *y, + integer *incy) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + static integer i__, j, ix, iy, jx, jy, kx, ky, info; + static real temp; + static integer lenx, leny; + extern logical lsame_(char *, char *); + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SGEMV performs one of the matrix-vector operations + + y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, + + where alpha and beta are scalars, x and y are vectors and A is an + m by n matrix. + + Parameters + ========== + + TRANS - CHARACTER*1. + On entry, TRANS specifies the operation to be performed as + follows: + + TRANS = 'N' or 'n' y := alpha*A*x + beta*y. + + TRANS = 'T' or 't' y := alpha*A'*x + beta*y. + + TRANS = 'C' or 'c' y := alpha*A'*x + beta*y. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of the matrix A. + M must be at least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of the matrix A. + N must be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, n ). + Before entry, the leading m by n part of the array A must + contain the matrix of coefficients. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. LDA must be at least + max( 1, m ). + Unchanged on exit. + + X - REAL array of DIMENSION at least + ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' + and at least + ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. + Before entry, the incremented array X must contain the + vector x. + Unchanged on exit. + + INCX - INTEGER. + On entry, INCX specifies the increment for the elements of + X. INCX must not be zero. + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. When BETA is + supplied as zero then Y need not be set on input. + Unchanged on exit. + + Y - REAL array of DIMENSION at least + ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' + and at least + ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. + Before entry with BETA non-zero, the incremented array Y + must contain the vector y. On exit, Y is overwritten by the + updated vector y. + + INCY - INTEGER. + On entry, INCY specifies the increment for the elements of + Y. INCY must not be zero. + Unchanged on exit. + + + Level 2 Blas routine. + + -- Written on 22-October-1986. + Jack Dongarra, Argonne National Lab. + Jeremy Du Croz, Nag Central Office. + Sven Hammarling, Nag Central Office. + Richard Hanson, Sandia National Labs. + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + --y; + + /* Function Body */ + info = 0; + if (! lsame_(trans, "N") && ! lsame_(trans, "T") && ! lsame_(trans, "C") + ) { + info = 1; + } else if (*m < 0) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*lda < max(1,*m)) { + info = 6; + } else if (*incx == 0) { + info = 8; + } else if (*incy == 0) { + info = 11; + } + if (info != 0) { + xerbla_("SGEMV ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || (*alpha == 0.f && *beta == 1.f)) { + return 0; + } + +/* + Set LENX and LENY, the lengths of the vectors x and y, and set + up the start points in X and Y. +*/ + + if (lsame_(trans, "N")) { + lenx = *n; + leny = *m; + } else { + lenx = *m; + leny = *n; + } + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (lenx - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (leny - 1) * *incy; + } + +/* + Start the operations. In this version the elements of A are + accessed sequentially with one pass through A. + + First form y := beta*y. +*/ + + if (*beta != 1.f) { + if (*incy == 1) { + if (*beta == 0.f) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = 0.f; +/* L10: */ + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = *beta * y[i__]; +/* L20: */ + } + } + } else { + iy = ky; + if (*beta == 0.f) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = 0.f; + iy += *incy; +/* L30: */ + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = *beta * y[iy]; + iy += *incy; +/* L40: */ + } + } + } + } + if (*alpha == 0.f) { + return 0; + } + if (lsame_(trans, "N")) { + +/* Form y := alpha*A*x + y. */ + + jx = kx; + if (*incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.f) { + temp = *alpha * x[jx]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + y[i__] += temp * a[i__ + j * a_dim1]; +/* L50: */ + } + } + jx += *incx; +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.f) { + temp = *alpha * x[jx]; + iy = ky; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + y[iy] += temp * a[i__ + j * a_dim1]; + iy += *incy; +/* L70: */ + } + } + jx += *incx; +/* L80: */ + } + } + } else { + +/* Form y := alpha*A'*x + y. */ + + jy = ky; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = 0.f; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[i__]; +/* L90: */ + } + y[jy] += *alpha * temp; + jy += *incy; +/* L100: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = 0.f; + ix = kx; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[ix]; + ix += *incx; +/* L110: */ + } + y[jy] += *alpha * temp; + jy += *incy; +/* L120: */ + } + } + } + + return 0; + +/* End of SGEMV . */ + +} /* sgemv_ */ + +/* Subroutine */ int sscal_(integer *n, real *sa, real *sx, integer *incx) +{ + /* System generated locals */ + integer i__1, i__2; + + /* Local variables */ + static integer i__, m, mp1, nincx; + + +/* + scales a vector by a constant. + uses unrolled loops for increment equal to 1. + jack dongarra, linpack, 3/11/78. + modified 3/93 to return if incx .le. 0. + modified 12/3/93, array(1) declarations changed to array(*) +*/ + + + /* Parameter adjustments */ + --sx; + + /* Function Body */ + if (*n <= 0 || *incx <= 0) { + return 0; + } + if (*incx == 1) { + goto L20; + } + +/* code for increment not equal to 1 */ + + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + sx[i__] = *sa * sx[i__]; +/* L10: */ + } + return 0; + +/* + code for increment equal to 1 + + + clean-up loop +*/ + +L20: + m = *n % 5; + if (m == 0) { + goto L40; + } + i__2 = m; + for (i__ = 1; i__ <= i__2; ++i__) { + sx[i__] = *sa * sx[i__]; +/* L30: */ + } + if (*n < 5) { + return 0; + } +L40: + mp1 = m + 1; + i__2 = *n; + for (i__ = mp1; i__ <= i__2; i__ += 5) { + sx[i__] = *sa * sx[i__]; + sx[i__ + 1] = *sa * sx[i__ + 1]; + sx[i__ + 2] = *sa * sx[i__ + 2]; + sx[i__ + 3] = *sa * sx[i__ + 3]; + sx[i__ + 4] = *sa * sx[i__ + 4]; +/* L50: */ + } + return 0; +} /* sscal_ */ + +/* Subroutine */ int ssymm_(char *side, char *uplo, integer *m, integer *n, + real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, + real *c__, integer *ldc) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; + + /* Local variables */ + static integer i__, j, k, info; + static real temp1, temp2; + extern logical lsame_(char *, char *); + static integer nrowa; + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SSYMM performs one of the matrix-matrix operations + + C := alpha*A*B + beta*C, + + or + + C := alpha*B*A + beta*C, + + where alpha and beta are scalars, A is a symmetric matrix and B and + C are m by n matrices. + + Parameters + ========== + + SIDE - CHARACTER*1. + On entry, SIDE specifies whether the symmetric matrix A + appears on the left or right in the operation as follows: + + SIDE = 'L' or 'l' C := alpha*A*B + beta*C, + + SIDE = 'R' or 'r' C := alpha*B*A + beta*C, + + Unchanged on exit. + + UPLO - CHARACTER*1. + On entry, UPLO specifies whether the upper or lower + triangular part of the symmetric matrix A is to be + referenced as follows: + + UPLO = 'U' or 'u' Only the upper triangular part of the + symmetric matrix is to be referenced. + + UPLO = 'L' or 'l' Only the lower triangular part of the + symmetric matrix is to be referenced. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of the matrix C. + M must be at least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of the matrix C. + N must be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, ka ), where ka is + m when SIDE = 'L' or 'l' and is n otherwise. + Before entry with SIDE = 'L' or 'l', the m by m part of + the array A must contain the symmetric matrix, such that + when UPLO = 'U' or 'u', the leading m by m upper triangular + part of the array A must contain the upper triangular part + of the symmetric matrix and the strictly lower triangular + part of A is not referenced, and when UPLO = 'L' or 'l', + the leading m by m lower triangular part of the array A + must contain the lower triangular part of the symmetric + matrix and the strictly upper triangular part of A is not + referenced. + Before entry with SIDE = 'R' or 'r', the n by n part of + the array A must contain the symmetric matrix, such that + when UPLO = 'U' or 'u', the leading n by n upper triangular + part of the array A must contain the upper triangular part + of the symmetric matrix and the strictly lower triangular + part of A is not referenced, and when UPLO = 'L' or 'l', + the leading n by n lower triangular part of the array A + must contain the lower triangular part of the symmetric + matrix and the strictly upper triangular part of A is not + referenced. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When SIDE = 'L' or 'l' then + LDA must be at least max( 1, m ), otherwise LDA must be at + least max( 1, n ). + Unchanged on exit. + + B - REAL array of DIMENSION ( LDB, n ). + Before entry, the leading m by n part of the array B must + contain the matrix B. + Unchanged on exit. + + LDB - INTEGER. + On entry, LDB specifies the first dimension of B as declared + in the calling (sub) program. LDB must be at least + max( 1, m ). + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. When BETA is + supplied as zero then C need not be set on input. + Unchanged on exit. + + C - REAL array of DIMENSION ( LDC, n ). + Before entry, the leading m by n part of the array C must + contain the matrix C, except when beta is zero, in which + case C need not be set on entry. + On exit, the array C is overwritten by the m by n updated + matrix. + + LDC - INTEGER. + On entry, LDC specifies the first dimension of C as declared + in the calling (sub) program. LDC must be at least + max( 1, m ). + Unchanged on exit. + + + Level 3 Blas routine. + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Set NROWA as the number of rows of A. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + if (lsame_(side, "L")) { + nrowa = *m; + } else { + nrowa = *n; + } + upper = lsame_(uplo, "U"); + +/* Test the input parameters. */ + + info = 0; + if (! lsame_(side, "L") && ! lsame_(side, "R")) { + info = 1; + } else if (! upper && ! lsame_(uplo, "L")) { + info = 2; + } else if (*m < 0) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*lda < max(1,nrowa)) { + info = 7; + } else if (*ldb < max(1,*m)) { + info = 9; + } else if (*ldc < max(1,*m)) { + info = 12; + } + if (info != 0) { + xerbla_("SSYMM ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || (*alpha == 0.f && *beta == 1.f)) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.f) { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + return 0; + } + +/* Start the operations. */ + + if (lsame_(side, "L")) { + +/* Form C := alpha*A*B + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp1 = *alpha * b[i__ + j * b_dim1]; + temp2 = 0.f; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; + temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; +/* L50: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + + *alpha * temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * + temp2; + } +/* L60: */ + } +/* L70: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp1 = *alpha * b[i__ + j * b_dim1]; + temp2 = 0.f; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; + temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; +/* L80: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + + *alpha * temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * + temp2; + } +/* L90: */ + } +/* L100: */ + } + } + } else { + +/* Form C := alpha*B*A + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * a[j + j * a_dim1]; + if (*beta == 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = temp1 * b[i__ + j * b_dim1]; +/* L110: */ + } + } else { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * b[i__ + j * b_dim1]; +/* L120: */ + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (upper) { + temp1 = *alpha * a[k + j * a_dim1]; + } else { + temp1 = *alpha * a[j + k * a_dim1]; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; +/* L130: */ + } +/* L140: */ + } + i__2 = *n; + for (k = j + 1; k <= i__2; ++k) { + if (upper) { + temp1 = *alpha * a[j + k * a_dim1]; + } else { + temp1 = *alpha * a[k + j * a_dim1]; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; +/* L150: */ + } +/* L160: */ + } +/* L170: */ + } + } + + return 0; + +/* End of SSYMM . */ + +} /* ssymm_ */ + +/* Subroutine */ int ssyrk_(char *uplo, char *trans, integer *n, integer *k, + real *alpha, real *a, integer *lda, real *beta, real *c__, integer * + ldc) +{ + /* System generated locals */ + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; + + /* Local variables */ + static integer i__, j, l, info; + static real temp; + extern logical lsame_(char *, char *); + static integer nrowa; + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SSYRK performs one of the symmetric rank k operations + + C := alpha*A*A' + beta*C, + + or + + C := alpha*A'*A + beta*C, + + where alpha and beta are scalars, C is an n by n symmetric matrix + and A is an n by k matrix in the first case and a k by n matrix + in the second case. + + Parameters + ========== + + UPLO - CHARACTER*1. + On entry, UPLO specifies whether the upper or lower + triangular part of the array C is to be referenced as + follows: + + UPLO = 'U' or 'u' Only the upper triangular part of C + is to be referenced. + + UPLO = 'L' or 'l' Only the lower triangular part of C + is to be referenced. + + Unchanged on exit. + + TRANS - CHARACTER*1. + On entry, TRANS specifies the operation to be performed as + follows: + + TRANS = 'N' or 'n' C := alpha*A*A' + beta*C. + + TRANS = 'T' or 't' C := alpha*A'*A + beta*C. + + TRANS = 'C' or 'c' C := alpha*A'*A + beta*C. + + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the order of the matrix C. N must be + at least zero. + Unchanged on exit. + + K - INTEGER. + On entry with TRANS = 'N' or 'n', K specifies the number + of columns of the matrix A, and on entry with + TRANS = 'T' or 't' or 'C' or 'c', K specifies the number + of rows of the matrix A. K must be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, ka ), where ka is + k when TRANS = 'N' or 'n', and is n otherwise. + Before entry with TRANS = 'N' or 'n', the leading n by k + part of the array A must contain the matrix A, otherwise + the leading k by n part of the array A must contain the + matrix A. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When TRANS = 'N' or 'n' + then LDA must be at least max( 1, n ), otherwise LDA must + be at least max( 1, k ). + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. + Unchanged on exit. + + C - REAL array of DIMENSION ( LDC, n ). + Before entry with UPLO = 'U' or 'u', the leading n by n + upper triangular part of the array C must contain the upper + triangular part of the symmetric matrix and the strictly + lower triangular part of C is not referenced. On exit, the + upper triangular part of the array C is overwritten by the + upper triangular part of the updated matrix. + Before entry with UPLO = 'L' or 'l', the leading n by n + lower triangular part of the array C must contain the lower + triangular part of the symmetric matrix and the strictly + upper triangular part of C is not referenced. On exit, the + lower triangular part of the array C is overwritten by the + lower triangular part of the updated matrix. + + LDC - INTEGER. + On entry, LDC specifies the first dimension of C as declared + in the calling (sub) program. LDC must be at least + max( 1, n ). + Unchanged on exit. + + + Level 3 Blas routine. + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + if (lsame_(trans, "N")) { + nrowa = *n; + } else { + nrowa = *k; + } + upper = lsame_(uplo, "U"); + + info = 0; + if (! upper && ! lsame_(uplo, "L")) { + info = 1; + } else if (! lsame_(trans, "N") && ! lsame_(trans, + "T") && ! lsame_(trans, "C")) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*k < 0) { + info = 4; + } else if (*lda < max(1,nrowa)) { + info = 7; + } else if (*ldc < max(1,*n)) { + info = 10; + } + if (info != 0) { + xerbla_("SSYRK ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || ((*alpha == 0.f || *k == 0) && *beta == 1.f)) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.f) { + if (upper) { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + } else { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L50: */ + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L70: */ + } +/* L80: */ + } + } + } + return 0; + } + +/* Start the operations. */ + + if (lsame_(trans, "N")) { + +/* Form C := alpha*A*A' + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L90: */ + } + } else if (*beta != 1.f) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L100: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0.f) { + temp = *alpha * a[j + l * a_dim1]; + i__3 = j; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L110: */ + } + } +/* L120: */ + } +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L140: */ + } + } else if (*beta != 1.f) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L150: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0.f) { + temp = *alpha * a[j + l * a_dim1]; + i__3 = *n; + for (i__ = j; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L160: */ + } + } +/* L170: */ + } +/* L180: */ + } + } + } else { + +/* Form C := alpha*A'*A + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; +/* L190: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L200: */ + } +/* L210: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; +/* L220: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L230: */ + } +/* L240: */ + } + } + } + + return 0; + +/* End of SSYRK . */ + +} /* ssyrk_ */ + +/* Subroutine */ int strsm_(char *side, char *uplo, char *transa, char *diag, + integer *m, integer *n, real *alpha, real *a, integer *lda, real *b, + integer *ldb) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; + + /* Local variables */ + static integer i__, j, k, info; + static real temp; + static logical lside; + extern logical lsame_(char *, char *); + static integer nrowa; + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + static logical nounit; + + +/* + Purpose + ======= + + STRSM solves one of the matrix equations + + op( A )*X = alpha*B, or X*op( A ) = alpha*B, + + where alpha is a scalar, X and B are m by n matrices, A is a unit, or + non-unit, upper or lower triangular matrix and op( A ) is one of + + op( A ) = A or op( A ) = A'. + + The matrix X is overwritten on B. + + Parameters + ========== + + SIDE - CHARACTER*1. + On entry, SIDE specifies whether op( A ) appears on the left + or right of X as follows: + + SIDE = 'L' or 'l' op( A )*X = alpha*B. + + SIDE = 'R' or 'r' X*op( A ) = alpha*B. + + Unchanged on exit. + + UPLO - CHARACTER*1. + On entry, UPLO specifies whether the matrix A is an upper or + lower triangular matrix as follows: + + UPLO = 'U' or 'u' A is an upper triangular matrix. + + UPLO = 'L' or 'l' A is a lower triangular matrix. + + Unchanged on exit. + + TRANSA - CHARACTER*1. + On entry, TRANSA specifies the form of op( A ) to be used in + the matrix multiplication as follows: + + TRANSA = 'N' or 'n' op( A ) = A. + + TRANSA = 'T' or 't' op( A ) = A'. + + TRANSA = 'C' or 'c' op( A ) = A'. + + Unchanged on exit. + + DIAG - CHARACTER*1. + On entry, DIAG specifies whether or not A is unit triangular + as follows: + + DIAG = 'U' or 'u' A is assumed to be unit triangular. + + DIAG = 'N' or 'n' A is not assumed to be unit + triangular. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of B. M must be at + least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of B. N must be + at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. When alpha is + zero then A is not referenced and B need not be set before + entry. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, k ), where k is m + when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. + Before entry with UPLO = 'U' or 'u', the leading k by k + upper triangular part of the array A must contain the upper + triangular matrix and the strictly lower triangular part of + A is not referenced. + Before entry with UPLO = 'L' or 'l', the leading k by k + lower triangular part of the array A must contain the lower + triangular matrix and the strictly upper triangular part of + A is not referenced. + Note that when DIAG = 'U' or 'u', the diagonal elements of + A are not referenced either, but are assumed to be unity. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When SIDE = 'L' or 'l' then + LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' + then LDA must be at least max( 1, n ). + Unchanged on exit. + + B - REAL array of DIMENSION ( LDB, n ). + Before entry, the leading m by n part of the array B must + contain the right-hand side matrix B, and on exit is + overwritten by the solution matrix X. + + LDB - INTEGER. + On entry, LDB specifies the first dimension of B as declared + in the calling (sub) program. LDB must be at least + max( 1, m ). + Unchanged on exit. + + + Level 3 Blas routine. + + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + lside = lsame_(side, "L"); + if (lside) { + nrowa = *m; + } else { + nrowa = *n; + } + nounit = lsame_(diag, "N"); + upper = lsame_(uplo, "U"); + + info = 0; + if (! lside && ! lsame_(side, "R")) { + info = 1; + } else if (! upper && ! lsame_(uplo, "L")) { + info = 2; + } else if (! lsame_(transa, "N") && ! lsame_(transa, + "T") && ! lsame_(transa, "C")) { + info = 3; + } else if (! lsame_(diag, "U") && ! lsame_(diag, + "N")) { + info = 4; + } else if (*m < 0) { + info = 5; + } else if (*n < 0) { + info = 6; + } else if (*lda < max(1,nrowa)) { + info = 9; + } else if (*ldb < max(1,*m)) { + info = 11; + } + if (info != 0) { + xerbla_("STRSM ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + return 0; + } + +/* Start the operations. */ + + if (lside) { + if (lsame_(transa, "N")) { + +/* Form B := alpha*inv( A )*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L30: */ + } + } + for (k = *m; k >= 1; --k) { + if (b[k + j * b_dim1] != 0.f) { + if (nounit) { + b[k + j * b_dim1] /= a[k + k * a_dim1]; + } + i__2 = k - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ + i__ + k * a_dim1]; +/* L40: */ + } + } +/* L50: */ + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L70: */ + } + } + i__2 = *m; + for (k = 1; k <= i__2; ++k) { + if (b[k + j * b_dim1] != 0.f) { + if (nounit) { + b[k + j * b_dim1] /= a[k + k * a_dim1]; + } + i__3 = *m; + for (i__ = k + 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ + i__ + k * a_dim1]; +/* L80: */ + } + } +/* L90: */ + } +/* L100: */ + } + } + } else { + +/* Form B := alpha*inv( A' )*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = *alpha * b[i__ + j * b_dim1]; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; +/* L110: */ + } + if (nounit) { + temp /= a[i__ + i__ * a_dim1]; + } + b[i__ + j * b_dim1] = temp; +/* L120: */ + } +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp = *alpha * b[i__ + j * b_dim1]; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; +/* L140: */ + } + if (nounit) { + temp /= a[i__ + i__ * a_dim1]; + } + b[i__ + j * b_dim1] = temp; +/* L150: */ + } +/* L160: */ + } + } + } + } else { + if (lsame_(transa, "N")) { + +/* Form B := alpha*B*inv( A ). */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L170: */ + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (a[k + j * a_dim1] != 0.f) { + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ + i__ + k * b_dim1]; +/* L180: */ + } + } +/* L190: */ + } + if (nounit) { + temp = 1.f / a[j + j * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; +/* L200: */ + } + } +/* L210: */ + } + } else { + for (j = *n; j >= 1; --j) { + if (*alpha != 1.f) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L220: */ + } + } + i__1 = *n; + for (k = j + 1; k <= i__1; ++k) { + if (a[k + j * a_dim1] != 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ + i__ + k * b_dim1]; +/* L230: */ + } + } +/* L240: */ + } + if (nounit) { + temp = 1.f / a[j + j * a_dim1]; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; +/* L250: */ + } + } +/* L260: */ + } + } + } else { + +/* Form B := alpha*B*inv( A' ). */ + + if (upper) { + for (k = *n; k >= 1; --k) { + if (nounit) { + temp = 1.f / a[k + k * a_dim1]; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; +/* L270: */ + } + } + i__1 = k - 1; + for (j = 1; j <= i__1; ++j) { + if (a[j + k * a_dim1] != 0.f) { + temp = a[j + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= temp * b[i__ + k * + b_dim1]; +/* L280: */ + } + } +/* L290: */ + } + if (*alpha != 1.f) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] + ; +/* L300: */ + } + } +/* L310: */ + } + } else { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + if (nounit) { + temp = 1.f / a[k + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; +/* L320: */ + } + } + i__2 = *n; + for (j = k + 1; j <= i__2; ++j) { + if (a[j + k * a_dim1] != 0.f) { + temp = a[j + k * a_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= temp * b[i__ + k * + b_dim1]; +/* L330: */ + } + } +/* L340: */ + } + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] + ; +/* L350: */ + } + } +/* L360: */ + } + } + } + } + + return 0; + +/* End of STRSM . */ + +} /* strsm_ */ + +/* Subroutine */ int xerbla_(char *srname, integer *info) +{ + /* Format strings */ + static char fmt_9999[] = "(\002 ** On entry to \002,a6,\002 parameter nu" + "mber \002,i2,\002 had \002,\002an illegal value\002)"; + + /* Builtin functions */ + integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); + /* Subroutine */ int s_stop(char *, ftnlen); + + /* Fortran I/O blocks */ + static cilist io___60 = { 0, 6, 0, fmt_9999, 0 }; + + +/* + -- LAPACK auxiliary routine (preliminary version) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + February 29, 1992 + + + Purpose + ======= + + XERBLA is an error handler for the LAPACK routines. + It is called by an LAPACK routine if an input parameter has an + invalid value. A message is printed and execution stops. + + Installers may consider modifying the STOP statement in order to + call system-specific exception-handling facilities. + + Arguments + ========= + + SRNAME (input) CHARACTER*6 + The name of the routine which called XERBLA. + + INFO (input) INTEGER + The position of the invalid parameter in the parameter list + of the calling routine. +*/ + + + s_wsfe(&io___60); + do_fio(&c__1, srname, (ftnlen)6); + do_fio(&c__1, (char *)&(*info), (ftnlen)sizeof(integer)); + e_wsfe(); + + s_stop("", (ftnlen)0); + + +/* End of XERBLA */ + + return 0; +} /* xerbla_ */ + diff --git a/src/libsphinxbase/util/case.c b/src/libsphinxbase/util/case.c new file mode 100644 index 000000000..f9e24ac06 --- /dev/null +++ b/src/libsphinxbase/util/case.c @@ -0,0 +1,141 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * case.c -- Upper/lower case conversion routines + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: case.c,v $ + * Revision 1.7 2005/06/22 02:58:54 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added strcmp_nocase. Moved UPPER_CASE and LOWER_CASE definitions to .h. + * + * 16-Feb-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +#include +#include + +#include "sphinxbase/case.h" +#include "sphinxbase/err.h" + + +void +lcase(register char *cp) +{ + if (cp) { + while (*cp) { + *cp = LOWER_CASE(*cp); + cp++; + } + } +} + +void +ucase(register char *cp) +{ + if (cp) { + while (*cp) { + *cp = UPPER_CASE(*cp); + cp++; + } + } +} + +int32 +strcmp_nocase(const char *str1, const char *str2) +{ + char c1, c2; + + if (str1 == str2) + return 0; + if (str1 && str2) { + for (;;) { + c1 = *(str1++); + c1 = UPPER_CASE(c1); + c2 = *(str2++); + c2 = UPPER_CASE(c2); + if (c1 != c2) + return (c1 - c2); + if (c1 == '\0') + return 0; + } + } + else + return (str1 == NULL) ? -1 : 1; + + return 0; +} + +int32 +strncmp_nocase(const char *str1, const char *str2, size_t len) +{ + char c1, c2; + + if (str1 && str2) { + size_t n; + + for (n = 0; n < len; ++n) { + c1 = *(str1++); + c1 = UPPER_CASE(c1); + c2 = *(str2++); + c2 = UPPER_CASE(c2); + if (c1 != c2) + return (c1 - c2); + if (c1 == '\0') + return 0; + } + } + else + return (str1 == NULL) ? -1 : 1; + + return 0; +} diff --git a/src/libsphinxbase/util/ckd_alloc.c b/src/libsphinxbase/util/ckd_alloc.c new file mode 100644 index 000000000..45dc84aae --- /dev/null +++ b/src/libsphinxbase/util/ckd_alloc.c @@ -0,0 +1,427 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * ckd_alloc.c -- Memory allocation package. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: ckd_alloc.c,v $ + * Revision 1.6 2005/06/22 02:59:25 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Removed file,line arguments from free functions. + * Removed debugging stuff. + * + * 01-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +/********************************************************************* + * + * $Header: /cvsroot/cmusphinx/sphinx3/src/libutil/ckd_alloc.c,v 1.6 2005/06/22 02:59:25 arthchan2003 Exp $ + * + * Carnegie Mellon ARPA Speech Group + * + * Copyright (c) 1994 Carnegie Mellon University. + * All rights reserved. + * + ********************************************************************* + * + * file: ckd_alloc.c + * + * traceability: + * + * description: + * + * author: + * + *********************************************************************/ + + +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/err.h" + +/** + * Target for longjmp() on failure. + * + * FIXME: This should be in thread-local storage. + */ +static jmp_buf *ckd_target; +static int jmp_abort; + +jmp_buf * +ckd_set_jump(jmp_buf *env, int abort) +{ + jmp_buf *old; + + if (abort) + jmp_abort = 1; + + old = ckd_target; + ckd_target = env; + return old; +} + +void +ckd_fail(char *format, ...) +{ + va_list args; + + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + + if (jmp_abort) + /* abort() doesn't exist in Windows CE */ + #if defined(_WIN32_WCE) + exit(-1); + #else + abort(); + #endif + else if (ckd_target) + longjmp(*ckd_target, 1); + else + exit(-1); +} + +void * +__ckd_calloc__(size_t n_elem, size_t elem_size, + const char *caller_file, int caller_line) +{ + void *mem; + +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if ((mem = heap_calloc(heap_lookup(1),n_elem, elem_size)) == NULL) + if ((mem = heap_calloc(heap_lookup(0),n_elem, elem_size)) == NULL) + { + ckd_fail("calloc(%d,%d) failed from %s(%d), free space: %d\n", n_elem, + elem_size, caller_file, caller_line,space_unused()); + } +#else + if ((mem = calloc(n_elem, elem_size)) == NULL) { + ckd_fail("calloc(%d,%d) failed from %s(%d)\n", n_elem, + elem_size, caller_file, caller_line); + } +#endif + + + return mem; +} + + +void * +__ckd_malloc__(size_t size, const char *caller_file, int caller_line) +{ + void *mem; + +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if ((mem = heap_malloc(heap_lookup(0),size)) == NULL) + if ((mem = heap_malloc(heap_lookup(1),size)) == NULL) +#else + if ((mem = malloc(size)) == NULL) +#endif + ckd_fail("malloc(%d) failed from %s(%d)\n", size, + caller_file, caller_line); + + return mem; +} + + +void * +__ckd_realloc__(void *ptr, size_t new_size, + const char *caller_file, int caller_line) +{ + void *mem; +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if ((mem = heap_realloc(heap_lookup(0),ptr, new_size)) == NULL) { +#else + if ((mem = realloc(ptr, new_size)) == NULL) { +#endif + ckd_fail("malloc(%d) failed from %s(%d)\n", new_size, + caller_file, caller_line); + } + + return mem; +} + + +char * +__ckd_salloc__(const char *orig, const char *caller_file, + int caller_line) +{ + size_t len; + char *buf; + + if (!orig) + return NULL; + + len = strlen(orig) + 1; + buf = (char *) __ckd_malloc__(len, caller_file, caller_line); + + strcpy(buf, orig); + return (buf); +} + + +void * +__ckd_calloc_2d__(size_t d1, size_t d2, size_t elemsize, + const char *caller_file, int caller_line) +{ + char **ref, *mem; + size_t i, offset; + + mem = + (char *) __ckd_calloc__(d1 * d2, elemsize, caller_file, + caller_line); + ref = + (char **) __ckd_malloc__(d1 * sizeof(void *), caller_file, + caller_line); + + for (i = 0, offset = 0; i < d1; i++, offset += d2 * elemsize) + ref[i] = mem + offset; + + return ref; +} + + +void +ckd_free(void *ptr) +{ +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if (ptr) + heap_free(0,ptr); +#else + free(ptr); +#endif +} + +void +ckd_free_2d(void *tmpptr) +{ + void **ptr = (void **)tmpptr; + if (ptr) + ckd_free(ptr[0]); + ckd_free(ptr); +} + + +void * +__ckd_calloc_3d__(size_t d1, size_t d2, size_t d3, size_t elemsize, + const char *caller_file, int caller_line) +{ + char ***ref1, **ref2, *mem; + size_t i, j, offset; + + mem = + (char *) __ckd_calloc__(d1 * d2 * d3, elemsize, caller_file, + caller_line); + ref1 = + (char ***) __ckd_malloc__(d1 * sizeof(void **), caller_file, + caller_line); + ref2 = + (char **) __ckd_malloc__(d1 * d2 * sizeof(void *), caller_file, + caller_line); + + for (i = 0, offset = 0; i < d1; i++, offset += d2) + ref1[i] = ref2 + offset; + + offset = 0; + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + ref1[i][j] = mem + offset; + offset += d3 * elemsize; + } + } + + return ref1; +} + + +void +ckd_free_3d(void *inptr) +{ + void ***ptr = (void ***)inptr; + + if (ptr && ptr[0]) + ckd_free(ptr[0][0]); + if (ptr) + ckd_free(ptr[0]); + ckd_free(ptr); +} + + +void **** +__ckd_calloc_4d__(size_t d1, + size_t d2, + size_t d3, + size_t d4, + size_t elem_size, + char *file, + int line) +{ + void *store; + void **tmp1; + void ***tmp2; + void ****out; + size_t i, j; + + store = calloc(d1 * d2 * d3 * d4, elem_size); + if (store == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + tmp1 = calloc(d1 * d2 * d3, sizeof(void *)); + if (tmp1 == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + tmp2 = ckd_calloc(d1 * d2, sizeof(void **)); + if (tmp2 == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + out = ckd_calloc(d1, sizeof(void ***)); + if (out == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + for (i = 0, j = 0; i < d1*d2*d3; i++, j += d4) { + tmp1[i] = &((char *)store)[j*elem_size]; + } + + for (i = 0, j = 0; i < d1*d2; i++, j += d3) { + tmp2[i] = &tmp1[j]; + } + + for (i = 0, j = 0; i < d1; i++, j += d2) { + out[i] = &tmp2[j]; + } + + return out; +} + +void +ckd_free_4d(void *inptr) +{ + void ****ptr = (void ****)inptr; + if (ptr == NULL) + return; + /* free the underlying store */ + ckd_free(ptr[0][0][0]); + + /* free the access overhead */ + ckd_free(ptr[0][0]); + ckd_free(ptr[0]); + ckd_free(ptr); +} + +/* Layers a 3d array access structure over a preallocated storage area */ +void * +__ckd_alloc_3d_ptr(size_t d1, + size_t d2, + size_t d3, + void *store, + size_t elem_size, + char *file, + int line) +{ + void **tmp1; + void ***out; + size_t i, j; + + tmp1 = __ckd_calloc__(d1 * d2, sizeof(void *), file, line); + + out = __ckd_calloc__(d1, sizeof(void **), file, line); + + for (i = 0, j = 0; i < d1*d2; i++, j += d3) { + tmp1[i] = &((char *)store)[j*elem_size]; + } + + for (i = 0, j = 0; i < d1; i++, j += d2) { + out[i] = &tmp1[j]; + } + + return out; +} + +void * +__ckd_alloc_2d_ptr(size_t d1, + size_t d2, + void *store, + size_t elem_size, + char *file, + int line) +{ + void **out; + size_t i, j; + + out = __ckd_calloc__(d1, sizeof(void *), file, line); + + for (i = 0, j = 0; i < d1; i++, j += d2) { + out[i] = &((char *)store)[j*elem_size]; + } + + return out; +} + +/* vim: set ts=4 sw=4: */ diff --git a/src/libsphinxbase/util/clapack_scrub.py b/src/libsphinxbase/util/clapack_scrub.py new file mode 100644 index 000000000..b98b937f6 --- /dev/null +++ b/src/libsphinxbase/util/clapack_scrub.py @@ -0,0 +1,276 @@ +#!/usr/bin/env python2.4 + +import sys, os +from cStringIO import StringIO +import re + +from Plex import * +from Plex.Traditional import re as Re + +class MyScanner(Scanner): + def __init__(self, info, name=''): + Scanner.__init__(self, self.lexicon, info, name) + + def begin(self, state_name): +# if self.state_name == '': +# print '' +# else: +# print self.state_name + Scanner.begin(self, state_name) + +def sep_seq(sequence, sep): + pat = Str(sequence[0]) + for s in sequence[1:]: + pat += sep + Str(s) + return pat + +def runScanner(data, scanner_class, lexicon=None): + info = StringIO(data) + outfo = StringIO() + if lexicon is not None: + scanner = scanner_class(lexicon, info) + else: + scanner = scanner_class(info) + while 1: + value, text = scanner.read() + if value is None: + break + elif value is IGNORE: + pass + else: + outfo.write(value) + return outfo.getvalue(), scanner + +class LenSubsScanner(MyScanner): + """Following clapack, we remove ftnlen arguments, which f2c puts after + a char * argument to hold the length of the passed string. This is just + a nuisance in C. + """ + def __init__(self, info, name=''): + MyScanner.__init__(self, info, name) + self.paren_count = 0 + + def beginArgs(self, text): + if self.paren_count == 0: + self.begin('args') + self.paren_count += 1 + return text + + def endArgs(self, text): + self.paren_count -= 1 + if self.paren_count == 0: + self.begin('') + return text + + digits = Re('[0-9]+') + iofun = Re(r'\([^;]*;') + decl = Re(r'\([^)]*\)[,;'+'\n]') + any = Re('[.]*') + S = Re('[ \t\n]*') + cS = Str(',') + S + len_ = Re('[a-z][a-z0-9]*_len') + + iofunctions = Str("s_cat", "s_copy", "s_stop", "s_cmp", + "i_len", "do_fio", "do_lio") + iofun + + # Routines to not scrub the ftnlen argument from + keep_ftnlen = (Str('ilaenv_') | Str('s_rnge')) + Str('(') + + lexicon = Lexicon([ + (iofunctions, TEXT), + (keep_ftnlen, beginArgs), + State('args', [ + (Str(')'), endArgs), + (Str('('), beginArgs), + (AnyChar, TEXT), + ]), + (cS+Re(r'[1-9][0-9]*L'), IGNORE), + (cS+Str('ftnlen')+Opt(S+len_), IGNORE), + (cS+sep_seq(['(', 'ftnlen', ')'], S)+S+digits, IGNORE), + (Bol+Str('ftnlen ')+len_+Str(';\n'), IGNORE), + (cS+len_, TEXT), + (AnyChar, TEXT), + ]) + +def scrubFtnlen(source): + return runScanner(source, LenSubsScanner)[0] + +def cleanSource(source): + # remove whitespace at end of lines + source = re.sub(r'[\t ]+\n', '\n', source) + # remove comments like .. Scalar Arguments .. + source = re.sub(r'(?m)^[\t ]*/\* *\.\. .*?\n', '', source) + # collapse blanks of more than two in-a-row to two + source = re.sub(r'\n\n\n\n+', r'\n\n\n', source) + return source + +class LineQueue(object): + def __init__(self): + object.__init__(self) + self._queue = [] + + def add(self, line): + self._queue.append(line) + + def clear(self): + self._queue = [] + + def flushTo(self, other_queue): + for line in self._queue: + other_queue.add(line) + self.clear() + + def getValue(self): + q = LineQueue() + self.flushTo(q) + s = ''.join(q._queue) + self.clear() + return s + +class CommentQueue(LineQueue): + def __init__(self): + LineQueue.__init__(self) + + def add(self, line): + if line.strip() == '': + LineQueue.add(self, '\n') + else: + line = ' ' + line[2:-3].rstrip() + '\n' + LineQueue.add(self, line) + + def flushTo(self, other_queue): + if len(self._queue) == 0: + pass + elif len(self._queue) == 1: + other_queue.add('/*' + self._queue[0][2:].rstrip() + ' */\n') + else: + other_queue.add('/*\n') + LineQueue.flushTo(self, other_queue) + other_queue.add('*/\n') + self.clear() + +# This really seems to be about 4x longer than it needs to be +def cleanComments(source): + lines = LineQueue() + comments = CommentQueue() + def isCommentLine(line): + return line.startswith('/*') and line.endswith('*/\n') + + blanks = LineQueue() + def isBlank(line): + return line.strip() == '' + + def SourceLines(line): + if isCommentLine(line): + comments.add(line) + return HaveCommentLines + else: + lines.add(line) + return SourceLines + def HaveCommentLines(line): + if isBlank(line): + blanks.add('\n') + return HaveBlankLines + elif isCommentLine(line): + comments.add(line) + return HaveCommentLines + else: + comments.flushTo(lines) + lines.add(line) + return SourceLines + def HaveBlankLines(line): + if isBlank(line): + blanks.add('\n') + return HaveBlankLines + elif isCommentLine(line): + blanks.flushTo(comments) + comments.add(line) + return HaveCommentLines + else: + comments.flushTo(lines) + blanks.flushTo(lines) + lines.add(line) + return SourceLines + + state = SourceLines + for line in StringIO(source): + state = state(line) + comments.flushTo(lines) + return lines.getValue() + +def removeHeader(source): + lines = LineQueue() + + def LookingForHeader(line): + m = re.match(r'/\*[^\n]*-- translated', line) + if m: + return InHeader + else: + lines.add(line) + return LookingForHeader + def InHeader(line): + if line.startswith('*/'): + return OutOfHeader + else: + return InHeader + def OutOfHeader(line): + if line.startswith('#include "f2c.h"'): + pass + else: + lines.add(line) + return OutOfHeader + + state = LookingForHeader + for line in StringIO(source): + state = state(line) + return lines.getValue() + +def replaceSlamch(source): + """Replace slamch_ calls with appropiate macros""" + def repl(m): + s = m.group(1) + return dict(E='EPSILON', P='PRECISION', S='SAFEMINIMUM', + B='BASE')[s[0]] + source = re.sub(r'slamch_\("(.*?)"\)', repl, source) + source = re.sub(r'^\s+extern.*? slamch_.*?;$(?m)', '', source) + return source + +# do it + +def scrubSource(source, nsteps=None, verbose=False): + steps = [ + ('scrubbing ftnlen', scrubFtnlen), + ('remove header', removeHeader), + ('clean source', cleanSource), + ('clean comments', cleanComments), + ('replace slamch_() calls', replaceSlamch), + ] + + if nsteps is not None: + steps = steps[:nsteps] + + for msg, step in steps: + if verbose: + print msg + source = step(source) + + return source + +if __name__ == '__main__': + filename = sys.argv[1] + outfilename = os.path.join(sys.argv[2], os.path.basename(filename)) + fo = open(filename, 'r') + source = fo.read() + fo.close() + + if len(sys.argv) > 3: + nsteps = int(sys.argv[3]) + else: + nsteps = None + + source = scrub_source(source, nsteps, verbose=True) + + writefo = open(outfilename, 'w') + writefo.write(source) + writefo.close() + diff --git a/src/libsphinxbase/util/cmd_ln.c b/src/libsphinxbase/util/cmd_ln.c new file mode 100644 index 000000000..1f655eb45 --- /dev/null +++ b/src/libsphinxbase/util/cmd_ln.c @@ -0,0 +1,1088 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmd_ln.c -- Command line argument parsing. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * 10-Sep-1998 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Changed strcasecmp() call in cmp_name() to strcmp_nocase() call. + * + * 15-Jul-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added required arguments handling. + * + * 07-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created, based on Eric's implementation. Basically, combined several + * functions into one, eliminated validation, and simplified the interface. + */ + + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996 4018) +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "sphinxbase/cmd_ln.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/hash_table.h" +#include "sphinxbase/case.h" +#include "sphinxbase/strfuncs.h" + +typedef struct cmd_ln_val_s { + anytype_t val; + int type; + char *name; +} cmd_ln_val_t; + +struct cmd_ln_s { + int refcount; + hash_table_t *ht; + char **f_argv; + uint32 f_argc; +}; + +/** Global command-line, for non-reentrant API. */ +cmd_ln_t *global_cmdln; + +static void +arg_dump_r(cmd_ln_t *, FILE *, arg_t const *, int32); + +static cmd_ln_t * +parse_options(cmd_ln_t *, const arg_t *, int32, char* [], int32); + +/* + * Find max length of name and default fields in the given defn array. + * Return #items in defn array. + */ +static int32 +arg_strlen(const arg_t * defn, int32 * namelen, int32 * deflen) +{ + int32 i, l; + + *namelen = *deflen = 0; + for (i = 0; defn[i].name; i++) { + l = strlen(defn[i].name); + if (*namelen < l) + *namelen = l; + + if (defn[i].deflt) + l = strlen(defn[i].deflt); + else + l = strlen("(null)"); + /* E_INFO("string default, %s , name %s, length %d\n",defn[i].deflt,defn[i].name,l); */ + if (*deflen < l) + *deflen = l; + } + + return i; +} + + +static int32 +cmp_name(const void *a, const void *b) +{ + return (strcmp_nocase + ((* (arg_t**) a)->name, + (* (arg_t**) b)->name)); +} + +static arg_t const ** +arg_sort(const arg_t * defn, int32 n) +{ + const arg_t ** pos; + int32 i; + + pos = (arg_t const **) ckd_calloc(n, sizeof(arg_t *)); + for (i = 0; i < n; ++i) + pos[i] = &defn[i]; + qsort(pos, n, sizeof(arg_t *), cmp_name); + + return pos; +} + +static size_t +strnappend(char **dest, size_t *dest_allocation, + const char *source, size_t n) +{ + size_t source_len, required_allocation; + + if (dest == NULL || dest_allocation == NULL) + return -1; + if (*dest == NULL && *dest_allocation != 0) + return -1; + if (source == NULL) + return *dest_allocation; + + source_len = strlen(source); + if (n && n < source_len) + source_len = n; + + required_allocation = (*dest ? strlen(*dest) : 0) + source_len + 1; + if (*dest_allocation < required_allocation) { + if (*dest_allocation == 0) { + *dest = (char *)ckd_calloc(required_allocation * 2, 1); + } else { + *dest = (char *)ckd_realloc(*dest, required_allocation * 2); + } + *dest_allocation = required_allocation * 2; + } + + strncat(*dest, source, source_len); + + return *dest_allocation; +} + +static size_t +strappend(char **dest, size_t *dest_allocation, + const char *source) +{ + return strnappend(dest, dest_allocation, source, 0); +} + +static char* +arg_resolve_env(const char *str) +{ + char *resolved_str = NULL; + char env_name[100]; + const char *env_val; + size_t alloced = 0; + const char *i = str, *j; + + /* calculate required resolved_str size */ + do { + j = strstr(i, "$("); + if (j != NULL) { + if (j != i) { + strnappend(&resolved_str, &alloced, i, j - i); + i = j; + } + j = strchr(i + 2, ')'); + if (j != NULL) { + if (j - (i + 2) < 100) { + strncpy(env_name, i + 2, j - (i + 2)); + env_name[j - (i + 2)] = '\0'; + #if !defined(_WIN32_WCE) + env_val = getenv(env_name); + if (env_val) + strappend(&resolved_str, &alloced, env_val); + #else + env_val = 0; + #endif + } + i = j + 1; + } else { + /* unclosed, copy and skip */ + j = i + 2; + strnappend(&resolved_str, &alloced, i, j - i); + i = j; + } + } else { + strappend(&resolved_str, &alloced, i); + } + } while(j != NULL); + + return resolved_str; +} + +static void +arg_dump_r(cmd_ln_t *cmdln, FILE *fp, const arg_t * defn, int32 doc) +{ + arg_t const **pos; + int32 i, n; + size_t l; + int32 namelen, deflen; + anytype_t *vp; + char const **array; + + /* No definitions, do nothing. */ + if (defn == NULL || fp == NULL) + return; + + /* Find max lengths of name and default value fields, and #entries in defn */ + n = arg_strlen(defn, &namelen, &deflen); + /* E_INFO("String length %d. Name length %d, Default Length %d\n",n, namelen, deflen); */ + namelen = namelen & 0xfffffff8; /* Previous tab position */ + deflen = deflen & 0xfffffff8; /* Previous tab position */ + + fprintf(fp, "[NAME]"); + for (l = strlen("[NAME]"); l < namelen; l += 8) + fprintf(fp, "\t"); + fprintf(fp, "\t[DEFLT]"); + for (l = strlen("[DEFLT]"); l < deflen; l += 8) + fprintf(fp, "\t"); + + if (doc) { + fprintf(fp, "\t[DESCR]\n"); + } + else { + fprintf(fp, "\t[VALUE]\n"); + } + + /* Print current configuration, sorted by name */ + pos = arg_sort(defn, n); + for (i = 0; i < n; i++) { + fprintf(fp, "%s", pos[i]->name); + for (l = strlen(pos[i]->name); l < namelen; l += 8) + fprintf(fp, "\t"); + + fprintf(fp, "\t"); + if (pos[i]->deflt) { + fprintf(fp, "%s", pos[i]->deflt); + l = strlen(pos[i]->deflt); + } + else + l = 0; + for (; l < deflen; l += 8) + fprintf(fp, "\t"); + + fprintf(fp, "\t"); + if (doc) { + if (pos[i]->doc) + fprintf(fp, "%s", pos[i]->doc); + } + else { + vp = cmd_ln_access_r(cmdln, pos[i]->name); + if (vp) { + switch (pos[i]->type) { + case ARG_INTEGER: + case REQARG_INTEGER: + fprintf(fp, "%ld", vp->i); + break; + case ARG_FLOATING: + case REQARG_FLOATING: + fprintf(fp, "%e", vp->fl); + break; + case ARG_STRING: + case REQARG_STRING: + if (vp->ptr) + fprintf(fp, "%s", (char *)vp->ptr); + break; + case ARG_STRING_LIST: + array = (char const**)vp->ptr; + if (array) + for (l = 0; array[l] != 0; l++) { + fprintf(fp, "%s,", array[l]); + } + break; + case ARG_BOOLEAN: + case REQARG_BOOLEAN: + fprintf(fp, "%s", vp->i ? "yes" : "no"); + break; + default: + E_ERROR("Unknown argument type: %d\n", pos[i]->type); + } + } + } + + fprintf(fp, "\n"); + } + ckd_free(pos); + + fprintf(fp, "\n"); +} + +static char ** +parse_string_list(const char *str) +{ + int count, i, j; + const char *p; + char **result; + + p = str; + count = 1; + while (*p) { + if (*p == ',') + count++; + p++; + } + /* Should end with NULL */ + result = (char **) ckd_calloc(count + 1, sizeof(char *)); + p = str; + for (i = 0; i < count; i++) { + for (j = 0; p[j] != ',' && p[j] != 0; j++); + result[i] = (char *)ckd_calloc(j + 1, sizeof(char)); + strncpy( result[i], p, j); + p = p + j + 1; + } + return result; +} + +static cmd_ln_val_t * +cmd_ln_val_init(int t, const char *name, const char *str) +{ + cmd_ln_val_t *v; + anytype_t val; + char *e_str; + + if (!str) { + /* For lack of a better default value. */ + memset(&val, 0, sizeof(val)); + } + else { + int valid = 1; + e_str = arg_resolve_env(str); + + switch (t) { + case ARG_INTEGER: + case REQARG_INTEGER: + if (sscanf(e_str, "%ld", &val.i) != 1) + valid = 0; + break; + case ARG_FLOATING: + case REQARG_FLOATING: + if (e_str == NULL || e_str[0] == 0) + valid = 0; + val.fl = atof_c(e_str); + break; + case ARG_BOOLEAN: + case REQARG_BOOLEAN: + if ((e_str[0] == 'y') || (e_str[0] == 't') || + (e_str[0] == 'Y') || (e_str[0] == 'T') || (e_str[0] == '1')) { + val.i = TRUE; + } + else if ((e_str[0] == 'n') || (e_str[0] == 'f') || + (e_str[0] == 'N') || (e_str[0] == 'F') | + (e_str[0] == '0')) { + val.i = FALSE; + } + else { + E_ERROR("Unparsed boolean value '%s'\n", str); + valid = 0; + } + break; + case ARG_STRING: + case REQARG_STRING: + val.ptr = ckd_salloc(e_str); + break; + case ARG_STRING_LIST: + val.ptr = parse_string_list(e_str); + break; + default: + E_ERROR("Unknown argument type: %d\n", t); + valid = 0; + } + + ckd_free(e_str); + if (valid == 0) + return NULL; + } + + v = (cmd_ln_val_t *)ckd_calloc(1, sizeof(*v)); + memcpy(v, &val, sizeof(val)); + v->type = t; + v->name = ckd_salloc(name); + + return v; +} + +/* + * Handles option parsing for cmd_ln_parse_file_r() and cmd_ln_init() + * also takes care of storing argv. + * DO NOT call it from cmd_ln_parse_r() + */ +static cmd_ln_t * +parse_options(cmd_ln_t *cmdln, const arg_t *defn, int32 argc, char* argv[], int32 strict) +{ + cmd_ln_t *new_cmdln; + + new_cmdln = cmd_ln_parse_r(cmdln, defn, argc, argv, strict); + /* If this failed then clean up and return NULL. */ + if (new_cmdln == NULL) { + int32 i; + for (i = 0; i < argc; ++i) + ckd_free(argv[i]); + ckd_free(argv); + return NULL; + } + + /* Otherwise, we need to add the contents of f_argv to the new object. */ + if (new_cmdln == cmdln) { + /* If we are adding to a previously passed-in cmdln, then + * store our allocated strings in its f_argv. */ + new_cmdln->f_argv = (char **)ckd_realloc(new_cmdln->f_argv, + (new_cmdln->f_argc + argc) + * sizeof(*new_cmdln->f_argv)); + memcpy(new_cmdln->f_argv + new_cmdln->f_argc, argv, + argc * sizeof(*argv)); + ckd_free(argv); + new_cmdln->f_argc += argc; + } + else { + /* Otherwise, store f_argc and f_argv. */ + new_cmdln->f_argc = argc; + new_cmdln->f_argv = argv; + } + + return new_cmdln; +} + +void +cmd_ln_val_free(cmd_ln_val_t *val) +{ + int i; + if (val->type & ARG_STRING_LIST) { + char ** array = (char **)val->val.ptr; + if (array) { + for (i = 0; array[i] != NULL; i++) { + ckd_free(array[i]); + } + ckd_free(array); + } + } + if (val->type & ARG_STRING) + ckd_free(val->val.ptr); + ckd_free(val->name); + ckd_free(val); +} + +cmd_ln_t * +cmd_ln_get(void) +{ + return global_cmdln; +} + +void +cmd_ln_appl_enter(int argc, char *argv[], + const char *default_argfn, + const arg_t * defn) +{ + /* Look for default or specified arguments file */ + const char *str; + + str = NULL; + + if ((argc == 2) && (strcmp(argv[1], "help") == 0)) { + cmd_ln_print_help(stderr, defn); + exit(1); + } + + if ((argc == 2) && (argv[1][0] != '-')) + str = argv[1]; + else if (argc == 1) { + FILE *fp; + E_INFO("Looking for default argument file: %s\n", default_argfn); + + if ((fp = fopen(default_argfn, "r")) == NULL) { + E_INFO("Can't find default argument file %s.\n", + default_argfn); + } + else { + str = default_argfn; + } + if (fp != NULL) + fclose(fp); + } + + + if (str) { + /* Build command line argument list from file */ + E_INFO("Parsing command lines from file %s\n", str); + if (cmd_ln_parse_file(defn, str, TRUE)) { + E_INFOCONT("Usage:\n"); + E_INFOCONT("\t%s argument-list, or\n", argv[0]); + E_INFOCONT("\t%s [argument-file] (default file: . %s)\n\n", + argv[0], default_argfn); + cmd_ln_print_help(stderr, defn); + exit(1); + } + } + else { + cmd_ln_parse(defn, argc, argv, TRUE); + } +} + +void +cmd_ln_appl_exit() +{ + cmd_ln_free(); +} + + +cmd_ln_t * +cmd_ln_parse_r(cmd_ln_t *inout_cmdln, const arg_t * defn, int32 argc, char *argv[], int strict) +{ + int32 i, j, n, argstart; + hash_table_t *defidx = NULL; + cmd_ln_t *cmdln; + + /* Construct command-line object */ + if (inout_cmdln == NULL) { + cmdln = (cmd_ln_t*)ckd_calloc(1, sizeof(*cmdln)); + cmdln->refcount = 1; + } + else + cmdln = inout_cmdln; + + /* Build a hash table for argument definitions */ + defidx = hash_table_new(50, 0); + if (defn) { + for (n = 0; defn[n].name; n++) { + void *v; + + v = hash_table_enter(defidx, defn[n].name, (void *)&defn[n]); + if (strict && (v != &defn[n])) { + E_ERROR("Duplicate argument name in definition: %s\n", defn[n].name); + goto error; + } + } + } + else { + /* No definitions. */ + n = 0; + } + + /* Allocate memory for argument values */ + if (cmdln->ht == NULL) + cmdln->ht = hash_table_new(n, 0 /* argument names are case-sensitive */ ); + + + /* skip argv[0] if it doesn't start with dash */ + argstart = 0; + if (argc > 0 && argv[0][0] != '-') { + argstart = 1; + } + + /* Parse command line arguments (name-value pairs) */ + for (j = argstart; j < argc; j += 2) { + arg_t *argdef; + cmd_ln_val_t *val; + void *v; + + if (hash_table_lookup(defidx, argv[j], &v) < 0) { + if (strict) { + E_ERROR("Unknown argument name '%s'\n", argv[j]); + goto error; + } + else if (defn == NULL) + v = NULL; + else + continue; + } + argdef = (arg_t *)v; + + /* Enter argument value */ + if (j + 1 >= argc) { + cmd_ln_print_help_r(cmdln, stderr, defn); + E_ERROR("Argument value for '%s' missing\n", argv[j]); + goto error; + } + + if (argdef == NULL) + val = cmd_ln_val_init(ARG_STRING, argv[j], argv[j + 1]); + else { + if ((val = cmd_ln_val_init(argdef->type, argv[j], argv[j + 1])) == NULL) { + cmd_ln_print_help_r(cmdln, stderr, defn); + E_ERROR("Bad argument value for %s: %s\n", argv[j], + argv[j + 1]); + goto error; + } + } + + if ((v = hash_table_enter(cmdln->ht, val->name, (void *)val)) != + (void *)val) + { + if (strict) { + cmd_ln_val_free(val); + E_ERROR("Duplicate argument name in arguments: %s\n", + argdef->name); + goto error; + } + else { + v = hash_table_replace(cmdln->ht, val->name, (void *)val); + cmd_ln_val_free((cmd_ln_val_t *)v); + } + } + } + + /* Fill in default values, if any, for unspecified arguments */ + for (i = 0; i < n; i++) { + cmd_ln_val_t *val; + void *v; + + if (hash_table_lookup(cmdln->ht, defn[i].name, &v) < 0) { + if ((val = cmd_ln_val_init(defn[i].type, defn[i].name, defn[i].deflt)) == NULL) { + E_ERROR + ("Bad default argument value for %s: %s\n", + defn[i].name, defn[i].deflt); + goto error; + } + hash_table_enter(cmdln->ht, val->name, (void *)val); + } + } + + /* Check for required arguments; exit if any missing */ + j = 0; + for (i = 0; i < n; i++) { + if (defn[i].type & ARG_REQUIRED) { + void *v; + if (hash_table_lookup(cmdln->ht, defn[i].name, &v) != 0) + E_ERROR("Missing required argument %s\n", defn[i].name); + } + } + if (j > 0) { + cmd_ln_print_help_r(cmdln, stderr, defn); + goto error; + } + + if (strict && argc == 1) { + E_ERROR("No arguments given, available options are:\n"); + cmd_ln_print_help_r(cmdln, stderr, defn); + if (defidx) + hash_table_free(defidx); + if (inout_cmdln == NULL) + cmd_ln_free_r(cmdln); + return NULL; + } + + /* If we use it from something except pocketsphinx, print current values */ + if (!cmd_ln_exists_r(cmdln, "-logfn") && err_get_logfp()) { + cmd_ln_print_values_r(cmdln, err_get_logfp(), defn); + } + + hash_table_free(defidx); + return cmdln; + + error: + if (defidx) + hash_table_free(defidx); + if (inout_cmdln == NULL) + cmd_ln_free_r(cmdln); + E_ERROR("Failed to parse arguments list\n"); + return NULL; +} + +cmd_ln_t * +cmd_ln_init(cmd_ln_t *inout_cmdln, const arg_t *defn, int32 strict, ...) +{ + va_list args; + const char *arg, *val; + char **f_argv; + int32 f_argc; + + va_start(args, strict); + f_argc = 0; + while ((arg = va_arg(args, const char *))) { + ++f_argc; + val = va_arg(args, const char*); + if (val == NULL) { + E_ERROR("Number of arguments must be even!\n"); + return NULL; + } + ++f_argc; + } + va_end(args); + + /* Now allocate f_argv */ + f_argv = (char**)ckd_calloc(f_argc, sizeof(*f_argv)); + va_start(args, strict); + f_argc = 0; + while ((arg = va_arg(args, const char *))) { + f_argv[f_argc] = ckd_salloc(arg); + ++f_argc; + val = va_arg(args, const char*); + f_argv[f_argc] = ckd_salloc(val); + ++f_argc; + } + va_end(args); + + return parse_options(inout_cmdln, defn, f_argc, f_argv, strict); +} + +int +cmd_ln_parse(const arg_t * defn, int32 argc, char *argv[], int strict) +{ + cmd_ln_t *cmdln; + + cmdln = cmd_ln_parse_r(global_cmdln, defn, argc, argv, strict); + if (cmdln == NULL) { + /* Old, bogus behaviour... */ + E_ERROR("Failed to parse arguments list, forced exit\n"); + exit(-1); + } + /* Initialize global_cmdln if not present. */ + if (global_cmdln == NULL) { + global_cmdln = cmdln; + } + return 0; +} + +cmd_ln_t * +cmd_ln_parse_file_r(cmd_ln_t *inout_cmdln, const arg_t * defn, const char *filename, int32 strict) +{ + FILE *file; + int argc; + int argv_size; + char *str; + int arg_max_length = 512; + int len = 0; + int quoting, ch; + char **f_argv; + int rv = 0; + const char separator[] = " \t\r\n"; + + if ((file = fopen(filename, "r")) == NULL) { + E_ERROR("Cannot open configuration file %s for reading\n", + filename); + return NULL; + } + + ch = fgetc(file); + /* Skip to the next interesting character */ + for (; ch != EOF && strchr(separator, ch); ch = fgetc(file)) ; + + if (ch == EOF) { + fclose(file); + return NULL; + } + + /* + * Initialize default argv, argc, and argv_size. + */ + argv_size = 30; + argc = 0; + f_argv = (char **)ckd_calloc(argv_size, sizeof(char *)); + /* Silently make room for \0 */ + str = (char* )ckd_calloc(arg_max_length + 1, sizeof(char)); + quoting = 0; + + do { + /* Handle arguments that are commented out */ + if (len == 0 && argc % 2 == 0) { + while (ch == '#') { + /* Skip everything until newline */ + for (ch = fgetc(file); ch != EOF && ch != '\n'; ch = fgetc(file)) ; + /* Skip to the next interesting character */ + for (ch = fgetc(file); ch != EOF && strchr(separator, ch); ch = fgetc(file)) ; + } + + /* Check if we are at the last line (without anything interesting in it) */ + if (ch == EOF) + break; + } + + /* Handle quoted arguments */ + if (ch == '"' || ch == '\'') { + if (quoting == ch) /* End a quoted section with the same type */ + quoting = 0; + else if (quoting) { + E_ERROR("Nesting quotations is not supported!\n"); + rv = 1; + break; + } + else + quoting = ch; /* Start a quoted section */ + } + else if (ch == EOF || (!quoting && strchr(separator, ch))) { + /* Reallocate argv so it is big enough to contain all the arguments */ + if (argc >= argv_size) { + char **tmp_argv; + if (!(tmp_argv = + (char **)ckd_realloc(f_argv, argv_size * 2 * sizeof(char *)))) { + rv = 1; + break; + } + f_argv = tmp_argv; + argv_size *= 2; + } + + /* Add the string to the list of arguments */ + f_argv[argc] = ckd_salloc(str); + len = 0; + str[0] = '\0'; + argc++; + + if (quoting) + E_WARN("Unclosed quotation, having EOF close it...\n"); + + /* Skip to the next interesting character */ + for (; ch != EOF && strchr(separator, ch); ch = fgetc(file)) ; + + if (ch == EOF) + break; + + /* We already have the next character */ + continue; + } + else { + if (len >= arg_max_length) { + /* Make room for more chars (including the \0 !) */ + char *tmp_str = str; + if ((tmp_str = (char *)ckd_realloc(str, (1 + arg_max_length * 2) * sizeof(char))) == NULL) { + rv = 1; + break; + } + str = tmp_str; + arg_max_length *= 2; + } + /* Add the char to the argument string */ + str[len++] = ch; + /* Always null terminate */ + str[len] = '\0'; + } + + ch = fgetc(file); + } while (1); + + fclose(file); + + ckd_free(str); + + if (rv) { + for (ch = 0; ch < argc; ++ch) + ckd_free(f_argv[ch]); + ckd_free(f_argv); + return NULL; + } + + return parse_options(inout_cmdln, defn, argc, f_argv, strict); +} + +int +cmd_ln_parse_file(const arg_t * defn, const char *filename, int32 strict) +{ + cmd_ln_t *cmdln; + + cmdln = cmd_ln_parse_file_r(global_cmdln, defn, filename, strict); + if (cmdln == NULL) { + return -1; + } + /* Initialize global_cmdln if not present. */ + if (global_cmdln == NULL) { + global_cmdln = cmdln; + } + return 0; +} + +void +cmd_ln_print_help_r(cmd_ln_t *cmdln, FILE *fp, arg_t const* defn) +{ + if (defn == NULL) + return; + fprintf(fp, "Arguments list definition:\n"); + arg_dump_r(cmdln, fp, defn, TRUE); +} + +void +cmd_ln_print_values_r(cmd_ln_t *cmdln, FILE *fp, arg_t const* defn) +{ + if (defn == NULL) + return; + fprintf(fp, "Current configuration:\n"); + arg_dump_r(cmdln, fp, defn, FALSE); +} + +int +cmd_ln_exists_r(cmd_ln_t *cmdln, const char *name) +{ + void *val; + if (cmdln == NULL) + return FALSE; + return (hash_table_lookup(cmdln->ht, name, &val) == 0); +} + +anytype_t * +cmd_ln_access_r(cmd_ln_t *cmdln, const char *name) +{ + void *val; + if (hash_table_lookup(cmdln->ht, name, &val) < 0) { + E_ERROR("Unknown argument: %s\n", name); + return NULL; + } + return (anytype_t *)val; +} + +char const * +cmd_ln_str_r(cmd_ln_t *cmdln, char const *name) +{ + anytype_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) + return NULL; + return (char const *)val->ptr; +} + +char const ** +cmd_ln_str_list_r(cmd_ln_t *cmdln, char const *name) +{ + anytype_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) + return NULL; + return (char const **)val->ptr; +} + +long +cmd_ln_int_r(cmd_ln_t *cmdln, char const *name) +{ + anytype_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) + return 0L; + return val->i; +} + +double +cmd_ln_float_r(cmd_ln_t *cmdln, char const *name) +{ + anytype_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) + return 0.0; + return val->fl; +} + +void +cmd_ln_set_str_r(cmd_ln_t *cmdln, char const *name, char const *str) +{ + anytype_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) { + E_ERROR("Unknown argument: %s\n", name); + return; + } + ckd_free(val->ptr); + val->ptr = ckd_salloc(str); +} + +void +cmd_ln_set_str_extra_r(cmd_ln_t *cmdln, char const *name, char const *str) +{ + cmd_ln_val_t *val; + if (hash_table_lookup(cmdln->ht, name, (void **)&val) < 0) { + val = cmd_ln_val_init(ARG_STRING, name, str); + hash_table_enter(cmdln->ht, val->name, (void *)val); + } else { + ckd_free(val->val.ptr); + val->val.ptr = ckd_salloc(str); + } +} + +void +cmd_ln_set_int_r(cmd_ln_t *cmdln, char const *name, long iv) +{ + anytype_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) { + E_ERROR("Unknown argument: %s\n", name); + return; + } + val->i = iv; +} + +void +cmd_ln_set_float_r(cmd_ln_t *cmdln, char const *name, double fv) +{ + anytype_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) { + E_ERROR("Unknown argument: %s\n", name); + return; + } + val->fl = fv; +} + +cmd_ln_t * +cmd_ln_retain(cmd_ln_t *cmdln) +{ + ++cmdln->refcount; + return cmdln; +} + +int +cmd_ln_free_r(cmd_ln_t *cmdln) +{ + if (cmdln == NULL) + return 0; + if (--cmdln->refcount > 0) + return cmdln->refcount; + + if (cmdln->ht) { + glist_t entries; + gnode_t *gn; + int32 n; + + entries = hash_table_tolist(cmdln->ht, &n); + for (gn = entries; gn; gn = gnode_next(gn)) { + hash_entry_t *e = (hash_entry_t *)gnode_ptr(gn); + cmd_ln_val_free((cmd_ln_val_t *)e->val); + } + glist_free(entries); + hash_table_free(cmdln->ht); + cmdln->ht = NULL; + } + + if (cmdln->f_argv) { + int32 i; + for (i = 0; i < cmdln->f_argc; ++i) { + ckd_free(cmdln->f_argv[i]); + } + ckd_free(cmdln->f_argv); + cmdln->f_argv = NULL; + cmdln->f_argc = 0; + } + ckd_free(cmdln); + return 0; +} + +void +cmd_ln_free(void) +{ + cmd_ln_free_r(global_cmdln); + global_cmdln = NULL; +} + +/* vim: set ts=4 sw=4: */ diff --git a/src/libsphinxbase/util/dtoa.c b/src/libsphinxbase/util/dtoa.c new file mode 100644 index 000000000..aeaf80401 --- /dev/null +++ b/src/libsphinxbase/util/dtoa.c @@ -0,0 +1,2985 @@ +/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + +/**************************************************************** + * This is dtoa.c by David M. Gay, downloaded from + * http://www.netlib.org/fp/dtoa.c on April 15, 2009 and modified for + * inclusion into the Python core by Mark E. T. Dickinson and Eric V. Smith. + * It was taken from Python distribution then and imported into sphinxbase. + * Python version is preferred due to cleanups, though original + * version at netlib is still maintained. + * + * Please remember to check http://www.netlib.org/fp regularly for bugfixes and updates. + * + * The major modifications from Gay's original code are as follows: + * + * 0. The original code has been specialized to Sphinxbase's needs by removing + * many of the #ifdef'd sections. In particular, code to support VAX and + * IBM floating-point formats, hex NaNs, hex floats, locale-aware + * treatment of the decimal point, and setting of the inexact flag have + * been removed. + * + * 1. We use cdk_calloc and ckd_free in place of malloc and free. + * + * 2. The public functions strtod, dtoa and freedtoa all now have + * a sb_ prefix. + * + * 3. Instead of assuming that malloc always succeeds, we thread + * malloc failures through the code. The functions + * + * Balloc, multadd, s2b, i2b, mult, pow5mult, lshift, diff, d2b + * + * of return type *Bigint all return NULL to indicate a malloc failure. + * Similarly, rv_alloc and nrv_alloc (return type char *) return NULL on + * failure. bigcomp now has return type int (it used to be void) and + * returns -1 on failure and 0 otherwise. sb_dtoa returns NULL + * on failure. sb_strtod indicates failure due to malloc failure + * by returning -1.0, setting errno=ENOMEM and *se to s00. + * + * 4. The static variable dtoa_result has been removed. Callers of + * sb_dtoa are expected to call sb_freedtoa to free the memory allocated + * by sb_dtoa. + * + * 5. The code has been reformatted to better fit with C style. + * + * 6. A bug in the memory allocation has been fixed: to avoid FREEing memory + * that hasn't been MALLOC'ed, private_mem should only be used when k <= + * Kmax. + * + * 7. sb_strtod has been modified so that it doesn't accept strings with + * leading whitespace. + * + * 8. Global static variables are not used due to memory access issues. Fixes + * usage from multiple threads. + * + ***************************************************************/ + +/* Please send bug reports for the original dtoa.c code to David M. Gay (dmg + * at acm dot org, with " at " changed at "@" and " dot " changed to "."). + */ + +/* On a machine with IEEE extended-precision registers, it is + * necessary to specify double-precision (53-bit) rounding precision + * before invoking strtod or dtoa. If the machine uses (the equivalent + * of) Intel 80x87 arithmetic, the call + * _control87(PC_53, MCW_PC); + * does this with many compilers. Whether this or another call is + * appropriate depends on the compiler; for this to work, it may be + * necessary to #include "float.h" or another system-dependent header + * file. + */ + +/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. + * + * This strtod returns a nearest machine number to the input decimal + * string (or sets errno to ERANGE). With IEEE arithmetic, ties are + * broken by the IEEE round-even rule. Otherwise ties are broken by + * biased rounding (add half and chop). + * + * Inspired loosely by William D. Clinger's paper "How to Read Floating + * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. + * + * Modifications: + * + * 1. We only require IEEE, IBM, or VAX double-precision + * arithmetic (not IEEE double-extended). + * 2. We get by with floating-point arithmetic in a case that + * Clinger missed -- when we're computing d * 10^n + * for a small integer d and the integer n is not too + * much larger than 22 (the maximum integer k for which + * we can represent 10^k exactly), we may be able to + * compute (d*10^k) * 10^(e-k) with just one roundoff. + * 3. Rather than a bit-at-a-time adjustment of the binary + * result in the hard case, we use floating-point + * arithmetic to determine the adjustment to within + * one bit; only in really hard cases do we need to + * compute a second residual. + * 4. Because of 3., we don't need a large table of powers of 10 + * for ten-to-e (just some small tables, e.g. of 10^k + * for 0 <= k <= 22). + */ + +/* Linking of sphinxbase's #defines to Gay's #defines starts here. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#include +#include + +#ifdef WORDS_BIGENDIAN +#define IEEE_MC68k +#else +#define IEEE_8087 +#endif + +#define Long int32 /* ZOMG */ +#define ULong uint32 /* WTF */ +#ifdef HAVE_LONG_LONG +#define ULLong uint64 +#endif + +#define MALLOC ckd_malloc +#define FREE ckd_free + +#define DBL_DIG 15 +#define DBL_MAX_10_EXP 308 +#define DBL_MAX_EXP 1024 +#define FLT_RADIX 2 + +/* maximum permitted exponent value for strtod; exponents larger than + MAX_ABS_EXP in absolute value get truncated to +-MAX_ABS_EXP. MAX_ABS_EXP + should fit into an int. */ +#ifndef MAX_ABS_EXP +#define MAX_ABS_EXP 1100000000U +#endif +/* Bound on length of pieces of input strings in sb_strtod; specifically, + this is used to bound the total number of digits ignoring leading zeros and + the number of digits that follow the decimal point. Ideally, MAX_DIGITS + should satisfy MAX_DIGITS + 400 < MAX_ABS_EXP; that ensures that the + exponent clipping in sb_strtod can't affect the value of the output. */ +#ifndef MAX_DIGITS +#define MAX_DIGITS 1000000000U +#endif + +/* End sphinxbase #define linking */ + +#ifdef DEBUG +#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef union { double d; ULong L[2]; } U; + +#ifdef IEEE_8087 +#define word0(x) (x)->L[1] +#define word1(x) (x)->L[0] +#else +#define word0(x) (x)->L[0] +#define word1(x) (x)->L[1] +#endif +#define dval(x) (x)->d + +#ifndef STRTOD_DIGLIM +#define STRTOD_DIGLIM 40 +#endif + +/* maximum permitted exponent value for strtod; exponents larger than + MAX_ABS_EXP in absolute value get truncated to +-MAX_ABS_EXP. MAX_ABS_EXP + should fit into an int. */ +#ifndef MAX_ABS_EXP +#define MAX_ABS_EXP 1100000000U +#endif +/* Bound on length of pieces of input strings in sb_strtod; specifically, + this is used to bound the total number of digits ignoring leading zeros and + the number of digits that follow the decimal point. Ideally, MAX_DIGITS + should satisfy MAX_DIGITS + 400 < MAX_ABS_EXP; that ensures that the + exponent clipping in sb_strtod can't affect the value of the output. */ +#ifndef MAX_DIGITS +#define MAX_DIGITS 1000000000U +#endif + +/* Guard against trying to use the above values on unusual platforms with ints + * of width less than 32 bits. */ +#if MAX_ABS_EXP > 0x7fffffff +#error "MAX_ABS_EXP should fit in an int" +#endif +#if MAX_DIGITS > 0x7fffffff +#error "MAX_DIGITS should fit in an int" +#endif + +/* The following definition of Storeinc is appropriate for MIPS processors. + * An alternative that might be better on some machines is + * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) + */ +#if defined(IEEE_8087) +#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ + ((unsigned short *)a)[0] = (unsigned short)c, a++) +#else +#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ + ((unsigned short *)a)[1] = (unsigned short)c, a++) +#endif + +/* #define P DBL_MANT_DIG */ +/* Ten_pmax = floor(P*log(2)/log(5)) */ +/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ +/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ +/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ + +#define Exp_shift 20 +#define Exp_shift1 20 +#define Exp_msk1 0x100000 +#define Exp_msk11 0x100000 +#define Exp_mask 0x7ff00000 +#define P 53 +#define Nbits 53 +#define Bias 1023 +#define Emax 1023 +#define Emin (-1022) +#define Etiny (-1074) /* smallest denormal is 2**Etiny */ +#define Exp_1 0x3ff00000 +#define Exp_11 0x3ff00000 +#define Ebits 11 +#define Frac_mask 0xfffff +#define Frac_mask1 0xfffff +#define Ten_pmax 22 +#define Bletch 0x10 +#define Bndry_mask 0xfffff +#define Bndry_mask1 0xfffff +#define Sign_bit 0x80000000 +#define Log2P 1 +#define Tiny0 0 +#define Tiny1 1 +#define Quick_max 14 +#define Int_max 14 + +#ifndef Flt_Rounds +#ifdef FLT_ROUNDS +#define Flt_Rounds FLT_ROUNDS +#else +#define Flt_Rounds 1 +#endif +#endif /*Flt_Rounds*/ + +#define Rounding Flt_Rounds + +#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) +#define Big1 0xffffffff + +/* Standard NaN used by sb_stdnan. */ + +#define NAN_WORD0 0x7ff80000 +#define NAN_WORD1 0 + +/* Bits of the representation of positive infinity. */ + +#define POSINF_WORD0 0x7ff00000 +#define POSINF_WORD1 0 + +/* struct BCinfo is used to pass information from sb_strtod to bigcomp */ + +typedef struct BCinfo BCinfo; +struct +BCinfo { + int e0, nd, nd0, scale; +}; + +#define FFFFFFFF 0xffffffffUL + +#define Kmax 7 + +/* struct Bigint is used to represent arbitrary-precision integers. These + integers are stored in sign-magnitude format, with the magnitude stored as + an array of base 2**32 digits. Bigints are always normalized: if x is a + Bigint then x->wds >= 1, and either x->wds == 1 or x[wds-1] is nonzero. + + The Bigint fields are as follows: + + - next is a header used by Balloc and Bfree to keep track of lists + of freed Bigints; it's also used for the linked list of + powers of 5 of the form 5**2**i used by pow5mult. + - k indicates which pool this Bigint was allocated from + - maxwds is the maximum number of words space was allocated for + (usually maxwds == 2**k) + - sign is 1 for negative Bigints, 0 for positive. The sign is unused + (ignored on inputs, set to 0 on outputs) in almost all operations + involving Bigints: a notable exception is the diff function, which + ignores signs on inputs but sets the sign of the output correctly. + - wds is the actual number of significant words + - x contains the vector of words (digits) for this Bigint, from least + significant (x[0]) to most significant (x[wds-1]). +*/ + +struct +Bigint { + struct Bigint *next; + int k, maxwds, sign, wds; + ULong x[1]; +}; + +typedef struct Bigint Bigint; + +#define SPHINXBASE_USING_MEMORY_DEBUGGER 1 + +#ifndef SPHINXBASE_USING_MEMORY_DEBUGGER + +#ifndef PRIVATE_MEM +#define PRIVATE_MEM 2304 +#endif +#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) +static double private_mem[PRIVATE_mem], *pmem_next = private_mem; + +/* Memory management: memory is allocated from, and returned to, Kmax+1 pools + of memory, where pool k (0 <= k <= Kmax) is for Bigints b with b->maxwds == + 1 << k. These pools are maintained as linked lists, with freelist[k] + pointing to the head of the list for pool k. + + On allocation, if there's no free slot in the appropriate pool, MALLOC is + called to get more memory. This memory is not returned to the system until + Python quits. There's also a private memory pool that's allocated from + in preference to using MALLOC. + + For Bigints with more than (1 << Kmax) digits (which implies at least 1233 + decimal digits), memory is directly allocated using MALLOC, and freed using + FREE. + + XXX: it would be easy to bypass this memory-management system and + translate each call to Balloc into a call to PyMem_Malloc, and each + Bfree to PyMem_Free. Investigate whether this has any significant + performance on impact. */ + +static Bigint *freelist[Kmax+1]; + +/* Allocate space for a Bigint with up to 1<next; + else { + x = 1 << k; + len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) + /sizeof(double); + if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) { + rv = (Bigint*)pmem_next; + pmem_next += len; + } + else { + rv = (Bigint*)MALLOC(len*sizeof(double)); + if (rv == NULL) + return NULL; + } + rv->k = k; + rv->maxwds = x; + } + rv->sign = rv->wds = 0; + return rv; +} + +/* Free a Bigint allocated with Balloc */ + +static void +Bfree(Bigint *v) +{ + if (v) { + if (v->k > Kmax) + FREE((void*)v); + else { + v->next = freelist[v->k]; + freelist[v->k] = v; + } + } +} + +#else + +/* Alternative versions of Balloc and Bfree that use PyMem_Malloc and + PyMem_Free directly in place of the custom memory allocation scheme above. + These are provided for the benefit of memory debugging tools like + Valgrind. */ + +/* Allocate space for a Bigint with up to 1<k = k; + rv->maxwds = x; + rv->sign = rv->wds = 0; + return rv; +} + +/* Free a Bigint allocated with Balloc */ + +static void +Bfree(Bigint *v) +{ + if (v) { + FREE((void*)v); + } +} + +#endif /* SPHINXBASE_USING_MEMORY_DEBUGGER */ + +#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ + y->wds*sizeof(Long) + 2*sizeof(int)) + +/* Multiply a Bigint b by m and add a. Either modifies b in place and returns + a pointer to the modified b, or Bfrees b and returns a pointer to a copy. + On failure, return NULL. In this case, b will have been already freed. */ + +static Bigint * +multadd(Bigint *b, int m, int a) /* multiply by m and add a */ +{ + int i, wds; +#ifdef ULLong + ULong *x; + ULLong carry, y; +#else + ULong carry, *x, y; + ULong xi, z; +#endif + Bigint *b1; + + wds = b->wds; + x = b->x; + i = 0; + carry = a; + do { +#ifdef ULLong + y = *x * (ULLong)m + carry; + carry = y >> 32; + *x++ = (ULong)(y & FFFFFFFF); +#else + xi = *x; + y = (xi & 0xffff) * m + carry; + z = (xi >> 16) * m + (y >> 16); + carry = z >> 16; + *x++ = (z << 16) + (y & 0xffff); +#endif + } + while(++i < wds); + if (carry) { + if (wds >= b->maxwds) { + b1 = Balloc(b->k+1); + if (b1 == NULL){ + Bfree(b); + return NULL; + } + Bcopy(b1, b); + Bfree(b); + b = b1; + } + b->x[wds++] = (ULong)carry; + b->wds = wds; + } + return b; +} + +/* convert a string s containing nd decimal digits (possibly containing a + decimal separator at position nd0, which is ignored) to a Bigint. This + function carries on where the parsing code in sb_strtod leaves off: on + entry, y9 contains the result of converting the first 9 digits. Returns + NULL on failure. */ + +static Bigint * +s2b(const char *s, int nd0, int nd, ULong y9) +{ + Bigint *b; + int i, k; + Long x, y; + + x = (nd + 8) / 9; + for(k = 0, y = 1; x > y; y <<= 1, k++) ; + b = Balloc(k); + if (b == NULL) + return NULL; + b->x[0] = y9; + b->wds = 1; + + if (nd <= 9) + return b; + + s += 9; + for (i = 9; i < nd0; i++) { + b = multadd(b, 10, *s++ - '0'); + if (b == NULL) + return NULL; + } + s++; + for(; i < nd; i++) { + b = multadd(b, 10, *s++ - '0'); + if (b == NULL) + return NULL; + } + return b; +} + +/* count leading 0 bits in the 32-bit integer x. */ + +static int +hi0bits(ULong x) +{ + int k = 0; + + if (!(x & 0xffff0000)) { + k = 16; + x <<= 16; + } + if (!(x & 0xff000000)) { + k += 8; + x <<= 8; + } + if (!(x & 0xf0000000)) { + k += 4; + x <<= 4; + } + if (!(x & 0xc0000000)) { + k += 2; + x <<= 2; + } + if (!(x & 0x80000000)) { + k++; + if (!(x & 0x40000000)) + return 32; + } + return k; +} + +/* count trailing 0 bits in the 32-bit integer y, and shift y right by that + number of bits. */ + +static int +lo0bits(ULong *y) +{ + int k; + ULong x = *y; + + if (x & 7) { + if (x & 1) + return 0; + if (x & 2) { + *y = x >> 1; + return 1; + } + *y = x >> 2; + return 2; + } + k = 0; + if (!(x & 0xffff)) { + k = 16; + x >>= 16; + } + if (!(x & 0xff)) { + k += 8; + x >>= 8; + } + if (!(x & 0xf)) { + k += 4; + x >>= 4; + } + if (!(x & 0x3)) { + k += 2; + x >>= 2; + } + if (!(x & 1)) { + k++; + x >>= 1; + if (!x) + return 32; + } + *y = x; + return k; +} + +/* convert a small nonnegative integer to a Bigint */ + +static Bigint * +i2b(int i) +{ + Bigint *b; + + b = Balloc(1); + if (b == NULL) + return NULL; + b->x[0] = i; + b->wds = 1; + return b; +} + +/* multiply two Bigints. Returns a new Bigint, or NULL on failure. Ignores + the signs of a and b. */ + +static Bigint * +mult(Bigint *a, Bigint *b) +{ + Bigint *c; + int k, wa, wb, wc; + ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; + ULong y; +#ifdef ULLong + ULLong carry, z; +#else + ULong carry, z; + ULong z2; +#endif + + if ((!a->x[0] && a->wds == 1) || (!b->x[0] && b->wds == 1)) { + c = Balloc(0); + if (c == NULL) + return NULL; + c->wds = 1; + c->x[0] = 0; + return c; + } + + if (a->wds < b->wds) { + c = a; + a = b; + b = c; + } + k = a->k; + wa = a->wds; + wb = b->wds; + wc = wa + wb; + if (wc > a->maxwds) + k++; + c = Balloc(k); + if (c == NULL) + return NULL; + for(x = c->x, xa = x + wc; x < xa; x++) + *x = 0; + xa = a->x; + xae = xa + wa; + xb = b->x; + xbe = xb + wb; + xc0 = c->x; +#ifdef ULLong + for(; xb < xbe; xc0++) { + if ((y = *xb++)) { + x = xa; + xc = xc0; + carry = 0; + do { + z = *x++ * (ULLong)y + *xc + carry; + carry = z >> 32; + *xc++ = (ULong)(z & FFFFFFFF); + } + while(x < xae); + *xc = (ULong)carry; + } + } +#else + for(; xb < xbe; xb++, xc0++) { + if (y = *xb & 0xffff) { + x = xa; + xc = xc0; + carry = 0; + do { + z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; + carry = z >> 16; + z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; + carry = z2 >> 16; + Storeinc(xc, z2, z); + } + while(x < xae); + *xc = carry; + } + if (y = *xb >> 16) { + x = xa; + xc = xc0; + carry = 0; + z2 = *xc; + do { + z = (*x & 0xffff) * y + (*xc >> 16) + carry; + carry = z >> 16; + Storeinc(xc, z, z2); + z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; + carry = z2 >> 16; + } + while(x < xae); + *xc = z2; + } + } +#endif + for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; + c->wds = wc; + return c; +} + +#ifndef SPHINXBASE_USING_MEMORY_DEBUGGER + +/* p5s is a linked list of powers of 5 of the form 5**(2**i), i >= 2 */ + +static Bigint *p5s; + +/* multiply the Bigint b by 5**k. Returns a pointer to the result, or NULL on + failure; if the returned pointer is distinct from b then the original + Bigint b will have been Bfree'd. Ignores the sign of b. */ + +static Bigint * +pow5mult(Bigint *b, int k) +{ + Bigint *b1, *p5, *p51; + int i; + static int p05[3] = { 5, 25, 125 }; + + if ((i = k & 3)) { + b = multadd(b, p05[i-1], 0); + if (b == NULL) + return NULL; + } + + if (!(k >>= 2)) + return b; + p5 = p5s; + if (!p5) { + /* first time */ + p5 = i2b(625); + if (p5 == NULL) { + Bfree(b); + return NULL; + } + p5s = p5; + p5->next = 0; + } + for(;;) { + if (k & 1) { + b1 = mult(b, p5); + Bfree(b); + b = b1; + if (b == NULL) + return NULL; + } + if (!(k >>= 1)) + break; + p51 = p5->next; + if (!p51) { + p51 = mult(p5,p5); + if (p51 == NULL) { + Bfree(b); + return NULL; + } + p51->next = 0; + p5->next = p51; + } + p5 = p51; + } + return b; +} + +#else + +/* Version of pow5mult that doesn't cache powers of 5. Provided for + the benefit of memory debugging tools like Valgrind. */ + +static Bigint * +pow5mult(Bigint *b, int k) +{ + Bigint *b1, *p5, *p51; + int i; + static int p05[3] = { 5, 25, 125 }; + + if ((i = k & 3)) { + b = multadd(b, p05[i-1], 0); + if (b == NULL) + return NULL; + } + + if (!(k >>= 2)) + return b; + p5 = i2b(625); + if (p5 == NULL) { + Bfree(b); + return NULL; + } + + for(;;) { + if (k & 1) { + b1 = mult(b, p5); + Bfree(b); + b = b1; + if (b == NULL) { + Bfree(p5); + return NULL; + } + } + if (!(k >>= 1)) + break; + p51 = mult(p5, p5); + Bfree(p5); + p5 = p51; + if (p5 == NULL) { + Bfree(b); + return NULL; + } + } + Bfree(p5); + return b; +} + +#endif /* SPHINXBASE_USING_MEMORY_DEBUGGER */ + +/* shift a Bigint b left by k bits. Return a pointer to the shifted result, + or NULL on failure. If the returned pointer is distinct from b then the + original b will have been Bfree'd. Ignores the sign of b. */ + +static Bigint * +lshift(Bigint *b, int k) +{ + int i, k1, n, n1; + Bigint *b1; + ULong *x, *x1, *xe, z; + + if (!k || (!b->x[0] && b->wds == 1)) + return b; + + n = k >> 5; + k1 = b->k; + n1 = n + b->wds + 1; + for(i = b->maxwds; n1 > i; i <<= 1) + k1++; + b1 = Balloc(k1); + if (b1 == NULL) { + Bfree(b); + return NULL; + } + x1 = b1->x; + for(i = 0; i < n; i++) + *x1++ = 0; + x = b->x; + xe = x + b->wds; + if (k &= 0x1f) { + k1 = 32 - k; + z = 0; + do { + *x1++ = *x << k | z; + z = *x++ >> k1; + } + while(x < xe); + if ((*x1 = z)) + ++n1; + } + else do + *x1++ = *x++; + while(x < xe); + b1->wds = n1 - 1; + Bfree(b); + return b1; +} + +/* Do a three-way compare of a and b, returning -1 if a < b, 0 if a == b and + 1 if a > b. Ignores signs of a and b. */ + +static int +cmp(Bigint *a, Bigint *b) +{ + ULong *xa, *xa0, *xb, *xb0; + int i, j; + + i = a->wds; + j = b->wds; +#ifdef DEBUG + if (i > 1 && !a->x[i-1]) + Bug("cmp called with a->x[a->wds-1] == 0"); + if (j > 1 && !b->x[j-1]) + Bug("cmp called with b->x[b->wds-1] == 0"); +#endif + if (i -= j) + return i; + xa0 = a->x; + xa = xa0 + j; + xb0 = b->x; + xb = xb0 + j; + for(;;) { + if (*--xa != *--xb) + return *xa < *xb ? -1 : 1; + if (xa <= xa0) + break; + } + return 0; +} + +/* Take the difference of Bigints a and b, returning a new Bigint. Returns + NULL on failure. The signs of a and b are ignored, but the sign of the + result is set appropriately. */ + +static Bigint * +diff(Bigint *a, Bigint *b) +{ + Bigint *c; + int i, wa, wb; + ULong *xa, *xae, *xb, *xbe, *xc; +#ifdef ULLong + ULLong borrow, y; +#else + ULong borrow, y; + ULong z; +#endif + + i = cmp(a,b); + if (!i) { + c = Balloc(0); + if (c == NULL) + return NULL; + c->wds = 1; + c->x[0] = 0; + return c; + } + if (i < 0) { + c = a; + a = b; + b = c; + i = 1; + } + else + i = 0; + c = Balloc(a->k); + if (c == NULL) + return NULL; + c->sign = i; + wa = a->wds; + xa = a->x; + xae = xa + wa; + wb = b->wds; + xb = b->x; + xbe = xb + wb; + xc = c->x; + borrow = 0; +#ifdef ULLong + do { + y = (ULLong)*xa++ - *xb++ - borrow; + borrow = y >> 32 & (ULong)1; + *xc++ = (ULong)(y & FFFFFFFF); + } + while(xb < xbe); + while(xa < xae) { + y = *xa++ - borrow; + borrow = y >> 32 & (ULong)1; + *xc++ = (ULong)(y & FFFFFFFF); + } +#else + do { + y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } + while(xb < xbe); + while(xa < xae) { + y = (*xa & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*xa++ >> 16) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } +#endif + while(!*--xc) + wa--; + c->wds = wa; + return c; +} + +/* Given a positive normal double x, return the difference between x and the + next double up. Doesn't give correct results for subnormals. */ + +static double +ulp(U *x) +{ + Long L; + U u; + + L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; + word0(&u) = L; + word1(&u) = 0; + return dval(&u); +} + +/* Convert a Bigint to a double plus an exponent */ + +static double +b2d(Bigint *a, int *e) +{ + ULong *xa, *xa0, w, y, z; + int k; + U d; + + xa0 = a->x; + xa = xa0 + a->wds; + y = *--xa; +#ifdef DEBUG + if (!y) Bug("zero y in b2d"); +#endif + k = hi0bits(y); + *e = 32 - k; + if (k < Ebits) { + word0(&d) = Exp_1 | y >> (Ebits - k); + w = xa > xa0 ? *--xa : 0; + word1(&d) = y << ((32-Ebits) + k) | w >> (Ebits - k); + goto ret_d; + } + z = xa > xa0 ? *--xa : 0; + if (k -= Ebits) { + word0(&d) = Exp_1 | y << k | z >> (32 - k); + y = xa > xa0 ? *--xa : 0; + word1(&d) = z << k | y >> (32 - k); + } + else { + word0(&d) = Exp_1 | y; + word1(&d) = z; + } + ret_d: + return dval(&d); +} + +/* Convert a scaled double to a Bigint plus an exponent. Similar to d2b, + except that it accepts the scale parameter used in sb_strtod (which + should be either 0 or 2*P), and the normalization for the return value is + different (see below). On input, d should be finite and nonnegative, and d + / 2**scale should be exactly representable as an IEEE 754 double. + + Returns a Bigint b and an integer e such that + + dval(d) / 2**scale = b * 2**e. + + Unlike d2b, b is not necessarily odd: b and e are normalized so + that either 2**(P-1) <= b < 2**P and e >= Etiny, or b < 2**P + and e == Etiny. This applies equally to an input of 0.0: in that + case the return values are b = 0 and e = Etiny. + + The above normalization ensures that for all possible inputs d, + 2**e gives ulp(d/2**scale). + + Returns NULL on failure. +*/ + +static Bigint * +sd2b(U *d, int scale, int *e) +{ + Bigint *b; + + b = Balloc(1); + if (b == NULL) + return NULL; + + /* First construct b and e assuming that scale == 0. */ + b->wds = 2; + b->x[0] = word1(d); + b->x[1] = word0(d) & Frac_mask; + *e = Etiny - 1 + (int)((word0(d) & Exp_mask) >> Exp_shift); + if (*e < Etiny) + *e = Etiny; + else + b->x[1] |= Exp_msk1; + + /* Now adjust for scale, provided that b != 0. */ + if (scale && (b->x[0] || b->x[1])) { + *e -= scale; + if (*e < Etiny) { + scale = Etiny - *e; + *e = Etiny; + /* We can't shift more than P-1 bits without shifting out a 1. */ + assert(0 < scale && scale <= P - 1); + if (scale >= 32) { + /* The bits shifted out should all be zero. */ + assert(b->x[0] == 0); + b->x[0] = b->x[1]; + b->x[1] = 0; + scale -= 32; + } + if (scale) { + /* The bits shifted out should all be zero. */ + assert(b->x[0] << (32 - scale) == 0); + b->x[0] = (b->x[0] >> scale) | (b->x[1] << (32 - scale)); + b->x[1] >>= scale; + } + } + } + /* Ensure b is normalized. */ + if (!b->x[1]) + b->wds = 1; + + return b; +} + +/* Convert a double to a Bigint plus an exponent. Return NULL on failure. + + Given a finite nonzero double d, return an odd Bigint b and exponent *e + such that fabs(d) = b * 2**e. On return, *bbits gives the number of + significant bits of b; that is, 2**(*bbits-1) <= b < 2**(*bbits). + + If d is zero, then b == 0, *e == -1010, *bbits = 0. + */ + +static Bigint * +d2b(U *d, int *e, int *bits) +{ + Bigint *b; + int de, k; + ULong *x, y, z; + int i; + + b = Balloc(1); + if (b == NULL) + return NULL; + x = b->x; + + z = word0(d) & Frac_mask; + word0(d) &= 0x7fffffff; /* clear sign bit, which we ignore */ + if ((de = (int)(word0(d) >> Exp_shift))) + z |= Exp_msk1; + if ((y = word1(d))) { + if ((k = lo0bits(&y))) { + x[0] = y | z << (32 - k); + z >>= k; + } + else + x[0] = y; + i = + b->wds = (x[1] = z) ? 2 : 1; + } + else { + k = lo0bits(&z); + x[0] = z; + i = + b->wds = 1; + k += 32; + } + if (de) { + *e = de - Bias - (P-1) + k; + *bits = P - k; + } + else { + *e = de - Bias - (P-1) + 1 + k; + *bits = 32*i - hi0bits(x[i-1]); + } + return b; +} + +/* Compute the ratio of two Bigints, as a double. The result may have an + error of up to 2.5 ulps. */ + +static double +ratio(Bigint *a, Bigint *b) +{ + U da, db; + int k, ka, kb; + + dval(&da) = b2d(a, &ka); + dval(&db) = b2d(b, &kb); + k = ka - kb + 32*(a->wds - b->wds); + if (k > 0) + word0(&da) += k*Exp_msk1; + else { + k = -k; + word0(&db) += k*Exp_msk1; + } + return dval(&da) / dval(&db); +} + +static const double +tens[] = { + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, + 1e20, 1e21, 1e22 +}; + +static const double +bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; +static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, + 9007199254740992.*9007199254740992.e-256 + /* = 2^106 * 1e-256 */ +}; +/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */ +/* flag unnecessarily. It leads to a song and dance at the end of strtod. */ +#define Scale_Bit 0x10 +#define n_bigtens 5 + +#define ULbits 32 +#define kshift 5 +#define kmask 31 + + +static int +dshift(Bigint *b, int p2) +{ + int rv = hi0bits(b->x[b->wds-1]) - 4; + if (p2 > 0) + rv -= p2; + return rv & kmask; +} + +/* special case of Bigint division. The quotient is always in the range 0 <= + quotient < 10, and on entry the divisor S is normalized so that its top 4 + bits (28--31) are zero and bit 27 is set. */ + +static int +quorem(Bigint *b, Bigint *S) +{ + int n; + ULong *bx, *bxe, q, *sx, *sxe; +#ifdef ULLong + ULLong borrow, carry, y, ys; +#else + ULong borrow, carry, y, ys; + ULong si, z, zs; +#endif + + n = S->wds; +#ifdef DEBUG + /*debug*/ if (b->wds > n) + /*debug*/ Bug("oversize b in quorem"); +#endif + if (b->wds < n) + return 0; + sx = S->x; + sxe = sx + --n; + bx = b->x; + bxe = bx + n; + q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ +#ifdef DEBUG + /*debug*/ if (q > 9) + /*debug*/ Bug("oversized quotient in quorem"); +#endif + if (q) { + borrow = 0; + carry = 0; + do { +#ifdef ULLong + ys = *sx++ * (ULLong)q + carry; + carry = ys >> 32; + y = *bx - (ys & FFFFFFFF) - borrow; + borrow = y >> 32 & (ULong)1; + *bx++ = (ULong)(y & FFFFFFFF); +#else + si = *sx++; + ys = (si & 0xffff) * q + carry; + zs = (si >> 16) * q + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#endif + } + while(sx <= sxe); + if (!*bxe) { + bx = b->x; + while(--bxe > bx && !*bxe) + --n; + b->wds = n; + } + } + if (cmp(b, S) >= 0) { + q++; + borrow = 0; + carry = 0; + bx = b->x; + sx = S->x; + do { +#ifdef ULLong + ys = *sx++ + carry; + carry = ys >> 32; + y = *bx - (ys & FFFFFFFF) - borrow; + borrow = y >> 32 & (ULong)1; + *bx++ = (ULong)(y & FFFFFFFF); +#else + si = *sx++; + ys = (si & 0xffff) + carry; + zs = (si >> 16) + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#endif + } + while(sx <= sxe); + bx = b->x; + bxe = bx + n; + if (!*bxe) { + while(--bxe > bx && !*bxe) + --n; + b->wds = n; + } + } + return q; +} + +/* sulp(x) is a version of ulp(x) that takes bc.scale into account. + + Assuming that x is finite and nonnegative (positive zero is fine + here) and x / 2^bc.scale is exactly representable as a double, + sulp(x) is equivalent to 2^bc.scale * ulp(x / 2^bc.scale). */ + +static double +sulp(U *x, BCinfo *bc) +{ + U u; + + if (bc->scale && 2*P + 1 > (int)((word0(x) & Exp_mask) >> Exp_shift)) { + /* rv/2^bc->scale is subnormal */ + word0(&u) = (P+2)*Exp_msk1; + word1(&u) = 0; + return u.d; + } + else { + assert(word0(x) || word1(x)); /* x != 0.0 */ + return ulp(x); + } +} + +/* The bigcomp function handles some hard cases for strtod, for inputs + with more than STRTOD_DIGLIM digits. It's called once an initial + estimate for the double corresponding to the input string has + already been obtained by the code in sb_strtod. + + The bigcomp function is only called after sb_strtod has found a + double value rv such that either rv or rv + 1ulp represents the + correctly rounded value corresponding to the original string. It + determines which of these two values is the correct one by + computing the decimal digits of rv + 0.5ulp and comparing them with + the corresponding digits of s0. + + In the following, write dv for the absolute value of the number represented + by the input string. + + Inputs: + + s0 points to the first significant digit of the input string. + + rv is a (possibly scaled) estimate for the closest double value to the + value represented by the original input to sb_strtod. If + bc->scale is nonzero, then rv/2^(bc->scale) is the approximation to + the input value. + + bc is a struct containing information gathered during the parsing and + estimation steps of sb_strtod. Description of fields follows: + + bc->e0 gives the exponent of the input value, such that dv = (integer + given by the bd->nd digits of s0) * 10**e0 + + bc->nd gives the total number of significant digits of s0. It will + be at least 1. + + bc->nd0 gives the number of significant digits of s0 before the + decimal separator. If there's no decimal separator, bc->nd0 == + bc->nd. + + bc->scale is the value used to scale rv to avoid doing arithmetic with + subnormal values. It's either 0 or 2*P (=106). + + Outputs: + + On successful exit, rv/2^(bc->scale) is the closest double to dv. + + Returns 0 on success, -1 on failure (e.g., due to a failed malloc call). */ + +static int +bigcomp(U *rv, const char *s0, BCinfo *bc) +{ + Bigint *b, *d; + int b2, d2, dd, i, nd, nd0, odd, p2, p5; + + nd = bc->nd; + nd0 = bc->nd0; + p5 = nd + bc->e0; + b = sd2b(rv, bc->scale, &p2); + if (b == NULL) + return -1; + + /* record whether the lsb of rv/2^(bc->scale) is odd: in the exact halfway + case, this is used for round to even. */ + odd = b->x[0] & 1; + + /* left shift b by 1 bit and or a 1 into the least significant bit; + this gives us b * 2**p2 = rv/2^(bc->scale) + 0.5 ulp. */ + b = lshift(b, 1); + if (b == NULL) + return -1; + b->x[0] |= 1; + p2--; + + p2 -= p5; + d = i2b(1); + if (d == NULL) { + Bfree(b); + return -1; + } + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + */ + if (p5 > 0) { + d = pow5mult(d, p5); + if (d == NULL) { + Bfree(b); + return -1; + } + } + else if (p5 < 0) { + b = pow5mult(b, -p5); + if (b == NULL) { + Bfree(d); + return -1; + } + } + if (p2 > 0) { + b2 = p2; + d2 = 0; + } + else { + b2 = 0; + d2 = -p2; + } + i = dshift(d, d2); + if ((b2 += i) > 0) { + b = lshift(b, b2); + if (b == NULL) { + Bfree(d); + return -1; + } + } + if ((d2 += i) > 0) { + d = lshift(d, d2); + if (d == NULL) { + Bfree(b); + return -1; + } + } + + /* Compare s0 with b/d: set dd to -1, 0, or 1 according as s0 < b/d, s0 == + * b/d, or s0 > b/d. Here the digits of s0 are thought of as representing + * a number in the range [0.1, 1). */ + if (cmp(b, d) >= 0) + /* b/d >= 1 */ + dd = -1; + else { + i = 0; + for(;;) { + b = multadd(b, 10, 0); + if (b == NULL) { + Bfree(d); + return -1; + } + dd = s0[i < nd0 ? i : i+1] - '0' - quorem(b, d); + i++; + + if (dd) + break; + if (!b->x[0] && b->wds == 1) { + /* b/d == 0 */ + dd = i < nd; + break; + } + if (!(i < nd)) { + /* b/d != 0, but digits of s0 exhausted */ + dd = -1; + break; + } + } + } + Bfree(b); + Bfree(d); + if (dd > 0 || (dd == 0 && odd)) + dval(rv) += sulp(rv, bc); + return 0; +} + +/* Return a 'standard' NaN value. + + There are exactly two quiet NaNs that don't arise by 'quieting' signaling + NaNs (see IEEE 754-2008, section 6.2.1). If sign == 0, return the one whose + sign bit is cleared. Otherwise, return the one whose sign bit is set. +*/ + +double +sb_stdnan(int sign) +{ + U rv; + word0(&rv) = NAN_WORD0; + word1(&rv) = NAN_WORD1; + if (sign) + word0(&rv) |= Sign_bit; + return dval(&rv); +} + +/* Return positive or negative infinity, according to the given sign (0 for + * positive infinity, 1 for negative infinity). */ + +double +sb_infinity(int sign) +{ + U rv; + word0(&rv) = POSINF_WORD0; + word1(&rv) = POSINF_WORD1; + return sign ? -dval(&rv) : dval(&rv); +} + +double +sb_strtod(const char *s00, char **se) +{ + int bb2, bb5, bbe, bd2, bd5, bs2, c, dsign, e, e1, error; + int esign, i, j, k, lz, nd, nd0, odd, sign; + const char *s, *s0, *s1; + double aadj, aadj1; + U aadj2, adj, rv, rv0; + ULong y, z, abs_exp; + Long L; + BCinfo bc; + Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; + size_t ndigits, fraclen; + + dval(&rv) = 0.; + + /* Start parsing. */ + c = *(s = s00); + + /* Parse optional sign, if present. */ + sign = 0; + switch (c) { + case '-': + sign = 1; + /* no break */ + case '+': + c = *++s; + } + + /* Skip leading zeros: lz is true iff there were leading zeros. */ + s1 = s; + while (c == '0') + c = *++s; + lz = s != s1; + + /* Point s0 at the first nonzero digit (if any). fraclen will be the + number of digits between the decimal point and the end of the + digit string. ndigits will be the total number of digits ignoring + leading zeros. */ + s0 = s1 = s; + while ('0' <= c && c <= '9') + c = *++s; + ndigits = s - s1; + fraclen = 0; + + /* Parse decimal point and following digits. */ + if (c == '.') { + c = *++s; + if (!ndigits) { + s1 = s; + while (c == '0') + c = *++s; + lz = lz || s != s1; + fraclen += (s - s1); + s0 = s; + } + s1 = s; + while ('0' <= c && c <= '9') + c = *++s; + ndigits += s - s1; + fraclen += s - s1; + } + + /* Now lz is true if and only if there were leading zero digits, and + ndigits gives the total number of digits ignoring leading zeros. A + valid input must have at least one digit. */ + if (!ndigits && !lz) { + if (se) + *se = (char *)s00; + goto parse_error; + } + + /* Range check ndigits and fraclen to make sure that they, and values + computed with them, can safely fit in an int. */ + if (ndigits > MAX_DIGITS || fraclen > MAX_DIGITS) { + if (se) + *se = (char *)s00; + goto parse_error; + } + nd = (int)ndigits; + nd0 = (int)ndigits - (int)fraclen; + + /* Parse exponent. */ + e = 0; + if (c == 'e' || c == 'E') { + s00 = s; + c = *++s; + + /* Exponent sign. */ + esign = 0; + switch (c) { + case '-': + esign = 1; + /* no break */ + case '+': + c = *++s; + } + + /* Skip zeros. lz is true iff there are leading zeros. */ + s1 = s; + while (c == '0') + c = *++s; + lz = s != s1; + + /* Get absolute value of the exponent. */ + s1 = s; + abs_exp = 0; + while ('0' <= c && c <= '9') { + abs_exp = 10*abs_exp + (c - '0'); + c = *++s; + } + + /* abs_exp will be correct modulo 2**32. But 10**9 < 2**32, so if + there are at most 9 significant exponent digits then overflow is + impossible. */ + if (s - s1 > 9 || abs_exp > MAX_ABS_EXP) + e = (int)MAX_ABS_EXP; + else + e = (int)abs_exp; + if (esign) + e = -e; + + /* A valid exponent must have at least one digit. */ + if (s == s1 && !lz) + s = s00; + } + + /* Adjust exponent to take into account position of the point. */ + e -= nd - nd0; + if (nd0 <= 0) + nd0 = nd; + + /* Finished parsing. Set se to indicate how far we parsed */ + if (se) + *se = (char *)s; + + /* If all digits were zero, exit with return value +-0.0. Otherwise, + strip trailing zeros: scan back until we hit a nonzero digit. */ + if (!nd) + goto ret; + for (i = nd; i > 0; ) { + --i; + if (s0[i < nd0 ? i : i+1] != '0') { + ++i; + break; + } + } + e += nd - i; + nd = i; + if (nd0 > nd) + nd0 = nd; + + /* Summary of parsing results. After parsing, and dealing with zero + * inputs, we have values s0, nd0, nd, e, sign, where: + * + * - s0 points to the first significant digit of the input string + * + * - nd is the total number of significant digits (here, and + * below, 'significant digits' means the set of digits of the + * significand of the input that remain after ignoring leading + * and trailing zeros). + * + * - nd0 indicates the position of the decimal point, if present; it + * satisfies 1 <= nd0 <= nd. The nd significant digits are in + * s0[0:nd0] and s0[nd0+1:nd+1] using the usual Python half-open slice + * notation. (If nd0 < nd, then s0[nd0] contains a '.' character; if + * nd0 == nd, then s0[nd0] could be any non-digit character.) + * + * - e is the adjusted exponent: the absolute value of the number + * represented by the original input string is n * 10**e, where + * n is the integer represented by the concatenation of + * s0[0:nd0] and s0[nd0+1:nd+1] + * + * - sign gives the sign of the input: 1 for negative, 0 for positive + * + * - the first and last significant digits are nonzero + */ + + /* put first DBL_DIG+1 digits into integer y and z. + * + * - y contains the value represented by the first min(9, nd) + * significant digits + * + * - if nd > 9, z contains the value represented by significant digits + * with indices in [9, min(16, nd)). So y * 10**(min(16, nd) - 9) + z + * gives the value represented by the first min(16, nd) sig. digits. + */ + + bc.e0 = e1 = e; + y = z = 0; + for (i = 0; i < nd; i++) { + if (i < 9) + y = 10*y + s0[i < nd0 ? i : i+1] - '0'; + else if (i < DBL_DIG+1) + z = 10*z + s0[i < nd0 ? i : i+1] - '0'; + else + break; + } + + k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; + dval(&rv) = y; + if (k > 9) { + dval(&rv) = tens[k - 9] * dval(&rv) + z; + } + bd0 = 0; + if (nd <= DBL_DIG + && Flt_Rounds == 1 + ) { + if (!e) + goto ret; + if (e > 0) { + if (e <= Ten_pmax) { + dval(&rv) *= tens[e]; + goto ret; + } + i = DBL_DIG - nd; + if (e <= Ten_pmax + i) { + /* A fancier test would sometimes let us do + * this for larger i values. + */ + e -= i; + dval(&rv) *= tens[i]; + dval(&rv) *= tens[e]; + goto ret; + } + } + else if (e >= -Ten_pmax) { + dval(&rv) /= tens[-e]; + goto ret; + } + } + e1 += nd - k; + + bc.scale = 0; + + /* Get starting approximation = rv * 10**e1 */ + + if (e1 > 0) { + if ((i = e1 & 15)) + dval(&rv) *= tens[i]; + if (e1 &= ~15) { + if (e1 > DBL_MAX_10_EXP) + goto ovfl; + e1 >>= 4; + for(j = 0; e1 > 1; j++, e1 >>= 1) + if (e1 & 1) + dval(&rv) *= bigtens[j]; + /* The last multiplication could overflow. */ + word0(&rv) -= P*Exp_msk1; + dval(&rv) *= bigtens[j]; + if ((z = word0(&rv) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-P)) + goto ovfl; + if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { + /* set to largest number */ + /* (Can't trust DBL_MAX) */ + word0(&rv) = Big0; + word1(&rv) = Big1; + } + else + word0(&rv) += P*Exp_msk1; + } + } + else if (e1 < 0) { + /* The input decimal value lies in [10**e1, 10**(e1+16)). + + If e1 <= -512, underflow immediately. + If e1 <= -256, set bc.scale to 2*P. + + So for input value < 1e-256, bc.scale is always set; + for input value >= 1e-240, bc.scale is never set. + For input values in [1e-256, 1e-240), bc.scale may or may + not be set. */ + + e1 = -e1; + if ((i = e1 & 15)) + dval(&rv) /= tens[i]; + if (e1 >>= 4) { + if (e1 >= 1 << n_bigtens) + goto undfl; + if (e1 & Scale_Bit) + bc.scale = 2*P; + for(j = 0; e1 > 0; j++, e1 >>= 1) + if (e1 & 1) + dval(&rv) *= tinytens[j]; + if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask) + >> Exp_shift)) > 0) { + /* scaled rv is denormal; clear j low bits */ + if (j >= 32) { + word1(&rv) = 0; + if (j >= 53) + word0(&rv) = (P+2)*Exp_msk1; + else + word0(&rv) &= 0xffffffff << (j-32); + } + else + word1(&rv) &= 0xffffffff << j; + } + if (!dval(&rv)) + goto undfl; + } + } + + /* Now the hard part -- adjusting rv to the correct value.*/ + + /* Put digits into bd: true value = bd * 10^e */ + + bc.nd = nd; + bc.nd0 = nd0; /* Only needed if nd > STRTOD_DIGLIM, but done here */ + /* to silence an erroneous warning about bc.nd0 */ + /* possibly not being initialized. */ + if (nd > STRTOD_DIGLIM) { + /* ASSERT(STRTOD_DIGLIM >= 18); 18 == one more than the */ + /* minimum number of decimal digits to distinguish double values */ + /* in IEEE arithmetic. */ + + /* Truncate input to 18 significant digits, then discard any trailing + zeros on the result by updating nd, nd0, e and y suitably. (There's + no need to update z; it's not reused beyond this point.) */ + for (i = 18; i > 0; ) { + /* scan back until we hit a nonzero digit. significant digit 'i' + is s0[i] if i < nd0, s0[i+1] if i >= nd0. */ + --i; + if (s0[i < nd0 ? i : i+1] != '0') { + ++i; + break; + } + } + e += nd - i; + nd = i; + if (nd0 > nd) + nd0 = nd; + if (nd < 9) { /* must recompute y */ + y = 0; + for(i = 0; i < nd0; ++i) + y = 10*y + s0[i] - '0'; + for(; i < nd; ++i) + y = 10*y + s0[i+1] - '0'; + } + } + bd0 = s2b(s0, nd0, nd, y); + if (bd0 == NULL) + goto failed_malloc; + + /* Notation for the comments below. Write: + + - dv for the absolute value of the number represented by the original + decimal input string. + + - if we've truncated dv, write tdv for the truncated value. + Otherwise, set tdv == dv. + + - srv for the quantity rv/2^bc.scale; so srv is the current binary + approximation to tdv (and dv). It should be exactly representable + in an IEEE 754 double. + */ + + for(;;) { + + /* This is the main correction loop for sb_strtod. + + We've got a decimal value tdv, and a floating-point approximation + srv=rv/2^bc.scale to tdv. The aim is to determine whether srv is + close enough (i.e., within 0.5 ulps) to tdv, and to compute a new + approximation if not. + + To determine whether srv is close enough to tdv, compute integers + bd, bb and bs proportional to tdv, srv and 0.5 ulp(srv) + respectively, and then use integer arithmetic to determine whether + |tdv - srv| is less than, equal to, or greater than 0.5 ulp(srv). + */ + + bd = Balloc(bd0->k); + if (bd == NULL) { + Bfree(bd0); + goto failed_malloc; + } + Bcopy(bd, bd0); + bb = sd2b(&rv, bc.scale, &bbe); /* srv = bb * 2^bbe */ + if (bb == NULL) { + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + /* Record whether lsb of bb is odd, in case we need this + for the round-to-even step later. */ + odd = bb->x[0] & 1; + + /* tdv = bd * 10**e; srv = bb * 2**bbe */ + bs = i2b(1); + if (bs == NULL) { + Bfree(bb); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + + if (e >= 0) { + bb2 = bb5 = 0; + bd2 = bd5 = e; + } + else { + bb2 = bb5 = -e; + bd2 = bd5 = 0; + } + if (bbe >= 0) + bb2 += bbe; + else + bd2 -= bbe; + bs2 = bb2; + bb2++; + bd2++; + + /* At this stage bd5 - bb5 == e == bd2 - bb2 + bbe, bb2 - bs2 == 1, + and bs == 1, so: + + tdv == bd * 10**e = bd * 2**(bbe - bb2 + bd2) * 5**(bd5 - bb5) + srv == bb * 2**bbe = bb * 2**(bbe - bb2 + bb2) + 0.5 ulp(srv) == 2**(bbe-1) = bs * 2**(bbe - bb2 + bs2) + + It follows that: + + M * tdv = bd * 2**bd2 * 5**bd5 + M * srv = bb * 2**bb2 * 5**bb5 + M * 0.5 ulp(srv) = bs * 2**bs2 * 5**bb5 + + for some constant M. (Actually, M == 2**(bb2 - bbe) * 5**bb5, but + this fact is not needed below.) + */ + + /* Remove factor of 2**i, where i = min(bb2, bd2, bs2). */ + i = bb2 < bd2 ? bb2 : bd2; + if (i > bs2) + i = bs2; + if (i > 0) { + bb2 -= i; + bd2 -= i; + bs2 -= i; + } + + /* Scale bb, bd, bs by the appropriate powers of 2 and 5. */ + if (bb5 > 0) { + bs = pow5mult(bs, bb5); + if (bs == NULL) { + Bfree(bb); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + bb1 = mult(bs, bb); + Bfree(bb); + bb = bb1; + if (bb == NULL) { + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + } + if (bb2 > 0) { + bb = lshift(bb, bb2); + if (bb == NULL) { + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + } + if (bd5 > 0) { + bd = pow5mult(bd, bd5); + if (bd == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd0); + goto failed_malloc; + } + } + if (bd2 > 0) { + bd = lshift(bd, bd2); + if (bd == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd0); + goto failed_malloc; + } + } + if (bs2 > 0) { + bs = lshift(bs, bs2); + if (bs == NULL) { + Bfree(bb); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + } + + /* Now bd, bb and bs are scaled versions of tdv, srv and 0.5 ulp(srv), + respectively. Compute the difference |tdv - srv|, and compare + with 0.5 ulp(srv). */ + + delta = diff(bb, bd); + if (delta == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + dsign = delta->sign; + delta->sign = 0; + i = cmp(delta, bs); + if (bc.nd > nd && i <= 0) { + if (dsign) + break; /* Must use bigcomp(). */ + + /* Here rv overestimates the truncated decimal value by at most + 0.5 ulp(rv). Hence rv either overestimates the true decimal + value by <= 0.5 ulp(rv), or underestimates it by some small + amount (< 0.1 ulp(rv)); either way, rv is within 0.5 ulps of + the true decimal value, so it's possible to exit. + + Exception: if scaled rv is a normal exact power of 2, but not + DBL_MIN, then rv - 0.5 ulp(rv) takes us all the way down to the + next double, so the correctly rounded result is either rv - 0.5 + ulp(rv) or rv; in this case, use bigcomp to distinguish. */ + + if (!word1(&rv) && !(word0(&rv) & Bndry_mask)) { + /* rv can't be 0, since it's an overestimate for some + nonzero value. So rv is a normal power of 2. */ + j = (int)(word0(&rv) & Exp_mask) >> Exp_shift; + /* rv / 2^bc.scale = 2^(j - 1023 - bc.scale); use bigcomp if + rv / 2^bc.scale >= 2^-1021. */ + if (j - bc.scale >= 2) { + dval(&rv) -= 0.5 * sulp(&rv, &bc); + break; /* Use bigcomp. */ + } + } + + { + bc.nd = nd; + i = -1; /* Discarded digits make delta smaller. */ + } + } + + if (i < 0) { + /* Error is less than half an ulp -- check for + * special case of mantissa a power of two. + */ + if (dsign || word1(&rv) || word0(&rv) & Bndry_mask + || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1 + ) { + break; + } + if (!delta->x[0] && delta->wds <= 1) { + /* exact result */ + break; + } + delta = lshift(delta,Log2P); + if (delta == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + if (cmp(delta, bs) > 0) + goto drop_down; + break; + } + if (i == 0) { + /* exactly half-way between */ + if (dsign) { + if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 + && word1(&rv) == ( + (bc.scale && + (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) ? + (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : + 0xffffffff)) { + /*boundary case -- increment exponent*/ + word0(&rv) = (word0(&rv) & Exp_mask) + + Exp_msk1 + ; + word1(&rv) = 0; + /* dsign = 0; */ + break; + } + } + else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) { + drop_down: + /* boundary case -- decrement exponent */ + if (bc.scale) { + L = word0(&rv) & Exp_mask; + if (L <= (2*P+1)*Exp_msk1) { + if (L > (P+2)*Exp_msk1) + /* round even ==> */ + /* accept rv */ + break; + /* rv = smallest denormal */ + if (bc.nd > nd) + break; + goto undfl; + } + } + L = (word0(&rv) & Exp_mask) - Exp_msk1; + word0(&rv) = L | Bndry_mask1; + word1(&rv) = 0xffffffff; + break; + } + if (!odd) + break; + if (dsign) + dval(&rv) += sulp(&rv, &bc); + else { + dval(&rv) -= sulp(&rv, &bc); + if (!dval(&rv)) { + if (bc.nd >nd) + break; + goto undfl; + } + } + /* dsign = 1 - dsign; */ + break; + } + if ((aadj = ratio(delta, bs)) <= 2.) { + if (dsign) + aadj = aadj1 = 1.; + else if (word1(&rv) || word0(&rv) & Bndry_mask) { + if (word1(&rv) == Tiny1 && !word0(&rv)) { + if (bc.nd >nd) + break; + goto undfl; + } + aadj = 1.; + aadj1 = -1.; + } + else { + /* special case -- power of FLT_RADIX to be */ + /* rounded down... */ + + if (aadj < 2./FLT_RADIX) + aadj = 1./FLT_RADIX; + else + aadj *= 0.5; + aadj1 = -aadj; + } + } + else { + aadj *= 0.5; + aadj1 = dsign ? aadj : -aadj; + if (Flt_Rounds == 0) + aadj1 += 0.5; + } + y = word0(&rv) & Exp_mask; + + /* Check for overflow */ + + if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { + dval(&rv0) = dval(&rv); + word0(&rv) -= P*Exp_msk1; + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; + if ((word0(&rv) & Exp_mask) >= + Exp_msk1*(DBL_MAX_EXP+Bias-P)) { + if (word0(&rv0) == Big0 && word1(&rv0) == Big1) { + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + goto ovfl; + } + word0(&rv) = Big0; + word1(&rv) = Big1; + goto cont; + } + else + word0(&rv) += P*Exp_msk1; + } + else { + if (bc.scale && y <= 2*P*Exp_msk1) { + if (aadj <= 0x7fffffff) { + if ((z = (ULong)aadj) <= 0) + z = 1; + aadj = z; + aadj1 = dsign ? aadj : -aadj; + } + dval(&aadj2) = aadj1; + word0(&aadj2) += (2*P+1)*Exp_msk1 - y; + aadj1 = dval(&aadj2); + } + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; + } + z = word0(&rv) & Exp_mask; + if (bc.nd == nd) { + if (!bc.scale) + if (y == z) { + /* Can we stop now? */ + L = (Long)aadj; + aadj -= L; + /* The tolerances below are conservative. */ + if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) { + if (aadj < .4999999 || aadj > .5000001) + break; + } + else if (aadj < .4999999/FLT_RADIX) + break; + } + } + cont: + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(delta); + } + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + if (bc.nd > nd) { + error = bigcomp(&rv, s0, &bc); + if (error) + goto failed_malloc; + } + + if (bc.scale) { + word0(&rv0) = Exp_1 - 2*P*Exp_msk1; + word1(&rv0) = 0; + dval(&rv) *= dval(&rv0); + } + + ret: + return sign ? -dval(&rv) : dval(&rv); + + parse_error: + return 0.0; + + failed_malloc: + errno = ENOMEM; + return -1.0; + + undfl: + return sign ? -0.0 : 0.0; + + ovfl: + errno = ERANGE; + /* Can't trust HUGE_VAL */ + word0(&rv) = Exp_mask; + word1(&rv) = 0; + return sign ? -dval(&rv) : dval(&rv); + +} + +static char * +rv_alloc(int i) +{ + int j, k, *r; + + j = sizeof(ULong); + for(k = 0; + sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (unsigned)i; + j <<= 1) + k++; + r = (int*)Balloc(k); + if (r == NULL) + return NULL; + *r = k; + return (char *)(r+1); +} + +static char * +nrv_alloc(char *s, char **rve, int n) +{ + char *rv, *t; + + rv = rv_alloc(n); + if (rv == NULL) + return NULL; + t = rv; + while((*t = *s++)) t++; + if (rve) + *rve = t; + return rv; +} + +/* freedtoa(s) must be used to free values s returned by dtoa + * when MULTIPLE_THREADS is #defined. It should be used in all cases, + * but for consistency with earlier versions of dtoa, it is optional + * when MULTIPLE_THREADS is not defined. + */ + +void +sb_freedtoa(char *s) +{ + Bigint *b = (Bigint *)((int *)s - 1); + b->maxwds = 1 << (b->k = *(int*)b); + Bfree(b); +} + +/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. + * + * Inspired by "How to Print Floating-Point Numbers Accurately" by + * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. + * + * Modifications: + * 1. Rather than iterating, we use a simple numeric overestimate + * to determine k = floor(log10(d)). We scale relevant + * quantities using O(log2(k)) rather than O(k) multiplications. + * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't + * try to generate digits strictly left to right. Instead, we + * compute with fewer bits and propagate the carry if necessary + * when rounding the final digit up. This is often faster. + * 3. Under the assumption that input will be rounded nearest, + * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. + * That is, we allow equality in stopping tests when the + * round-nearest rule will give the same floating-point value + * as would satisfaction of the stopping test with strict + * inequality. + * 4. We remove common factors of powers of 2 from relevant + * quantities. + * 5. When converting floating-point integers less than 1e16, + * we use floating-point arithmetic rather than resorting + * to multiple-precision integers. + * 6. When asked to produce fewer than 15 digits, we first try + * to get by with floating-point arithmetic; we resort to + * multiple-precision integer arithmetic only if we cannot + * guarantee that the floating-point calculation has given + * the correctly rounded result. For k requested digits and + * "uniformly" distributed input, the probability is + * something like 10^(k-15) that we must resort to the Long + * calculation. + */ + +/* Additional notes (METD): (1) returns NULL on failure. (2) to avoid memory + leakage, a successful call to sb_dtoa should always be matched by a + call to sb_freedtoa. */ + +char * +sb_dtoa(double dd, int mode, int ndigits, + int *decpt, int *sign, char **rve) +{ + /* Arguments ndigits, decpt, sign are similar to those + of ecvt and fcvt; trailing zeros are suppressed from + the returned string. If not null, *rve is set to point + to the end of the return value. If d is +-Infinity or NaN, + then *decpt is set to 9999. + + mode: + 0 ==> shortest string that yields d when read in + and rounded to nearest. + 1 ==> like 0, but with Steele & White stopping rule; + e.g. with IEEE P754 arithmetic , mode 0 gives + 1e23 whereas mode 1 gives 9.999999999999999e22. + 2 ==> max(1,ndigits) significant digits. This gives a + return value similar to that of ecvt, except + that trailing zeros are suppressed. + 3 ==> through ndigits past the decimal point. This + gives a return value similar to that from fcvt, + except that trailing zeros are suppressed, and + ndigits can be negative. + 4,5 ==> similar to 2 and 3, respectively, but (in + round-nearest mode) with the tests of mode 0 to + possibly return a shorter string that rounds to d. + With IEEE arithmetic and compilation with + -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same + as modes 2 and 3 when FLT_ROUNDS != 1. + 6-9 ==> Debugging modes similar to mode - 4: don't try + fast floating-point estimate (if applicable). + + Values of mode other than 0-9 are treated as mode 0. + + Sufficient space is allocated to the return value + to hold the suppressed trailing zeros. + */ + + int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, + j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, + spec_case, try_quick; + Long L; + int denorm; + ULong x; + Bigint *b, *b1, *delta, *mlo, *mhi, *S; + U d2, eps, u; + double ds; + char *s, *s0; + + /* set pointers to NULL, to silence gcc compiler warnings and make + cleanup easier on error */ + mlo = mhi = S = 0; + s0 = 0; + + u.d = dd; + if (word0(&u) & Sign_bit) { + /* set sign for everything, including 0's and NaNs */ + *sign = 1; + word0(&u) &= ~Sign_bit; /* clear sign bit */ + } + else + *sign = 0; + + /* quick return for Infinities, NaNs and zeros */ + if ((word0(&u) & Exp_mask) == Exp_mask) + { + /* Infinity or NaN */ + *decpt = 9999; + if (!word1(&u) && !(word0(&u) & 0xfffff)) + return nrv_alloc("Infinity", rve, 8); + return nrv_alloc("NaN", rve, 3); + } + if (!dval(&u)) { + *decpt = 1; + return nrv_alloc("0", rve, 1); + } + + /* compute k = floor(log10(d)). The computation may leave k + one too large, but should never leave k too small. */ + b = d2b(&u, &be, &bbits); + if (b == NULL) + goto failed_malloc; + if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) { + dval(&d2) = dval(&u); + word0(&d2) &= Frac_mask1; + word0(&d2) |= Exp_11; + + /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 + * log10(x) = log(x) / log(10) + * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) + * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) + * + * This suggests computing an approximation k to log10(d) by + * + * k = (i - Bias)*0.301029995663981 + * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); + * + * We want k to be too large rather than too small. + * The error in the first-order Taylor series approximation + * is in our favor, so we just round up the constant enough + * to compensate for any error in the multiplication of + * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, + * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, + * adding 1e-13 to the constant term more than suffices. + * Hence we adjust the constant term to 0.1760912590558. + * (We could get a more accurate k by invoking log10, + * but this is probably not worthwhile.) + */ + + i -= Bias; + denorm = 0; + } + else { + /* d is denormalized */ + + i = bbits + be + (Bias + (P-1) - 1); + x = i > 32 ? word0(&u) << (64 - i) | word1(&u) >> (i - 32) + : word1(&u) << (32 - i); + dval(&d2) = x; + word0(&d2) -= 31*Exp_msk1; /* adjust exponent */ + i -= (Bias + (P-1) - 1) + 1; + denorm = 1; + } + ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + + i*0.301029995663981; + k = (int)ds; + if (ds < 0. && ds != k) + k--; /* want k = floor(ds) */ + k_check = 1; + if (k >= 0 && k <= Ten_pmax) { + if (dval(&u) < tens[k]) + k--; + k_check = 0; + } + j = bbits - i - 1; + if (j >= 0) { + b2 = 0; + s2 = j; + } + else { + b2 = -j; + s2 = 0; + } + if (k >= 0) { + b5 = 0; + s5 = k; + s2 += k; + } + else { + b2 -= k; + b5 = -k; + s5 = 0; + } + if (mode < 0 || mode > 9) + mode = 0; + + try_quick = 1; + + if (mode > 5) { + mode -= 4; + try_quick = 0; + } + leftright = 1; + ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */ + /* silence erroneous "gcc -Wall" warning. */ + switch(mode) { + case 0: + case 1: + i = 18; + ndigits = 0; + break; + case 2: + leftright = 0; + /* no break */ + case 4: + if (ndigits <= 0) + ndigits = 1; + ilim = ilim1 = i = ndigits; + break; + case 3: + leftright = 0; + /* no break */ + case 5: + i = ndigits + k + 1; + ilim = i; + ilim1 = i - 1; + if (i <= 0) + i = 1; + } + s0 = rv_alloc(i); + if (s0 == NULL) + goto failed_malloc; + s = s0; + + + if (ilim >= 0 && ilim <= Quick_max && try_quick) { + + /* Try to get by with floating-point arithmetic. */ + + i = 0; + dval(&d2) = dval(&u); + k0 = k; + ilim0 = ilim; + ieps = 2; /* conservative */ + if (k > 0) { + ds = tens[k&0xf]; + j = k >> 4; + if (j & Bletch) { + /* prevent overflows */ + j &= Bletch - 1; + dval(&u) /= bigtens[n_bigtens-1]; + ieps++; + } + for(; j; j >>= 1, i++) + if (j & 1) { + ieps++; + ds *= bigtens[i]; + } + dval(&u) /= ds; + } + else if ((j1 = -k)) { + dval(&u) *= tens[j1 & 0xf]; + for(j = j1 >> 4; j; j >>= 1, i++) + if (j & 1) { + ieps++; + dval(&u) *= bigtens[i]; + } + } + if (k_check && dval(&u) < 1. && ilim > 0) { + if (ilim1 <= 0) + goto fast_failed; + ilim = ilim1; + k--; + dval(&u) *= 10.; + ieps++; + } + dval(&eps) = ieps*dval(&u) + 7.; + word0(&eps) -= (P-1)*Exp_msk1; + if (ilim == 0) { + S = mhi = 0; + dval(&u) -= 5.; + if (dval(&u) > dval(&eps)) + goto one_digit; + if (dval(&u) < -dval(&eps)) + goto no_digits; + goto fast_failed; + } + if (leftright) { + /* Use Steele & White method of only + * generating digits needed. + */ + dval(&eps) = 0.5/tens[ilim-1] - dval(&eps); + for(i = 0;;) { + L = (Long)dval(&u); + dval(&u) -= L; + *s++ = '0' + (int)L; + if (dval(&u) < dval(&eps)) + goto ret1; + if (1. - dval(&u) < dval(&eps)) + goto bump_up; + if (++i >= ilim) + break; + dval(&eps) *= 10.; + dval(&u) *= 10.; + } + } + else { + /* Generate ilim digits, then fix them up. */ + dval(&eps) *= tens[ilim-1]; + for(i = 1;; i++, dval(&u) *= 10.) { + L = (Long)(dval(&u)); + if (!(dval(&u) -= L)) + ilim = i; + *s++ = '0' + (int)L; + if (i == ilim) { + if (dval(&u) > 0.5 + dval(&eps)) + goto bump_up; + else if (dval(&u) < 0.5 - dval(&eps)) { + while(*--s == '0'); + s++; + goto ret1; + } + break; + } + } + } + fast_failed: + s = s0; + dval(&u) = dval(&d2); + k = k0; + ilim = ilim0; + } + + /* Do we have a "small" integer? */ + + if (be >= 0 && k <= Int_max) { + /* Yes. */ + ds = tens[k]; + if (ndigits < 0 && ilim <= 0) { + S = mhi = 0; + if (ilim < 0 || dval(&u) <= 5*ds) + goto no_digits; + goto one_digit; + } + for(i = 1;; i++, dval(&u) *= 10.) { + L = (Long)(dval(&u) / ds); + dval(&u) -= L*ds; + *s++ = '0' + (int)L; + if (!dval(&u)) { + break; + } + if (i == ilim) { + dval(&u) += dval(&u); + if (dval(&u) > ds || (dval(&u) == ds && L & 1)) { + bump_up: + while(*--s == '9') + if (s == s0) { + k++; + *s = '0'; + break; + } + ++*s++; + } + break; + } + } + goto ret1; + } + + m2 = b2; + m5 = b5; + if (leftright) { + i = + denorm ? be + (Bias + (P-1) - 1 + 1) : + 1 + P - bbits; + b2 += i; + s2 += i; + mhi = i2b(1); + if (mhi == NULL) + goto failed_malloc; + } + if (m2 > 0 && s2 > 0) { + i = m2 < s2 ? m2 : s2; + b2 -= i; + m2 -= i; + s2 -= i; + } + if (b5 > 0) { + if (leftright) { + if (m5 > 0) { + mhi = pow5mult(mhi, m5); + if (mhi == NULL) + goto failed_malloc; + b1 = mult(mhi, b); + Bfree(b); + b = b1; + if (b == NULL) + goto failed_malloc; + } + if ((j = b5 - m5)) { + b = pow5mult(b, j); + if (b == NULL) + goto failed_malloc; + } + } + else { + b = pow5mult(b, b5); + if (b == NULL) + goto failed_malloc; + } + } + S = i2b(1); + if (S == NULL) + goto failed_malloc; + if (s5 > 0) { + S = pow5mult(S, s5); + if (S == NULL) + goto failed_malloc; + } + + /* Check for special case that d is a normalized power of 2. */ + + spec_case = 0; + if ((mode < 2 || leftright) + ) { + if (!word1(&u) && !(word0(&u) & Bndry_mask) + && word0(&u) & (Exp_mask & ~Exp_msk1) + ) { + /* The special case */ + b2 += Log2P; + s2 += Log2P; + spec_case = 1; + } + } + + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + * + * Perhaps we should just compute leading 28 bits of S once + * and for all and pass them and a shift to quorem, so it + * can do shifts and ors to compute the numerator for q. + */ +#define iInc 28 + i = dshift(S, s2); + b2 += i; + m2 += i; + s2 += i; + if (b2 > 0) { + b = lshift(b, b2); + if (b == NULL) + goto failed_malloc; + } + if (s2 > 0) { + S = lshift(S, s2); + if (S == NULL) + goto failed_malloc; + } + if (k_check) { + if (cmp(b,S) < 0) { + k--; + b = multadd(b, 10, 0); /* we botched the k estimate */ + if (b == NULL) + goto failed_malloc; + if (leftright) { + mhi = multadd(mhi, 10, 0); + if (mhi == NULL) + goto failed_malloc; + } + ilim = ilim1; + } + } + if (ilim <= 0 && (mode == 3 || mode == 5)) { + if (ilim < 0) { + /* no digits, fcvt style */ + no_digits: + k = -1 - ndigits; + goto ret; + } + else { + S = multadd(S, 5, 0); + if (S == NULL) + goto failed_malloc; + if (cmp(b, S) <= 0) + goto no_digits; + } + one_digit: + *s++ = '1'; + k++; + goto ret; + } + if (leftright) { + if (m2 > 0) { + mhi = lshift(mhi, m2); + if (mhi == NULL) + goto failed_malloc; + } + + /* Compute mlo -- check for special case + * that d is a normalized power of 2. + */ + + mlo = mhi; + if (spec_case) { + mhi = Balloc(mhi->k); + if (mhi == NULL) + goto failed_malloc; + Bcopy(mhi, mlo); + mhi = lshift(mhi, Log2P); + if (mhi == NULL) + goto failed_malloc; + } + + for(i = 1;;i++) { + dig = quorem(b,S) + '0'; + /* Do we yet have the shortest decimal string + * that will round to d? + */ + j = cmp(b, mlo); + delta = diff(S, mhi); + if (delta == NULL) + goto failed_malloc; + j1 = delta->sign ? 1 : cmp(b, delta); + Bfree(delta); + if (j1 == 0 && mode != 1 && !(word1(&u) & 1) + ) { + if (dig == '9') + goto round_9_up; + if (j > 0) + dig++; + *s++ = dig; + goto ret; + } + if (j < 0 || (j == 0 && mode != 1 + && !(word1(&u) & 1) + )) { + if (!b->x[0] && b->wds <= 1) { + goto accept_dig; + } + if (j1 > 0) { + b = lshift(b, 1); + if (b == NULL) + goto failed_malloc; + j1 = cmp(b, S); + if ((j1 > 0 || (j1 == 0 && dig & 1)) + && dig++ == '9') + goto round_9_up; + } + accept_dig: + *s++ = dig; + goto ret; + } + if (j1 > 0) { + if (dig == '9') { /* possible if i == 1 */ + round_9_up: + *s++ = '9'; + goto roundoff; + } + *s++ = dig + 1; + goto ret; + } + *s++ = dig; + if (i == ilim) + break; + b = multadd(b, 10, 0); + if (b == NULL) + goto failed_malloc; + if (mlo == mhi) { + mlo = mhi = multadd(mhi, 10, 0); + if (mlo == NULL) + goto failed_malloc; + } + else { + mlo = multadd(mlo, 10, 0); + if (mlo == NULL) + goto failed_malloc; + mhi = multadd(mhi, 10, 0); + if (mhi == NULL) + goto failed_malloc; + } + } + } + else + for(i = 1;; i++) { + *s++ = dig = quorem(b,S) + '0'; + if (!b->x[0] && b->wds <= 1) { + goto ret; + } + if (i >= ilim) + break; + b = multadd(b, 10, 0); + if (b == NULL) + goto failed_malloc; + } + + /* Round off last digit */ + + b = lshift(b, 1); + if (b == NULL) + goto failed_malloc; + j = cmp(b, S); + if (j > 0 || (j == 0 && dig & 1)) { + roundoff: + while(*--s == '9') + if (s == s0) { + k++; + *s++ = '1'; + goto ret; + } + ++*s++; + } + else { + while(*--s == '0'); + s++; + } + ret: + Bfree(S); + if (mhi) { + if (mlo && mlo != mhi) + Bfree(mlo); + Bfree(mhi); + } + ret1: + Bfree(b); + *s = 0; + *decpt = k + 1; + if (rve) + *rve = s; + return s0; + failed_malloc: + if (S) + Bfree(S); + if (mlo && mlo != mhi) + Bfree(mlo); + if (mhi) + Bfree(mhi); + if (b) + Bfree(b); + if (s0) + sb_freedtoa(s0); + return NULL; +} +#ifdef __cplusplus +} +#endif diff --git a/src/libsphinxbase/util/err.c b/src/libsphinxbase/util/err.c new file mode 100644 index 000000000..19c25e8e8 --- /dev/null +++ b/src/libsphinxbase/util/err.c @@ -0,0 +1,282 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file err.c + * @brief Somewhat antiquated logging and error interface. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include "sphinxbase/err.h" +#include "sphinxbase/prim_type.h" +#include "sphinxbase/filename.h" +#include "sphinxbase/ckd_alloc.h" + +static FILE* logfp = NULL; +static int logfp_disabled = FALSE; + +#if defined(__ANDROID__) +#include +static void +err_logcat_cb(void* user_data, err_lvl_t level, const char *fmt, ...); +#elif defined(_WIN32_WCE) +#include +#define vsnprintf _vsnprintf +static void +err_wince_cb(void* user_data, err_lvl_t level, const char *fmt, ...); +#endif + +#if defined(__ANDROID__) +static err_cb_f err_cb = err_logcat_cb; +#elif defined(_WIN32_WCE) +static err_cb_f err_cb = err_wince_cb; +#else +static err_cb_f err_cb = err_logfp_cb; +#endif +static void* err_user_data; + +void +err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) +{ + static const char *err_prefix[ERR_MAX] = { + "DEBUG", "INFO", "INFOCONT", "WARN", "ERROR", "FATAL" + }; + + char msg[1024]; + va_list ap; + + if (!err_cb) + return; + + va_start(ap, fmt); + vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + if (path) { + const char *fname = path2basename(path); + if (lvl == ERR_INFOCONT) + err_cb(err_user_data, lvl, "%s(%ld): %s", fname, ln, msg); + else if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s", err_prefix[lvl], fname, ln, msg); + else + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s", err_prefix[lvl], fname, ln, msg); + } else { + err_cb(err_user_data, lvl, "%s", msg); + } +} + +#ifdef _WIN32_WCE /* No strerror for WinCE, so a separate implementation */ +void +err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) +{ + static const char *err_prefix[ERR_MAX] = { + "DEBUG", "INFO", "INFOCONT", "WARN", "ERROR", "FATAL" + }; + + va_list ap; + LPVOID error_wstring; + DWORD error; + char msg[1024]; + char error_string[1024]; + + if (!err_cb) + return; + + error = GetLastError(); + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + error, + 0, // Default language + (LPTSTR) &error_wstring, + 0, + NULL); + wcstombs(error_string, error_wstring, 1023); + LocalFree(error_wstring); + + va_start(ap, fmt); + vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + if (path) { + const char *fname = path2basename(path); + if (lvl == ERR_INFOCONT) + err_cb(err_user_data, lvl, "%s(%ld): %s: %s\n", fname, ln, msg, error_string); + else if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string); + else + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string); + } else { + err_cb(err_user_data, lvl, "%s: %s\n", msg, error_string); + } +} +#else +void +err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) +{ + int local_errno = errno; + + static const char *err_prefix[ERR_MAX] = { + "DEBUG", "INFO", "INFOCONT", "WARN", "ERROR", "FATAL" + }; + + char msg[1024]; + va_list ap; + + if (!err_cb) + return; + + va_start(ap, fmt); + vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + if (path) { + const char *fname = path2basename(path); + if (lvl == ERR_INFOCONT) + err_cb(err_user_data, lvl, "%s(%ld): %s: %s\n", fname, ln, msg, strerror(local_errno)); + else if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, strerror(local_errno)); + else + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, strerror(local_errno)); + } else { + err_cb(err_user_data, lvl, "%s: %s\n", msg, strerror(local_errno)); + } +} +#endif + +#if defined(__ANDROID__) +static void +err_logcat_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) +{ + static const int android_level[ERR_MAX] = {ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, + ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_ERROR}; + + va_list ap; + va_start(ap, fmt); + __android_log_vprint(android_level[lvl], "cmusphinx", fmt, ap); + va_end(ap); +} +#elif defined(_WIN32_WCE) +static void +err_wince_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) +{ + char msg[1024]; + WCHAR *wmsg; + size_t size; + va_list ap; + + va_start(ap, fmt); + _vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + size = mbstowcs(NULL, msg, 0) + 1; + wmsg = ckd_calloc(size, sizeof(*wmsg)); + mbstowcs(wmsg, msg, size); + + OutputDebugStringW(wmsg); + ckd_free(wmsg); +} +#else +void +err_logfp_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) +{ + va_list ap; + FILE *fp = err_get_logfp(); + + if (!fp) + return; + + va_start(ap, fmt); + vfprintf(fp, fmt, ap); + va_end(ap); + fflush(fp); +} +#endif + +int +err_set_logfile(const char *path) +{ + FILE *newfp, *oldfp; + + if ((newfp = fopen(path, "a")) == NULL) + return -1; + oldfp = err_get_logfp(); + err_set_logfp(newfp); + if (oldfp != NULL && oldfp != stdout && oldfp != stderr) + fclose(oldfp); + return 0; +} + +void +err_set_logfp(FILE *stream) +{ + if (stream == NULL) { + logfp_disabled = TRUE; + logfp = NULL; + return; + } + logfp_disabled = FALSE; + logfp = stream; + return; +} + +FILE * +err_get_logfp(void) +{ + if (logfp_disabled) + return NULL; + if (logfp == NULL) + return stderr; + + return logfp; +} + +void +err_set_callback(err_cb_f cb, void* user_data) +{ + err_cb = cb; + err_user_data= user_data; +} diff --git a/src/libsphinxbase/util/errno.c b/src/libsphinxbase/util/errno.c new file mode 100644 index 000000000..844b6f538 --- /dev/null +++ b/src/libsphinxbase/util/errno.c @@ -0,0 +1,51 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + */ +/********************************************************************* + * + * File: errno.c + * + * Description: functions and variables missing from Windows CE standard + * library + * + * Author: Silvio Moioli + * + *********************************************************************/ + +#include + +#if defined(_WIN32_WCE) +int errno; +#endif diff --git a/src/libsphinxbase/util/f2c_lite.c b/src/libsphinxbase/util/f2c_lite.c new file mode 100644 index 000000000..58fbc4ee6 --- /dev/null +++ b/src/libsphinxbase/util/f2c_lite.c @@ -0,0 +1,551 @@ +#include +#include +#include +#include +#include + +#include "sphinxbase/f2c.h" + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + + +extern void +s_wsfe(cilist * f) +{; +} +extern void +e_wsfe(void) +{; +} +extern void +do_fio(integer * c, char *s, ftnlen l) +{; +} + +/* You'll want this if you redo the *_lite.c files with the -C option + * to f2c for checking array subscripts. (It's not suggested you do that + * for production use, of course.) */ +extern int +s_rnge(char *var, int index, char *routine, int lineno) +{ + fprintf(stderr, + "array index out-of-bounds for %s[%d] in routine %s:%d\n", var, + index, routine, lineno); + fflush(stderr); + assert(2+2 == 5); + return 0; +} + + +#ifdef KR_headers +extern double sqrt(); +float +f__cabs(real, imag) +float real, imag; +#else +#undef abs + +float +f__cabs(float real, float imag) +#endif +{ + float temp; + + if (real < 0) + real = -real; + if (imag < 0) + imag = -imag; + if (imag > real) { + temp = real; + real = imag; + imag = temp; + } + if ((imag + real) == real) + return ((float) real); + + temp = imag / real; + temp = real * sqrt(1.0 + temp * temp); /*overflow!! */ + return (temp); +} + + +VOID +#ifdef KR_headers +s_cnjg(r, z) +complex *r, *z; +#else +s_cnjg(complex * r, complex * z) +#endif +{ + r->r = z->r; + r->i = -z->i; +} + + +#ifdef KR_headers +float +r_imag(z) +complex *z; +#else +float +r_imag(complex * z) +#endif +{ + return (z->i); +} + + +#define log10e 0.43429448190325182765 + +#ifdef KR_headers +double log(); +float +r_lg10(x) +real *x; +#else +#undef abs + +float +r_lg10(real * x) +#endif +{ + return (log10e * log(*x)); +} + + +#ifdef KR_headers +float +r_sign(a, b) +real *a, *b; +#else +float +r_sign(real * a, real * b) +#endif +{ + float x; + x = (*a >= 0 ? *a : -*a); + return (*b >= 0 ? x : -x); +} + + +#ifdef KR_headers +double floor(); +integer +i_dnnt(x) +real *x; +#else +#undef abs + +integer +i_dnnt(real * x) +#endif +{ + return ((*x) >= 0 ? floor(*x + .5) : -floor(.5 - *x)); +} + + +#ifdef KR_headers +double pow(); +double +pow_dd(ap, bp) +doublereal *ap, *bp; +#else +#undef abs + +double +pow_dd(doublereal * ap, doublereal * bp) +#endif +{ + return (pow(*ap, *bp)); +} + + +#ifdef KR_headers +float +pow_ri(ap, bp) +real *ap; +integer *bp; +#else +float +pow_ri(real * ap, integer * bp) +#endif +{ + float pow, x; + integer n; + unsigned long u; + + pow = 1; + x = *ap; + n = *bp; + + if (n != 0) { + if (n < 0) { + n = -n; + x = 1 / x; + } + for (u = n;;) { + if (u & 01) + pow *= x; + if (u >>= 1) + x *= x; + else + break; + } + } + return (pow); +} + +/* Unless compiled with -DNO_OVERWRITE, this variant of s_cat allows the + * target of a concatenation to appear on its right-hand side (contrary + * to the Fortran 77 Standard, but in accordance with Fortran 90). + */ +#define NO_OVERWRITE + + +#ifndef NO_OVERWRITE + +#undef abs +#ifdef KR_headers +extern char *F77_aloc(); +extern void free(); +extern void exit_(); +#else + +extern char *F77_aloc(ftnlen, char *); +#endif + +#endif /* NO_OVERWRITE */ + +VOID +#ifdef KR_headers +s_cat(lp, rpp, rnp, np, ll) +char *lp, *rpp[]; +ftnlen rnp[], *np, ll; +#else +s_cat(char *lp, char *rpp[], ftnlen rnp[], ftnlen * np, ftnlen ll) +#endif +{ + ftnlen i, nc; + char *rp; + ftnlen n = *np; +#ifndef NO_OVERWRITE + ftnlen L, m; + char *lp0, *lp1; + + lp0 = 0; + lp1 = lp; + L = ll; + i = 0; + while (i < n) { + rp = rpp[i]; + m = rnp[i++]; + if (rp >= lp1 || rp + m <= lp) { + if ((L -= m) <= 0) { + n = i; + break; + } + lp1 += m; + continue; + } + lp0 = lp; + lp = lp1 = F77_aloc(L = ll, "s_cat"); + break; + } + lp1 = lp; +#endif /* NO_OVERWRITE */ + for (i = 0; i < n; ++i) { + nc = ll; + if (rnp[i] < nc) + nc = rnp[i]; + ll -= nc; + rp = rpp[i]; + while (--nc >= 0) + *lp++ = *rp++; + } + while (--ll >= 0) + *lp++ = ' '; +#ifndef NO_OVERWRITE + if (lp0) { + memmove(lp0, lp1, L); + free(lp1); + } +#endif +} + + +/* compare two strings */ + +#ifdef KR_headers +integer +s_cmp(a0, b0, la, lb) +char *a0, *b0; +ftnlen la, lb; +#else +integer +s_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) +#endif +{ + register unsigned char *a, *aend, *b, *bend; + a = (unsigned char *) a0; + b = (unsigned char *) b0; + aend = a + la; + bend = b + lb; + + if (la <= lb) { + while (a < aend) + if (*a != *b) + return (*a - *b); + else { + ++a; + ++b; + } + + while (b < bend) + if (*b != ' ') + return (' ' - *b); + else + ++b; + } + + else { + while (b < bend) + if (*a == *b) { + ++a; + ++b; + } + else + return (*a - *b); + while (a < aend) + if (*a != ' ') + return (*a - ' '); + else + ++a; + } + return (0); +} + +/* Unless compiled with -DNO_OVERWRITE, this variant of s_copy allows the + * target of an assignment to appear on its right-hand side (contrary + * to the Fortran 77 Standard, but in accordance with Fortran 90), + * as in a(2:5) = a(4:7) . + */ + + + +/* assign strings: a = b */ + +#ifdef KR_headers +VOID +s_copy(a, b, la, lb) +register char *a, *b; +ftnlen la, lb; +#else +void +s_copy(register char *a, register char *b, ftnlen la, ftnlen lb) +#endif +{ + register char *aend, *bend; + + aend = a + la; + + if (la <= lb) +#ifndef NO_OVERWRITE + if (a <= b || a >= b + la) +#endif + while (a < aend) + *a++ = *b++; +#ifndef NO_OVERWRITE + else + for (b += la; a < aend;) + *--aend = *--b; +#endif + + else { + bend = b + lb; +#ifndef NO_OVERWRITE + if (a <= b || a >= bend) +#endif + while (b < bend) + *a++ = *b++; +#ifndef NO_OVERWRITE + else { + a += lb; + while (b < bend) + *--a = *--bend; + a += lb; + } +#endif + while (a < aend) + *a++ = ' '; + } +} + + +#ifdef KR_headers +float f__cabs(); +float +z_abs(z) +complex *z; +#else +float f__cabs(float, float); +float +z_abs(complex * z) +#endif +{ + return (f__cabs(z->r, z->i)); +} + + +#ifdef KR_headers +extern void sig_die(); +VOID +z_div(c, a, b) +complex *a, *b, *c; +#else +extern void sig_die(char *, int); +void +z_div(complex * c, complex * a, complex * b) +#endif +{ + float ratio, den; + float abr, abi; + + if ((abr = b->r) < 0.) + abr = -abr; + if ((abi = b->i) < 0.) + abi = -abi; + if (abr <= abi) { + /*Let IEEE Infinties handle this ;( */ + /*if(abi == 0) + sig_die("complex division by zero", 1); */ + ratio = b->r / b->i; + den = b->i * (1 + ratio * ratio); + c->r = (a->r * ratio + a->i) / den; + c->i = (a->i * ratio - a->r) / den; + } + + else { + ratio = b->i / b->r; + den = b->r * (1 + ratio * ratio); + c->r = (a->r + a->i * ratio) / den; + c->i = (a->i - a->r * ratio) / den; + } + +} + + +#ifdef KR_headers +double sqrt(); +double f__cabs(); +VOID +z_sqrt(r, z) +complex *r, *z; +#else +#undef abs + +extern float f__cabs(float, float); +void +z_sqrt(complex * r, complex * z) +#endif +{ + float mag; + + if ((mag = f__cabs(z->r, z->i)) == 0.) + r->r = r->i = 0.; + else if (z->r > 0) { + r->r = sqrt(0.5 * (mag + z->r)); + r->i = z->i / r->r / 2; + } + else { + r->i = sqrt(0.5 * (mag - z->r)); + if (z->i < 0) + r->i = -r->i; + r->r = z->i / r->i / 2; + } +} + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers + integer pow_ii(ap, bp) integer *ap, *bp; +#else + integer pow_ii(integer * ap, integer * bp) +#endif + { + integer pow, x, n; + unsigned long u; + + x = *ap; + n = *bp; + + if (n <= 0) { + if (n == 0 || x == 1) + return 1; + if (x != -1) + return x != 0 ? 1 / x : 0; + n = -n; + } u = n; + for (pow = 1;;) { + if (u & 01) + pow *= x; + if (u >>= 1) + x *= x; + else + break; + } + return (pow); + } +#ifdef __cplusplus +} +#endif + +#ifdef KR_headers +extern void f_exit(); +VOID +s_stop(s, n) +char *s; +ftnlen n; +#else +#undef abs +#undef min +#undef max +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus + extern "C" { +#endif + void f_exit(void); + + int s_stop(char *s, ftnlen n) +#endif + { + int i; + + if (n > 0) { + fprintf(stderr, "STOP "); + for (i = 0; i < n; ++i) + putc(*s++, stderr); + fprintf(stderr, " statement executed\n"); + } +#ifdef NO_ONEXIT + f_exit(); +#endif + exit(0); + +/* We cannot avoid (useless) compiler diagnostics here: */ +/* some compilers complain if there is no return statement, */ +/* and others complain that this one cannot be reached. */ + + return 0; /* NOT REACHED */ + } +#ifdef __cplusplus + } +#endif +#ifdef __cplusplus +} +#endif diff --git a/src/libsphinxbase/util/filename.c b/src/libsphinxbase/util/filename.c new file mode 100644 index 000000000..3f4ae4750 --- /dev/null +++ b/src/libsphinxbase/util/filename.c @@ -0,0 +1,120 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * filename.c -- File and path name operations. + */ + +#include +#include +#include +#include + +#include "sphinxbase/filename.h" + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +const char * +path2basename(const char *path) +{ + const char *result; + +#if defined(_WIN32) || defined(__CYGWIN__) + result = strrchr(path, '\\'); +#else + result = strrchr(path, '/'); +#endif + + return (result == NULL ? path : result + 1); +} + +/* Return all leading pathname components */ +void +path2dirname(const char *path, char *dir) +{ + size_t i, l; + + l = strlen(path); +#if defined(_WIN32) || defined(__CYGWIN__) + for (i = l - 1; (i > 0) && !(path[i] == '/' || path[i] == '\\'); --i); +#else + for (i = l - 1; (i > 0) && !(path[i] == '/'); --i); +#endif + if (i == 0) { + dir[0] = '.'; + dir[1] = '\0'; + } else { + memcpy(dir, path, i); + dir[i] = '\0'; + } +} + + +/* Strip off the shortest trailing .xyz suffix */ +void +strip_fileext(const char *path, char *root) +{ + size_t i, l; + + l = strlen(path); + for (i = l - 1; (i > 0) && (path[i] != '.'); --i); + if (i == 0) { + strcpy(root, path); /* Didn't find a . */ + } else { + strncpy(root, path, i); + } +} + +/* Test if this path is absolute. */ +int +path_is_absolute(const char *path) +{ +#if defined(_WIN32) && !defined(_WIN32_WCE) /* FIXME: Also SymbianOS */ + return /* Starts with drive letter : \ or / */ + (strlen(path) >= 3 + && + ((path[0] >= 'A' && path[0] <= 'Z') + || (path[0] >= 'a' && path[0] <= 'z')) + && path[1] == ':' + && (path[2] == '/' || path[2] == '\\')); +#elif defined(_WIN32_WCE) + return path[0] == '\\' || path[0] == '/'; +#else /* Assume Unix */ + return path[0] == '/'; +#endif +} diff --git a/src/libsphinxbase/util/fortran.py b/src/libsphinxbase/util/fortran.py new file mode 100644 index 000000000..7be986a8e --- /dev/null +++ b/src/libsphinxbase/util/fortran.py @@ -0,0 +1,114 @@ +import re +import itertools + +def isBlank(line): + return not line +def isLabel(line): + return line[0].isdigit() +def isComment(line): + return line[0] != ' ' +def isContinuation(line): + return line[5] != ' ' + +COMMENT, STATEMENT, CONTINUATION = 0, 1, 2 +def lineType(line): + """Return the type of a line of Fortan code.""" + if isBlank(line): + return COMMENT + elif isLabel(line): + return STATEMENT + elif isComment(line): + return COMMENT + elif isContinuation(line): + return CONTINUATION + else: + return STATEMENT + +class LineIterator(object): + """LineIterator(iterable) + + Return rstrip()'d lines from iterable, while keeping a count of the + line number in the .lineno attribute. + """ + def __init__(self, iterable): + object.__init__(self) + self.iterable = iter(iterable) + self.lineno = 0 + def __iter__(self): + return self + def next(self): + self.lineno += 1 + line = self.iterable.next() + line = line.rstrip() + return line + +class PushbackIterator(object): + """PushbackIterator(iterable) + + Return an iterator for which items can be pushed back into. + Call the .pushback(item) method to have item returned as the next + value of .next(). + """ + def __init__(self, iterable): + object.__init__(self) + self.iterable = iter(iterable) + self.buffer = [] + + def __iter__(self): + return self + + def next(self): + if self.buffer: + return self.buffer.pop() + else: + return self.iterable.next() + + def pushback(self, item): + self.buffer.append(item) + +def fortranSourceLines(fo): + """Return an iterator over statement lines of a Fortran source file. + + Comment and blank lines are stripped out, and continuation lines are + merged. + """ + numberingiter = LineIterator(fo) + # add an extra '' at the end + with_extra = itertools.chain(numberingiter, ['']) + pushbackiter = PushbackIterator(with_extra) + for line in pushbackiter: + t = lineType(line) + if t == COMMENT: + continue + elif t == STATEMENT: + lines = [line] + # this is where we need the extra '', so we don't finish reading + # the iterator when we don't want to handle that + for next_line in pushbackiter: + t = lineType(next_line) + if t == CONTINUATION: + lines.append(next_line[6:]) + else: + pushbackiter.pushback(next_line) + break + yield numberingiter.lineno, ''.join(lines) + else: + raise ValueError("jammed: continuation line not expected: %s:%d" % + (fo.name, numberingiter.lineno)) + +def getDependencies(filename): + """For a Fortran source file, return a list of routines declared as EXTERNAL + in it. + """ + fo = open(filename) + external_pat = re.compile(r'^\s*EXTERNAL\s', re.I) + routines = [] + for lineno, line in fortranSourceLines(fo): + m = external_pat.match(line) + if m: + names = line = line[m.end():].strip().split(',') + names = [n.strip().lower() for n in names] + names = [n for n in names if n] + routines.extend(names) + fo.close() + return routines diff --git a/src/libsphinxbase/util/genrand.c b/src/libsphinxbase/util/genrand.c new file mode 100644 index 000000000..ca75c590a --- /dev/null +++ b/src/libsphinxbase/util/genrand.c @@ -0,0 +1,198 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright +` notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Any feedback is very welcome. + http://www.math.keio.ac.jp/matumoto/emt.html + email: matumoto@math.keio.ac.jp +*/ + +#include + +#include "sphinxbase/genrand.h" + +/* Period parameters */ +#define N 624 +#define M 397 +#define MATRIX_A 0x9908b0dfUL /* constant vector a */ +#define UPPER_MASK 0x80000000UL /* most significant w-r bits */ +#define LOWER_MASK 0x7fffffffUL /* least significant r bits */ + +void init_genrand(unsigned long s); + +void +genrand_seed(unsigned long s) +{ + init_genrand(s); +} + + +static unsigned long mt[N]; /* the array for the state vector */ +static int mti = N + 1; /* mti==N+1 means mt[N] is not initialized */ + +/* initializes mt[N] with a seed */ +void +init_genrand(unsigned long s) +{ + mt[0] = s & 0xffffffffUL; + for (mti = 1; mti < N; mti++) { + mt[mti] = + (1812433253UL * (mt[mti - 1] ^ (mt[mti - 1] >> 30)) + mti); + /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ + /* In the previous versions, MSBs of the seed affect */ + /* only MSBs of the array mt[]. */ + /* 2002/01/09 modified by Makoto Matsumoto */ + mt[mti] &= 0xffffffffUL; + /* for >32 bit machines */ + } +} + +/* generates a random number on [0,0xffffffff]-interval */ +unsigned long +genrand_int32(void) +{ + unsigned long y; + static unsigned long mag01[2] = { 0x0UL, MATRIX_A }; + /* mag01[x] = x * MATRIX_A for x=0,1 */ + + if (mti >= N) { /* generate N words at one time */ + int kk; + + if (mti == N + 1) /* if init_genrand() has not been called, */ + init_genrand(5489UL); /* a default initial seed is used */ + + for (kk = 0; kk < N - M; kk++) { + y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK); + mt[kk] = mt[kk + M] ^ (y >> 1) ^ mag01[y & 0x1UL]; + } + for (; kk < N - 1; kk++) { + y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK); + mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1UL]; + } + y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK); + mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ mag01[y & 0x1UL]; + + mti = 0; + } + + y = mt[mti++]; + + /* Tempering */ + y ^= (y >> 11); + y ^= (y << 7) & 0x9d2c5680UL; + y ^= (y << 15) & 0xefc60000UL; + y ^= (y >> 18); + + return y; +} + +/* generates a random number on [0,0x7fffffff]-interval */ +long +genrand_int31(void) +{ + return (long) (genrand_int32() >> 1); +} + +/* generates a random number on [0,1]-real-interval */ +double +genrand_real1(void) +{ + return genrand_int32() * (1.0 / 4294967295.0); + /* divided by 2^32-1 */ +} + +/* generates a random number on [0,1)-real-interval */ +double +genrand_real2(void) +{ + return genrand_int32() * (1.0 / 4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on (0,1)-real-interval */ +double +genrand_real3(void) +{ + return (((double) genrand_int32()) + 0.5) * (1.0 / 4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on [0,1) with 53-bit resolution*/ +double +genrand_res53(void) +{ + unsigned long a = genrand_int32() >> 5, b = genrand_int32() >> 6; + return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0); +} + +/* These real versions are due to Isaku Wada, 2002/01/09 added */ diff --git a/src/libsphinxbase/util/glist.c b/src/libsphinxbase/util/glist.c new file mode 100644 index 000000000..a97e71978 --- /dev/null +++ b/src/libsphinxbase/util/glist.c @@ -0,0 +1,271 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * glist.h -- Module for maintaining a generic, linear linked-list structure. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: glist.c,v $ + * Revision 1.8 2005/06/22 03:02:51 arthchan2003 + * 1, Fixed doxygen documentation, 2, add keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 09-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added glist_chkdup_*(). + * + * 13-Feb-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created from earlier version. + */ + + +#include +#include +#include +#include + +#include "sphinxbase/glist.h" +#include "sphinxbase/ckd_alloc.h" + + +glist_t +glist_add_ptr(glist_t g, void *ptr) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.ptr = ptr; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_int32(glist_t g, int32 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.i = (long)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_uint32(glist_t g, uint32 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.ui = (unsigned long)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_float32(glist_t g, float32 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.fl = (double)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_float64(glist_t g, float64 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.fl = (double)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + +void +glist_free(glist_t g) +{ + gnode_t *gn; + + while (g) { + gn = g; + g = gn->next; + ckd_free((void *) gn); + } +} + +int32 +glist_count(glist_t g) +{ + gnode_t *gn; + int32 n; + + for (gn = g, n = 0; gn; gn = gn->next, n++); + return n; +} + + +gnode_t * +glist_tail(glist_t g) +{ + gnode_t *gn; + + if (!g) + return NULL; + + for (gn = g; gn->next; gn = gn->next); + return gn; +} + + +glist_t +glist_reverse(glist_t g) +{ + gnode_t *gn, *nextgn; + gnode_t *rev; + + rev = NULL; + for (gn = g; gn; gn = nextgn) { + nextgn = gn->next; + + gn->next = rev; + rev = gn; + } + + return rev; +} + + +gnode_t * +glist_insert_ptr(gnode_t * gn, void *ptr) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.ptr = ptr; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_int32(gnode_t * gn, int32 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.i = val; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_uint32(gnode_t * gn, uint32 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.ui = val; + newgn->next = gn->next; + + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_float32(gnode_t * gn, float32 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.fl = (double)val; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_float64(gnode_t * gn, float64 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.fl = (double)val; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + +gnode_t * +gnode_free(gnode_t * gn, gnode_t * pred) +{ + gnode_t *next; + + next = gn->next; + if (pred) { + assert(pred->next == gn); + + pred->next = next; + } + + ckd_free((char *) gn); + + return next; +} diff --git a/src/libsphinxbase/util/hash_table.c b/src/libsphinxbase/util/hash_table.c new file mode 100644 index 000000000..32dfcd5cd --- /dev/null +++ b/src/libsphinxbase/util/hash_table.c @@ -0,0 +1,706 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * hash.c -- Hash table module. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: hash.c,v $ + * Revision 1.5 2005/06/22 03:04:01 arthchan2003 + * 1, Implemented hash_delete and hash_display, 2, Fixed doxygen documentation, 3, Added keyword. + * + * Revision 1.9 2005/05/25 06:17:53 archan + * Delete the test code in cmd_ln.c and fixed platform specific code of hash.c + * + * Revision 1.8 2005/05/24 01:10:54 archan + * Fix a bug when the value only appear in the hash but there is no chain. Also make sure that prev was initialized to NULL. All success cases were tested, but not tested with the deletion is tested. + * + * Revision 1.6 2005/05/24 00:00:45 archan + * Added basic functionalities to hash_t: 1, display and 2, delete a key from a hash. \n + * + * Revision 1.5 2005/05/11 07:01:38 archan + * Added comments on the usage of the current implementation of hash tables. + * + * Revision 1.4 2005/05/03 04:09:11 archan + * Implemented the heart of word copy search. For every ci-phone, every word end, a tree will be allocated to preserve its pathscore. This is different from 3.5 or below, only the best score for a particular ci-phone, regardless of the word-ends will be preserved at every frame. The graph propagation will not collect unused word tree at this point. srch_WST_propagate_wd_lv2 is also as the most stupid in the century. But well, after all, everything needs a start. I will then really get the results from the search and see how it looks. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-May-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Removed hash_key2hash(). Added hash_enter_bkey() and hash_lookup_bkey(), + * and len attribute to hash_entry_t. + * + * 30-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added hash_key2hash(). + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Included case sensitive/insensitive option. Removed local, static + * maintenance of all hash tables. + * + * 31-Jul-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4018) +#endif + +#include "sphinxbase/hash_table.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/case.h" + + +#if 0 +static void +prime_sieve(int32 max) +{ + char *notprime; + int32 p, pp; + + notprime = (char *) ckd_calloc(max + 1, 1); + p = 2; + for (;;) { + printf("%d\n", p); + for (pp = p + p; pp <= max; pp += p) + notprime[pp] = 1; + for (++p; (p <= max) && notprime[p]; p++); + if (p > max) + break; + } +} +#endif + + +/* + * HACK!! Initial hash table size is restricted by this set of primes. (Of course, + * collision resolution by chaining will accommodate more entries indefinitely, but + * efficiency will drop.) + */ +const int32 prime[] = { + 101, 211, 307, 401, 503, 601, 701, 809, 907, + 1009, 1201, 1601, 2003, 2411, 3001, 4001, 5003, 6007, 7001, 8009, + 9001, + 10007, 12007, 16001, 20011, 24001, 30011, 40009, 50021, 60013, + 70001, 80021, 90001, + 100003, 120011, 160001, 200003, 240007, 300007, 400009, 500009, + 600011, 700001, 800011, 900001, + -1 +}; + + +/** + * This function returns a very large prime. + */ +static int32 +prime_size(int32 size) +{ + int32 i; + + for (i = 0; (prime[i] > 0) && (prime[i] < size); i++); + if (prime[i] <= 0) { + E_WARN("Very large hash table requested (%d entries)\n", size); + --i; + } + return (prime[i]); +} + + +hash_table_t * +hash_table_new(int32 size, int32 casearg) +{ + hash_table_t *h; + + h = (hash_table_t *) ckd_calloc(1, sizeof(hash_table_t)); + h->size = prime_size(size + (size >> 1)); + h->nocase = (casearg == HASH_CASE_NO); + h->table = (hash_entry_t *) ckd_calloc(h->size, sizeof(hash_entry_t)); + /* The above calloc clears h->table[*].key and .next to NULL, i.e. an empty table */ + + return h; +} + + +/* + * Compute hash value for given key string. + * Somewhat tuned for English text word strings. + */ +static uint32 +key2hash(hash_table_t * h, const char *key) +{ + + register const char *cp; + + /* This is a hack because the best way to solve it is to make sure + all character representation is unsigned character in the first place. + (or better unicode.) */ + register unsigned char c; + register int32 s; + register uint32 hash; + + hash = 0; + s = 0; + + if (h->nocase) { + for (cp = key; *cp; cp++) { + c = *cp; + c = UPPER_CASE(c); + hash += c << s; + s += 5; + if (s >= 25) + s -= 24; + } + } + else { + for (cp = key; *cp; cp++) { + hash += (*cp) << s; + s += 5; + if (s >= 25) + s -= 24; + } + } + + return (hash % h->size); +} + + +static char * +makekey(uint8 * data, size_t len, char *key) +{ + size_t i, j; + + if (!key) + key = (char *) ckd_calloc(len * 2 + 1, sizeof(char)); + + for (i = 0, j = 0; i < len; i++, j += 2) { + key[j] = 'A' + (data[i] & 0x000f); + key[j + 1] = 'J' + ((data[i] >> 4) & 0x000f); + } + key[j] = '\0'; + + return key; +} + + +static int32 +keycmp_nocase(hash_entry_t * entry, const char *key) +{ + char c1, c2; + int32 i; + const char *str; + + str = entry->key; + for (i = 0; i < entry->len; i++) { + c1 = *(str++); + c1 = UPPER_CASE(c1); + c2 = *(key++); + c2 = UPPER_CASE(c2); + if (c1 != c2) + return (c1 - c2); + } + + return 0; +} + + +static int32 +keycmp_case(hash_entry_t * entry, const char *key) +{ + char c1, c2; + int32 i; + const char *str; + + str = entry->key; + for (i = 0; i < entry->len; i++) { + c1 = *(str++); + c2 = *(key++); + if (c1 != c2) + return (c1 - c2); + } + + return 0; +} + + +/* + * Lookup entry with hash-value hash in table h for given key + * Return value: hash_entry_t for key + */ +static hash_entry_t * +lookup(hash_table_t * h, uint32 hash, const char *key, size_t len) +{ + hash_entry_t *entry; + + entry = &(h->table[hash]); + if (entry->key == NULL) + return NULL; + + if (h->nocase) { + while (entry && ((entry->len != len) + || (keycmp_nocase(entry, key) != 0))) + entry = entry->next; + } + else { + while (entry && ((entry->len != len) + || (keycmp_case(entry, key) != 0))) + entry = entry->next; + } + + return entry; +} + + +int32 +hash_table_lookup(hash_table_t * h, const char *key, void ** val) +{ + hash_entry_t *entry; + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + + entry = lookup(h, hash, key, len); + if (entry) { + if (val) + *val = entry->val; + return 0; + } + else + return -1; +} + +int32 +hash_table_lookup_int32(hash_table_t * h, const char *key, int32 *val) +{ + void *vval; + int32 rv; + + rv = hash_table_lookup(h, key, &vval); + if (rv != 0) + return rv; + if (val) + *val = (int32)(long)vval; + return 0; +} + + +int32 +hash_table_lookup_bkey(hash_table_t * h, const char *key, size_t len, void ** val) +{ + hash_entry_t *entry; + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + entry = lookup(h, hash, key, len); + if (entry) { + if (val) + *val = entry->val; + return 0; + } + else + return -1; +} + +int32 +hash_table_lookup_bkey_int32(hash_table_t * h, const char *key, size_t len, int32 *val) +{ + void *vval; + int32 rv; + + rv = hash_table_lookup_bkey(h, key, len, &vval); + if (rv != 0) + return rv; + if (val) + *val = (int32)(long)vval; + return 0; +} + + +static void * +enter(hash_table_t * h, uint32 hash, const char *key, size_t len, void *val, int32 replace) +{ + hash_entry_t *cur, *new; + + if ((cur = lookup(h, hash, key, len)) != NULL) { + void *oldval; + /* Key already exists. */ + oldval = cur->val; + if (replace) { + /* Replace the pointer if replacement is requested, + * because this might be a different instance of the same + * string (this verges on magic, sorry) */ + cur->key = key; + cur->val = val; + } + return oldval; + } + + cur = &(h->table[hash]); + if (cur->key == NULL) { + /* Empty slot at hashed location; add this entry */ + cur->key = key; + cur->len = len; + cur->val = val; + + /* Added by ARCHAN at 20050515. This allows deletion could work. */ + cur->next = NULL; + + } + else { + /* Key collision; create new entry and link to hashed location */ + new = (hash_entry_t *) ckd_calloc(1, sizeof(hash_entry_t)); + new->key = key; + new->len = len; + new->val = val; + new->next = cur->next; + cur->next = new; + } + ++h->inuse; + + return val; +} + +/* 20050523 Added by ARCHAN to delete a key from a hash table */ +static void * +delete(hash_table_t * h, uint32 hash, const char *key, size_t len) +{ + hash_entry_t *entry, *prev; + void *val; + + prev = NULL; + entry = &(h->table[hash]); + if (entry->key == NULL) + return NULL; + + if (h->nocase) { + while (entry && ((entry->len != len) + || (keycmp_nocase(entry, key) != 0))) { + prev = entry; + entry = entry->next; + } + } + else { + while (entry && ((entry->len != len) + || (keycmp_case(entry, key) != 0))) { + prev = entry; + entry = entry->next; + } + } + + if (entry == NULL) + return NULL; + + /* At this point, entry will be the one required to be deleted, prev + will contain the previous entry + */ + val = entry->val; + + if (prev == NULL) { + /* That is to say the entry in the hash table (not the chain) matched the key. */ + /* We will then copy the things from the next entry to the hash table */ + prev = entry; + if (entry->next) { /* There is a next entry, great, copy it. */ + entry = entry->next; + prev->key = entry->key; + prev->len = entry->len; + prev->val = entry->val; + prev->next = entry->next; + ckd_free(entry); + } + else { /* There is not a next entry, just set the key to null */ + prev->key = NULL; + prev->len = 0; + prev->next = NULL; + } + + } + else { /* This case is simple */ + prev->next = entry->next; + ckd_free(entry); + } + + /* Do wiring and free the entry */ + + --h->inuse; + + return val; +} + +void +hash_table_empty(hash_table_t *h) +{ + hash_entry_t *e, *e2; + int32 i; + + for (i = 0; i < h->size; i++) { + /* Free collision lists. */ + for (e = h->table[i].next; e; e = e2) { + e2 = e->next; + ckd_free((void *) e); + } + memset(&h->table[i], 0, sizeof(h->table[i])); + } + h->inuse = 0; +} + + +void * +hash_table_enter(hash_table_t * h, const char *key, void *val) +{ + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + return (enter(h, hash, key, len, val, 0)); +} + +void * +hash_table_replace(hash_table_t * h, const char *key, void *val) +{ + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + return (enter(h, hash, key, len, val, 1)); +} + +void * +hash_table_delete(hash_table_t * h, const char *key) +{ + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + + return (delete(h, hash, key, len)); +} + +void * +hash_table_enter_bkey(hash_table_t * h, const char *key, size_t len, void *val) +{ + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + return (enter(h, hash, key, len, val, 0)); +} + +void * +hash_table_replace_bkey(hash_table_t * h, const char *key, size_t len, void *val) +{ + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + return (enter(h, hash, key, len, val, 1)); +} + +void * +hash_table_delete_bkey(hash_table_t * h, const char *key, size_t len) +{ + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + return (delete(h, hash, key, len)); +} + +void +hash_table_display(hash_table_t * h, int32 showdisplay) +{ + hash_entry_t *e; + int i, j; + j = 0; + + printf("Hash with chaining representation of the hash table\n"); + + for (i = 0; i < h->size; i++) { + e = &(h->table[i]); + if (e->key != NULL) { + printf("|key:"); + if (showdisplay) + printf("%s", e->key); + else + printf("%p", e->key); + + printf("|len:%zd|val=%ld|->", e->len, (long)e->val); + if (e->next == NULL) { + printf("NULL\n"); + } + j++; + + for (e = e->next; e; e = e->next) { + printf("|key:"); + if (showdisplay) + printf("%s", e->key); + + printf("|len:%zd|val=%ld|->", e->len, (long)e->val); + if (e->next == NULL) { + printf("NULL\n"); + } + j++; + } + } + } + + printf("The total number of keys =%d\n", j); +} + + +glist_t +hash_table_tolist(hash_table_t * h, int32 * count) +{ + glist_t g; + hash_entry_t *e; + int32 i, j; + + g = NULL; + + j = 0; + for (i = 0; i < h->size; i++) { + e = &(h->table[i]); + + if (e->key != NULL) { + g = glist_add_ptr(g, (void *) e); + j++; + + for (e = e->next; e; e = e->next) { + g = glist_add_ptr(g, (void *) e); + j++; + } + } + } + + if (count) + *count = j; + + return g; +} + +hash_iter_t * +hash_table_iter(hash_table_t *h) +{ + hash_iter_t *itor; + + itor = ckd_calloc(1, sizeof(*itor)); + itor->ht = h; + return hash_table_iter_next(itor); +} + +hash_iter_t * +hash_table_iter_next(hash_iter_t *itor) +{ + /* If there is an entry, walk down its list. */ + if (itor->ent) + itor->ent = itor->ent->next; + /* If we got to the end of the chain, or we had no entry, scan + * forward in the table to find the next non-empty bucket. */ + if (itor->ent == NULL) { + while (itor->idx < itor->ht->size + && itor->ht->table[itor->idx].key == NULL) + ++itor->idx; + /* If we did not find one then delete the iterator and + * return NULL. */ + if (itor->idx == itor->ht->size) { + hash_table_iter_free(itor); + return NULL; + } + /* Otherwise use this next entry. */ + itor->ent = itor->ht->table + itor->idx; + /* Increase idx for the next time around. */ + ++itor->idx; + } + return itor; +} + +void +hash_table_iter_free(hash_iter_t *itor) +{ + ckd_free(itor); +} + +void +hash_table_free(hash_table_t * h) +{ + hash_entry_t *e, *e2; + int32 i; + + if (h == NULL) + return; + + /* Free additional entries created for key collision cases */ + for (i = 0; i < h->size; i++) { + for (e = h->table[i].next; e; e = e2) { + e2 = e->next; + ckd_free((void *) e); + } + } + + ckd_free((void *) h->table); + ckd_free((void *) h); +} diff --git a/src/libsphinxbase/util/heap.c b/src/libsphinxbase/util/heap.c new file mode 100644 index 000000000..e3b4421b7 --- /dev/null +++ b/src/libsphinxbase/util/heap.c @@ -0,0 +1,292 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * heap.c -- Generic heap structure for inserting in any and popping in sorted + * order. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: heap.c,v $ + * Revision 1.4 2005/06/22 03:05:49 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-Mar-99 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Fixed bug in heap_destroy() (in while loop exit condition). + * + * 23-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started. + */ + + +#include +#include +#include +#include + +#include "sphinxbase/heap.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" + +/** + * One node on the heap + */ +typedef struct heapnode_s { + void *data; /**< Application data at this node */ + int32 val; /**< Associated with above application data; according to which + heap is sorted (in ascending order) */ + int32 nl, nr; /**< left/right descendants of this node (for balancing heap) */ + struct heapnode_s *l; /**< Root of left descendant heap */ + struct heapnode_s *r; /**< Root of right descendant heap */ +} heapnode_t; + +/** + * Internal heap data structure. + */ +struct heap_s { + heapnode_t *top; +}; + + +#if 0 +static void +heap_dump(heapnode_t * top, int32 level) +{ + int32 i; + + if (!top) + return; + + for (i = 0; i < level; i++) + printf(" "); + /* print top info */ + heap_dump(top->l, level + 1); + heap_dump(top->r, level + 1); +} +#endif + + +heap_t * +heap_new(void) +{ + heap_t *h = ckd_calloc(1, sizeof(*h)); + return h; +} + + +static heapnode_t * +subheap_insert(heapnode_t * root, void *data, int32 val) +{ + heapnode_t *h; + void *tmpdata; + int32 tmpval; + + if (!root) { + h = (heapnode_t *) ckd_calloc(1, sizeof(heapnode_t)); + h->data = data; + h->val = val; + h->l = h->r = NULL; + h->nl = h->nr = 0; + return h; + } + + /* Root already exists; if new value is less, replace root node */ + if (root->val > val) { + tmpdata = root->data; + tmpval = root->val; + root->data = data; + root->val = val; + data = tmpdata; + val = tmpval; + } + + /* Insert new or old (replaced) node in right or left subtree; keep them balanced */ + if (root->nl > root->nr) { + root->r = subheap_insert(root->r, data, val); + root->nr++; + } + else { + root->l = subheap_insert(root->l, data, val); + root->nl++; + } + + return root; +} + + +int +heap_insert(heap_t *heap, void *data, int32 val) +{ + heap->top = subheap_insert(heap->top, data, val); + return 0; +} + + +static heapnode_t * +subheap_pop(heapnode_t * root) +{ + heapnode_t *l, *r; + + /* Propagate best value from below into root, if any */ + l = root->l; + r = root->r; + + if (!l) { + if (!r) { + ckd_free((char *) root); + return NULL; + } + else { + root->data = r->data; + root->val = r->val; + root->r = subheap_pop(r); + root->nr--; + } + } + else { + if ((!r) || (l->val < r->val)) { + root->data = l->data; + root->val = l->val; + root->l = subheap_pop(l); + root->nl--; + } + else { + root->data = r->data; + root->val = r->val; + root->r = subheap_pop(r); + root->nr--; + } + } + + return root; +} + + +int +heap_pop(heap_t *heap, void **data, int32 * val) +{ + if (heap->top == NULL) + return 0; + *data = heap->top->data; + *val = heap->top->val; + heap->top = subheap_pop(heap->top); + return 1; +} + + +int +heap_top(heap_t *heap, void **data, int32 * val) +{ + if (heap->top == NULL) + return 0; + *data = heap->top->data; + *val = heap->top->val; + return 1; +} + +static int +heap_remove_one(heap_t *heap, heapnode_t *top, void *data) +{ + if (top == NULL) + return -1; + else if (top->data == data) { + assert(top == heap->top); + heap->top = subheap_pop(heap->top); + return 0; + } + if (top->l) { + if (top->l->data == data) { + top->l = subheap_pop(top->l); + --top->nl; + return 0; + } + else if (heap_remove_one(heap, top->l, data) == 0) { + --top->nl; + return 0; + } + } + if (top->r) { + if (top->r->data == data) { + top->r = subheap_pop(top->r); + --top->nr; + return 0; + } + else if (heap_remove_one(heap, top->r, data) == 0) { + --top->nr; + return 0; + } + } + return -1; +} + +int +heap_remove(heap_t *heap, void *data) +{ + return heap_remove_one(heap, heap->top, data); +} + + +size_t +heap_size(heap_t *heap) +{ + if (heap->top == NULL) + return 0; + return heap->top->nl + heap->top->nr + 1; +} + +int +heap_destroy(heap_t *heap) +{ + void *data; + int32 val; + + /* Empty the heap and free it */ + while (heap_pop(heap, &data, &val) > 0) + ; + ckd_free(heap); + + return 0; +} diff --git a/src/libsphinxbase/util/listelem_alloc.c b/src/libsphinxbase/util/listelem_alloc.c new file mode 100644 index 000000000..d6b4ceda0 --- /dev/null +++ b/src/libsphinxbase/util/listelem_alloc.c @@ -0,0 +1,294 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include + +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/listelem_alloc.h" +#include "sphinxbase/glist.h" + +/** + * Fast linked list allocator. + * + * We keep a separate linked list for each element-size. Element-size + * must be a multiple of pointer-size. + * + * Initially a block of empty elements is allocated, where the first + * machine word in each element points to the next available element. + * To allocate, we use this pointer to move the freelist to the next + * element, then return the current element. + * + * The last element in the list starts with a NULL pointer, which is + * used as a signal to allocate a new block of elements. + * + * In order to be able to actually release the memory allocated, we + * have to add a linked list of block pointers. This shouldn't create + * much overhead since we never access it except when freeing the + * allocator. + */ +struct listelem_alloc_s { + char **freelist; /**< ptr to first element in freelist */ + glist_t blocks; /**< Linked list of blocks allocated. */ + glist_t blocksize; /**< Number of elements in each block */ + size_t elemsize; /**< Number of (char *) in element */ + size_t blk_alloc; /**< Number of alloc operations before increasing blocksize */ + size_t n_blocks; + size_t n_alloc; + size_t n_freed; +}; + +#define MIN_ALLOC 50 /**< Minimum number of elements to allocate in one block */ +#define BLKID_SHIFT 16 /**< Bit position of block number in element ID */ +#define BLKID_MASK ((1<freelist = NULL; + list->blocks = NULL; + list->elemsize = elemsize; + /* Intent of this is to increase block size once we allocate + * 256KiB (i.e. 1<<18). If somehow the element size is big enough + * to overflow that, just fail, people should use malloc anyway. */ + list->blk_alloc = (1 << 18) / (MIN_ALLOC * elemsize); + if (list->blk_alloc <= 0) { + E_ERROR("Element size * block size exceeds 256k, use malloc instead.\n"); + ckd_free(list); + return NULL; + } + list->n_alloc = 0; + list->n_freed = 0; + + /* Allocate an initial block to minimize latency. */ + listelem_add_block(list, __FILE__, __LINE__); + return list; +} + +void +listelem_alloc_free(listelem_alloc_t *list) +{ + gnode_t *gn; + if (list == NULL) + return; + for (gn = list->blocks; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(list->blocks); + glist_free(list->blocksize); + ckd_free(list); +} + +static void +listelem_add_block(listelem_alloc_t *list, char *caller_file, int caller_line) +{ + char **cpp, *cp; + size_t j; + int32 blocksize; + + blocksize = list->blocksize ? gnode_int32(list->blocksize) : MIN_ALLOC; + /* Check if block size should be increased (if many requests for this size) */ + if (list->blk_alloc == 0) { + /* See above. No sense in allocating blocks bigger than + * 256KiB (well, actually, there might be, but we'll worry + * about that later). */ + blocksize <<= 1; + if (blocksize * list->elemsize > (1 << 18)) + blocksize = (1 << 18) / list->elemsize; + list->blk_alloc = (1 << 18) / (blocksize * list->elemsize); + } + + /* Allocate block */ + cpp = list->freelist = + (char **) __ckd_calloc__(blocksize, list->elemsize, + caller_file, caller_line); + list->blocks = glist_add_ptr(list->blocks, cpp); + list->blocksize = glist_add_int32(list->blocksize, blocksize); + cp = (char *) cpp; + /* Link up the blocks via their first machine word. */ + for (j = blocksize - 1; j > 0; --j) { + cp += list->elemsize; + *cpp = cp; + cpp = (char **) cp; + } + /* Make sure the last element's forward pointer is NULL */ + *cpp = NULL; + --list->blk_alloc; + ++list->n_blocks; +} + + +void * +__listelem_malloc__(listelem_alloc_t *list, char *caller_file, int caller_line) +{ + char **ptr; + + /* Allocate a new block if list empty */ + if (list->freelist == NULL) + listelem_add_block(list, caller_file, caller_line); + + /* Unlink and return first element in freelist */ + ptr = list->freelist; + list->freelist = (char **) (*(list->freelist)); + (list->n_alloc)++; + + return (void *)ptr; +} + +void * +__listelem_malloc_id__(listelem_alloc_t *list, char *caller_file, + int caller_line, int32 *out_id) +{ + char **ptr; + + /* Allocate a new block if list empty */ + if (list->freelist == NULL) + listelem_add_block(list, caller_file, caller_line); + + /* Unlink and return first element in freelist */ + ptr = list->freelist; + list->freelist = (char **) (*(list->freelist)); + (list->n_alloc)++; + + if (out_id) { + int32 blksize, blkidx, ptridx; + gnode_t *gn, *gn2; + char **block; + + gn2 = list->blocksize; + block = NULL; + blkidx = 0; + for (gn = list->blocks; gn; gn = gnode_next(gn)) { + block = gnode_ptr(gn); + blksize = gnode_int32(gn2) * list->elemsize / sizeof(*block); + if (ptr >= block && ptr < block + blksize) + break; + gn2 = gnode_next(gn2); + ++blkidx; + } + if (gn == NULL) { + E_ERROR("Failed to find block index for pointer %p!\n", ptr); + } + ptridx = (ptr - block) / (list->elemsize / sizeof(*block)); + E_DEBUG("ptr %p block %p blkidx %d ptridx %d\n", + ptr, block, list->n_blocks - blkidx - 1, ptridx); + *out_id = ((list->n_blocks - blkidx - 1) << BLKID_SHIFT) | ptridx; + } + + return ptr; +} + +void * +listelem_get_item(listelem_alloc_t *list, int32 id) +{ + int32 blkidx, ptridx, i; + gnode_t *gn; + + blkidx = (id >> BLKID_SHIFT) & BLKID_MASK; + ptridx = id & BLKID_MASK; + + i = 0; + blkidx = list->n_blocks - blkidx; + for (gn = list->blocks; gn; gn = gnode_next(gn)) { + if (++i == blkidx) + break; + } + if (gn == NULL) { + E_ERROR("Failed to find block index %d\n", blkidx); + return NULL; + } + + return (void *)((char **)gnode_ptr(gn) + + ptridx * (list->elemsize / sizeof(void *))); +} + +void +__listelem_free__(listelem_alloc_t *list, void *elem, + char *caller_file, int caller_line) +{ + char **cpp; + + /* + * Insert freed item at head of list. + */ + cpp = (char **) elem; + *cpp = (char *) list->freelist; + list->freelist = cpp; + (list->n_freed)++; +} + + +void +listelem_stats(listelem_alloc_t *list) +{ + gnode_t *gn, *gn2; + char **cpp; + size_t n; + + E_INFO("Linklist stats:\n"); + for (n = 0, cpp = list->freelist; cpp; + cpp = (char **) (*cpp), n++); + E_INFO + ("elemsize %lu, #alloc %lu, #freed %lu, #freelist %lu\n", + (unsigned long)list->elemsize, + (unsigned long)list->n_alloc, + (unsigned long)list->n_freed, + (unsigned long)n); + E_INFO("Allocated blocks:\n"); + gn2 = list->blocksize; + for (gn = list->blocks; gn; gn = gnode_next(gn)) { + E_INFO("%p (%d * %d bytes)\n", gnode_ptr(gn), gnode_int32(gn2), list->elemsize); + gn2 = gnode_next(gn2); + } +} diff --git a/src/libsphinxbase/util/logmath.c b/src/libsphinxbase/util/logmath.c new file mode 100644 index 000000000..9bb8c6d97 --- /dev/null +++ b/src/libsphinxbase/util/logmath.c @@ -0,0 +1,503 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include + +#include "sphinxbase/logmath.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/mmio.h" +#include "sphinxbase/bio.h" +#include "sphinxbase/strfuncs.h" + +struct logmath_s { + logadd_t t; + int refcount; + mmio_file_t *filemap; + float64 base; + float64 log_of_base; + float64 log10_of_base; + float64 inv_log_of_base; + float64 inv_log10_of_base; + int32 zero; +}; + +logmath_t * +logmath_init(float64 base, int shift, int use_table) +{ + logmath_t *lmath; + uint32 maxyx, i; + float64 byx; + int width; + + /* Check that the base is correct. */ + if (base <= 1.0) { + E_ERROR("Base must be greater than 1.0\n"); + return NULL; + } + + /* Set up various necessary constants. */ + lmath = ckd_calloc(1, sizeof(*lmath)); + lmath->refcount = 1; + lmath->base = base; + lmath->log_of_base = log(base); + lmath->log10_of_base = log10(base); + lmath->inv_log_of_base = 1.0/lmath->log_of_base; + lmath->inv_log10_of_base = 1.0/lmath->log10_of_base; + lmath->t.shift = shift; + /* Shift this sufficiently that overflows can be avoided. */ + lmath->zero = MAX_NEG_INT32 >> (shift + 2); + + if (!use_table) + return lmath; + + /* Create a logadd table with the appropriate width */ + maxyx = (uint32) (log(2.0) / log(base) + 0.5) >> shift; + /* Poor man's log2 */ + if (maxyx < 256) width = 1; + else if (maxyx < 65536) width = 2; + else width = 4; + + lmath->t.width = width; + /* Figure out size of add table required. */ + byx = 1.0; /* Maximum possible base^{y-x} value - note that this implies that y-x == 0 */ + for (i = 0;; ++i) { + float64 lobyx = log(1.0 + byx) * lmath->inv_log_of_base; /* log_{base}(1 + base^{y-x}); */ + int32 k = (int32) (lobyx + 0.5 * (1<> shift; /* Round to shift */ + + /* base^{y-x} has reached the smallest representable value. */ + if (k <= 0) + break; + + /* This table is indexed by -(y-x), so we multiply byx by + * base^{-1} here which is equivalent to subtracting one from + * (y-x). */ + byx /= base; + } + i >>= shift; + + /* Never produce a table smaller than 256 entries. */ + if (i < 255) i = 255; + + lmath->t.table = ckd_calloc(i+1, width); + lmath->t.table_size = i + 1; + /* Create the add table (see above). */ + byx = 1.0; + for (i = 0;; ++i) { + float64 lobyx = log(1.0 + byx) * lmath->inv_log_of_base; + int32 k = (int32) (lobyx + 0.5 * (1<> shift; /* Round to shift */ + uint32 prev = 0; + + /* Check any previous value - if there is a shift, we want to + * only store the highest one. */ + switch (width) { + case 1: + prev = ((uint8 *)lmath->t.table)[i >> shift]; + break; + case 2: + prev = ((uint16 *)lmath->t.table)[i >> shift]; + break; + case 4: + prev = ((uint32 *)lmath->t.table)[i >> shift]; + break; + } + if (prev == 0) { + switch (width) { + case 1: + ((uint8 *)lmath->t.table)[i >> shift] = (uint8) k; + break; + case 2: + ((uint16 *)lmath->t.table)[i >> shift] = (uint16) k; + break; + case 4: + ((uint32 *)lmath->t.table)[i >> shift] = (uint32) k; + break; + } + } + if (k <= 0) + break; + + /* Decay base^{y-x} exponentially according to base. */ + byx /= base; + } + + return lmath; +} + +logmath_t * +logmath_read(const char *file_name) +{ + logmath_t *lmath; + char **argname, **argval; + int32 byteswap, i; + int chksum_present, do_mmap; + uint32 chksum; + long pos; + FILE *fp; + + E_INFO("Reading log table file '%s'\n", file_name); + if ((fp = fopen(file_name, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open log table file '%s' for reading", file_name); + return NULL; + } + + /* Read header, including argument-value info and 32-bit byteorder magic */ + if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) { + E_ERROR("Failed to read the header from the file '%s'\n", file_name); + fclose(fp); + return NULL; + } + + lmath = ckd_calloc(1, sizeof(*lmath)); + /* Default values. */ + lmath->t.shift = 0; + lmath->t.width = 2; + lmath->base = 1.0001; + + /* Parse argument-value list */ + chksum_present = 0; + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + } + else if (strcmp(argname[i], "chksum0") == 0) { + if (strcmp(argval[i], "yes") == 0) + chksum_present = 1; + } + else if (strcmp(argname[i], "width") == 0) { + lmath->t.width = atoi(argval[i]); + } + else if (strcmp(argname[i], "shift") == 0) { + lmath->t.shift = atoi(argval[i]); + } + else if (strcmp(argname[i], "logbase") == 0) { + lmath->base = atof_c(argval[i]); + } + } + bio_hdrarg_free(argname, argval); + chksum = 0; + + /* Set up various necessary constants. */ + lmath->log_of_base = log(lmath->base); + lmath->log10_of_base = log10(lmath->base); + lmath->inv_log_of_base = 1.0/lmath->log_of_base; + lmath->inv_log10_of_base = 1.0/lmath->log10_of_base; + /* Shift this sufficiently that overflows can be avoided. */ + lmath->zero = MAX_NEG_INT32 >> (lmath->t.shift + 2); + + /* #Values to follow */ + if (bio_fread(&lmath->t.table_size, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { + E_ERROR("Failed to read values from the file '%s'", file_name); + goto error_out; + } + + /* Check alignment constraints for memory mapping */ + do_mmap = 1; + pos = ftell(fp); + if (pos & ((long)lmath->t.width - 1)) { + E_WARN("%s: Data start %ld is not aligned on %d-byte boundary, will not memory map\n", + file_name, pos, lmath->t.width); + do_mmap = 0; + } + /* Check byte order for memory mapping */ + if (byteswap) { + E_WARN("%s: Data is wrong-endian, will not memory map\n", file_name); + do_mmap = 0; + } + + if (do_mmap) { + lmath->filemap = mmio_file_read(file_name); + lmath->t.table = (char *)mmio_file_ptr(lmath->filemap) + pos; + } + else { + lmath->t.table = ckd_calloc(lmath->t.table_size, lmath->t.width); + if (bio_fread(lmath->t.table, lmath->t.width, lmath->t.table_size, + fp, byteswap, &chksum) != lmath->t.table_size) { + E_ERROR("Failed to read data (%d x %d bytes) from the file '%s' failed", + lmath->t.table_size, lmath->t.width, file_name); + goto error_out; + } + if (chksum_present) + bio_verify_chksum(fp, byteswap, chksum); + + if (fread(&i, 1, 1, fp) == 1) { + E_ERROR("%s: More data than expected\n", file_name); + goto error_out; + } + } + fclose(fp); + + return lmath; +error_out: + logmath_free(lmath); + return NULL; +} + +int32 +logmath_write(logmath_t *lmath, const char *file_name) +{ + FILE *fp; + long pos; + uint32 chksum; + + if (lmath->t.table == NULL) { + E_ERROR("No log table to write!\n"); + return -1; + } + + E_INFO("Writing log table file '%s'\n", file_name); + if ((fp = fopen(file_name, "wb")) == NULL) { + E_ERROR_SYSTEM("Failed to open logtable file '%s' for writing", file_name); + return -1; + } + + /* For whatever reason, we have to do this manually at the + * moment. */ + fprintf(fp, "s3\nversion 1.0\nchksum0 yes\n"); + fprintf(fp, "width %d\n", lmath->t.width); + fprintf(fp, "shift %d\n", lmath->t.shift); + fprintf(fp, "logbase %f\n", lmath->base); + /* Pad it out to ensure alignment. */ + pos = ftell(fp) + strlen("endhdr\n"); + if (pos & ((long)lmath->t.width - 1)) { + size_t align = lmath->t.width - (pos & ((long)lmath->t.width - 1)); + assert(lmath->t.width <= 8); + fwrite(" " /* 8 spaces */, 1, align, fp); + } + fprintf(fp, "endhdr\n"); + + /* Now write the binary data. */ + chksum = (uint32)BYTE_ORDER_MAGIC; + fwrite(&chksum, sizeof(uint32), 1, fp); + chksum = 0; + /* #Values to follow */ + if (bio_fwrite(&lmath->t.table_size, sizeof(uint32), + 1, fp, 0, &chksum) != 1) { + E_ERROR("Failed to write data to a file '%s'", file_name); + goto error_out; + } + + if (bio_fwrite(lmath->t.table, lmath->t.width, lmath->t.table_size, + fp, 0, &chksum) != lmath->t.table_size) { + E_ERROR("Failed to write data (%d x %d bytes) to the file '%s'", + lmath->t.table_size, lmath->t.width, file_name); + goto error_out; + } + if (bio_fwrite(&chksum, sizeof(uint32), 1, fp, 0, NULL) != 1) { + E_ERROR("Failed to write checksum to the file '%s'", file_name); + goto error_out; + } + + fclose(fp); + return 0; + +error_out: + fclose(fp); + return -1; +} + +logmath_t * +logmath_retain(logmath_t *lmath) +{ + ++lmath->refcount; + return lmath; +} + +int +logmath_free(logmath_t *lmath) +{ + if (lmath == NULL) + return 0; + if (--lmath->refcount > 0) + return lmath->refcount; + if (lmath->filemap) + mmio_file_unmap(lmath->filemap); + else + ckd_free(lmath->t.table); + ckd_free(lmath); + return 0; +} + +int32 +logmath_get_table_shape(logmath_t *lmath, uint32 *out_size, + uint32 *out_width, uint32 *out_shift) +{ + if (out_size) *out_size = lmath->t.table_size; + if (out_width) *out_width = lmath->t.width; + if (out_shift) *out_shift = lmath->t.shift; + + return lmath->t.table_size * lmath->t.width; +} + +float64 +logmath_get_base(logmath_t *lmath) +{ + return lmath->base; +} + +int +logmath_get_zero(logmath_t *lmath) +{ + return lmath->zero; +} + +int +logmath_get_width(logmath_t *lmath) +{ + return lmath->t.width; +} + +int +logmath_get_shift(logmath_t *lmath) +{ + return lmath->t.shift; +} + +int +logmath_add(logmath_t *lmath, int logb_x, int logb_y) +{ + logadd_t *t = LOGMATH_TABLE(lmath); + int d, r; + + /* handle 0 + x = x case. */ + if (logb_x <= lmath->zero) + return logb_y; + if (logb_y <= lmath->zero) + return logb_x; + + if (t->table == NULL) + return logmath_add_exact(lmath, logb_x, logb_y); + + /* d must be positive, obviously. */ + if (logb_x > logb_y) { + d = (logb_x - logb_y); + r = logb_x; + } + else { + d = (logb_y - logb_x); + r = logb_y; + } + + if (d < 0) { + /* Some kind of overflow has occurred, fail gracefully. */ + return r; + } + if ((size_t)d >= t->table_size) { + /* If this happens, it's not actually an error, because the + * last entry in the logadd table is guaranteed to be zero. + * Therefore we just return the larger of the two values. */ + return r; + } + + switch (t->width) { + case 1: + return r + (((uint8 *)t->table)[d]); + case 2: + return r + (((uint16 *)t->table)[d]); + case 4: + return r + (((uint32 *)t->table)[d]); + } + return r; +} + +int +logmath_add_exact(logmath_t *lmath, int logb_p, int logb_q) +{ + return logmath_log(lmath, + logmath_exp(lmath, logb_p) + + logmath_exp(lmath, logb_q)); +} + +int +logmath_log(logmath_t *lmath, float64 p) +{ + if (p <= 0) { + return lmath->zero; + } + return (int)(log(p) * lmath->inv_log_of_base) >> lmath->t.shift; +} + +float64 +logmath_exp(logmath_t *lmath, int logb_p) +{ + return pow(lmath->base, (float64)(logb_p << lmath->t.shift)); +} + +int +logmath_ln_to_log(logmath_t *lmath, float64 log_p) +{ + return (int)(log_p * lmath->inv_log_of_base) >> lmath->t.shift; +} + +float64 +logmath_log_to_ln(logmath_t *lmath, int logb_p) +{ + return (float64)(logb_p << lmath->t.shift) * lmath->log_of_base; +} + +int +logmath_log10_to_log(logmath_t *lmath, float64 log_p) +{ + return (int)(log_p * lmath->inv_log10_of_base) >> lmath->t.shift; +} + +float +logmath_log10_to_log_float(logmath_t *lmath, float64 log_p) +{ + int i; + float res = (float)(log_p * lmath->inv_log10_of_base); + for (i = 0; i < lmath->t.shift; i++) + res /= 2.0f; + return res; +} + +float64 +logmath_log_to_log10(logmath_t *lmath, int logb_p) +{ + return (float64)(logb_p << lmath->t.shift) * lmath->log10_of_base; +} + +float64 +logmath_log_float_to_log10(logmath_t *lmath, float log_p) +{ + int i; + for (i = 0; i < lmath->t.shift; i++) { + log_p *= 2; + } + return log_p * lmath->log10_of_base; +} diff --git a/src/libsphinxbase/util/make_lite.py b/src/libsphinxbase/util/make_lite.py new file mode 100755 index 000000000..b0ea26371 --- /dev/null +++ b/src/libsphinxbase/util/make_lite.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python + +import sys, os +import fortran +import clapack_scrub + +try: set +except NameError: + from sets import Set as set + +# Arguments to pass to f2c. You'll always want -A for ANSI C prototypes +# Others of interest: -a to not make variables static by default +# -C to check array subscripts +F2C_ARGS = '-A' + +# The header to add to the top of the *_lite.c file. Note that slamch_() calls +# will be replaced by the macros below by clapack_scrub.scrub_source() +HEADER = '''\ +/* +NOTE: This is generated code. Look in README.python for information on + remaking this file. +*/ +#include "f2c.h" + +#ifdef HAVE_CONFIG +#include "config.h" +#else +extern doublereal slamch_(char *); +#define EPSILON slamch_("Epsilon") +#define SAFEMINIMUM slamch_("Safe minimum") +#define PRECISION slamch_("Precision") +#define BASE slamch_("Base") +#endif + + +extern doublereal slapy2_(real *, real *); + +''' + +class FortranRoutine: + """Wrapper for a Fortran routine in a file. + """ + type = 'generic' + def __init__(self, name=None, filename=None): + self.filename = filename + if name is None: + root, ext = os.path.splitext(filename) + name = root + self.name = name + self._dependencies = None + + def dependencies(self): + if self._dependencies is None: + deps = fortran.getDependencies(self.filename) + self._dependencies = [d.lower() for d in deps] + return self._dependencies + +class UnknownFortranRoutine(FortranRoutine): + """Wrapper for a Fortran routine for which the corresponding file + is not known. + """ + type = 'unknown' + def __init__(self, name): + FortranRoutine.__init__(self, name=name, filename='') + + def dependencies(self): + return [] + +class FortranLibrary: + """Container for a bunch of Fortran routines. + """ + def __init__(self, src_dirs): + self._src_dirs = src_dirs + self.names_to_routines = {} + + def _findRoutine(self, rname): + rname = rname.lower() + for s in self._src_dirs: + ffilename = os.path.join(s, rname + '.f') + if os.path.exists(ffilename): + return self._newFortranRoutine(rname, ffilename) + return UnknownFortranRoutine(rname) + + def _newFortranRoutine(self, rname, filename): + return FortranRoutine(rname, filename) + + def addIgnorableRoutine(self, rname): + """Add a routine that we don't want to consider when looking at + dependencies. + """ + rname = rname.lower() + routine = UnknownFortranRoutine(rname) + self.names_to_routines[rname] = routine + + def addRoutine(self, rname): + """Add a routine to the library. + """ + self.getRoutine(rname) + + def getRoutine(self, rname): + """Get a routine from the library. Will add if it's not found. + """ + unique = [] + rname = rname.lower() + routine = self.names_to_routines.get(rname, unique) + if routine is unique: + routine = self._findRoutine(rname) + self.names_to_routines[rname] = routine + return routine + + def allRoutineNames(self): + """Return the names of all the routines. + """ + return self.names_to_routines.keys() + + def allRoutines(self): + """Return all the routines. + """ + return self.names_to_routines.values() + + def resolveAllDependencies(self): + """Try to add routines to the library to satisfy all the dependencies + for each routine in the library. + + Returns a set of routine names that have the dependencies unresolved. + """ + done_this = set() + last_todo = set() + while 1: + todo = set(self.allRoutineNames()) - done_this + if todo == last_todo: + break + for rn in todo: + r = self.getRoutine(rn) + deps = r.dependencies() + for d in deps: + self.addRoutine(d) + done_this.add(rn) + last_todo = todo + return todo + +class LapackLibrary(FortranLibrary): + def _newFortranRoutine(self, rname, filename): + routine = FortranLibrary._newFortranRoutine(self, rname, filename) + if filename.find('BLAS') != -1: + routine.type = 'blas' + elif rname.startswith('z'): + routine.type = 'zlapack' + else: + routine.type = 'slapack' + return routine + + def allRoutinesByType(self, typename): + routines = [(r.name,r) for r in self.allRoutines() if r.type == typename] + routines.sort() + return [a[1] for a in routines] + +def printRoutineNames(desc, routines): + print desc + for r in routines: + print '\t%s' % r.name + +def getLapackRoutines(wrapped_routines, ignores, lapack_dir): + blas_src_dir = os.path.join(lapack_dir, 'BLAS', 'SRC') + if not os.path.exists(blas_src_dir): + blas_src_dir = os.path.join(lapack_dir, 'blas', 'src') + lapack_src_dir = os.path.join(lapack_dir, 'SRC') + if not os.path.exists(lapack_src_dir): + lapack_src_dir = os.path.join(lapack_dir, 'src') + library = LapackLibrary([blas_src_dir, lapack_src_dir]) + + for r in ignores: + library.addIgnorableRoutine(r) + + for w in wrapped_routines: + library.addRoutine(w) + + library.resolveAllDependencies() + + return library + +def getWrappedRoutineNames(wrapped_routines_file): + fo = open(wrapped_routines_file) + routines = [] + ignores = [] + for line in fo: + line = line.strip() + if not line or line.startswith('#'): + continue + if line.startswith('IGNORE:'): + line = line[7:].strip() + ig = line.split() + ignores.extend(ig) + else: + routines.append(line) + return routines, ignores + +def dumpRoutineNames(library, output_dir): + for typename in ['unknown', 'blas', 'slapack', 'zlapack']: + routines = library.allRoutinesByType(typename) + filename = os.path.join(output_dir, typename + '_routines.lst') + fo = open(filename, 'w') + for r in routines: + deps = r.dependencies() + fo.write('%s: %s\n' % (r.name, ' '.join(deps))) + fo.close() + +def concatenateRoutines(routines, output_file): + output_fo = open(output_file, 'w') + for r in routines: + fo = open(r.filename, 'r') + source = fo.read() + fo.close() + output_fo.write(source) + output_fo.close() + +class F2CError(Exception): + pass + +def runF2C(fortran_filename, output_dir): + # we're assuming no funny business that needs to be quoted for the shell + cmd = "f2c %s -d %s %s" % (F2C_ARGS, output_dir, fortran_filename) + rc = os.system(cmd) + if rc != 0: + raise F2CError + +def scrubF2CSource(c_file): + fo = open(c_file, 'r') + source = fo.read() + fo.close() + source = clapack_scrub.scrubSource(source, verbose=True) + fo = open(c_file, 'w') + fo.write(HEADER) + fo.write(source) + fo.close() + +def main(): + if len(sys.argv) != 4: + print 'Usage: %s wrapped_routines_file lapack_dir output_dir' % \ + (sys.argv[0],) + return + wrapped_routines_file = sys.argv[1] + lapack_src_dir = sys.argv[2] + output_dir = sys.argv[3] + + wrapped_routines, ignores = getWrappedRoutineNames(wrapped_routines_file) + library = getLapackRoutines(wrapped_routines, ignores, lapack_src_dir) + + dumpRoutineNames(library, output_dir) + + for typename in ['blas', 'slapack']: + print 'creating %s_lite.c ...' % typename + routines = library.allRoutinesByType(typename) + fortran_file = os.path.join(output_dir, typename+'_lite.f') + c_file = fortran_file[:-2] + '.c' + concatenateRoutines(routines, fortran_file) + try: + runF2C(fortran_file, output_dir) + except F2CError: + print 'f2c failed on %s' % fortran_file + break + scrubF2CSource(c_file) + +if __name__ == '__main__': + main() diff --git a/src/libsphinxbase/util/matrix.c b/src/libsphinxbase/util/matrix.c new file mode 100644 index 000000000..7369ef76a --- /dev/null +++ b/src/libsphinxbase/util/matrix.c @@ -0,0 +1,316 @@ +/* -*- c-basic-offset: 4 -*- */ +/* ==================================================================== + * Copyright (c) 1997-2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "sphinxbase/clapack_lite.h" +#include "sphinxbase/matrix.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" + +void +norm_3d(float32 ***arr, + uint32 d1, + uint32 d2, + uint32 d3) +{ + uint32 i, j, k; + float64 s; + + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + + /* compute sum (i, j) as over all k */ + for (k = 0, s = 0; k < d3; k++) { + s += arr[i][j][k]; + } + + /* do 1 floating point divide */ + s = 1.0 / s; + + /* divide all k by sum over k */ + for (k = 0; k < d3; k++) { + arr[i][j][k] *= s; + } + } + } +} + +void +accum_3d(float32 ***out, + float32 ***in, + uint32 d1, + uint32 d2, + uint32 d3) +{ + uint32 i, j, k; + + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + for (k = 0; k < d3; k++) { + out[i][j][k] += in[i][j][k]; + } + } + } +} + +void +floor_nz_3d(float32 ***m, + uint32 d1, + uint32 d2, + uint32 d3, + float32 floor) +{ + uint32 i, j, k; + + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + for (k = 0; k < d3; k++) { + if ((m[i][j][k] != 0) && (m[i][j][k] < floor)) + m[i][j][k] = floor; + } + } + } +} +void +floor_nz_1d(float32 *v, + uint32 d1, + float32 floor) +{ + uint32 i; + + for (i = 0; i < d1; i++) { + if ((v[i] != 0) && (v[i] < floor)) + v[i] = floor; + } +} + +void +band_nz_1d(float32 *v, + uint32 d1, + float32 band) +{ + uint32 i; + + for (i = 0; i < d1; i++) { + if (v[i] != 0) { + if ((v[i] > 0) && (v[i] < band)) { + v[i] = band; + } + else if ((v[i] < 0) && (v[i] > -band)) { + v[i] = -band; + } + } + } +} + +#ifndef WITH_LAPACK +float64 +determinant(float32 **a, int32 n) +{ + E_FATAL("No LAPACK library available, cannot compute determinant (FIXME)\n"); + return 0.0; +} +int32 +invert(float32 **ainv, float32 **a, int32 n) +{ + E_FATAL("No LAPACK library available, cannot compute matrix inverse (FIXME)\n"); + return 0; +} +int32 +solve(float32 **a, float32 *b, float32 *out_x, int32 n) +{ + E_FATAL("No LAPACK library available, cannot solve linear equations (FIXME)\n"); + return 0; +} + +void +matrixmultiply(float32 ** c, float32 ** a, float32 ** b, int32 n) +{ + int32 i, j, k; + + memset(c[0], 0, n*n*sizeof(float32)); + for (i = 0; i < n; ++i) { + for (j = 0; j < n; ++j) { + for (k = 0; k < n; ++k) { + c[i][k] += a[i][j] * b[j][k]; + } + } + } +} +#else /* WITH_LAPACK */ +/* Find determinant through LU decomposition. */ +float64 +determinant(float32 ** a, int32 n) +{ + float32 **tmp_a; + float64 det; + char uplo; + int32 info, i; + + /* a is assumed to be symmetric, so we don't need to switch the + * ordering of the data. But we do need to copy it since it is + * overwritten by LAPACK. */ + tmp_a = (float32 **)ckd_calloc_2d(n, n, sizeof(float32)); + memcpy(tmp_a[0], a[0], n*n*sizeof(float32)); + + uplo = 'L'; + spotrf_(&uplo, &n, tmp_a[0], &n, &info); + det = tmp_a[0][0]; + /* det = prod(diag(l))^2 */ + for (i = 1; i < n; ++i) + det *= tmp_a[i][i]; + ckd_free_2d((void **)tmp_a); + if (info > 0) + return -1.0; /* Generic "not positive-definite" answer */ + else + return det * det; +} + +int32 +solve(float32 **a, /*Input : an n*n matrix A */ + float32 *b, /*Input : a n dimesion vector b */ + float32 *out_x, /*Output : a n dimesion vector x */ + int32 n) +{ + char uplo; + float32 **tmp_a; + int32 info, nrhs; + + /* a is assumed to be symmetric, so we don't need to switch the + * ordering of the data. But we do need to copy it since it is + * overwritten by LAPACK. */ + tmp_a = (float32 **)ckd_calloc_2d(n, n, sizeof(float32)); + memcpy(tmp_a[0], a[0], n*n*sizeof(float32)); + memcpy(out_x, b, n*sizeof(float32)); + uplo = 'L'; + nrhs = 1; + sposv_(&uplo, &n, &nrhs, tmp_a[0], &n, out_x, &n, &info); + ckd_free_2d((void **)tmp_a); + + if (info != 0) + return -1; + else + return info; +} + +/* Find inverse by solving AX=I. */ +int32 +invert(float32 ** ainv, float32 ** a, int32 n) +{ + char uplo; + float32 **tmp_a; + int32 info, nrhs, i; + + /* a is assumed to be symmetric, so we don't need to switch the + * ordering of the data. But we do need to copy it since it is + * overwritten by LAPACK. */ + tmp_a = (float32 **)ckd_calloc_2d(n, n, sizeof(float32)); + memcpy(tmp_a[0], a[0], n*n*sizeof(float32)); + + /* Construct an identity matrix. */ + memset(ainv[0], 0, sizeof(float32) * n * n); + for (i = 0; i < n; i++) + ainv[i][i] = 1.0; + + uplo = 'L'; + nrhs = n; + sposv_(&uplo, &n, &nrhs, tmp_a[0], &n, ainv[0], &n, &info); + + ckd_free_2d((void **)tmp_a); + + if (info != 0) + return -1; + else + return info; +} + +void +matrixmultiply(float32 ** c, float32 ** a, float32 ** b, int32 n) +{ + char side, uplo; + float32 alpha; + + side = 'L'; + uplo = 'L'; + alpha = 1.0; + ssymm_(&side, &uplo, &n, &n, &alpha, a[0], &n, b[0], &n, &alpha, c[0], &n); +} + +#endif /* WITH_LAPACK */ + +void +outerproduct(float32 ** a, float32 * x, float32 * y, int32 len) +{ + int32 i, j; + + for (i = 0; i < len; ++i) { + a[i][i] = x[i] * y[i]; + for (j = i + 1; j < len; ++j) { + a[i][j] = x[i] * y[j]; + a[j][i] = x[j] * y[i]; + } + } +} + +void +scalarmultiply(float32 ** a, float32 x, int32 n) +{ + int32 i, j; + + for (i = 0; i < n; ++i) { + a[i][i] *= x; + for (j = i+1; j < n; ++j) { + a[i][j] *= x; + a[j][i] *= x; + } + } +} + +void +matrixadd(float32 ** a, float32 ** b, int32 n) +{ + int32 i, j; + + for (i = 0; i < n; ++i) + for (j = 0; j < n; ++j) + a[i][j] += b[i][j]; +} diff --git a/src/libsphinxbase/util/mmio.c b/src/libsphinxbase/util/mmio.c new file mode 100644 index 000000000..0b2315b71 --- /dev/null +++ b/src/libsphinxbase/util/mmio.c @@ -0,0 +1,257 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: mmio.c + * + * Description: mmap() wrappers for Unix/Windows + * + * Author: David Huggins-Daines + * + *********************************************************************/ + +#include +#include + + +#ifdef GNUWINCE +# include +# include +# include +# include +#elif defined(__SYMBIAN32__) /* SYMBIAN32 must be before WIN32 since Symbian SDK defines WIN32 as well */ +# include +# include +# include +# include +#elif defined(_WIN32) +# include +#else +# include +# include +# include +# include +# include +#endif + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/err.h" +#include "sphinxbase/mmio.h" +#include "sphinxbase/ckd_alloc.h" + +#if defined(_WIN32_WCE) || defined(GNUWINCE) +struct mmio_file_s { + int dummy; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + HANDLE ffm, fd; + WCHAR *wfilename; + void *rv; + int len; + + len = mbstowcs(NULL, filename, 0) + 1; + wfilename = malloc(len * sizeof(WCHAR)); + mbstowcs(wfilename, filename, len); + + if ((ffm = + CreateFileForMappingW(wfilename, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, + NULL)) == INVALID_HANDLE_VALUE) { + E_ERROR("Failed to create mapping for the file '%s': %08x\n", filename, + GetLastError()); + return NULL; + } + if ((fd = + CreateFileMappingW(ffm, NULL, PAGE_READONLY, 0, 0, NULL)) == NULL) { + E_ERROR("Failed to CreateFileMapping: %08x\n", GetLastError()); + CloseHandle(ffm); + return NULL; + } + rv = MapViewOfFile(fd, FILE_MAP_READ, 0, 0, 0); + free(wfilename); + CloseHandle(ffm); + CloseHandle(fd); + + return (mmio_file_t *) rv; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + if (!UnmapViewOfFile((void *)mf)) { + E_ERROR("Failed to UnmapViewOfFile: %08x\n", GetLastError()); + } +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + return (void *)mf; +} + +#elif defined(_WIN32) && !defined(_WIN32_WP) /* !WINCE */ +struct mmio_file_s { + int dummy; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + HANDLE ffm, fd; + void *rv; + + if ((ffm = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, + NULL)) == INVALID_HANDLE_VALUE) { + E_ERROR("Failed to create file '%s': %08x\n", + filename, GetLastError()); + return NULL; + } + if ((fd = CreateFileMapping(ffm, NULL, + PAGE_READONLY, 0, 0, NULL)) == NULL) { + E_ERROR("Failed to CreateFileMapping: %08x\n", GetLastError()); + CloseHandle(ffm); + } + rv = MapViewOfFile(fd, FILE_MAP_READ, 0, 0, 0); + CloseHandle(ffm); + CloseHandle(fd); + + return (mmio_file_t *)rv; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + if (!UnmapViewOfFile((void *)mf)) { + E_ERROR("Failed to UnmapViewOfFile: %08x\n", GetLastError()); + } +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + return (void *)mf; +} + +#else /* !WIN32, !WINCE */ +#if defined(__ADSPBLACKFIN__) || defined(_WIN32_WP) + /* This is true for both uClinux and VisualDSP++, + but actually we need a better way to detect it. */ +struct mmio_file_s { + int dummy; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + E_ERROR("mmio is not implemented on this platform!"); + return NULL; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + E_ERROR("mmio is not implemented on this platform!"); +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + E_ERROR("mmio is not implemented on this platform!"); + return NULL; +} +#else /* !__ADSPBLACKFIN__ */ +struct mmio_file_s { + void *ptr; + size_t mapsize; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + mmio_file_t *mf; + struct stat buf; + void *ptr; + int fd; + size_t pagesize; + + if ((fd = open(filename, O_RDONLY)) == -1) { + E_ERROR_SYSTEM("Failed to open %s", filename); + return NULL; + } + if (fstat(fd, &buf) == -1) { + E_ERROR_SYSTEM("Failed to stat %s", filename); + close(fd); + return NULL; + } + ptr = mmap(NULL, buf.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (ptr == (void *)-1) { + E_ERROR_SYSTEM("Failed to mmap %lld bytes", (unsigned long long)buf.st_size); + close(fd); + return NULL; + } + close(fd); + mf = ckd_calloc(1, sizeof(*mf)); + mf->ptr = ptr; + /* Align map size to next page. */ + pagesize = sysconf(_SC_PAGESIZE); + mf->mapsize = (buf.st_size + pagesize - 1) / pagesize * pagesize; + + return mf; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + if (mf == NULL) + return; + if (munmap(mf->ptr, mf->mapsize) < 0) { + E_ERROR_SYSTEM("Failed to unmap %ld bytes at %p", mf->mapsize, mf->ptr); + } + ckd_free(mf); +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + return mf->ptr; +} +#endif /* !__ADSPBLACKFIN__ */ +#endif /* !(WINCE || WIN32) */ diff --git a/src/libsphinxbase/util/pio.c b/src/libsphinxbase/util/pio.c new file mode 100644 index 000000000..72cf8e9c9 --- /dev/null +++ b/src/libsphinxbase/util/pio.c @@ -0,0 +1,657 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_SYS_STAT_H +#include +#endif + +#if defined(_WIN32) && !defined(CYGWIN) +#include +#endif + +#include "sphinxbase/pio.h" +#include "sphinxbase/filename.h" +#include "sphinxbase/err.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/ckd_alloc.h" + +#ifndef EXEEXT +#define EXEEXT "" +#endif + +enum { + COMP_NONE, + COMP_COMPRESS, + COMP_GZIP, + COMP_BZIP2 +}; + +static void +guess_comptype(char const *file, int32 *ispipe, int32 *isgz) +{ + size_t k; + + k = strlen(file); + *ispipe = 0; + *isgz = COMP_NONE; + if ((k > 2) + && ((strcmp(file + k - 2, ".Z") == 0) + || (strcmp(file + k - 2, ".z") == 0))) { + *ispipe = 1; + *isgz = COMP_COMPRESS; + } + else if ((k > 3) && ((strcmp(file + k - 3, ".gz") == 0) + || (strcmp(file + k - 3, ".GZ") == 0))) { + *ispipe = 1; + *isgz = COMP_GZIP; + } + else if ((k > 4) && ((strcmp(file + k - 4, ".bz2") == 0) + || (strcmp(file + k - 4, ".BZ2") == 0))) { + *ispipe = 1; + *isgz = COMP_BZIP2; + } +} + +FILE * +fopen_comp(const char *file, const char *mode, int32 * ispipe) +{ + FILE *fp; + +#ifndef HAVE_POPEN + *ispipe = 0; /* No popen() on WinCE */ +#else /* HAVE_POPEN */ + int32 isgz; + guess_comptype(file, ispipe, &isgz); +#endif /* HAVE_POPEN */ + + if (*ispipe) { +#ifndef HAVE_POPEN + /* Shouldn't get here, anyway */ + E_FATAL("No popen() on WinCE\n"); +#else + if (strcmp(mode, "r") == 0) { + char *command; + switch (isgz) { + case COMP_GZIP: + command = string_join("gunzip" EXEEXT, " -c ", file, NULL); + break; + case COMP_COMPRESS: + command = string_join("zcat" EXEEXT, " ", file, NULL); + break; + case COMP_BZIP2: + command = string_join("bunzip2" EXEEXT, " -c ", file, NULL); + break; + default: + command = NULL; /* Make compiler happy. */ + E_FATAL("Unknown compression type %d\n", isgz); + } + if ((fp = popen(command, mode)) == NULL) { + E_ERROR_SYSTEM("Failed to open a pipe for a command '%s' mode '%s'", command, mode); + ckd_free(command); + return NULL; + } + ckd_free(command); + } + else if (strcmp(mode, "w") == 0) { + char *command; + switch (isgz) { + case COMP_GZIP: + command = string_join("gzip" EXEEXT, " > ", file, NULL); + break; + case COMP_COMPRESS: + command = string_join("compress" EXEEXT, " -c > ", file, NULL); + break; + case COMP_BZIP2: + command = string_join("bzip2" EXEEXT, " > ", file, NULL); + break; + default: + command = NULL; /* Make compiler happy. */ + E_FATAL("Unknown compression type %d\n", isgz); + } + if ((fp = popen(command, mode)) == NULL) { + E_ERROR_SYSTEM("Failed to open a pipe for a command '%s' mode '%s'", command, mode); + ckd_free(command); + return NULL; + } + ckd_free(command); + } + else { + E_ERROR("Compressed file operation for mode %s is not supported\n", mode); + return NULL; + } +#endif /* HAVE_POPEN */ + } + else { + fp = fopen(file, mode); + } + + return (fp); +} + + +void +fclose_comp(FILE * fp, int32 ispipe) +{ + if (ispipe) { +#ifdef HAVE_POPEN +#if defined(_WIN32) && (!defined(__SYMBIAN32__)) + _pclose(fp); +#else + pclose(fp); +#endif +#endif + } + else + fclose(fp); +} + + +FILE * +fopen_compchk(const char *file, int32 * ispipe) +{ +#ifndef HAVE_POPEN + *ispipe = 0; /* No popen() on WinCE */ + /* And therefore the rest of this function is useless. */ + return (fopen_comp(file, "r", ispipe)); +#else /* HAVE_POPEN */ + int32 isgz; + FILE *fh; + + /* First just try to fopen_comp() it */ + if ((fh = fopen_comp(file, "r", ispipe)) != NULL) + return fh; + else { + char *tmpfile; + size_t k; + + /* File doesn't exist; try other compressed/uncompressed form, as appropriate */ + guess_comptype(file, ispipe, &isgz); + k = strlen(file); + tmpfile = ckd_calloc(k+5, 1); + strcpy(tmpfile, file); + switch (isgz) { + case COMP_GZIP: + tmpfile[k - 3] = '\0'; + break; + case COMP_BZIP2: + tmpfile[k - 4] = '\0'; + break; + case COMP_COMPRESS: + tmpfile[k - 2] = '\0'; + break; + case COMP_NONE: + strcpy(tmpfile + k, ".gz"); + if ((fh = fopen_comp(tmpfile, "r", ispipe)) != NULL) { + E_WARN("Using %s instead of %s\n", tmpfile, file); + ckd_free(tmpfile); + return fh; + } + strcpy(tmpfile + k, ".bz2"); + if ((fh = fopen_comp(tmpfile, "r", ispipe)) != NULL) { + E_WARN("Using %s instead of %s\n", tmpfile, file); + ckd_free(tmpfile); + return fh; + } + strcpy(tmpfile + k, ".Z"); + if ((fh = fopen_comp(tmpfile, "r", ispipe)) != NULL) { + E_WARN("Using %s instead of %s\n", tmpfile, file); + ckd_free(tmpfile); + return fh; + } + ckd_free(tmpfile); + return NULL; + } + E_WARN("Using %s instead of %s\n", tmpfile, file); + fh = fopen_comp(tmpfile, "r", ispipe); + ckd_free(tmpfile); + return NULL; + } +#endif /* HAVE_POPEN */ +} + +lineiter_t * +lineiter_start(FILE *fh) +{ + lineiter_t *li; + + li = (lineiter_t *)ckd_calloc(1, sizeof(*li)); + li->buf = (char *)ckd_malloc(128); + li->buf[0] = '\0'; + li->bsiz = 128; + li->len = 0; + li->fh = fh; + + li = lineiter_next(li); + + /* Strip the UTF-8 BOM */ + + if (li && 0 == strncmp(li->buf, "\xef\xbb\xbf", 3)) { + memmove(li->buf, li->buf + 3, strlen(li->buf + 1)); + li->len -= 3; + } + + return li; +} + +lineiter_t * +lineiter_start_clean(FILE *fh) +{ + lineiter_t *li; + + li = lineiter_start(fh); + + if (li == NULL) + return li; + + li->clean = TRUE; + + if (li->buf && li->buf[0] == '#') { + li = lineiter_next(li); + } else { + string_trim(li->buf, STRING_BOTH); + } + + return li; +} + + +static lineiter_t * +lineiter_next_plain(lineiter_t *li) +{ + /* We are reading the next line */ + li->lineno++; + + /* Read a line and check for EOF. */ + if (fgets(li->buf, li->bsiz, li->fh) == NULL) { + lineiter_free(li); + return NULL; + } + /* If we managed to read the whole thing, then we are done + * (this will be by far the most common result). */ + li->len = (int32)strlen(li->buf); + if (li->len < li->bsiz - 1 || li->buf[li->len - 1] == '\n') + return li; + + /* Otherwise we have to reallocate and keep going. */ + while (1) { + li->bsiz *= 2; + li->buf = (char *)ckd_realloc(li->buf, li->bsiz); + /* If we get an EOF, we are obviously done. */ + if (fgets(li->buf + li->len, li->bsiz - li->len, li->fh) == NULL) { + li->len += strlen(li->buf + li->len); + return li; + } + li->len += strlen(li->buf + li->len); + /* If we managed to read the whole thing, then we are done. */ + if (li->len < li->bsiz - 1 || li->buf[li->len - 1] == '\n') + return li; + } + + /* Shouldn't get here. */ + return li; +} + + +lineiter_t * +lineiter_next(lineiter_t *li) +{ + if (!li->clean) + return lineiter_next_plain(li); + + for (li = lineiter_next_plain(li); li; li = lineiter_next_plain(li)) { + if (li->buf) { + li->buf = string_trim(li->buf, STRING_BOTH); + if (li->buf[0] != 0 && li->buf[0] != '#') + break; + } + } + return li; +} + +int lineiter_lineno(lineiter_t *li) +{ + return li->lineno; +} + +void +lineiter_free(lineiter_t *li) +{ + if (li == NULL) + return; + ckd_free(li->buf); + ckd_free(li); +} + +char * +fread_line(FILE *stream, size_t *out_len) +{ + char *output, *outptr; + char buf[128]; + + output = outptr = NULL; + while (fgets(buf, sizeof(buf), stream)) { + size_t len = strlen(buf); + /* Append this data to the buffer. */ + if (output == NULL) { + output = (char *)ckd_malloc(len + 1); + outptr = output; + } + else { + size_t cur = outptr - output; + output = (char *)ckd_realloc(output, cur + len + 1); + outptr = output + cur; + } + memcpy(outptr, buf, len + 1); + outptr += len; + /* Stop on a short read or end of line. */ + if (len < sizeof(buf)-1 || buf[len-1] == '\n') + break; + } + if (out_len) *out_len = outptr - output; + return output; +} + +#define FREAD_RETRY_COUNT 60 + +int32 +fread_retry(void *pointer, int32 size, int32 num_items, FILE * stream) +{ + char *data; + size_t n_items_read; + size_t n_items_rem; + uint32 n_retry_rem; + int32 loc; + + n_retry_rem = FREAD_RETRY_COUNT; + + data = (char *)pointer; + loc = 0; + n_items_rem = num_items; + + do { + n_items_read = fread(&data[loc], size, n_items_rem, stream); + + n_items_rem -= n_items_read; + + if (n_items_rem > 0) { + /* an incomplete read occurred */ + + if (n_retry_rem == 0) + return -1; + + if (n_retry_rem == FREAD_RETRY_COUNT) { + E_ERROR_SYSTEM("fread() failed; retrying...\n"); + } + + --n_retry_rem; + + loc += n_items_read * size; +#if !defined(_WIN32) && defined(HAVE_UNISTD_H) + sleep(1); +#endif + } + } while (n_items_rem > 0); + + return num_items; +} + + +#ifdef _WIN32_WCE /* No stat() on WinCE */ +int32 +stat_retry(const char *file, struct stat * statbuf) +{ + WIN32_FIND_DATAW file_data; + HANDLE *h; + wchar_t *wfile; + size_t len; + + len = mbstowcs(NULL, file, 0) + 1; + wfile = ckd_calloc(len, sizeof(*wfile)); + mbstowcs(wfile, file, len); + if ((h = FindFirstFileW(wfile, &file_data)) == INVALID_HANDLE_VALUE) { + ckd_free(wfile); + return -1; + } + ckd_free(wfile); + memset(statbuf, 0, sizeof(*statbuf)); + statbuf->st_mtime = file_data.ftLastWriteTime.dwLowDateTime; + statbuf->st_size = file_data.nFileSizeLow; + FindClose(h); + + return 0; +} + + +int32 +stat_mtime(const char *file) +{ + struct stat statbuf; + + if (stat_retry(file, &statbuf) != 0) + return -1; + + return ((int32) statbuf.st_mtime); +} +#else +#define STAT_RETRY_COUNT 10 +int32 +stat_retry(const char *file, struct stat * statbuf) +{ + int32 i; + + for (i = 0; i < STAT_RETRY_COUNT; i++) { +#ifndef HAVE_SYS_STAT_H + FILE *fp; + + if ((fp = (FILE *)fopen(file, "r")) != 0) { + fseek(fp, 0, SEEK_END); + statbuf->st_size = ftell(fp); + fclose(fp); + return 0; + } +#else /* HAVE_SYS_STAT_H */ + if (stat(file, statbuf) == 0) + return 0; +#endif + if (i == 0) { + E_ERROR_SYSTEM("Failed to stat file '%s'; retrying...", file); + } +#ifdef HAVE_UNISTD_H + sleep(1); +#endif + } + + return -1; +} + +int32 +stat_mtime(const char *file) +{ + struct stat statbuf; + +#ifdef HAVE_SYS_STAT_H + if (stat(file, &statbuf) != 0) + return -1; +#else /* HAVE_SYS_STAT_H */ + if (stat_retry(file, &statbuf) != 0) + return -1; +#endif /* HAVE_SYS_STAT_H */ + + return ((int32) statbuf.st_mtime); +} +#endif /* !_WIN32_WCE */ + +struct bit_encode_s { + FILE *fh; + unsigned char buf, bbits; + int16 refcount; +}; + +bit_encode_t * +bit_encode_attach(FILE *outfh) +{ + bit_encode_t *be; + + be = (bit_encode_t *)ckd_calloc(1, sizeof(*be)); + be->refcount = 1; + be->fh = outfh; + return be; +} + +bit_encode_t * +bit_encode_retain(bit_encode_t *be) +{ + ++be->refcount; + return be; +} + +int +bit_encode_free(bit_encode_t *be) +{ + if (be == NULL) + return 0; + if (--be->refcount > 0) + return be->refcount; + ckd_free(be); + + return 0; +} + +int +bit_encode_write(bit_encode_t *be, unsigned char const *bits, int nbits) +{ + int tbits; + + tbits = nbits + be->bbits; + if (tbits < 8) { + /* Append to buffer. */ + be->buf |= ((bits[0] >> (8 - nbits)) << (8 - tbits)); + } + else { + int i = 0; + while (tbits >= 8) { + /* Shift bits out of the buffer and splice with high-order bits */ + fputc(be->buf | ((bits[i]) >> be->bbits), be->fh); + /* Put low-order bits back into buffer */ + be->buf = (bits[i] << (8 - be->bbits)) & 0xff; + tbits -= 8; + ++i; + } + } + /* tbits contains remaining number of bits. */ + be->bbits = tbits; + + return nbits; +} + +int +bit_encode_write_cw(bit_encode_t *be, uint32 codeword, int nbits) +{ + unsigned char bits[4]; + codeword <<= (32 - nbits); + bits[0] = (codeword >> 24) & 0xff; + bits[1] = (codeword >> 16) & 0xff; + bits[2] = (codeword >> 8) & 0xff; + bits[3] = codeword & 0xff; + return bit_encode_write(be, bits, nbits); +} + +int +bit_encode_flush(bit_encode_t *be) +{ + if (be->bbits) { + fputc(be->buf, be->fh); + be->bbits = 0; + } + return 0; +} + +int +build_directory(const char *path) +{ + int rv; + + /* Utterly failed... */ + if (strlen(path) == 0) + return -1; + +#if defined(_WIN32) && !defined(CYGWIN) + else if ((rv = _mkdir(path)) == 0) + return 0; +#elif defined(HAVE_SYS_STAT_H) /* Unix, Cygwin, doesn't work on MINGW */ + else if ((rv = mkdir(path, 0777)) == 0) + return 0; +#endif + + /* Or, it already exists... */ + else if (errno == EEXIST) + return 0; + else if (errno != ENOENT) { + E_ERROR_SYSTEM("Failed to create %s", path); + return -1; + } + else { + char *dirname = ckd_salloc(path); + path2dirname(path, dirname); + build_directory(dirname); + ckd_free(dirname); + +#if defined(_WIN32) && !defined(CYGWIN) + return _mkdir(path); +#elif defined(HAVE_SYS_STAT_H) /* Unix, Cygwin, doesn't work on MINGW */ + return mkdir(path, 0777); +#endif + } + return -1; //control should never reach here; fixes some compiler warnings +} diff --git a/src/libsphinxbase/util/priority_queue.c b/src/libsphinxbase/util/priority_queue.c new file mode 100644 index 000000000..fdfb5690c --- /dev/null +++ b/src/libsphinxbase/util/priority_queue.c @@ -0,0 +1,144 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +struct priority_queue_s { + void **pointers; + size_t alloc_size; + size_t size; + void *max_element; + int (*compare)(const void *a, const void *b); +}; + +priority_queue_t* priority_queue_create(size_t len, int (*compare)(const void *a, const void *b)) +{ + priority_queue_t* queue; + + queue = (priority_queue_t *)ckd_calloc(1, sizeof(*queue)); + queue->alloc_size = len; + queue->pointers = (void **)ckd_calloc(len, sizeof(*queue->pointers)); + queue->size = 0; + queue->max_element = NULL; + queue->compare = compare; + + return queue; +} + +void* priority_queue_poll(priority_queue_t *queue) +{ + + size_t i; + void *res; + + if (queue->size == 0) { + E_WARN("Trying to poll from empty queue\n"); + return NULL; + } + if (queue->max_element == NULL) { + E_ERROR("Trying to poll from queue and max element is undefined\n"); + return NULL; + } + res = queue->max_element; + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] == queue->max_element) { + queue->pointers[i] = NULL; + break; + } + } + queue->max_element = NULL; + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] == 0) + continue; + if (queue->max_element == NULL) { + queue->max_element = queue->pointers[i]; + } else { + if (queue->compare(queue->pointers[i], queue->max_element) < 0) + queue->max_element = queue->pointers[i]; + } + } + queue->size--; + return res; +} + +void priority_queue_add(priority_queue_t *queue, void *element) +{ + size_t i; + if (queue->size == queue->alloc_size) { + E_ERROR("Trying to add element into full queue\n"); + return; + } + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] == NULL) { + queue->pointers[i] = element; + break; + } + } + + if (queue->max_element == NULL || queue->compare(element, queue->max_element) < 0) { + queue->max_element = element; + } + queue->size++; +} + +size_t priority_queue_size(priority_queue_t *queue) +{ + return queue->size; +} + +void priority_queue_free(priority_queue_t *queue, void (*free_ptr)(void *a)) +{ + size_t i; + + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] != NULL) { + if (free_ptr == NULL) { + ckd_free(queue->pointers[i]); + } else { + free_ptr(queue->pointers[i]); + } + } + } + ckd_free(queue->pointers); + ckd_free(queue); +} diff --git a/src/libsphinxbase/util/profile.c b/src/libsphinxbase/util/profile.c new file mode 100644 index 000000000..c8d84ca98 --- /dev/null +++ b/src/libsphinxbase/util/profile.c @@ -0,0 +1,345 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * profile.c -- For timing and event counting. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: profile.c,v $ + * Revision 1.7 2005/06/22 03:10:59 arthchan2003 + * 1, Fixed doxygen documentation, 2, Added keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 11-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added ptmr_init(). + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#if defined(_WIN32) && !defined(__SYMBIAN32__) +# include +# ifndef _WIN32_WCE +# include +# endif +#elif defined(HAVE_UNISTD_H) /* I know this, this is Unix... */ +# include +# include +# include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/profile.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" + +#if defined(_WIN32_WCE) || defined(_WIN32_WP) +DWORD unlink(const char *filename) +{ + WCHAR *wfilename; + DWORD rv; + size_t len; + + len = mbstowcs(NULL, filename, 0); + wfilename = ckd_calloc(len+1, sizeof(*wfilename)); + mbstowcs(wfilename, filename, len); + rv = DeleteFileW(wfilename); + ckd_free(wfilename); + + return rv; +} +#endif + +pctr_t * +pctr_new(char *nm) +{ + pctr_t *pc; + + pc = ckd_calloc(1, sizeof(pctr_t)); + pc->name = ckd_salloc(nm); + pc->count = 0; + + return pc; +} + +void +pctr_reset(pctr_t * ctr) +{ + ctr->count = 0; +} + + +void +pctr_increment(pctr_t * ctr, int32 inc) +{ + ctr->count += inc; + /* E_INFO("Name %s, Count %d, inc %d\n",ctr->name, ctr->count, inc); */ +} + +void +pctr_print(FILE * fp, pctr_t * ctr) +{ + fprintf(fp, "CTR:"); + fprintf(fp, "[%d %s]", ctr->count, ctr->name); +} + +void +pctr_free(pctr_t * pc) +{ + if (pc) { + if (pc->name) + ckd_free(pc->name); + } + ckd_free(pc); +} + + +#if defined(_WIN32) && !defined(GNUWINCE) && !defined(__SYMBIAN32__) + +#define TM_LOWSCALE 1e-7 +#define TM_HIGHSCALE (4294967296.0 * TM_LOWSCALE); + +static float64 +make_sec(FILETIME * tm) +{ + float64 dt; + + dt = tm->dwLowDateTime * TM_LOWSCALE; + dt += tm->dwHighDateTime * TM_HIGHSCALE; + + return (dt); +} + +#else /* NOT WINDOWS */ + +static float64 +make_sec(struct timeval *s) +{ + return (s->tv_sec + s->tv_usec * 0.000001); +} + +#endif + + +void +ptmr_start(ptmr_t * tm) +{ +#if (! defined(_WIN32)) || defined(GNUWINCE) || defined(__SYMBIAN32__) + struct timeval e_start; /* Elapsed time */ + +#if (! defined(_HPUX_SOURCE)) && (! defined(__SYMBIAN32__)) + struct rusage start; /* CPU time */ + + /* Unix but not HPUX */ + getrusage(RUSAGE_SELF, &start); + tm->start_cpu = make_sec(&start.ru_utime) + make_sec(&start.ru_stime); +#endif + /* Unix + HP */ + gettimeofday(&e_start, 0); + tm->start_elapsed = make_sec(&e_start); +#elif defined(_WIN32_WP) + tm->start_cpu = GetTickCount64() / 1000; + tm->start_elapsed = GetTickCount64() / 1000; +#elif defined(_WIN32_WCE) + /* No GetProcessTimes() on WinCE. (Note CPU time will be bogus) */ + tm->start_cpu = GetTickCount() / 1000; + tm->start_elapsed = GetTickCount() / 1000; +#else + HANDLE pid; + FILETIME t_create, t_exit, kst, ust; + + /* PC */ + pid = GetCurrentProcess(); + GetProcessTimes(pid, &t_create, &t_exit, &kst, &ust); + tm->start_cpu = make_sec(&ust) + make_sec(&kst); + + tm->start_elapsed = (float64) clock() / CLOCKS_PER_SEC; +#endif +} + + +void +ptmr_stop(ptmr_t * tm) +{ + float64 dt_cpu, dt_elapsed; + +#if (! defined(_WIN32)) || defined(GNUWINCE) || defined(__SYMBIAN32__) + struct timeval e_stop; /* Elapsed time */ + +#if (! defined(_HPUX_SOURCE)) && (! defined(__SYMBIAN32__)) + struct rusage stop; /* CPU time */ + + /* Unix but not HPUX */ + getrusage(RUSAGE_SELF, &stop); + dt_cpu = + make_sec(&stop.ru_utime) + make_sec(&stop.ru_stime) - + tm->start_cpu; +#else + dt_cpu = 0.0; +#endif + /* Unix + HP */ + gettimeofday(&e_stop, 0); + dt_elapsed = (make_sec(&e_stop) - tm->start_elapsed); +#elif defined(_WIN32_WP) + dt_cpu = GetTickCount64() / 1000 - tm->start_cpu; + dt_elapsed = GetTickCount64() / 1000 - tm->start_elapsed; +#elif defined(_WIN32_WCE) + /* No GetProcessTimes() on WinCE. (Note CPU time will be bogus) */ + dt_cpu = GetTickCount() / 1000 - tm->start_cpu; + dt_elapsed = GetTickCount() / 1000 - tm->start_elapsed; +#else + HANDLE pid; + FILETIME t_create, t_exit, kst, ust; + + /* PC */ + pid = GetCurrentProcess(); + GetProcessTimes(pid, &t_create, &t_exit, &kst, &ust); + dt_cpu = make_sec(&ust) + make_sec(&kst) - tm->start_cpu; + dt_elapsed = ((float64) clock() / CLOCKS_PER_SEC) - tm->start_elapsed; +#endif + + tm->t_cpu += dt_cpu; + tm->t_elapsed += dt_elapsed; + + tm->t_tot_cpu += dt_cpu; + tm->t_tot_elapsed += dt_elapsed; +} + + +void +ptmr_reset(ptmr_t * tm) +{ + tm->t_cpu = 0.0; + tm->t_elapsed = 0.0; +} + + +void +ptmr_init(ptmr_t * tm) +{ + tm->t_cpu = 0.0; + tm->t_elapsed = 0.0; + tm->t_tot_cpu = 0.0; + tm->t_tot_elapsed = 0.0; +} + + +void +ptmr_reset_all(ptmr_t * tm) +{ + for (; tm->name; tm++) + ptmr_reset(tm); +} + + +void +ptmr_print_all(FILE * fp, ptmr_t * tm, float64 norm) +{ + if (norm != 0.0) { + norm = 1.0 / norm; + for (; tm->name; tm++) + fprintf(fp, " %6.2fx %s", tm->t_cpu * norm, tm->name); + } +} + + +int32 +host_endian(void) +{ + FILE *fp; + int32 BYTE_ORDER_MAGIC; + char *file; + char buf[8]; + int32 k, endian; + + file = "/tmp/__EnDiAn_TeSt__"; + + if ((fp = fopen(file, "wb")) == NULL) { + E_ERROR("Failed to open file '%s' for writing", file); + return -1; + } + + BYTE_ORDER_MAGIC = (int32) 0x11223344; + + k = (int32) BYTE_ORDER_MAGIC; + if (fwrite(&k, sizeof(int32), 1, fp) != 1) { + E_ERROR("Failed to write to file '%s'\n", file); + fclose(fp); + unlink(file); + return -1; + } + + fclose(fp); + if ((fp = fopen(file, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open file '%s' for reading", file); + unlink(file); + return -1; + } + if (fread(buf, 1, sizeof(int32), fp) != sizeof(int32)) { + E_ERROR("Failed to read from file '%s'\n", file); + fclose(fp); + unlink(file); + return -1; + } + fclose(fp); + unlink(file); + + /* If buf[0] == lsB of BYTE_ORDER_MAGIC, we are little-endian */ + endian = (buf[0] == (BYTE_ORDER_MAGIC & 0x000000ff)) ? 1 : 0; + + return (endian); +} diff --git a/src/libsphinxbase/util/sbthread.c b/src/libsphinxbase/util/sbthread.c new file mode 100644 index 000000000..238cfa423 --- /dev/null +++ b/src/libsphinxbase/util/sbthread.c @@ -0,0 +1,739 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file sbthread.c + * @brief Simple portable thread functions + * @author David Huggins-Daines + */ + +#include + +#include "sphinxbase/sbthread.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/err.h" + +/* + * Platform-specific parts: threads, mutexes, and signals. + */ +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(__SYMBIAN32__) +#define _WIN32_WINNT 0x0400 +#include + +struct sbthread_s { + cmd_ln_t *config; + sbmsgq_t *msgq; + sbthread_main func; + void *arg; + HANDLE th; + DWORD tid; +}; + +struct sbmsgq_s { + /* Ringbuffer for passing messages. */ + char *data; + size_t depth; + size_t out; + size_t nbytes; + + /* Current message is stored here. */ + char *msg; + size_t msglen; + CRITICAL_SECTION mtx; + HANDLE evt; +}; + +struct sbevent_s { + HANDLE evt; +}; + +struct sbmtx_s { + CRITICAL_SECTION mtx; +}; + +DWORD WINAPI +sbthread_internal_main(LPVOID arg) +{ + sbthread_t *th = (sbthread_t *)arg; + int rv; + + rv = (*th->func)(th); + return (DWORD)rv; +} + +sbthread_t * +sbthread_start(cmd_ln_t *config, sbthread_main func, void *arg) +{ + sbthread_t *th; + + th = ckd_calloc(1, sizeof(*th)); + th->config = config; + th->func = func; + th->arg = arg; + th->msgq = sbmsgq_init(256); + th->th = CreateThread(NULL, 0, sbthread_internal_main, th, 0, &th->tid); + if (th->th == NULL) { + sbthread_free(th); + return NULL; + } + return th; +} + +int +sbthread_wait(sbthread_t *th) +{ + DWORD rv, exit; + + /* It has already been joined. */ + if (th->th == NULL) + return -1; + + rv = WaitForSingleObject(th->th, INFINITE); + if (rv == WAIT_FAILED) { + E_ERROR("Failed to join thread: WAIT_FAILED\n"); + return -1; + } + GetExitCodeThread(th->th, &exit); + CloseHandle(th->th); + th->th = NULL; + return (int)exit; +} + +static DWORD +cond_timed_wait(HANDLE cond, int sec, int nsec) +{ + DWORD rv; + if (sec == -1) { + rv = WaitForSingleObject(cond, INFINITE); + } + else { + DWORD ms; + + ms = sec * 1000 + nsec / (1000*1000); + rv = WaitForSingleObject(cond, ms); + } + return rv; +} + +/* Updated to use Unicode */ +sbevent_t * +sbevent_init(void) +{ + sbevent_t *evt; + + evt = ckd_calloc(1, sizeof(*evt)); + evt->evt = CreateEventW(NULL, FALSE, FALSE, NULL); + if (evt->evt == NULL) { + ckd_free(evt); + return NULL; + } + return evt; +} + +void +sbevent_free(sbevent_t *evt) +{ + CloseHandle(evt->evt); + ckd_free(evt); +} + +int +sbevent_signal(sbevent_t *evt) +{ + return SetEvent(evt->evt) ? 0 : -1; +} + +int +sbevent_wait(sbevent_t *evt, int sec, int nsec) +{ + DWORD rv; + + rv = cond_timed_wait(evt->evt, sec, nsec); + return rv; +} + +sbmtx_t * +sbmtx_init(void) +{ + sbmtx_t *mtx; + + mtx = ckd_calloc(1, sizeof(*mtx)); + InitializeCriticalSection(&mtx->mtx); + return mtx; +} + +int +sbmtx_trylock(sbmtx_t *mtx) +{ + return TryEnterCriticalSection(&mtx->mtx) ? 0 : -1; +} + +int +sbmtx_lock(sbmtx_t *mtx) +{ + EnterCriticalSection(&mtx->mtx); + return 0; +} + +int +sbmtx_unlock(sbmtx_t *mtx) +{ + LeaveCriticalSection(&mtx->mtx); + return 0; +} + +void +sbmtx_free(sbmtx_t *mtx) +{ + DeleteCriticalSection(&mtx->mtx); + ckd_free(mtx); +} + +sbmsgq_t * +sbmsgq_init(size_t depth) +{ + sbmsgq_t *msgq; + + msgq = ckd_calloc(1, sizeof(*msgq)); + msgq->depth = depth; + msgq->evt = CreateEventW(NULL, FALSE, FALSE, NULL); + if (msgq->evt == NULL) { + ckd_free(msgq); + return NULL; + } + InitializeCriticalSection(&msgq->mtx); + msgq->data = ckd_calloc(depth, 1); + msgq->msg = ckd_calloc(depth, 1); + return msgq; +} + +void +sbmsgq_free(sbmsgq_t *msgq) +{ + CloseHandle(msgq->evt); + ckd_free(msgq->data); + ckd_free(msgq->msg); + ckd_free(msgq); +} + +int +sbmsgq_send(sbmsgq_t *q, size_t len, void const *data) +{ + char const *cdata = (char const *)data; + size_t in; + + /* Don't allow things bigger than depth to be sent! */ + if (len + sizeof(len) > q->depth) + return -1; + + if (q->nbytes + len + sizeof(len) > q->depth) + WaitForSingleObject(q->evt, INFINITE); + + /* Lock things while we manipulate the buffer (FIXME: this + actually should have been atomic with the wait above ...) */ + EnterCriticalSection(&q->mtx); + in = (q->out + q->nbytes) % q->depth; + /* First write the size of the message. */ + if (in + sizeof(len) > q->depth) { + /* Handle the annoying case where the size field gets wrapped around. */ + size_t len1 = q->depth - in; + memcpy(q->data + in, &len, len1); + memcpy(q->data, ((char *)&len) + len1, sizeof(len) - len1); + q->nbytes += sizeof(len); + in = sizeof(len) - len1; + } + else { + memcpy(q->data + in, &len, sizeof(len)); + q->nbytes += sizeof(len); + in += sizeof(len); + } + + /* Now write the message body. */ + if (in + len > q->depth) { + /* Handle wraparound. */ + size_t len1 = q->depth - in; + memcpy(q->data + in, cdata, len1); + q->nbytes += len1; + cdata += len1; + len -= len1; + in = 0; + } + memcpy(q->data + in, cdata, len); + q->nbytes += len; + + /* Signal the condition variable. */ + SetEvent(q->evt); + /* Unlock. */ + LeaveCriticalSection(&q->mtx); + + return 0; +} + +void * +sbmsgq_wait(sbmsgq_t *q, size_t *out_len, int sec, int nsec) +{ + char *outptr; + size_t len; + + /* Wait for data to be available. */ + if (q->nbytes == 0) { + if (cond_timed_wait(q->evt, sec, nsec) == WAIT_FAILED) + /* Timed out or something... */ + return NULL; + } + /* Lock to manipulate the queue (FIXME) */ + EnterCriticalSection(&q->mtx); + /* Get the message size. */ + if (q->out + sizeof(q->msglen) > q->depth) { + /* Handle annoying wraparound case. */ + size_t len1 = q->depth - q->out; + memcpy(&q->msglen, q->data + q->out, len1); + memcpy(((char *)&q->msglen) + len1, q->data, + sizeof(q->msglen) - len1); + q->out = sizeof(q->msglen) - len1; + } + else { + memcpy(&q->msglen, q->data + q->out, sizeof(q->msglen)); + q->out += sizeof(q->msglen); + } + q->nbytes -= sizeof(q->msglen); + /* Get the message body. */ + outptr = q->msg; + len = q->msglen; + if (q->out + q->msglen > q->depth) { + /* Handle wraparound. */ + size_t len1 = q->depth - q->out; + memcpy(outptr, q->data + q->out, len1); + outptr += len1; + len -= len1; + q->nbytes -= len1; + q->out = 0; + } + memcpy(outptr, q->data + q->out, len); + q->nbytes -= len; + q->out += len; + + /* Signal the condition variable. */ + SetEvent(q->evt); + /* Unlock. */ + LeaveCriticalSection(&q->mtx); + if (out_len) + *out_len = q->msglen; + return q->msg; +} + +#else /* POSIX */ +#include +#include + +struct sbthread_s { + cmd_ln_t *config; + sbmsgq_t *msgq; + sbthread_main func; + void *arg; + pthread_t th; +}; + +struct sbmsgq_s { + /* Ringbuffer for passing messages. */ + char *data; + size_t depth; + size_t out; + size_t nbytes; + + /* Current message is stored here. */ + char *msg; + size_t msglen; + pthread_mutex_t mtx; + pthread_cond_t cond; +}; + +struct sbevent_s { + pthread_mutex_t mtx; + pthread_cond_t cond; + int signalled; +}; + +struct sbmtx_s { + pthread_mutex_t mtx; +}; + +static void * +sbthread_internal_main(void *arg) +{ + sbthread_t *th = (sbthread_t *)arg; + int rv; + + rv = (*th->func)(th); + return (void *)(long)rv; +} + +sbthread_t * +sbthread_start(cmd_ln_t *config, sbthread_main func, void *arg) +{ + sbthread_t *th; + int rv; + + th = ckd_calloc(1, sizeof(*th)); + th->config = config; + th->func = func; + th->arg = arg; + th->msgq = sbmsgq_init(1024); + if ((rv = pthread_create(&th->th, NULL, &sbthread_internal_main, th)) != 0) { + E_ERROR("Failed to create thread: %d\n", rv); + sbthread_free(th); + return NULL; + } + return th; +} + +int +sbthread_wait(sbthread_t *th) +{ + void *exit; + int rv; + + /* It has already been joined. */ + if (th->th == (pthread_t)-1) + return -1; + + rv = pthread_join(th->th, &exit); + if (rv != 0) { + E_ERROR("Failed to join thread: %d\n", rv); + return -1; + } + th->th = (pthread_t)-1; + return (int)(long)exit; +} + +sbmsgq_t * +sbmsgq_init(size_t depth) +{ + sbmsgq_t *msgq; + + msgq = ckd_calloc(1, sizeof(*msgq)); + msgq->depth = depth; + if (pthread_cond_init(&msgq->cond, NULL) != 0) { + ckd_free(msgq); + return NULL; + } + if (pthread_mutex_init(&msgq->mtx, NULL) != 0) { + pthread_cond_destroy(&msgq->cond); + ckd_free(msgq); + return NULL; + } + msgq->data = ckd_calloc(depth, 1); + msgq->msg = ckd_calloc(depth, 1); + return msgq; +} + +void +sbmsgq_free(sbmsgq_t *msgq) +{ + pthread_mutex_destroy(&msgq->mtx); + pthread_cond_destroy(&msgq->cond); + ckd_free(msgq->data); + ckd_free(msgq->msg); + ckd_free(msgq); +} + +int +sbmsgq_send(sbmsgq_t *q, size_t len, void const *data) +{ + size_t in; + + /* Don't allow things bigger than depth to be sent! */ + if (len + sizeof(len) > q->depth) + return -1; + + /* Lock the condition variable while we manipulate the buffer. */ + pthread_mutex_lock(&q->mtx); + if (q->nbytes + len + sizeof(len) > q->depth) { + /* Unlock and wait for space to be available. */ + if (pthread_cond_wait(&q->cond, &q->mtx) != 0) { + /* Timed out, don't send anything. */ + pthread_mutex_unlock(&q->mtx); + return -1; + } + /* Condition is now locked again. */ + } + in = (q->out + q->nbytes) % q->depth; + + /* First write the size of the message. */ + if (in + sizeof(len) > q->depth) { + /* Handle the annoying case where the size field gets wrapped around. */ + size_t len1 = q->depth - in; + memcpy(q->data + in, &len, len1); + memcpy(q->data, ((char *)&len) + len1, sizeof(len) - len1); + q->nbytes += sizeof(len); + in = sizeof(len) - len1; + } + else { + memcpy(q->data + in, &len, sizeof(len)); + q->nbytes += sizeof(len); + in += sizeof(len); + } + + /* Now write the message body. */ + if (in + len > q->depth) { + /* Handle wraparound. */ + size_t len1 = q->depth - in; + memcpy(q->data + in, data, len1); + q->nbytes += len1; + data = (char const *)data + len1; + len -= len1; + in = 0; + } + memcpy(q->data + in, data, len); + q->nbytes += len; + + /* Signal the condition variable. */ + pthread_cond_signal(&q->cond); + /* Unlock it, we have nothing else to do. */ + pthread_mutex_unlock(&q->mtx); + return 0; +} + +static int +cond_timed_wait(pthread_cond_t *cond, pthread_mutex_t *mtx, int sec, int nsec) +{ + int rv; + if (sec == -1) { + rv = pthread_cond_wait(cond, mtx); + } + else { + struct timeval now; + struct timespec end; + + gettimeofday(&now, NULL); + end.tv_sec = now.tv_sec + sec; + end.tv_nsec = now.tv_usec * 1000 + nsec; + if (end.tv_nsec > (1000*1000*1000)) { + sec += end.tv_nsec / (1000*1000*1000); + end.tv_nsec = end.tv_nsec % (1000*1000*1000); + } + rv = pthread_cond_timedwait(cond, mtx, &end); + } + return rv; +} + +void * +sbmsgq_wait(sbmsgq_t *q, size_t *out_len, int sec, int nsec) +{ + char *outptr; + size_t len; + + /* Lock the condition variable while we manipulate nmsg. */ + pthread_mutex_lock(&q->mtx); + if (q->nbytes == 0) { + /* Unlock the condition variable and wait for a signal. */ + if (cond_timed_wait(&q->cond, &q->mtx, sec, nsec) != 0) { + /* Timed out or something... */ + pthread_mutex_unlock(&q->mtx); + return NULL; + } + /* Condition variable is now locked again. */ + } + /* Get the message size. */ + if (q->out + sizeof(q->msglen) > q->depth) { + /* Handle annoying wraparound case. */ + size_t len1 = q->depth - q->out; + memcpy(&q->msglen, q->data + q->out, len1); + memcpy(((char *)&q->msglen) + len1, q->data, + sizeof(q->msglen) - len1); + q->out = sizeof(q->msglen) - len1; + } + else { + memcpy(&q->msglen, q->data + q->out, sizeof(q->msglen)); + q->out += sizeof(q->msglen); + } + q->nbytes -= sizeof(q->msglen); + /* Get the message body. */ + outptr = q->msg; + len = q->msglen; + if (q->out + q->msglen > q->depth) { + /* Handle wraparound. */ + size_t len1 = q->depth - q->out; + memcpy(outptr, q->data + q->out, len1); + outptr += len1; + len -= len1; + q->nbytes -= len1; + q->out = 0; + } + memcpy(outptr, q->data + q->out, len); + q->nbytes -= len; + q->out += len; + + /* Signal the condition variable. */ + pthread_cond_signal(&q->cond); + /* Unlock the condition variable, we are done. */ + pthread_mutex_unlock(&q->mtx); + if (out_len) + *out_len = q->msglen; + return q->msg; +} + +sbevent_t * +sbevent_init(void) +{ + sbevent_t *evt; + int rv; + + evt = ckd_calloc(1, sizeof(*evt)); + if ((rv = pthread_mutex_init(&evt->mtx, NULL)) != 0) { + E_ERROR("Failed to initialize mutex: %d\n", rv); + ckd_free(evt); + return NULL; + } + if ((rv = pthread_cond_init(&evt->cond, NULL)) != 0) { + E_ERROR_SYSTEM("Failed to initialize mutex: %d\n", rv); + pthread_mutex_destroy(&evt->mtx); + ckd_free(evt); + return NULL; + } + return evt; +} + +void +sbevent_free(sbevent_t *evt) +{ + pthread_mutex_destroy(&evt->mtx); + pthread_cond_destroy(&evt->cond); + ckd_free(evt); +} + +int +sbevent_signal(sbevent_t *evt) +{ + int rv; + + pthread_mutex_lock(&evt->mtx); + evt->signalled = TRUE; + rv = pthread_cond_signal(&evt->cond); + pthread_mutex_unlock(&evt->mtx); + return rv; +} + +int +sbevent_wait(sbevent_t *evt, int sec, int nsec) +{ + int rv = 0; + + /* Lock the mutex before we check its signalled state. */ + pthread_mutex_lock(&evt->mtx); + /* If it's not signalled, then wait until it is. */ + if (!evt->signalled) + rv = cond_timed_wait(&evt->cond, &evt->mtx, sec, nsec); + /* Set its state to unsignalled if we were successful. */ + if (rv == 0) + evt->signalled = FALSE; + /* And unlock its mutex. */ + pthread_mutex_unlock(&evt->mtx); + + return rv; +} + +sbmtx_t * +sbmtx_init(void) +{ + sbmtx_t *mtx; + + mtx = ckd_calloc(1, sizeof(*mtx)); + if (pthread_mutex_init(&mtx->mtx, NULL) != 0) { + ckd_free(mtx); + return NULL; + } + return mtx; +} + +int +sbmtx_trylock(sbmtx_t *mtx) +{ + return pthread_mutex_trylock(&mtx->mtx); +} + +int +sbmtx_lock(sbmtx_t *mtx) +{ + return pthread_mutex_lock(&mtx->mtx); +} + +int +sbmtx_unlock(sbmtx_t *mtx) +{ + return pthread_mutex_unlock(&mtx->mtx); +} + +void +sbmtx_free(sbmtx_t *mtx) +{ + pthread_mutex_destroy(&mtx->mtx); + ckd_free(mtx); +} +#endif /* not WIN32 */ + +cmd_ln_t * +sbthread_config(sbthread_t *th) +{ + return th->config; +} + +void * +sbthread_arg(sbthread_t *th) +{ + return th->arg; +} + +sbmsgq_t * +sbthread_msgq(sbthread_t *th) +{ + return th->msgq; +} + +int +sbthread_send(sbthread_t *th, size_t len, void const *data) +{ + return sbmsgq_send(th->msgq, len, data); +} + +void +sbthread_free(sbthread_t *th) +{ + sbthread_wait(th); + sbmsgq_free(th->msgq); + ckd_free(th); +} diff --git a/src/libsphinxbase/util/slamch.c b/src/libsphinxbase/util/slamch.c new file mode 100644 index 000000000..229458470 --- /dev/null +++ b/src/libsphinxbase/util/slamch.c @@ -0,0 +1,1029 @@ +/* src/slamch.f -- translated by f2c (version 20050501). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#include "sphinxbase/f2c.h" + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +/* Table of constant values */ + +static integer c__1 = 1; +static real c_b32 = 0.f; + +doublereal +slamch_(char *cmach, ftnlen cmach_len) +{ + /* Initialized data */ + + static logical first = TRUE_; + + /* System generated locals */ + integer i__1; + real ret_val; + + /* Builtin functions */ + double pow_ri(real *, integer *); + + /* Local variables */ + static real t; + static integer it; + static real rnd, eps, base; + static integer beta; + static real emin, prec, emax; + static integer imin, imax; + static logical lrnd; + static real rmin, rmax, rmach; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + static real small, sfmin; + extern /* Subroutine */ int slamc2_(integer *, integer *, logical *, real + *, integer *, real *, integer *, + real *); + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMCH determines single precision machine parameters. */ + +/* Arguments */ +/* ========= */ + +/* CMACH (input) CHARACTER*1 */ +/* Specifies the value to be returned by SLAMCH: */ +/* = 'E' or 'e', SLAMCH := eps */ +/* = 'S' or 's , SLAMCH := sfmin */ +/* = 'B' or 'b', SLAMCH := base */ +/* = 'P' or 'p', SLAMCH := eps*base */ +/* = 'N' or 'n', SLAMCH := t */ +/* = 'R' or 'r', SLAMCH := rnd */ +/* = 'M' or 'm', SLAMCH := emin */ +/* = 'U' or 'u', SLAMCH := rmin */ +/* = 'L' or 'l', SLAMCH := emax */ +/* = 'O' or 'o', SLAMCH := rmax */ + +/* where */ + +/* eps = relative machine precision */ +/* sfmin = safe minimum, such that 1/sfmin does not overflow */ +/* base = base of the machine */ +/* prec = eps*base */ +/* t = number of (base) digits in the mantissa */ +/* rnd = 1.0 when rounding occurs in addition, 0.0 otherwise */ +/* emin = minimum exponent before (gradual) underflow */ +/* rmin = underflow threshold - base**(emin-1) */ +/* emax = largest exponent before overflow */ +/* rmax = overflow threshold - (base**emax)*(1-eps) */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Save statement .. */ +/* .. */ +/* .. Data statements .. */ +/* .. */ +/* .. Executable Statements .. */ + + if (first) { + first = FALSE_; + slamc2_(&beta, &it, &lrnd, &eps, &imin, &rmin, &imax, &rmax); + base = (real) beta; + t = (real) it; + if (lrnd) { + rnd = 1.f; + i__1 = 1 - it; + eps = pow_ri(&base, &i__1) / 2; + } + else { + rnd = 0.f; + i__1 = 1 - it; + eps = pow_ri(&base, &i__1); + } + prec = eps * base; + emin = (real) imin; + emax = (real) imax; + sfmin = rmin; + small = 1.f / rmax; + if (small >= sfmin) { + +/* Use SMALL plus a bit, to avoid the possibility of rounding */ +/* causing overflow when computing 1/sfmin. */ + + sfmin = small * (eps + 1.f); + } + } + + if (lsame_(cmach, "E", (ftnlen) 1, (ftnlen) 1)) { + rmach = eps; + } + else if (lsame_(cmach, "S", (ftnlen) 1, (ftnlen) 1)) { + rmach = sfmin; + } + else if (lsame_(cmach, "B", (ftnlen) 1, (ftnlen) 1)) { + rmach = base; + } + else if (lsame_(cmach, "P", (ftnlen) 1, (ftnlen) 1)) { + rmach = prec; + } + else if (lsame_(cmach, "N", (ftnlen) 1, (ftnlen) 1)) { + rmach = t; + } + else if (lsame_(cmach, "R", (ftnlen) 1, (ftnlen) 1)) { + rmach = rnd; + } + else if (lsame_(cmach, "M", (ftnlen) 1, (ftnlen) 1)) { + rmach = emin; + } + else if (lsame_(cmach, "U", (ftnlen) 1, (ftnlen) 1)) { + rmach = rmin; + } + else if (lsame_(cmach, "L", (ftnlen) 1, (ftnlen) 1)) { + rmach = emax; + } + else if (lsame_(cmach, "O", (ftnlen) 1, (ftnlen) 1)) { + rmach = rmax; + } + + ret_val = rmach; + return ret_val; + +/* End of SLAMCH */ + +} /* slamch_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc1_(integer * beta, integer * t, logical * rnd, logical * ieee1) +{ + /* Initialized data */ + + static logical first = TRUE_; + + /* System generated locals */ + real r__1, r__2; + + /* Local variables */ + static real a, b, c__, f, t1, t2; + static integer lt; + static real one, qtr; + static logical lrnd; + static integer lbeta; + static real savec; + static logical lieee1; + extern doublereal slamc3_(real *, real *); + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC1 determines the machine parameters given by BETA, T, RND, and */ +/* IEEE1. */ + +/* Arguments */ +/* ========= */ + +/* BETA (output) INTEGER */ +/* The base of the machine. */ + +/* T (output) INTEGER */ +/* The number of ( BETA ) digits in the mantissa. */ + +/* RND (output) LOGICAL */ +/* Specifies whether proper rounding ( RND = .TRUE. ) or */ +/* chopping ( RND = .FALSE. ) occurs in addition. This may not */ +/* be a reliable guide to the way in which the machine performs */ +/* its arithmetic. */ + +/* IEEE1 (output) LOGICAL */ +/* Specifies whether rounding appears to be done in the IEEE */ +/* 'round to nearest' style. */ + +/* Further Details */ +/* =============== */ + +/* The routine is based on the routine ENVRON by Malcolm and */ +/* incorporates suggestions by Gentleman and Marovich. See */ + +/* Malcolm M. A. (1972) Algorithms to reveal properties of */ +/* floating-point arithmetic. Comms. of the ACM, 15, 949-951. */ + +/* Gentleman W. M. and Marovich S. B. (1974) More on algorithms */ +/* that reveal properties of floating point arithmetic units. */ +/* Comms. of the ACM, 17, 276-277. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Save statement .. */ +/* .. */ +/* .. Data statements .. */ +/* .. */ +/* .. Executable Statements .. */ + + if (first) { + first = FALSE_; + one = 1.f; + +/* LBETA, LIEEE1, LT and LRND are the local values of BETA, */ +/* IEEE1, T and RND. */ + +/* Throughout this routine we use the function SLAMC3 to ensure */ +/* that relevant values are stored and not held in registers, or */ +/* are not affected by optimizers. */ + +/* Compute a = 2.0**m with the smallest positive integer m such */ +/* that */ + +/* fl( a + 1.0 ) = a. */ + + a = 1.f; + c__ = 1.f; + +/* + WHILE( C.EQ.ONE )LOOP */ + L10: + if (c__ == one) { + a *= 2; + c__ = slamc3_(&a, &one); + r__1 = -a; + c__ = slamc3_(&c__, &r__1); + goto L10; + } +/* + END WHILE */ + +/* Now compute b = 2.0**m with the smallest positive integer m */ +/* such that */ + +/* fl( a + b ) .gt. a. */ + + b = 1.f; + c__ = slamc3_(&a, &b); + +/* + WHILE( C.EQ.A )LOOP */ + L20: + if (c__ == a) { + b *= 2; + c__ = slamc3_(&a, &b); + goto L20; + } +/* + END WHILE */ + +/* Now compute the base. a and c are neighbouring floating point */ +/* numbers in the interval ( beta**t, beta**( t + 1 ) ) and so */ +/* their difference is beta. Adding 0.25 to c is to ensure that it */ +/* is truncated to beta and not ( beta - 1 ). */ + + qtr = one / 4; + savec = c__; + r__1 = -a; + c__ = slamc3_(&c__, &r__1); + lbeta = c__ + qtr; + +/* Now determine whether rounding or chopping occurs, by adding a */ +/* bit less than beta/2 and a bit more than beta/2 to a. */ + + b = (real) lbeta; + r__1 = b / 2; + r__2 = -b / 100; + f = slamc3_(&r__1, &r__2); + c__ = slamc3_(&f, &a); + if (c__ == a) { + lrnd = TRUE_; + } + else { + lrnd = FALSE_; + } + r__1 = b / 2; + r__2 = b / 100; + f = slamc3_(&r__1, &r__2); + c__ = slamc3_(&f, &a); + if (lrnd && c__ == a) { + lrnd = FALSE_; + } + +/* Try and decide whether rounding is done in the IEEE 'round to */ +/* nearest' style. B/2 is half a unit in the last place of the two */ +/* numbers A and SAVEC. Furthermore, A is even, i.e. has last bit */ +/* zero, and SAVEC is odd. Thus adding B/2 to A should not change */ +/* A, but adding B/2 to SAVEC should change SAVEC. */ + + r__1 = b / 2; + t1 = slamc3_(&r__1, &a); + r__1 = b / 2; + t2 = slamc3_(&r__1, &savec); + lieee1 = t1 == a && t2 > savec && lrnd; + +/* Now find the mantissa, t. It should be the integer part of */ +/* log to the base beta of a, however it is safer to determine t */ +/* by powering. So we find t as the smallest positive integer for */ +/* which */ + +/* fl( beta**t + 1.0 ) = 1.0. */ + + lt = 0; + a = 1.f; + c__ = 1.f; + +/* + WHILE( C.EQ.ONE )LOOP */ + L30: + if (c__ == one) { + ++lt; + a *= lbeta; + c__ = slamc3_(&a, &one); + r__1 = -a; + c__ = slamc3_(&c__, &r__1); + goto L30; + } +/* + END WHILE */ + + } + + *beta = lbeta; + *t = lt; + *rnd = lrnd; + *ieee1 = lieee1; + return 0; + +/* End of SLAMC1 */ + +} /* slamc1_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc2_(integer * beta, integer * t, logical * rnd, real * + eps, integer * emin, real * rmin, integer * emax, real * rmax) +{ + /* Initialized data */ + + static logical first = TRUE_; + static logical iwarn = FALSE_; + + /* Format strings */ + static char fmt_9999[] = + "(//\002 WARNING. The value EMIN may be incorre" + "ct:-\002,\002 EMIN = \002,i8,/\002 If, after inspection, the va" + "lue EMIN looks\002,\002 acceptable please comment out \002,/\002" + " the IF block as marked within the code of routine\002,\002 SLAM" + "C2,\002,/\002 otherwise supply EMIN explicitly.\002,/)"; + + /* System generated locals */ + integer i__1; + real r__1, r__2, r__3, r__4, r__5; + + /* Builtin functions */ + double pow_ri(real *, integer *); + integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), + e_wsfe(void); + + /* Local variables */ + static real a, b, c__; + static integer i__, lt; + static real one, two; + static logical ieee; + static real half; + static logical lrnd; + static real leps, zero; + static integer lbeta; + static real rbase; + static integer lemin, lemax, gnmin; + static real small; + static integer gpmin; + static real third, lrmin, lrmax, sixth; + static logical lieee1; + extern /* Subroutine */ int slamc1_(integer *, integer *, logical *, + logical *); + extern doublereal slamc3_(real *, real *); + extern /* Subroutine */ int slamc4_(integer *, real *, integer *), + slamc5_(integer *, integer *, integer *, logical *, integer *, + real *); + static integer ngnmin, ngpmin; + + /* Fortran I/O blocks */ + static cilist io___58 = { 0, 6, 0, fmt_9999, 0 }; + + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC2 determines the machine parameters specified in its argument */ +/* list. */ + +/* Arguments */ +/* ========= */ + +/* BETA (output) INTEGER */ +/* The base of the machine. */ + +/* T (output) INTEGER */ +/* The number of ( BETA ) digits in the mantissa. */ + +/* RND (output) LOGICAL */ +/* Specifies whether proper rounding ( RND = .TRUE. ) or */ +/* chopping ( RND = .FALSE. ) occurs in addition. This may not */ +/* be a reliable guide to the way in which the machine performs */ +/* its arithmetic. */ + +/* EPS (output) REAL */ +/* The smallest positive number such that */ + +/* fl( 1.0 - EPS ) .LT. 1.0, */ + +/* where fl denotes the computed value. */ + +/* EMIN (output) INTEGER */ +/* The minimum exponent before (gradual) underflow occurs. */ + +/* RMIN (output) REAL */ +/* The smallest normalized number for the machine, given by */ +/* BASE**( EMIN - 1 ), where BASE is the floating point value */ +/* of BETA. */ + +/* EMAX (output) INTEGER */ +/* The maximum exponent before overflow occurs. */ + +/* RMAX (output) REAL */ +/* The largest positive number for the machine, given by */ +/* BASE**EMAX * ( 1 - EPS ), where BASE is the floating point */ +/* value of BETA. */ + +/* Further Details */ +/* =============== */ + +/* The computation of EPS is based on a routine PARANOIA by */ +/* W. Kahan of the University of California at Berkeley. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Save statement .. */ +/* .. */ +/* .. Data statements .. */ +/* .. */ +/* .. Executable Statements .. */ + + if (first) { + first = FALSE_; + zero = 0.f; + one = 1.f; + two = 2.f; + +/* LBETA, LT, LRND, LEPS, LEMIN and LRMIN are the local values of */ +/* BETA, T, RND, EPS, EMIN and RMIN. */ + +/* Throughout this routine we use the function SLAMC3 to ensure */ +/* that relevant values are stored and not held in registers, or */ +/* are not affected by optimizers. */ + +/* SLAMC1 returns the parameters LBETA, LT, LRND and LIEEE1. */ + + slamc1_(&lbeta, <, &lrnd, &lieee1); + +/* Start to find EPS. */ + + b = (real) lbeta; + i__1 = -lt; + a = pow_ri(&b, &i__1); + leps = a; + +/* Try some tricks to see whether or not this is the correct EPS. */ + + b = two / 3; + half = one / 2; + r__1 = -half; + sixth = slamc3_(&b, &r__1); + third = slamc3_(&sixth, &sixth); + r__1 = -half; + b = slamc3_(&third, &r__1); + b = slamc3_(&b, &sixth); + b = dabs(b); + if (b < leps) { + b = leps; + } + + leps = 1.f; + +/* + WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP */ + L10: + if (leps > b && b > zero) { + leps = b; + r__1 = half * leps; +/* Computing 5th power */ + r__3 = two, r__4 = r__3, r__3 *= r__3; +/* Computing 2nd power */ + r__5 = leps; + r__2 = r__4 * (r__3 * r__3) * (r__5 * r__5); + c__ = slamc3_(&r__1, &r__2); + r__1 = -c__; + c__ = slamc3_(&half, &r__1); + b = slamc3_(&half, &c__); + r__1 = -b; + c__ = slamc3_(&half, &r__1); + b = slamc3_(&half, &c__); + goto L10; + } +/* + END WHILE */ + + if (a < leps) { + leps = a; + } + +/* Computation of EPS complete. */ + +/* Now find EMIN. Let A = + or - 1, and + or - (1 + BASE**(-3)). */ +/* Keep dividing A by BETA until (gradual) underflow occurs. This */ +/* is detected when we cannot recover the previous A. */ + + rbase = one / lbeta; + small = one; + for (i__ = 1; i__ <= 3; ++i__) { + r__1 = small * rbase; + small = slamc3_(&r__1, &zero); +/* L20: */ + } + a = slamc3_(&one, &small); + slamc4_(&ngpmin, &one, &lbeta); + r__1 = -one; + slamc4_(&ngnmin, &r__1, &lbeta); + slamc4_(&gpmin, &a, &lbeta); + r__1 = -a; + slamc4_(&gnmin, &r__1, &lbeta); + ieee = FALSE_; + + if (ngpmin == ngnmin && gpmin == gnmin) { + if (ngpmin == gpmin) { + lemin = ngpmin; +/* ( Non twos-complement machines, no gradual underflow; */ +/* e.g., VAX ) */ + } + else if (gpmin - ngpmin == 3) { + lemin = ngpmin - 1 + lt; + ieee = TRUE_; +/* ( Non twos-complement machines, with gradual underflow; */ +/* e.g., IEEE standard followers ) */ + } + else { + lemin = min(ngpmin, gpmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } + + } + else if (ngpmin == gpmin && ngnmin == gnmin) { + if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1) { + lemin = max(ngpmin, ngnmin); +/* ( Twos-complement machines, no gradual underflow; */ +/* e.g., CYBER 205 ) */ + } + else { + lemin = min(ngpmin, ngnmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } + + } + else if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1 + && gpmin == gnmin) { + if (gpmin - min(ngpmin, ngnmin) == 3) { + lemin = max(ngpmin, ngnmin) - 1 + lt; +/* ( Twos-complement machines with gradual underflow; */ +/* no known machine ) */ + } + else { + lemin = min(ngpmin, ngnmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } + + } + else { +/* Computing MIN */ + i__1 = min(ngpmin, ngnmin), i__1 = min(i__1, gpmin); + lemin = min(i__1, gnmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } +/* ** */ +/* Comment out this if block if EMIN is ok */ + if (iwarn) { + first = TRUE_; + s_wsfe(&io___58); + do_fio(&c__1, (char *) &lemin, (ftnlen) sizeof(integer)); + e_wsfe(); + } +/* ** */ + +/* Assume IEEE arithmetic if we found denormalised numbers above, */ +/* or if arithmetic seems to round in the IEEE style, determined */ +/* in routine SLAMC1. A true IEEE machine should have both things */ +/* true; however, faulty machines may have one or the other. */ + + ieee = ieee || lieee1; + +/* Compute RMIN by successive division by BETA. We could compute */ +/* RMIN as BASE**( EMIN - 1 ), but some machines underflow during */ +/* this computation. */ + + lrmin = 1.f; + i__1 = 1 - lemin; + for (i__ = 1; i__ <= i__1; ++i__) { + r__1 = lrmin * rbase; + lrmin = slamc3_(&r__1, &zero); +/* L30: */ + } + +/* Finally, call SLAMC5 to compute EMAX and RMAX. */ + + slamc5_(&lbeta, <, &lemin, &ieee, &lemax, &lrmax); + } + + *beta = lbeta; + *t = lt; + *rnd = lrnd; + *eps = leps; + *emin = lemin; + *rmin = lrmin; + *emax = lemax; + *rmax = lrmax; + + return 0; + + +/* End of SLAMC2 */ + +} /* slamc2_ */ + + +/* *********************************************************************** */ + +doublereal +slamc3_(real * a, real * b) +{ + /* System generated locals */ + real ret_val; + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC3 is intended to force A and B to be stored prior to doing */ +/* the addition of A and B , for use in situations where optimizers */ +/* might hold one of these in a register. */ + +/* Arguments */ +/* ========= */ + +/* A, B (input) REAL */ +/* The values A and B. */ + +/* ===================================================================== */ + +/* .. Executable Statements .. */ + + ret_val = *a + *b; + + return ret_val; + +/* End of SLAMC3 */ + +} /* slamc3_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc4_(integer * emin, real * start, integer * base) +{ + /* System generated locals */ + integer i__1; + real r__1; + + /* Local variables */ + static real a; + static integer i__; + static real b1, b2, c1, c2, d1, d2, one, zero, rbase; + extern doublereal slamc3_(real *, real *); + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC4 is a service routine for SLAMC2. */ + +/* Arguments */ +/* ========= */ + +/* EMIN (output) EMIN */ +/* The minimum exponent before (gradual) underflow, computed by */ +/* setting A = START and dividing by BASE until the previous A */ +/* can not be recovered. */ + +/* START (input) REAL */ +/* The starting point for determining EMIN. */ + +/* BASE (input) INTEGER */ +/* The base of the machine. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + a = *start; + one = 1.f; + rbase = one / *base; + zero = 0.f; + *emin = 1; + r__1 = a * rbase; + b1 = slamc3_(&r__1, &zero); + c1 = a; + c2 = a; + d1 = a; + d2 = a; +/* + WHILE( ( C1.EQ.A ).AND.( C2.EQ.A ).AND. */ +/* $ ( D1.EQ.A ).AND.( D2.EQ.A ) )LOOP */ + L10: + if (c1 == a && c2 == a && d1 == a && d2 == a) { + --(*emin); + a = b1; + r__1 = a / *base; + b1 = slamc3_(&r__1, &zero); + r__1 = b1 * *base; + c1 = slamc3_(&r__1, &zero); + d1 = zero; + i__1 = *base; + for (i__ = 1; i__ <= i__1; ++i__) { + d1 += b1; +/* L20: */ + } + r__1 = a * rbase; + b2 = slamc3_(&r__1, &zero); + r__1 = b2 / rbase; + c2 = slamc3_(&r__1, &zero); + d2 = zero; + i__1 = *base; + for (i__ = 1; i__ <= i__1; ++i__) { + d2 += b2; +/* L30: */ + } + goto L10; + } +/* + END WHILE */ + + return 0; + +/* End of SLAMC4 */ + +} /* slamc4_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc5_(integer * beta, integer * p, integer * emin, + logical * ieee, integer * emax, real * rmax) +{ + /* System generated locals */ + integer i__1; + real r__1; + + /* Local variables */ + static integer i__; + static real y, z__; + static integer try__, lexp; + static real oldy; + static integer uexp, nbits; + extern doublereal slamc3_(real *, real *); + static real recbas; + static integer exbits, expsum; + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC5 attempts to compute RMAX, the largest machine floating-point */ +/* number, without overflow. It assumes that EMAX + abs(EMIN) sum */ +/* approximately to a power of 2. It will fail on machines where this */ +/* assumption does not hold, for example, the Cyber 205 (EMIN = -28625, */ +/* EMAX = 28718). It will also fail if the value supplied for EMIN is */ +/* too large (i.e. too close to zero), probably with overflow. */ + +/* Arguments */ +/* ========= */ + +/* BETA (input) INTEGER */ +/* The base of floating-point arithmetic. */ + +/* P (input) INTEGER */ +/* The number of base BETA digits in the mantissa of a */ +/* floating-point value. */ + +/* EMIN (input) INTEGER */ +/* The minimum exponent before (gradual) underflow. */ + +/* IEEE (input) LOGICAL */ +/* A logical flag specifying whether or not the arithmetic */ +/* system is thought to comply with the IEEE standard. */ + +/* EMAX (output) INTEGER */ +/* The largest exponent before overflow */ + +/* RMAX (output) REAL */ +/* The largest machine floating-point number. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* First compute LEXP and UEXP, two powers of 2 that bound */ +/* abs(EMIN). We then assume that EMAX + abs(EMIN) will sum */ +/* approximately to the bound that is closest to abs(EMIN). */ +/* (EMAX is the exponent of the required number RMAX). */ + + lexp = 1; + exbits = 1; + L10: + try__ = lexp << 1; + if (try__ <= -(*emin)) { + lexp = try__; + ++exbits; + goto L10; + } + if (lexp == -(*emin)) { + uexp = lexp; + } + else { + uexp = try__; + ++exbits; + } + +/* Now -LEXP is less than or equal to EMIN, and -UEXP is greater */ +/* than or equal to EMIN. EXBITS is the number of bits needed to */ +/* store the exponent. */ + + if (uexp + *emin > -lexp - *emin) { + expsum = lexp << 1; + } + else { + expsum = uexp << 1; + } + +/* EXPSUM is the exponent range, approximately equal to */ +/* EMAX - EMIN + 1 . */ + + *emax = expsum + *emin - 1; + nbits = exbits + 1 + *p; + +/* NBITS is the total number of bits needed to store a */ +/* floating-point number. */ + + if (nbits % 2 == 1 && *beta == 2) { + +/* Either there are an odd number of bits used to store a */ +/* floating-point number, which is unlikely, or some bits are */ +/* not used in the representation of numbers, which is possible, */ +/* (e.g. Cray machines) or the mantissa has an implicit bit, */ +/* (e.g. IEEE machines, Dec Vax machines), which is perhaps the */ +/* most likely. We have to assume the last alternative. */ +/* If this is true, then we need to reduce EMAX by one because */ +/* there must be some way of representing zero in an implicit-bit */ +/* system. On machines like Cray, we are reducing EMAX by one */ +/* unnecessarily. */ + + --(*emax); + } + + if (*ieee) { + +/* Assume we are on an IEEE machine which reserves one exponent */ +/* for infinity and NaN. */ + + --(*emax); + } + +/* Now create RMAX, the largest machine number, which should */ +/* be equal to (1.0 - BETA**(-P)) * BETA**EMAX . */ + +/* First compute 1.0 - BETA**(-P), being careful that the */ +/* result is less than 1.0 . */ + + recbas = 1.f / *beta; + z__ = *beta - 1.f; + y = 0.f; + i__1 = *p; + for (i__ = 1; i__ <= i__1; ++i__) { + z__ *= recbas; + if (y < 1.f) { + oldy = y; + } + y = slamc3_(&y, &z__); +/* L20: */ + } + if (y >= 1.f) { + y = oldy; + } + +/* Now multiply by BETA**EMAX to get RMAX. */ + + i__1 = *emax; + for (i__ = 1; i__ <= i__1; ++i__) { + r__1 = y * *beta; + y = slamc3_(&r__1, &c_b32); +/* L30: */ + } + + *rmax = y; + return 0; + +/* End of SLAMC5 */ + +} /* slamc5_ */ diff --git a/src/libsphinxbase/util/slapack_lite.c b/src/libsphinxbase/util/slapack_lite.c new file mode 100644 index 000000000..06ac89c19 --- /dev/null +++ b/src/libsphinxbase/util/slapack_lite.c @@ -0,0 +1,1461 @@ +/* +NOTE: This is generated code. Look in README.python for information on + remaking this file. +*/ +#include "sphinxbase/f2c.h" + +#ifdef HAVE_CONFIG +#include "config.h" +#else +extern doublereal slamch_(char *); +#define EPSILON slamch_("Epsilon") +#define SAFEMINIMUM slamch_("Safe minimum") +#define PRECISION slamch_("Precision") +#define BASE slamch_("Base") +#endif + + +extern doublereal slapy2_(real *, real *); + + + +/* Table of constant values */ + +static integer c__0 = 0; +static real c_b163 = 0.f; +static real c_b164 = 1.f; +static integer c__1 = 1; +static real c_b181 = -1.f; +static integer c_n1 = -1; + +integer ieeeck_(integer *ispec, real *zero, real *one) +{ + /* System generated locals */ + integer ret_val; + + /* Local variables */ + static real nan1, nan2, nan3, nan4, nan5, nan6, neginf, posinf, negzro, + newzro; + + +/* + -- LAPACK auxiliary routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + June 30, 1998 + + + Purpose + ======= + + IEEECK is called from the ILAENV to verify that Infinity and + possibly NaN arithmetic is safe (i.e. will not trap). + + Arguments + ========= + + ISPEC (input) INTEGER + Specifies whether to test just for inifinity arithmetic + or whether to test for infinity and NaN arithmetic. + = 0: Verify infinity arithmetic only. + = 1: Verify infinity and NaN arithmetic. + + ZERO (input) REAL + Must contain the value 0.0 + This is passed to prevent the compiler from optimizing + away this code. + + ONE (input) REAL + Must contain the value 1.0 + This is passed to prevent the compiler from optimizing + away this code. + + RETURN VALUE: INTEGER + = 0: Arithmetic failed to produce the correct answers + = 1: Arithmetic produced the correct answers +*/ + + ret_val = 1; + + posinf = *one / *zero; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + neginf = -(*one) / *zero; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + negzro = *one / (neginf + *one); + if (negzro != *zero) { + ret_val = 0; + return ret_val; + } + + neginf = *one / negzro; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + newzro = negzro + *zero; + if (newzro != *zero) { + ret_val = 0; + return ret_val; + } + + posinf = *one / newzro; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + neginf *= posinf; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + posinf *= posinf; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + +/* Return if we were only asked to check infinity arithmetic */ + + if (*ispec == 0) { + return ret_val; + } + + nan1 = posinf + neginf; + + nan2 = posinf / neginf; + + nan3 = posinf / posinf; + + nan4 = posinf * *zero; + + nan5 = neginf * negzro; + + nan6 = nan5 * 0.f; + + if (nan1 == nan1) { + ret_val = 0; + return ret_val; + } + + if (nan2 == nan2) { + ret_val = 0; + return ret_val; + } + + if (nan3 == nan3) { + ret_val = 0; + return ret_val; + } + + if (nan4 == nan4) { + ret_val = 0; + return ret_val; + } + + if (nan5 == nan5) { + ret_val = 0; + return ret_val; + } + + if (nan6 == nan6) { + ret_val = 0; + return ret_val; + } + + return ret_val; +} /* ieeeck_ */ + +integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, + integer *n2, integer *n3, integer *n4, ftnlen name_len, ftnlen + opts_len) +{ + /* System generated locals */ + integer ret_val; + + /* Builtin functions */ + /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); + integer s_cmp(char *, char *, ftnlen, ftnlen); + + /* Local variables */ + static integer i__; + static char c1[1], c2[2], c3[3], c4[2]; + static integer ic, nb, iz, nx; + static logical cname, sname; + static integer nbmin; + extern integer ieeeck_(integer *, real *, real *); + static char subnam[6]; + + +/* + -- LAPACK auxiliary routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + June 30, 1999 + + + Purpose + ======= + + ILAENV is called from the LAPACK routines to choose problem-dependent + parameters for the local environment. See ISPEC for a description of + the parameters. + + This version provides a set of parameters which should give good, + but not optimal, performance on many of the currently available + computers. Users are encouraged to modify this subroutine to set + the tuning parameters for their particular machine using the option + and problem size information in the arguments. + + This routine will not function correctly if it is converted to all + lower case. Converting it to all upper case is allowed. + + Arguments + ========= + + ISPEC (input) INTEGER + Specifies the parameter to be returned as the value of + ILAENV. + = 1: the optimal blocksize; if this value is 1, an unblocked + algorithm will give the best performance. + = 2: the minimum block size for which the block routine + should be used; if the usable block size is less than + this value, an unblocked routine should be used. + = 3: the crossover point (in a block routine, for N less + than this value, an unblocked routine should be used) + = 4: the number of shifts, used in the nonsymmetric + eigenvalue routines + = 5: the minimum column dimension for blocking to be used; + rectangular blocks must have dimension at least k by m, + where k is given by ILAENV(2,...) and m by ILAENV(5,...) + = 6: the crossover point for the SVD (when reducing an m by n + matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds + this value, a QR factorization is used first to reduce + the matrix to a triangular form.) + = 7: the number of processors + = 8: the crossover point for the multishift QR and QZ methods + for nonsymmetric eigenvalue problems. + = 9: maximum size of the subproblems at the bottom of the + computation tree in the divide-and-conquer algorithm + (used by xGELSD and xGESDD) + =10: ieee NaN arithmetic can be trusted not to trap + =11: infinity arithmetic can be trusted not to trap + + NAME (input) CHARACTER*(*) + The name of the calling subroutine, in either upper case or + lower case. + + OPTS (input) CHARACTER*(*) + The character options to the subroutine NAME, concatenated + into a single character string. For example, UPLO = 'U', + TRANS = 'T', and DIAG = 'N' for a triangular routine would + be specified as OPTS = 'UTN'. + + N1 (input) INTEGER + N2 (input) INTEGER + N3 (input) INTEGER + N4 (input) INTEGER + Problem dimensions for the subroutine NAME; these may not all + be required. + + (ILAENV) (output) INTEGER + >= 0: the value of the parameter specified by ISPEC + < 0: if ILAENV = -k, the k-th argument had an illegal value. + + Further Details + =============== + + The following conventions have been used when calling ILAENV from the + LAPACK routines: + 1) OPTS is a concatenation of all of the character options to + subroutine NAME, in the same order that they appear in the + argument list for NAME, even if they are not used in determining + the value of the parameter specified by ISPEC. + 2) The problem dimensions N1, N2, N3, N4 are specified in the order + that they appear in the argument list for NAME. N1 is used + first, N2 second, and so on, and unused problem dimensions are + passed a value of -1. + 3) The parameter value returned by ILAENV is checked for validity in + the calling subroutine. For example, ILAENV is used to retrieve + the optimal blocksize for STRTRI as follows: + + NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) + IF( NB.LE.1 ) NB = MAX( 1, N ) + + ===================================================================== +*/ + + + switch (*ispec) { + case 1: goto L100; + case 2: goto L100; + case 3: goto L100; + case 4: goto L400; + case 5: goto L500; + case 6: goto L600; + case 7: goto L700; + case 8: goto L800; + case 9: goto L900; + case 10: goto L1000; + case 11: goto L1100; + } + +/* Invalid value for ISPEC */ + + ret_val = -1; + return ret_val; + +L100: + +/* Convert NAME to upper case if the first character is lower case. */ + + ret_val = 1; + s_copy(subnam, name__, (ftnlen)6, name_len); + ic = *(unsigned char *)subnam; + iz = 'Z'; + if (iz == 90 || iz == 122) { + +/* ASCII character set */ + + if (ic >= 97 && ic <= 122) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 97 && ic <= 122) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } +/* L10: */ + } + } + + } else if (iz == 233 || iz == 169) { + +/* EBCDIC character set */ + + if ((ic >= 129 && ic <= 137) || (ic >= 145 && ic <= 153) || (ic >= 162 && + ic <= 169)) { + *(unsigned char *)subnam = (char) (ic + 64); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if ((ic >= 129 && ic <= 137) || (ic >= 145 && ic <= 153) || (ic >= + 162 && ic <= 169)) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); + } +/* L20: */ + } + } + + } else if (iz == 218 || iz == 250) { + +/* Prime machines: ASCII+128 */ + + if (ic >= 225 && ic <= 250) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 225 && ic <= 250) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } +/* L30: */ + } + } + } + + *(unsigned char *)c1 = *(unsigned char *)subnam; + sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D'; + cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z'; + if (! (cname || sname)) { + return ret_val; + } + s_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2); + s_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3); + s_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2); + + switch (*ispec) { + case 1: goto L110; + case 2: goto L200; + case 3: goto L300; + } + +L110: + +/* + ISPEC = 1: block size + + In these examples, separate code is provided for setting NB for + real and complex. We assume that NB will take the same value in + single or double precision. +*/ + + nb = 1; + + if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, + "RQF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen) + 3, (ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) + == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, "PO", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nb = 32; + } else if (sname && s_cmp(c3, "GST", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } + } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } else if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nb = 32; + } else if (s_cmp(c3, "GST", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } + } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } + } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } + } else if (s_cmp(c2, "GB", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (*n4 <= 64) { + nb = 1; + } else { + nb = 32; + } + } else { + if (*n4 <= 64) { + nb = 1; + } else { + nb = 32; + } + } + } + } else if (s_cmp(c2, "PB", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (*n2 <= 64) { + nb = 1; + } else { + nb = 32; + } + } else { + if (*n2 <= 64) { + nb = 1; + } else { + nb = 32; + } + } + } + } else if (s_cmp(c2, "TR", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, "LA", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "UUM", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (sname && s_cmp(c2, "ST", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "EBZ", (ftnlen)3, (ftnlen)3) == 0) { + nb = 1; + } + } + ret_val = nb; + return ret_val; + +L200: + +/* ISPEC = 2: minimum block size */ + + nbmin = 2; + if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) + { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } + } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 8; + } else { + nbmin = 8; + } + } else if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } + } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } + } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } + } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } + } + ret_val = nbmin; + return ret_val; + +L300: + +/* ISPEC = 3: crossover point */ + + nx = 0; + if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) + { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } + } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { + if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nx = 32; + } + } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nx = 32; + } + } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + } + } + } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + } + } + } + ret_val = nx; + return ret_val; + +L400: + +/* ISPEC = 4: number of shifts (used by xHSEQR) */ + + ret_val = 6; + return ret_val; + +L500: + +/* ISPEC = 5: minimum column dimension (not used) */ + + ret_val = 2; + return ret_val; + +L600: + +/* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) */ + + ret_val = (integer) ((real) min(*n1,*n2) * 1.6f); + return ret_val; + +L700: + +/* ISPEC = 7: number of processors (not used) */ + + ret_val = 1; + return ret_val; + +L800: + +/* ISPEC = 8: crossover point for multishift (used by xHSEQR) */ + + ret_val = 50; + return ret_val; + +L900: + +/* + ISPEC = 9: maximum size of the subproblems at the bottom of the + computation tree in the divide-and-conquer algorithm + (used by xGELSD and xGESDD) +*/ + + ret_val = 25; + return ret_val; + +L1000: + +/* + ISPEC = 10: ieee NaN arithmetic can be trusted not to trap + + ILAENV = 0 +*/ + ret_val = 1; + if (ret_val == 1) { + ret_val = ieeeck_(&c__0, &c_b163, &c_b164); + } + return ret_val; + +L1100: + +/* + ISPEC = 11: infinity arithmetic can be trusted not to trap + + ILAENV = 0 +*/ + ret_val = 1; + if (ret_val == 1) { + ret_val = ieeeck_(&c__1, &c_b163, &c_b164); + } + return ret_val; + +/* End of ILAENV */ + +} /* ilaenv_ */ + +/* Subroutine */ int sposv_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + + /* Local variables */ + extern logical lsame_(char *, char *); + extern /* Subroutine */ int xerbla_(char *, integer *), spotrf_( + char *, integer *, real *, integer *, integer *), spotrs_( + char *, integer *, integer *, real *, integer *, real *, integer * + , integer *); + + +/* + -- LAPACK driver routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + March 31, 1993 + + + Purpose + ======= + + SPOSV computes the solution to a real system of linear equations + A * X = B, + where A is an N-by-N symmetric positive definite matrix and X and B + are N-by-NRHS matrices. + + The Cholesky decomposition is used to factor A as + A = U**T* U, if UPLO = 'U', or + A = L * L**T, if UPLO = 'L', + where U is an upper triangular matrix and L is a lower triangular + matrix. The factored form of A is then used to solve the system of + equations A * X = B. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + = 'U': Upper triangle of A is stored; + = 'L': Lower triangle of A is stored. + + N (input) INTEGER + The number of linear equations, i.e., the order of the + matrix A. N >= 0. + + NRHS (input) INTEGER + The number of right hand sides, i.e., the number of columns + of the matrix B. NRHS >= 0. + + A (input/output) REAL array, dimension (LDA,N) + On entry, the symmetric matrix A. If UPLO = 'U', the leading + N-by-N upper triangular part of A contains the upper + triangular part of the matrix A, and the strictly lower + triangular part of A is not referenced. If UPLO = 'L', the + leading N-by-N lower triangular part of A contains the lower + triangular part of the matrix A, and the strictly upper + triangular part of A is not referenced. + + On exit, if INFO = 0, the factor U or L from the Cholesky + factorization A = U**T*U or A = L*L**T. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + B (input/output) REAL array, dimension (LDB,NRHS) + On entry, the N-by-NRHS right hand side matrix B. + On exit, if INFO = 0, the N-by-NRHS solution matrix X. + + LDB (input) INTEGER + The leading dimension of the array B. LDB >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -i, the i-th argument had an illegal value + > 0: if INFO = i, the leading minor of order i of A is not + positive definite, so the factorization could not be + completed, and the solution has not been computed. + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + if (! lsame_(uplo, "U") && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOSV ", &i__1); + return 0; + } + +/* Compute the Cholesky factorization A = U'*U or A = L*L'. */ + + spotrf_(uplo, n, &a[a_offset], lda, info); + if (*info == 0) { + +/* Solve the system A*X = B, overwriting B with X. */ + + spotrs_(uplo, n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info); + + } + return 0; + +/* End of SPOSV */ + +} /* sposv_ */ + +/* Subroutine */ int spotf2_(char *uplo, integer *n, real *a, integer *lda, + integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + real r__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + static integer j; + static real ajj; + extern doublereal sdot_(integer *, real *, integer *, real *, integer *); + extern logical lsame_(char *, char *); + extern /* Subroutine */ int sscal_(integer *, real *, real *, integer *), + sgemv_(char *, integer *, integer *, real *, real *, integer *, + real *, integer *, real *, real *, integer *); + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + -- LAPACK routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + February 29, 1992 + + + Purpose + ======= + + SPOTF2 computes the Cholesky factorization of a real symmetric + positive definite matrix A. + + The factorization has the form + A = U' * U , if UPLO = 'U', or + A = L * L', if UPLO = 'L', + where U is an upper triangular matrix and L is lower triangular. + + This is the unblocked version of the algorithm, calling Level 2 BLAS. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + Specifies whether the upper or lower triangular part of the + symmetric matrix A is stored. + = 'U': Upper triangular + = 'L': Lower triangular + + N (input) INTEGER + The order of the matrix A. N >= 0. + + A (input/output) REAL array, dimension (LDA,N) + On entry, the symmetric matrix A. If UPLO = 'U', the leading + n by n upper triangular part of A contains the upper + triangular part of the matrix A, and the strictly lower + triangular part of A is not referenced. If UPLO = 'L', the + leading n by n lower triangular part of A contains the lower + triangular part of the matrix A, and the strictly upper + triangular part of A is not referenced. + + On exit, if INFO = 0, the factor U or L from the Cholesky + factorization A = U'*U or A = L*L'. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -k, the k-th argument had an illegal value + > 0: if INFO = k, the leading minor of order k is not + positive definite, and the factorization could not be + completed. + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, "U"); + if (! upper && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOTF2", &i__1); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (upper) { + +/* Compute the Cholesky factorization A = U'*U. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + +/* Compute U(J,J) and test for non-positive-definiteness. */ + + i__2 = j - 1; + ajj = a[j + j * a_dim1] - sdot_(&i__2, &a[j * a_dim1 + 1], &c__1, + &a[j * a_dim1 + 1], &c__1); + if (ajj <= 0.f) { + a[j + j * a_dim1] = ajj; + goto L30; + } + ajj = sqrt(ajj); + a[j + j * a_dim1] = ajj; + +/* Compute elements J+1:N of row J. */ + + if (j < *n) { + i__2 = j - 1; + i__3 = *n - j; + sgemv_("Transpose", &i__2, &i__3, &c_b181, &a[(j + 1) * + a_dim1 + 1], lda, &a[j * a_dim1 + 1], &c__1, &c_b164, + &a[j + (j + 1) * a_dim1], lda); + i__2 = *n - j; + r__1 = 1.f / ajj; + sscal_(&i__2, &r__1, &a[j + (j + 1) * a_dim1], lda); + } +/* L10: */ + } + } else { + +/* Compute the Cholesky factorization A = L*L'. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + +/* Compute L(J,J) and test for non-positive-definiteness. */ + + i__2 = j - 1; + ajj = a[j + j * a_dim1] - sdot_(&i__2, &a[j + a_dim1], lda, &a[j + + a_dim1], lda); + if (ajj <= 0.f) { + a[j + j * a_dim1] = ajj; + goto L30; + } + ajj = sqrt(ajj); + a[j + j * a_dim1] = ajj; + +/* Compute elements J+1:N of column J. */ + + if (j < *n) { + i__2 = *n - j; + i__3 = j - 1; + sgemv_("No transpose", &i__2, &i__3, &c_b181, &a[j + 1 + + a_dim1], lda, &a[j + a_dim1], lda, &c_b164, &a[j + 1 + + j * a_dim1], &c__1); + i__2 = *n - j; + r__1 = 1.f / ajj; + sscal_(&i__2, &r__1, &a[j + 1 + j * a_dim1], &c__1); + } +/* L20: */ + } + } + goto L40; + +L30: + *info = j; + +L40: + return 0; + +/* End of SPOTF2 */ + +} /* spotf2_ */ + +/* Subroutine */ int spotrf_(char *uplo, integer *n, real *a, integer *lda, + integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + static integer j, jb, nb; + extern logical lsame_(char *, char *); + extern /* Subroutine */ int sgemm_(char *, char *, integer *, integer *, + integer *, real *, real *, integer *, real *, integer *, real *, + real *, integer *); + static logical upper; + extern /* Subroutine */ int strsm_(char *, char *, char *, char *, + integer *, integer *, real *, real *, integer *, real *, integer * + ), ssyrk_(char *, char *, integer + *, integer *, real *, real *, integer *, real *, real *, integer * + ), spotf2_(char *, integer *, real *, integer *, + integer *), xerbla_(char *, integer *); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + + +/* + -- LAPACK routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + March 31, 1993 + + + Purpose + ======= + + SPOTRF computes the Cholesky factorization of a real symmetric + positive definite matrix A. + + The factorization has the form + A = U**T * U, if UPLO = 'U', or + A = L * L**T, if UPLO = 'L', + where U is an upper triangular matrix and L is lower triangular. + + This is the block version of the algorithm, calling Level 3 BLAS. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + = 'U': Upper triangle of A is stored; + = 'L': Lower triangle of A is stored. + + N (input) INTEGER + The order of the matrix A. N >= 0. + + A (input/output) REAL array, dimension (LDA,N) + On entry, the symmetric matrix A. If UPLO = 'U', the leading + N-by-N upper triangular part of A contains the upper + triangular part of the matrix A, and the strictly lower + triangular part of A is not referenced. If UPLO = 'L', the + leading N-by-N lower triangular part of A contains the lower + triangular part of the matrix A, and the strictly upper + triangular part of A is not referenced. + + On exit, if INFO = 0, the factor U or L from the Cholesky + factorization A = U**T*U or A = L*L**T. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -i, the i-th argument had an illegal value + > 0: if INFO = i, the leading minor of order i is not + positive definite, and the factorization could not be + completed. + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, "U"); + if (! upper && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOTRF", &i__1); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Determine the block size for this environment. */ + + nb = ilaenv_(&c__1, "SPOTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( + ftnlen)1); + if (nb <= 1 || nb >= *n) { + +/* Use unblocked code. */ + + spotf2_(uplo, n, &a[a_offset], lda, info); + } else { + +/* Use blocked code. */ + + if (upper) { + +/* Compute the Cholesky factorization A = U'*U. */ + + i__1 = *n; + i__2 = nb; + for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + +/* + Update and factorize the current diagonal block and test + for non-positive-definiteness. + + Computing MIN +*/ + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3,i__4); + i__3 = j - 1; + ssyrk_("Upper", "Transpose", &jb, &i__3, &c_b181, &a[j * + a_dim1 + 1], lda, &c_b164, &a[j + j * a_dim1], lda); + spotf2_("Upper", &jb, &a[j + j * a_dim1], lda, info); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { + +/* Compute the current block row. */ + + i__3 = *n - j - jb + 1; + i__4 = j - 1; + sgemm_("Transpose", "No transpose", &jb, &i__3, &i__4, & + c_b181, &a[j * a_dim1 + 1], lda, &a[(j + jb) * + a_dim1 + 1], lda, &c_b164, &a[j + (j + jb) * + a_dim1], lda); + i__3 = *n - j - jb + 1; + strsm_("Left", "Upper", "Transpose", "Non-unit", &jb, & + i__3, &c_b164, &a[j + j * a_dim1], lda, &a[j + (j + + jb) * a_dim1], lda); + } +/* L10: */ + } + + } else { + +/* Compute the Cholesky factorization A = L*L'. */ + + i__2 = *n; + i__1 = nb; + for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + +/* + Update and factorize the current diagonal block and test + for non-positive-definiteness. + + Computing MIN +*/ + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3,i__4); + i__3 = j - 1; + ssyrk_("Lower", "No transpose", &jb, &i__3, &c_b181, &a[j + + a_dim1], lda, &c_b164, &a[j + j * a_dim1], lda); + spotf2_("Lower", &jb, &a[j + j * a_dim1], lda, info); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { + +/* Compute the current block column. */ + + i__3 = *n - j - jb + 1; + i__4 = j - 1; + sgemm_("No transpose", "Transpose", &i__3, &jb, &i__4, & + c_b181, &a[j + jb + a_dim1], lda, &a[j + a_dim1], + lda, &c_b164, &a[j + jb + j * a_dim1], lda); + i__3 = *n - j - jb + 1; + strsm_("Right", "Lower", "Transpose", "Non-unit", &i__3, & + jb, &c_b164, &a[j + j * a_dim1], lda, &a[j + jb + + j * a_dim1], lda); + } +/* L20: */ + } + } + } + goto L40; + +L30: + *info = *info + j - 1; + +L40: + return 0; + +/* End of SPOTRF */ + +} /* spotrf_ */ + +/* Subroutine */ int spotrs_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + + /* Local variables */ + extern logical lsame_(char *, char *); + static logical upper; + extern /* Subroutine */ int strsm_(char *, char *, char *, char *, + integer *, integer *, real *, real *, integer *, real *, integer * + ), xerbla_(char *, integer *); + + +/* + -- LAPACK routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + March 31, 1993 + + + Purpose + ======= + + SPOTRS solves a system of linear equations A*X = B with a symmetric + positive definite matrix A using the Cholesky factorization + A = U**T*U or A = L*L**T computed by SPOTRF. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + = 'U': Upper triangle of A is stored; + = 'L': Lower triangle of A is stored. + + N (input) INTEGER + The order of the matrix A. N >= 0. + + NRHS (input) INTEGER + The number of right hand sides, i.e., the number of columns + of the matrix B. NRHS >= 0. + + A (input) REAL array, dimension (LDA,N) + The triangular factor U or L from the Cholesky factorization + A = U**T*U or A = L*L**T, as computed by SPOTRF. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + B (input/output) REAL array, dimension (LDB,NRHS) + On entry, the right hand side matrix B. + On exit, the solution matrix X. + + LDB (input) INTEGER + The leading dimension of the array B. LDB >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -i, the i-th argument had an illegal value + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, "U"); + if (! upper && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOTRS", &i__1); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0 || *nrhs == 0) { + return 0; + } + + if (upper) { + +/* + Solve A*X = B where A = U'*U. + + Solve U'*X = B, overwriting B with X. +*/ + + strsm_("Left", "Upper", "Transpose", "Non-unit", n, nrhs, &c_b164, &a[ + a_offset], lda, &b[b_offset], ldb); + +/* Solve U*X = B, overwriting B with X. */ + + strsm_("Left", "Upper", "No transpose", "Non-unit", n, nrhs, &c_b164, + &a[a_offset], lda, &b[b_offset], ldb); + } else { + +/* + Solve A*X = B where A = L*L'. + + Solve L*X = B, overwriting B with X. +*/ + + strsm_("Left", "Lower", "No transpose", "Non-unit", n, nrhs, &c_b164, + &a[a_offset], lda, &b[b_offset], ldb); + +/* Solve L'*X = B, overwriting B with X. */ + + strsm_("Left", "Lower", "Transpose", "Non-unit", n, nrhs, &c_b164, &a[ + a_offset], lda, &b[b_offset], ldb); + } + + return 0; + +/* End of SPOTRS */ + +} /* spotrs_ */ + diff --git a/src/libsphinxbase/util/strfuncs.c b/src/libsphinxbase/util/strfuncs.c new file mode 100644 index 000000000..4d2d72ffc --- /dev/null +++ b/src/libsphinxbase/util/strfuncs.c @@ -0,0 +1,194 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * strfuncs.c -- String functions + */ + + +#include +#include +#include +#include +#include + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/strfuncs.h" + +/* Defined in dtoa.c */ +double sb_strtod(const char *s00, char **se); + +double +atof_c(char const *str) +{ + return sb_strtod(str, NULL); +} + +/* Locale-independent isspace to avoid different incompatibilities */ +static int +isspace_c(char ch) +{ + if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') + return 1; + return 0; +} + +char * +string_join(const char *base, ...) +{ + va_list args; + size_t len; + const char *c; + char *out; + + va_start(args, base); + len = strlen(base); + while ((c = va_arg(args, const char *)) != NULL) { + len += strlen(c); + } + len++; + va_end(args); + + out = ckd_calloc(len, 1); + va_start(args, base); + strcpy(out, base); + while ((c = va_arg(args, const char *)) != NULL) { + strcat(out, c); + } + va_end(args); + + return out; +} + +char * +string_trim(char *string, enum string_edge_e which) +{ + size_t len; + + len = strlen(string); + if (which == STRING_START || which == STRING_BOTH) { + size_t sub = strspn(string, " \t\n\r\f"); + if (sub > 0) { + memmove(string, string + sub, len + 1 - sub); + len -= sub; + } + } + if (which == STRING_END || which == STRING_BOTH) { + long sub = len; + while (--sub >= 0) + if (strchr(" \t\n\r\f", string[sub]) == NULL) + break; + if (sub == -1) + string[0] = '\0'; + else + string[sub+1] = '\0'; + } + return string; +} + +int32 +str2words(char *line, char **ptr, int32 max_ptr) +{ + int32 i, n; + + n = 0; /* #words found so far */ + i = 0; /* For scanning through the input string */ + while (1) { + /* Skip whitespace before next word */ + while (line[i] && isspace_c(line[i])) + ++i; + if (!line[i]) + break; + + if (ptr != NULL && n >= max_ptr) { + /* + * Pointer array size insufficient. Restore NULL chars inserted so far + * to space chars. Not a perfect restoration, but better than nothing. + */ + for (; i >= 0; --i) + if (line[i] == '\0') + line[i] = ' '; + + return -1; + } + + /* Scan to end of word */ + if (ptr != NULL) + ptr[n] = line + i; + ++n; + while (line[i] && !isspace_c(line[i])) + ++i; + if (!line[i]) + break; + if (ptr != NULL) + line[i] = '\0'; + ++i; + } + + return n; +} + + +int32 +nextword(char *line, const char *delim, char **word, char *delimfound) +{ + const char *d; + char *w; + + /* Skip past any preceding delimiters */ + for (w = line; *w; w++) { + for (d = delim; *d && (*d != *w); d++); + if (!*d) + break; + } + if (!*w) + return -1; + + *word = w; /* Beginning of word */ + + /* Skip until first delimiter char */ + for (w++; *w; w++) { + for (d = delim; *d && (*d != *w); d++); + if (*d) + break; + } + + /* Replace delimiter with NULL char, but return the original first */ + *delimfound = *w; + *w = '\0'; + + return (w - *word); +} diff --git a/src/libsphinxbase/util/wrapped_routines b/src/libsphinxbase/util/wrapped_routines new file mode 100644 index 000000000..d78c8db2c --- /dev/null +++ b/src/libsphinxbase/util/wrapped_routines @@ -0,0 +1,4 @@ +ssymm +sposv +spotrf +IGNORE: slamch diff --git a/src/sphinx_adtools/Makefile.am b/src/sphinx_adtools/Makefile.am new file mode 100644 index 000000000..3b9193174 --- /dev/null +++ b/src/sphinx_adtools/Makefile.am @@ -0,0 +1,8 @@ +bin_PROGRAMS = sphinx_pitch sphinx_cont_seg + +sphinx_cont_seg_SOURCES = cont_seg.c + +LDADD = $(top_builddir)/src/libsphinxbase/libsphinxbase.la \ + $(top_builddir)/src/libsphinxad/libsphinxad.la + +AM_CFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include diff --git a/src/sphinx_adtools/cont_seg.c b/src/sphinx_adtools/cont_seg.c new file mode 100644 index 000000000..7589bad3b --- /dev/null +++ b/src/sphinx_adtools/cont_seg.c @@ -0,0 +1,312 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cont_seg.c -- Continuously listen and segment input speech into utterances. + * + * HISTORY + * + * 05-Nov-13 Created from adseg and fileseg + * + */ + +#include +#include +#include +#include +#include + +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +#else +#include +#endif + +#include +#include +#include +#include +#include +#include + +#define BLOCKSIZE 1024 + +static const arg_t cont_args_def[] = { + waveform_to_cepstral_command_line_macro(), + /* Argument file. */ + {"-argfile", + ARG_STRING, + NULL, + "Argument file giving extra arguments."}, + {"-adcdev", + ARG_STRING, + NULL, + "Name of audio device to use for input."}, + {"-inmic", + ARG_BOOLEAN, + "no", + "Transcribe audio from microphone."}, + {"-infile", + ARG_STRING, + NULL, + "Name of audio file to use for input."}, + {"-singlefile", + ARG_BOOLEAN, + FALSE, + "Write a single cleaned file."}, + {NULL, 0, NULL, NULL} +}; + +static fe_t *fe; +static cmd_ln_t *config; +static int (*read_audio) (int16 * buf, int len); +static ad_rec_t *ad; +static const char *infile_path; +static FILE *infile; +static int32 singlefile; + +/* Sleep for specified msec */ +static void +sleep_msec(int32 ms) +{ +#if (defined(_WIN32) && !defined(GNUWINCE)) || defined(_WIN32_WCE) + Sleep(ms); +#else + /* ------------------- Unix ------------------ */ + struct timeval tmo; + + tmo.tv_sec = 0; + tmo.tv_usec = ms * 1000; + + select(0, NULL, NULL, NULL, &tmo); +#endif +} + +static int +read_audio_file(int16 * buf, int len) +{ + if (!infile) { + E_FATAL("Failed to read audio from file\n"); + return -1; + } + return fread(buf, sizeof(int16), len, infile); +} + +static int +read_audio_adev(int16 * buf, int len) +{ + int k; + + if (!ad) { + E_FATAL("Failed to read audio from mic\n"); + return -1; + } + while ((k = ad_read(ad, buf, len)) == 0) + /* wait until something is read */ + sleep_msec(50); + + return k; +} + +void +segment_audio() +{ + FILE *file; + int16 pcm_buf[BLOCKSIZE]; + mfcc_t **cep_buf; + int16 *voiced_buf = NULL; + int32 voiced_nsamps, out_frameidx, uttstart = 0; + char file_name[1024]; + uint8 cur_vad_state, vad_state, writing; + int uttno, uttlen, sample_rate; + int32 nframes, nframes_tmp; + int16 frame_size, frame_shift, frame_rate; + size_t k; + + sample_rate = (int) cmd_ln_float32_r(config, "-samprate"); + frame_rate = cmd_ln_int32_r(config, "-frate"); + frame_size = + (int32) (cmd_ln_float32_r(config, "-wlen") * sample_rate + 0.5); + frame_shift = + (int32) (sample_rate / cmd_ln_int32_r(config, "-frate") + 0.5); + nframes = (BLOCKSIZE - frame_size) / frame_shift; + cep_buf = + (mfcc_t **) ckd_calloc_2d(nframes, fe_get_output_size(fe), + sizeof(mfcc_t)); + + uttno = 0; + uttlen = 0; + cur_vad_state = 0; + voiced_nsamps = 0; + writing = 0; + file = NULL; + fe_start_stream(fe); + fe_start_utt(fe); + while ((k = read_audio(pcm_buf, BLOCKSIZE)) > 0) { + int16 const *pcm_buf_tmp; + pcm_buf_tmp = &pcm_buf[0]; + while (k) { + nframes_tmp = nframes; + fe_process_frames_ext(fe, &pcm_buf_tmp, &k, cep_buf, + &nframes_tmp, voiced_buf, + &voiced_nsamps, &out_frameidx); + if (out_frameidx > 0) { + uttstart = out_frameidx; + } + vad_state = fe_get_vad_state(fe); + if (!cur_vad_state && vad_state) { + /* silence->speech transition, time to start new file */ + uttno++; + if (!singlefile) { + sprintf(file_name, "%s%04d.raw", infile_path, uttno); + if ((file = fopen(file_name, "wb")) == NULL) + E_FATAL_SYSTEM("Failed to open '%s' for writing", + file_name); + } else { + sprintf(file_name, "%s.raw", infile_path); + if ((file = fopen(file_name, "ab")) == NULL) + E_FATAL_SYSTEM("Failed to open '%s' for writing", + file_name); + } + writing = 1; + } + + if (writing && file && voiced_nsamps > 0) { + fwrite(voiced_buf, sizeof(int16), voiced_nsamps, file); + uttlen += voiced_nsamps; + } + + if (cur_vad_state && !vad_state) { + /* speech -> silence transition, time to finish file */ + fclose(file); + printf("Utterance %04d: file %s start %.1f sec length %d samples ( %.2f sec )\n", + uttno, + file_name, + ((double) uttstart) / frame_rate, + uttlen, + ((double) uttlen) / sample_rate); + fflush(stdout); + fe_end_utt(fe, cep_buf[0], &nframes_tmp); + writing = 0; + uttlen = 0; + voiced_nsamps = 0; + fe_start_utt(fe); + } + cur_vad_state = vad_state; + } + } + + if (writing) { + fclose(file); + printf("Utterance %04d: file %s start %.1f sec length %d samples ( %.2f sec )\n", + uttno, + file_name, + ((double) uttstart) / frame_rate, + uttlen, + ((double) uttlen) / sample_rate); + fflush(stdout); + } + fe_end_utt(fe, cep_buf[0], &nframes); + ckd_free_2d(cep_buf); +} + +int +main(int argc, char *argv[]) +{ + int i; + int16 buf[2048]; + + config = cmd_ln_parse_r(NULL, cont_args_def, argc, argv, TRUE); + + if (config && cmd_ln_str_r(config, "-argfile")) + config = cmd_ln_parse_file_r(config, cont_args_def, + cmd_ln_str_r(config, "-argfile"), FALSE); + + if (config == NULL || (cmd_ln_str_r(config, "-infile") == NULL && cmd_ln_boolean_r(config, "-inmic") == FALSE)) { + E_INFO("Specify '-infile ' to segment a file or '-inmic yes' to segment audio from microphone.\n"); + cmd_ln_free_r(config); + return 1; + } + + + singlefile = cmd_ln_boolean_r(config, "-singlefile"); + if ((infile_path = cmd_ln_str_r(config, "-infile")) != NULL) { + if ((infile = fopen(infile_path, "rb")) == NULL) { + E_FATAL_SYSTEM("Failed to read audio from '%s'", infile_path); + return 1; + } + read_audio = &read_audio_file; + /* skip wav header */ + read_audio(buf, 44); + } + else if cmd_ln_boolean_r(config, "-inmic") { + if ((ad = ad_open_dev(cmd_ln_str_r(config, "-adcdev"), + (int) cmd_ln_float32_r(config, + "-samprate"))) == + NULL) { + E_FATAL("Failed to open audio device\n"); + return 1; + } + read_audio = &read_audio_adev; + printf("Start recording ...\n"); + fflush(stdout); + if (ad_start_rec(ad) < 0) + E_FATAL("Failed to start recording\n"); + + /* TODO remove this thing */ + for (i = 0; i < 5; i++) { + sleep_msec(200); + read_audio(buf, 2048); + } + printf("You may speak now\n"); + fflush(stdout); + } + + fe = fe_init_auto_r(config); + if (fe == NULL) + return 1; + + segment_audio(); + + if (ad) + ad_close(ad); + if (infile) + fclose(infile); + + fe_free(fe); + cmd_ln_free_r(config); + return 0; +} diff --git a/src/sphinx_adtools/sphinx_pitch.c b/src/sphinx_adtools/sphinx_pitch.c new file mode 100644 index 000000000..381958072 --- /dev/null +++ b/src/sphinx_adtools/sphinx_pitch.c @@ -0,0 +1,578 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +static arg_t defn[] = { + { "-i", + ARG_STRING, + NULL, + "Single audio input file" }, + + { "-o", + ARG_STRING, + NULL, + "Single text output file (standard output will be used if not given)" }, + + { "-c", + ARG_STRING, + NULL, + "Control file for batch processing" }, + + { "-nskip", + ARG_INT32, + "0", + "If a control file was specified, the number of utterances to skip at the head of the file" }, + + { "-runlen", + ARG_INT32, + "-1", + "If a control file was specified, the number of utterances to process (see -nskip too)" }, + + { "-di", + ARG_STRING, + NULL, + "Input directory, input file names are relative to this, if defined" }, + + { "-ei", + ARG_STRING, + NULL, + "Input extension to be applied to all input files" }, + + { "-do", + ARG_STRING, + NULL, + "Output directory, output files are relative to this" }, + + { "-eo", + ARG_STRING, + NULL, + "Output extension to be applied to all output files" }, + + { "-nist", + ARG_BOOLEAN, + "no", + "Defines input format as NIST sphere" }, + + { "-raw", + ARG_BOOLEAN, + "no", + "Defines input format as raw binary data" }, + + { "-mswav", + ARG_BOOLEAN, + "no", + "Defines input format as Microsoft Wav (RIFF)" }, + + { "-samprate", + ARG_INT32, + "0", + "Sampling rate of audio data (will be determined automatically if 0)" }, + + { "-input_endian", + ARG_STRING, + NULL, + "Endianness of audio data (will be determined automatically if not given)" }, + + { "-fshift", + ARG_FLOAT32, + "0.01", + "Frame shift: number of seconds between each analysis frame." }, + + { "-flen", + ARG_FLOAT32, + "0.025", + "Number of seconds in each analysis frame (needs to be greater than twice the longest period you wish to detect - to detect down to 80Hz you need a frame length of 2.0/80 = 0.025)." }, + + { "-smooth_window", + ARG_INT32, + "2", + "Number of frames on either side of the current frame to use for smoothing." }, + + { "-voice_thresh", + ARG_FLOAT32, + "0.1", + "Threshold of normalized difference under which to search for the fundamental period." }, + + { "-search_range", + ARG_FLOAT32, + "0.2", + "Fraction of the best local estimate to use as a search range for smoothing." }, + + { NULL, 0, NULL, NULL } +}; + +static int extract_pitch(const char *in, const char *out); +static int run_control_file(const char *ctl); + +int +main(int argc, char *argv[]) +{ + cmd_ln_parse(defn, argc, argv, TRUE); + + /* Run a control file if requested. */ + if (cmd_ln_str("-c")) { + if (run_control_file(cmd_ln_str("-c")) < 0) + return 1; + } + else { + if (extract_pitch(cmd_ln_str("-i"), cmd_ln_str("-o")) < 0) + return 1; + } + + cmd_ln_free(); + return 0; +} + +static int +guess_file_type(char const *file, FILE *infh) +{ + char header[4]; + + fseek(infh, 0, SEEK_SET); + if (fread(header, 1, 4, infh) != 4) { + E_ERROR_SYSTEM("Failed to read 4 byte header"); + return -1; + } + if (0 == memcmp(header, "RIFF", 4)) { + E_INFO("%s appears to be a WAV file\n", file); + cmd_ln_set_boolean("-mswav", TRUE); + cmd_ln_set_boolean("-nist", FALSE); + cmd_ln_set_boolean("-raw", FALSE); + } + else if (0 == memcmp(header, "NIST", 4)) { + E_INFO("%s appears to be a NIST SPHERE file\n", file); + cmd_ln_set_boolean("-mswav", FALSE); + cmd_ln_set_boolean("-nist", TRUE); + cmd_ln_set_boolean("-raw", FALSE); + } + else { + E_INFO("%s appears to be raw data\n", file); + cmd_ln_set_boolean("-mswav", FALSE); + cmd_ln_set_boolean("-nist", FALSE); + cmd_ln_set_boolean("-raw", TRUE); + } + fseek(infh, 0, SEEK_SET); + return 0; +} + +#define TRY_FREAD(ptr, size, nmemb, stream) \ + if (fread(ptr, size, nmemb, stream) != (nmemb)) { \ + E_ERROR_SYSTEM("Failed to read %d bytes", size * nmemb); \ + goto error_out; \ + } + +static int +read_riff_header(FILE *infh) +{ + char id[4]; + int32 intval, header_len; + int16 shortval; + + /* RIFF files are little-endian by definition. */ + cmd_ln_set_str("-input_endian", "little"); + + /* Read in all the header chunks and etcetera. */ + TRY_FREAD(id, 1, 4, infh); + /* Total file length (we don't care) */ + TRY_FREAD(&intval, 4, 1, infh); + /* 'WAVE' */ + TRY_FREAD(id, 1, 4, infh); + if (0 != memcmp(id, "WAVE", 4)) { + E_ERROR("This is not a WAVE file\n"); + goto error_out; + } + /* 'fmt ' */ + TRY_FREAD(id, 1, 4, infh); + if (0 != memcmp(id, "fmt ", 4)) { + E_ERROR("Format chunk missing\n"); + goto error_out; + } + /* Length of 'fmt ' chunk */ + TRY_FREAD(&intval, 4, 1, infh); + SWAP_LE_32(&intval); + header_len = intval; + + /* Data format. */ + TRY_FREAD(&shortval, 2, 1, infh); + SWAP_LE_16(&shortval); + if (shortval != 1) { /* PCM */ + E_ERROR("WAVE file is not in PCM format\n"); + goto error_out; + } + + /* Number of channels. */ + TRY_FREAD(&shortval, 2, 1, infh); + SWAP_LE_16(&shortval); + if (shortval != 1) { /* PCM */ + E_ERROR("WAVE file is not single channel\n"); + goto error_out; + } + + /* Sampling rate (finally!) */ + TRY_FREAD(&intval, 4, 1, infh); + SWAP_LE_32(&intval); + if (cmd_ln_int32("-samprate") == 0) + cmd_ln_set_int32("-samprate", intval); + else if (cmd_ln_int32("-samprate") != intval) { + E_WARN("WAVE file sampling rate %d != -samprate %d\n", + intval, cmd_ln_int32("-samprate")); + } + + /* Average bytes per second (we don't care) */ + TRY_FREAD(&intval, 4, 1, infh); + + /* Block alignment (we don't care) */ + TRY_FREAD(&shortval, 2, 1, infh); + + /* Bits per sample (must be 16) */ + TRY_FREAD(&shortval, 2, 1, infh); + SWAP_LE_16(&shortval); + if (shortval != 16) { + E_ERROR("WAVE file is not 16-bit\n"); + goto error_out; + } + + /* Any extra parameters. */ + if (header_len > 16) + fseek(infh, header_len - 16, SEEK_CUR); + + /* Now skip to the 'data' chunk. */ + while (1) { + TRY_FREAD(id, 1, 4, infh); + if (0 == memcmp(id, "data", 4)) { + /* Total number of bytes of data (we don't care). */ + TRY_FREAD(&intval, 4, 1, infh); + break; + } + else { + /* Some other stuff... */ + /* Number of bytes of ... whatever */ + TRY_FREAD(&intval, 4, 1, infh); + SWAP_LE_32(&intval); + fseek(infh, intval, SEEK_CUR); + } + } + + /* We are ready to rumble. */ + return 0; +error_out: + return -1; +} + +static int +read_nist_header(FILE *infh) +{ + char hdr[1024]; + char *line, *c; + + TRY_FREAD(hdr, 1, 1024, infh); + hdr[1023] = '\0'; + + /* Roughly parse it to find the sampling rate and byte order + * (don't bother with other stuff) */ + if ((line = strstr(hdr, "sample_rate")) == NULL) { + E_ERROR("No sampling rate in NIST header!\n"); + goto error_out; + } + c = strchr(line, '\n'); + if (c) *c = '\0'; + c = strrchr(line, ' '); + if (c == NULL) { + E_ERROR("Could not find sampling rate!\n"); + goto error_out; + } + ++c; + if (cmd_ln_int32("-samprate") == 0) + cmd_ln_set_int32("-samprate", atoi(c)); + else if (cmd_ln_int32("-samprate") != atoi(c)) { + E_WARN("NIST file sampling rate %d != -samprate %d\n", + atoi(c), cmd_ln_int32("-samprate")); + } + + if (line + strlen(line) < hdr + 1023) + line[strlen(line)] = ' '; + if ((line = strstr(hdr, "sample_byte_format")) == NULL) { + E_ERROR("No sample byte format in NIST header!\n"); + goto error_out; + } + c = strchr(line, '\n'); + if (c) *c = '\0'; + c = strrchr(line, ' '); + if (c == NULL) { + E_ERROR("Could not find sample byte order!\n"); + goto error_out; + } + ++c; + if (0 == memcmp(c, "01", 2)) { + cmd_ln_set_str("-input_endian", "little"); + } + else if (0 == memcmp(c, "10", 2)) { + cmd_ln_set_str("-input_endian", "big"); + } + else { + E_ERROR("Unknown byte order %s\n", c); + goto error_out; + } + + /* We are ready to rumble. */ + return 0; +error_out: + return -1; +} + +static int +extract_pitch(const char *in, const char *out) +{ + FILE *infh = NULL, *outfh = NULL; + size_t flen, fshift, nsamps; + int16 *buf = NULL; + yin_t *yin = NULL; + uint16 period, bestdiff; + int32 sps; + + if (out) { + if ((outfh = fopen(out, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s for writing", out); + goto error_out; + } + } + else { + outfh = stdout; + } + if ((infh = fopen(in, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s for reading", in); + goto error_out; + } + + /* If we weren't told what the file type is, weakly try to + * determine it (actually it's pretty obvious) */ + if (!(cmd_ln_boolean("-raw") + || cmd_ln_boolean("-mswav") + || cmd_ln_boolean("-nist"))) { + if (guess_file_type(in, infh) < 0) + goto error_out; + } + + /* Grab the sampling rate and byte order from the header and also + * make sure this is 16-bit linear PCM. */ + if (cmd_ln_boolean("-mswav")) { + if (read_riff_header(infh) < 0) + goto error_out; + } + else if (cmd_ln_boolean("-nist")) { + if (read_nist_header(infh) < 0) + goto error_out; + } + else if (cmd_ln_boolean("-raw")) { + /* Just use some defaults for sampling rate and endian. */ + if (cmd_ln_str("-input_endian") == NULL) { + cmd_ln_set_str("-input_endian", "little"); + } + if (cmd_ln_int32("-samprate") == 0) + cmd_ln_set_int32("-samprate", 16000); + } + + /* Now read frames and write pitch estimates. */ + sps = cmd_ln_int32("-samprate"); + flen = (size_t)(0.5 + sps * cmd_ln_float32("-flen")); + fshift = (size_t)(0.5 + sps * cmd_ln_float32("-fshift")); + yin = yin_init(flen, cmd_ln_float32("-voice_thresh"), + cmd_ln_float32("-search_range"), + cmd_ln_int32("-smooth_window")); + if (yin == NULL) { + E_ERROR("Failed to initialize YIN\n"); + goto error_out; + } + buf = ckd_calloc(flen, sizeof(*buf)); + /* Read the first full frame of data. */ + if (fread(buf, sizeof(*buf), flen, infh) != flen) { + /* Fail silently, which is probably okay. */ + } + yin_start(yin); + nsamps = 0; + while (!feof(infh)) { + /* Process a frame of data. */ + yin_write(yin, buf); + if (yin_read(yin, &period, &bestdiff)) { + fprintf(outfh, "%.3f %.2f %.2f\n", + /* Time point. */ + (double)nsamps/sps, + /* "Probability" of voicing. */ + bestdiff > 32768 ? 0.0 : 1.0 - (double)bestdiff / 32768, + /* Pitch (possibly bogus) */ + period == 0 ? sps : (double)sps / period); + nsamps += fshift; + } + /* Shift it back and get the next frame's overlap. */ + memmove(buf, buf + fshift, (flen - fshift) * sizeof(*buf)); + if (fread(buf + flen - fshift, sizeof(*buf), fshift, infh) != fshift) { + /* Fail silently (FIXME: really?) */ + } + } + yin_end(yin); + /* Process trailing frames of data. */ + while (yin_read(yin, &period, &bestdiff)) { + fprintf(outfh, "%.3f %.2f %.2f\n", + /* Time point. */ + (double)nsamps/sps, + /* "Probability" of voicing. */ + bestdiff > 32768 ? 0.0 : 1.0 - (double)bestdiff / 32768, + /* Pitch (possibly bogus) */ + period == 0 ? sps : (double)sps / period); + } + + if (yin) + yin_free(yin); + ckd_free(buf); + fclose(infh); + if (outfh && outfh != stdout) + fclose(outfh); + return 0; + +error_out: + if (yin) + yin_free(yin); + ckd_free(buf); + if (infh) fclose(infh); + if (outfh && outfh != stdout) + fclose(outfh); + return -1; +} + +static int +run_control_file(const char *ctl) +{ + FILE *ctlfh; + char *line; + char *di, *dout, *ei, *eio; + size_t len; + int rv, guess_type, guess_sps, guess_endian; + int32 skip, runlen; + + skip = cmd_ln_int32("-nskip"); + runlen = cmd_ln_int32("-runlen"); + + /* Whether to guess file types */ + guess_type = !(cmd_ln_boolean("-raw") + || cmd_ln_boolean("-mswav") + || cmd_ln_boolean("-nist")); + /* Whether to guess sampling rate */ + guess_sps = (cmd_ln_int32("-samprate") == 0); + /* Whether to guess endian */ + guess_endian = (cmd_ln_str("-input_endian") == NULL); + + if ((ctlfh = fopen(ctl, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open control file %s", ctl); + return -1; + } + if (cmd_ln_str("-di")) + di = string_join(cmd_ln_str("-di"), "/", NULL); + else + di = ckd_salloc(""); + if (cmd_ln_str("-do")) + dout = string_join(cmd_ln_str("-do"), "/", NULL); + else + dout = ckd_salloc(""); + if (cmd_ln_str("-ei")) + ei = string_join(".", cmd_ln_str("-ei"), NULL); + else + ei = ckd_salloc(""); + if (cmd_ln_str("-eo")) + eio = string_join(".", cmd_ln_str("-eo"), NULL); + else + eio = ckd_salloc(""); + rv = 0; + while ((line = fread_line(ctlfh, &len)) != NULL) { + char *infile, *outfile; + + if (skip-- > 0) { + ckd_free(line); + continue; + } + if (runlen == 0) { + ckd_free(line); + break; + } + --runlen; + + if (line[len-1] == '\n') + line[len-1] = '\0'; + + infile = string_join(di, line, ei, NULL); + outfile = string_join(dout, line, eio, NULL); + + /* Reset various guessed information */ + if (guess_type) { + cmd_ln_set_boolean("-nist", FALSE); + cmd_ln_set_boolean("-mswav", FALSE); + cmd_ln_set_boolean("-raw", FALSE); + } + if (guess_sps) + cmd_ln_set_int32("-samprate", 0); + if (guess_endian) + cmd_ln_set_str("-input_endian", NULL); + + rv = extract_pitch(infile, outfile); + + ckd_free(infile); + ckd_free(outfile); + ckd_free(line); + + if (rv != 0) + break; + } + ckd_free(di); + ckd_free(dout); + ckd_free(ei); + ckd_free(eio); + fclose(ctlfh); + return rv; +} diff --git a/src/sphinx_cepview/Makefile.am b/src/sphinx_cepview/Makefile.am new file mode 100644 index 000000000..f0fdd8522 --- /dev/null +++ b/src/sphinx_cepview/Makefile.am @@ -0,0 +1,8 @@ +bin_PROGRAMS = sphinx_cepview + +sphinx_cepview_SOURCES = main_cepview.c + +sphinx_cepview_LDADD = \ + $(top_builddir)/src/libsphinxbase/libsphinxbase.la + +AM_CFLAGS =-I$(top_srcdir)/include -I$(top_builddir)/include diff --git a/src/sphinx_cepview/main_cepview.c b/src/sphinx_cepview/main_cepview.c new file mode 100644 index 000000000..36544d3c1 --- /dev/null +++ b/src/sphinx_cepview/main_cepview.c @@ -0,0 +1,287 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1994-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + */ + +#include +#include +#include + +#ifdef _WIN32 +#pragma warning (disable: 4996) +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +/** \file main_cepview.c + \brief Main driver of cepview + */ +#define IO_ERR (-1) +#define IO_SUCCESS (0) + +#define SHOW_ALL "-1" + +/* Default cepstral vector size */ +#define NUM_COEFF "13" + +/* Default display size, i.e., number of coefficients displayed, less + * than the vector size so we display one frame per line. + */ +#define DISPLAY_SIZE "10" +#define STR_MAX_INT "2147483647" + +static arg_t arg[] = { + {"-i", + ARG_INT32, + NUM_COEFF, + "Number of coefficients in the feature vector."}, + {"-d", + ARG_INT32, + DISPLAY_SIZE, + "Number of displayed coefficients."}, + {"-header", + ARG_INT32, + "0", + "Whether header is shown."}, + {"-describe", + ARG_INT32, + "0", + "Whether description will be shown."}, + {"-b", + ARG_INT32, + "0", + "The beginning frame 0-based."}, + {"-e", + ARG_INT32, + "2147483647", + "The ending frame."}, + {"-f", + ARG_STRING, + NULL, + "Input feature file."}, + {NULL, ARG_INT32, NULL, NULL} +}; + +int read_cep(char const *file, float ***cep, int *nframes, int numcep); + +int +main(int argc, char *argv[]) +{ + int i, j, offset; + int32 noframe, vsize, dsize, column; + int32 frm_begin, frm_end; + int is_header, is_describe; + float *z, **cep; + char const *cepfile; + + cmd_ln_appl_enter(argc, argv, "default.arg", arg); + + vsize = cmd_ln_int32("-i"); + dsize = cmd_ln_int32("-d"); + frm_begin = cmd_ln_int32("-b"); + frm_end = cmd_ln_int32("-e"); + is_header = cmd_ln_int32("-header"); + is_describe = cmd_ln_int32("-describe"); + + if (vsize < 0) + E_FATAL("-i : Input vector size should be larger than 0.\n"); + if (dsize < 0) + E_FATAL("-d : Column size should be larger than 0\n"); + if (frm_begin < 0) + E_FATAL("-b : Beginning frame should be larger than 0\n"); + /* The following condition is redundant + * if (frm_end < 0) E_FATAL("-e : Ending frame should be larger than 0\n"); + */ + if (frm_begin >= frm_end) + E_FATAL + ("Ending frame (-e) should be larger than beginning frame (-b).\n"); + + if ((cepfile = cmd_ln_str("-f")) == NULL) { + E_FATAL("Input file was not specified with (-f)\n"); + } + if (read_cep(cepfile, &cep, &noframe, vsize) == IO_ERR) + E_FATAL_SYSTEM("Failed to open '%s' for reading", cepfile); + + z = cep[0]; + + offset = 0; + column = (vsize > dsize) ? dsize : vsize; + frm_end = (frm_end > noframe) ? noframe : frm_end; + + E_INFO("Displaying %d out of %d columns per frame\n", column, vsize); + E_INFO("Total %d frames\n\n", noframe); + + /* This part should be moved to a special library if this file is + longer than 300 lines. */ + + if (is_header) { + if (is_describe) { + printf("\n%6s", "frame#:"); + } + + for (j = 0; j < column; ++j) { + printf("%3s%3d%s ", "c[", j, "]"); + } + printf("\n"); + } + + offset += frm_begin * vsize; + for (i = frm_begin; i < frm_end; ++i) { + if (is_describe) { + printf("%6d:", i); + } + for (j = 0; j < column; ++j) + printf("%7.3f ", z[offset + j]); + printf("\n"); + + offset += vsize; + } + fflush(stdout); + cmd_ln_appl_exit(); + ckd_free_2d(cep); + + return (IO_SUCCESS); + +} + +int +read_cep(char const *file, float ***cep, int *numframes, int cepsize) +{ + FILE *fp; + int n_float; + struct stat statbuf; + int i, n, byterev; + float32 **mfcbuf; + + if (stat_retry(file, &statbuf) < 0) { + E_ERROR_SYSTEM("Failed to get file size '%s'", file); + return IO_ERR; + } + + if ((fp = fopen(file, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open '%s' for reading", file); + return IO_ERR; + } + + /* Read #floats in header */ + if (fread(&n_float, sizeof(int), 1, fp) != 1) { + fclose(fp); + return IO_ERR; + } + + /* Check if n_float matches file size */ + byterev = FALSE; + if ((int) (n_float * sizeof(float) + 4) != statbuf.st_size) { + n = n_float; + SWAP_INT32(&n); + + if ((int) (n * sizeof(float) + 4) != statbuf.st_size) { + E_ERROR("Header size field: %d(%08x); filesize: %d(%08x)\n", + n_float, n_float, (int) statbuf.st_size, + (int) statbuf.st_size); + fclose(fp); + return IO_ERR; + } + + n_float = n; + byterev = TRUE; + } + if (n_float <= 0) { + E_ERROR("Header size field: %d\n", n_float); + fclose(fp); + return IO_ERR; + } + + /* n = #frames of input */ + n = n_float / cepsize; + if (n * cepsize != n_float) { + E_ERROR("Header size field: %d; not multiple of %d\n", + n_float, cepsize); + fclose(fp); + return IO_ERR; + } + + mfcbuf = (float **) ckd_calloc_2d(n, cepsize, sizeof(float32)); + + /* Read mfc data and byteswap if necessary */ + n_float = n * cepsize; + if ((int) fread(mfcbuf[0], sizeof(float), n_float, fp) != n_float) { + E_ERROR("Error reading mfc data from the file '%s'", file); + fclose(fp); + return IO_ERR; + } + if (byterev) { + for (i = 0; i < n_float; i++) + SWAP_FLOAT32(&(mfcbuf[0][i])); + } + fclose(fp); + + *numframes = n; + *cep = mfcbuf; + return IO_SUCCESS; +} + +/** Windows CE/Mobile entry point added. */ +#if defined(_WIN32_WCE) +#pragma comment(linker,"/entry:mainWCRTStartup") + +/* Windows Mobile has the Unicode main only */ +int wmain(int32 argc, wchar_t *wargv[]) { + char** argv; + size_t wlen; + size_t len; + int i; + + argv = malloc(argc*sizeof(char*)); + for (i = 0; i < argc; i++){ + wlen = lstrlenW(wargv[i]); + len = wcstombs(NULL, wargv[i], wlen); + argv[i] = malloc(len+1); + wcstombs(argv[i], wargv[i], wlen); + } + + /* assuming ASCII parameters */ + return main(argc, argv); +} +#endif diff --git a/src/sphinx_fe/Makefile.am b/src/sphinx_fe/Makefile.am new file mode 100644 index 000000000..c7e4b3b1a --- /dev/null +++ b/src/sphinx_fe/Makefile.am @@ -0,0 +1,14 @@ +bin_PROGRAMS = sphinx_fe + +sphinx_fe_SOURCES = sphinx_fe.c + +noinst_HEADERS = cmd_ln_defn.h \ + sphinx_wave2feat.h + +sphinx_fe_LDADD = \ + $(top_builddir)/src/libsphinxbase/libsphinxbase.la + +AM_CFLAGS =-I$(top_srcdir)/include \ + -I$(top_builddir)/include \ + -I$(top_srcdir)/src/libsphinxbase/fe + diff --git a/src/sphinx_fe/cmd_ln_defn.h b/src/sphinx_fe/cmd_ln_defn.h new file mode 100644 index 000000000..8924269d1 --- /dev/null +++ b/src/sphinx_fe/cmd_ln_defn.h @@ -0,0 +1,223 @@ +/* ==================================================================== + * Copyright (c) 1998-2000 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: cmd_ln_defn.h + * + * Description: + * Command line argument definition + * + * Author: + * + *********************************************************************/ + +#ifndef CMD_LN_DEFN_H +#define CMD_LN_DEFN_H + +#include +#include + +const char helpstr[] = + "Description: \n\ +Extract acoustic features form from audio file.\n\ +\n\ +The main parameters that affect the final output, with typical values, are:\n\ +\n\ +samprate, typically 8000, 11025, or 16000\n\ +lowerf, 130, 200, 130, for the respective sampling rates above\n\ +upperf, 3700, 5200, 6800, for the respective sampling rates above\n\ +nfilt, 31, 37, 40, for the respective sampling rates above\n\ +nfft, 256 or 512\n\ +format, raw or nist or mswav\n\ +\""; + +const char examplestr[] = + "Example: \n\ +This example creates a cepstral file named \"output.mfc\" from an input audio file named \"input.raw\", which is a raw audio file (no header information), which was originally sampled at 16kHz. \n\ +\n\ +sphinx_fe -i input.raw \n\ + -o output.mfc \n\ + -input_endian little \n\ + -samprate 16000 \n\ + -lowerf 130 \n\ + -upperf 6800 \n\ + -nfilt 40 \n\ + -nfft 512"; + +static arg_t defn[] = { + { "-help", + ARG_BOOLEAN, + "no", + "Shows the usage of the tool"}, + + { "-example", + ARG_BOOLEAN, + "no", + "Shows example of how to use the tool"}, + + waveform_to_cepstral_command_line_macro(), + + { "-argfile", + ARG_STRING, + NULL, + "Argument file (e.g. feat.params from an acoustic model) to read parameters from. This will override anything set in other command line arguments." }, + + { "-i", + ARG_STRING, + NULL, + "Single audio input file" }, + + { "-o", + ARG_STRING, + NULL, + "Single cepstral output file" }, + + { "-c", + ARG_STRING, + NULL, + "Control file for batch processing" }, + + { "-nskip", + ARG_INT32, + "0", + "If a control file was specified, the number of utterances to skip at the head of the file" }, + + { "-runlen", + ARG_INT32, + "-1", + "If a control file was specified, the number of utterances to process, or -1 for all" }, + + { "-part", + ARG_INT32, + "0", + "Index of the part to run (supersedes -nskip and -runlen if non-zero)" }, + + { "-npart", + ARG_INT32, + "0", + "Number of parts to run in (supersedes -nskip and -runlen if non-zero)" }, + + { "-di", + ARG_STRING, + NULL, + "Input directory, input file names are relative to this, if defined" }, + + { "-ei", + ARG_STRING, + NULL, + "Input extension to be applied to all input files" }, + + { "-do", + ARG_STRING, + NULL, + "Output directory, output files are relative to this" }, + + { "-eo", + ARG_STRING, + NULL, + "Output extension to be applied to all output files" }, + + { "-build_outdirs", + ARG_BOOLEAN, + "yes", + "Create missing subdirectories in output directory" }, + + { "-sph2pipe", + ARG_BOOLEAN, + "no", + "Input is NIST sphere (possibly with Shorten), use sph2pipe to convert" }, + + { "-nist", + ARG_BOOLEAN, + "no", + "Defines input format as NIST sphere" }, + + { "-raw", + ARG_BOOLEAN, + "no", + "Defines input format as raw binary data" }, + + { "-mswav", + ARG_BOOLEAN, + "no", + "Defines input format as Microsoft Wav (RIFF)" }, + + { "-nchans", + ARG_INT32, + "1", + "Number of channels of data (interlaced samples assumed)" }, + + { "-whichchan", + ARG_INT32, + "0", + "Channel to process (numbered from 1), or 0 to mix all channels" }, + + { "-ofmt", + ARG_STRING, + "sphinx", + "Format of output files - one of sphinx, htk, text." }, + + { "-mach_endian", + ARG_STRING, +#ifdef WORDS_BIGENDIAN + "big", +#else + "little", +#endif + "Endianness of machine, big or little" }, + + { "-blocksize", + ARG_INT32, + "2048", + "Number of samples to read at a time." }, + + { "-spec2cep", + ARG_BOOLEAN, + "no", + "Input is log spectral files, output is cepstral files" }, + + { "-cep2spec", + ARG_BOOLEAN, + "no", + "Input is cepstral files, output is log spectral files" }, + + { NULL, 0, NULL, NULL } +}; + + +#define CMD_LN_DEFN_H + +#endif /* CMD_LN_DEFN_H */ diff --git a/src/sphinx_fe/sphinx_fe.c b/src/sphinx_fe/sphinx_fe.c new file mode 100644 index 000000000..e4229b4a1 --- /dev/null +++ b/src/sphinx_fe/sphinx_fe.c @@ -0,0 +1,1044 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sphinx_wave2feat.h" +#include "cmd_ln_defn.h" + +typedef struct audio_type_s { + char const *name; + int (*detect)(sphinx_wave2feat_t *wtf); + int (*decode)(sphinx_wave2feat_t *wtf); +} audio_type_t; + +typedef struct output_type_s { + char const *name; + int (*output_header)(sphinx_wave2feat_t *wtf, int nfloat); + int (*output_frames)(sphinx_wave2feat_t *wtf, mfcc_t **frames, int nfr); +} output_type_t; + +struct sphinx_wave2feat_s { + int refcount; /**< Reference count. */ + cmd_ln_t *config; /**< Configuration parameters. */ + fe_t *fe; /**< Front end object. */ + char *infile; /**< Path to input file. */ + char *outfile; /**< Path to output file. */ + FILE *infh; /**< Input file handle. */ + FILE *outfh; /**< Output file handle. */ + short *audio; /**< Audio buffer. */ + mfcc_t **feat; /**< Feature buffer. */ + int blocksize; /**< Size of audio buffer. */ + int featsize; /**< Size of feature buffer. */ + int veclen; /**< Length of each output vector. */ + int in_veclen; /**< Length of each input vector (for cep<->spec). */ + int byteswap; /**< Whether byteswapping is necessary. */ + output_type_t const *ot;/**< Output type object. */ +}; + +/** RIFF 44-byte header structure for MS wav files. */ +typedef struct RIFFHeader{ + char rifftag[4]; /* "RIFF" string */ + int32 TotalLength; /* Total length */ + char wavefmttag[8]; /* "WAVEfmt " string (note space after 't') */ + int32 RemainingLength; /* Remaining length */ + int16 data_format; /* data format tag, 1 = PCM */ + int16 numchannels; /* Number of channels in file */ + int32 SamplingFreq; /* Sampling frequency */ + int32 BytesPerSec; /* Average bytes/sec */ + int16 BlockAlign; /* Block align */ + int16 BitsPerSample; /* 8 or 16 bit */ + char datatag[4]; /* "data" string */ + int32 datalength; /* Raw data length */ +} MSWAV_hdr; + +/** + * Detect RIFF file and parse its header if detected. + * + * @return TRUE if it's a RIFF file, FALSE if not, -1 if an error occurred. + */ +static int +detect_riff(sphinx_wave2feat_t *wtf) +{ + FILE *fh; + MSWAV_hdr hdr; + double samprate; + + if ((fh = fopen(wtf->infile, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s", wtf->infile); + return -1; + } + if (fread(&hdr, sizeof(hdr), 1, fh) != 1) { + E_ERROR("Failed to read RIFF header"); + fclose(fh); + return -1; + } + /* Make sure it is actually a RIFF file. */ + if (0 != memcmp(hdr.rifftag, "RIFF", 4)) { + fclose(fh); + return FALSE; + } + if (cmd_ln_int32_r(wtf->config, "-nchans") != hdr.numchannels) { + E_ERROR("Number of channels %d does not match configured value in file '%s'\n", hdr.numchannels, wtf->infile); + fclose(fh); + return -1; + } + samprate = cmd_ln_float32_r(wtf->config, "-samprate"); + if (samprate != hdr.SamplingFreq) { + E_ERROR("Sample rate %d does not match configured value %.1f in file '%s'\n", + hdr.SamplingFreq, samprate, wtf->infile); + fclose(fh); + return -1; + } + wtf->infh = fh; + + return TRUE; +} + +static int +open_nist_file(sphinx_wave2feat_t *wtf, char const *infile, FILE **out_fh, int detect_endian) +{ + char nist[7]; + lineiter_t *li; + FILE *fh; + + if ((fh = fopen(infile, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s", infile); + return -1; + } + if (fread(&nist, 1, 7, fh) != 7) { + E_ERROR_SYSTEM("Failed to read NIST header"); + fclose(fh); + return -1; + } + /* Is this actually a NIST file? */ + if (0 != strncmp(nist, "NIST_1A", 7)) { + fclose(fh); + return FALSE; + } + /* Rewind, parse lines. */ + fseek(fh, 0, SEEK_SET); + for (li = lineiter_start(fh); li; li = lineiter_next(li)) { + char **words; + int nword; + + string_trim(li->buf, STRING_BOTH); + if (strlen(li->buf) == 0) { + lineiter_free(li); + break; + } + nword = str2words(li->buf, NULL, 0); + if (nword != 3) + continue; + words = (char **)ckd_calloc(nword, sizeof(*words)); + str2words(li->buf, words, nword); + if (0 == strcmp(words[0], "sample_rate")) { + float samprate = atof_c(words[2]); + if (cmd_ln_float32_r(wtf->config, "-samprate") != samprate) { + E_ERROR("Sample rate %.1f does not match configured value in file '%s'\n", samprate, infile); + lineiter_free(li); + fclose(fh); + return -1; + } + } + if (0 == strcmp(words[0], "channel_count")) { + int nchans = atoi(words[2]); + if (cmd_ln_int32_r(wtf->config, "-nchans") != nchans) { + E_ERROR("Number of channels %d does not match configured value in file '%s'\n", nchans, infile); + lineiter_free(li); + fclose(fh); + return -1; + } + } + if (detect_endian && 0 == strcmp(words[0], "sample_byte_format")) { + const char *endian = (0 == strcmp(words[2], "10")) ? "big" : "little"; + if (0 != strcmp(cmd_ln_str_r(wtf->config, "-input_endian"), endian)) { + E_ERROR("Input endian %s does not match configured value in file '%s'\n", endian, infile); + lineiter_free(li); + fclose(fh); + return -1; + } + } + ckd_free(words); + } + + fseek(fh, 1024, SEEK_SET); + if (out_fh) + *out_fh = fh; + else + fclose(fh); + return TRUE; +} + +#ifdef HAVE_POPEN +static int +detect_sph2pipe(sphinx_wave2feat_t *wtf) +{ + FILE *fh; + char *cmdline; + int rv; + + /* Determine if it's NIST file and get parameters. */ + if ((rv = open_nist_file(wtf, wtf->infile, NULL, FALSE)) != TRUE) + return rv; + + /* Now popen it with sph2pipe. */ + cmdline = string_join("sph2pipe -f raw '", wtf->infile, "'", NULL); + if ((fh = popen(cmdline, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to popen(\"sph2pipe -f raw '%s'\")", wtf->infile); + ckd_free(cmdline); + return -1; + } + + wtf->infh = fh; + return TRUE; +} +#else /* !HAVE_POPEN */ +static int +detect_sph2pipe(sphinx_wave2feat_t *wtf) +{ + E_ERROR("popen() not available, cannot run sph2pipe\n"); + return -1; +} +#endif /* !HAVE_POPEN */ + +/** + * Detect NIST file and parse its header if detected. + * + * @return TRUE if it's a NIST file, FALSE if not, -1 if an error occurred. + */ +static int +detect_nist(sphinx_wave2feat_t *wtf) +{ + FILE *fh; + int rv; + + if ((rv = open_nist_file(wtf, wtf->infile, &fh, TRUE)) != TRUE) + return rv; + wtf->infh = fh; + + return TRUE; +} + + +/** + * Default "detection" function, just opens the file and keeps the + * default configuration parameters. + * + * @return TRUE, or -1 on error. + */ +static int +detect_raw(sphinx_wave2feat_t *wtf) +{ + FILE *fh; + + if ((fh = fopen(wtf->infile, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s", wtf->infile); + return -1; + } + wtf->infh = fh; + return TRUE; +} + +/** + * "Detect" Sphinx MFCC files, meaning verify their lousy headers, and + * set up some parameters from the config object. + * + * @return TRUE, or -1 on error. + */ +static int +detect_sphinx_mfc(sphinx_wave2feat_t *wtf) +{ + FILE *fh; + int32 len; + long flen; + + if ((fh = fopen(wtf->infile, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s", wtf->infile); + return -1; + } + if (fread(&len, 4, 1, fh) != 1) { + E_ERROR_SYSTEM("Failed to read header from %s\n", wtf->infile); + fclose(fh); + return -1; + } + fseek(fh, 0, SEEK_END); + flen = ftell(fh); + + /* figure out whether to byteswap */ + flen = (flen / 4) - 1; + if (flen != len) { + /* First make sure this is an endianness problem, otherwise fail. */ + SWAP_INT32(&len); + if (flen != len) { + SWAP_INT32(&len); + E_ERROR("Mismatch in header/file lengths: 0x%08x vs 0x%08x\n", + len, flen); + fclose(fh); + return -1; + } + /* Set the input endianness to the opposite of the machine endianness... */ + cmd_ln_set_str_r(wtf->config, "-input_endian", + (0 == strcmp("big", cmd_ln_str_r(wtf->config, "-mach_endian")) + ? "little" : "big")); + } + + fseek(fh, 4, SEEK_SET); + wtf->infh = fh; + if (cmd_ln_boolean_r(wtf->config, "-spec2cep")) { + wtf->in_veclen = cmd_ln_int32_r(wtf->config, "-nfilt"); + } + else if (cmd_ln_boolean_r(wtf->config, "-cep2spec")) { + wtf->in_veclen = cmd_ln_int32_r(wtf->config, "-ncep"); + wtf->veclen = cmd_ln_int32_r(wtf->config, "-nfilt"); + } + else { + /* Should not happen. */ + E_ERROR("Sphinx MFCC file reading requested but -spec2cep/-cep2spec not given\n"); + assert(FALSE); + } + + return TRUE; +} + +int +mixnpick_channels(int16 *buf, int32 nsamp, int32 nchans, int32 whichchan) +{ + int i, j; + + if (whichchan > 0) { + for (i = whichchan - 1; i < nsamp; i += nchans) + buf[i/nchans] = buf[i]; + } + else { + for (i = 0; i < nsamp; i += nchans) { + float64 tmp = 0.0; + for (j = 0; j < nchans && i + j < nsamp; ++j) { + tmp += buf[i + j]; + } + buf[i/nchans] = (int16)(tmp / nchans); + } + } + return i/nchans; +} + +/** + * Process PCM audio from a filehandle. Assume that wtf->infh is + * positioned just after the file header. + */ +static int +decode_pcm(sphinx_wave2feat_t *wtf) +{ + size_t nsamp; + int32 n, nfr, nchans, whichchan; + uint32 nfloat; + + nchans = cmd_ln_int32_r(wtf->config, "-nchans"); + whichchan = cmd_ln_int32_r(wtf->config, "-whichchan"); + fe_start_stream(wtf->fe); + fe_start_utt(wtf->fe); + nfloat = 0; + while ((nsamp = fread(wtf->audio, sizeof(int16), wtf->blocksize, wtf->infh)) != 0) { + size_t nvec; + int16 const *inspeech; + + /* Byteswap stuff here if necessary. */ + if (wtf->byteswap) { + for (n = 0; n < nsamp; ++n) + SWAP_INT16(wtf->audio + n); + } + + /* Mix or pick channels. */ + if (nchans > 1) + nsamp = mixnpick_channels(wtf->audio, nsamp, nchans, whichchan); + + inspeech = wtf->audio; + nvec = wtf->featsize; + /* Consume all samples. */ + while (nsamp) { + nfr = nvec; + fe_process_frames(wtf->fe, &inspeech, &nsamp, wtf->feat, &nfr, NULL); + if (nfr) { + if ((n = (*wtf->ot->output_frames)(wtf, wtf->feat, nfr)) < 0) + return -1; + nfloat += n; + } + } + inspeech = wtf->audio; + } + /* Now process any leftover audio frames. */ + fe_end_utt(wtf->fe, wtf->feat[0], &nfr); + if (nfr) { + if ((n = (*wtf->ot->output_frames)(wtf, wtf->feat, nfr)) < 0) + return -1; + nfloat += n; + } + + if (fclose(wtf->infh) == EOF) + E_ERROR_SYSTEM("Failed to close input file"); + wtf->infh = NULL; + return nfloat; +} + +/** + * Process Sphinx MFCCs/logspectra from a filehandle. Assume that + * wtf->infh is positioned just after the file header. + */ +static int +decode_sphinx_mfc(sphinx_wave2feat_t *wtf) +{ + int nfloat = 0, n; + int featsize = wtf->featsize; + + /* If the input vector length is less than the output length, we + * need to do this one frame at a time, because there's empty + * space at the end of each vector in wtf->feat. */ + if (wtf->in_veclen < wtf->veclen) + featsize = 1; + while ((n = fread(wtf->feat[0], sizeof(**wtf->feat), + featsize * wtf->in_veclen, wtf->infh)) != 0) { + int i, nfr = n / wtf->in_veclen; + if (n % wtf->in_veclen) { + E_ERROR("Size of file %d not a multiple of veclen %d\n", + n, wtf->in_veclen); + return -1; + } + /* Byteswap stuff here if necessary. */ + if (wtf->byteswap) { + for (i = 0; i < n; ++i) + SWAP_FLOAT32(wtf->feat[0] + i); + } + fe_float_to_mfcc(wtf->fe, (float32 **)wtf->feat, wtf->feat, nfr); + for (i = 0; i < nfr; ++i) { + if (cmd_ln_boolean_r(wtf->config, "-spec2cep")) { + if (0 == strcmp(cmd_ln_str_r(wtf->config, "-transform"), "legacy")) + fe_logspec_to_mfcc(wtf->fe, wtf->feat[i], wtf->feat[i]); + else + fe_logspec_dct2(wtf->fe, wtf->feat[i], wtf->feat[i]); + } + else if (cmd_ln_boolean_r(wtf->config, "-cep2spec")) { + fe_mfcc_dct3(wtf->fe, wtf->feat[i], wtf->feat[i]); + } + } + if ((n = (*wtf->ot->output_frames)(wtf, wtf->feat, nfr)) < 0) + return -1; + nfloat += n; + } + + if (fclose(wtf->infh) == EOF) + E_ERROR_SYSTEM("Failed to close input file"); + wtf->infh = NULL; + return nfloat; +} + +static const audio_type_t types[] = { + { "-mswav", &detect_riff, &decode_pcm }, + { "-nist", &detect_nist, &decode_pcm }, + { "-raw", &detect_raw, &decode_pcm }, + { "-sph2pipe", &detect_sph2pipe, &decode_pcm } +}; +static const int ntypes = sizeof(types)/sizeof(types[0]); +static const audio_type_t mfcc_type = { + "sphinx_mfc", &detect_sphinx_mfc, &decode_sphinx_mfc +}; + +/** + * Output sphinx format "header" + * + * @return 0 for success, <0 for error. + */ +static int +output_header_sphinx(sphinx_wave2feat_t *wtf, int32 nfloat) +{ + if (fwrite(&nfloat, 4, 1, wtf->outfh) != 1) { + E_ERROR_SYSTEM("Failed to write to %s", wtf->outfile); + return -1; + } + return 0; +} + +/** + * Output frames in sphinx format. + * + * @return 0 for success, <0 for error. + */ +static int +output_frames_sphinx(sphinx_wave2feat_t *wtf, mfcc_t **frames, int nfr) +{ + int i, nfloat = 0; + + fe_mfcc_to_float(wtf->fe, frames, (float32 **)frames, nfr); + for (i = 0; i < nfr; ++i) { + if (fwrite(frames[i], sizeof(float32), wtf->veclen, wtf->outfh) != wtf->veclen) { + E_ERROR_SYSTEM("Writing %d values to %s failed", + wtf->veclen, wtf->outfile); + return -1; + } + nfloat += wtf->veclen; + } + return nfloat; +} + +typedef enum htk_feature_kind_e { + WAVEFORM = 0, /* PCM audio (rarely used) */ + LPC = 1, /* LPC filter coefficients */ + LPCREFC = 2, /* LPC reflection coefficients */ + LPCEPSTRA = 3, /* LPC-based cepstral coefficients */ + LPCDELCEP = 4, /* LPCC plus deltas */ + IREFC = 5, /* 16-bit integer LPC reflection coefficients */ + MFCC = 6, /* MFCCs */ + FBANK = 7, /* Log mel spectrum */ + MELSPEC = 8, /* Linear mel spectrum */ + USER = 9, /* User defined */ + DISCRETE = 10, /* Vector quantized data */ + PLP = 11 /* PLP coefficients */ +} htk_feature_kind_t; + +typedef enum htk_feature_flag_e { + _E = 0000100, /* has energy */ + _N = 0000200, /* absolute energy supressed */ + _D = 0000400, /* has delta coefficients */ + _A = 0001000, /* has acceleration (delta-delta) coefficients */ + _C = 0002000, /* is compressed */ + _Z = 0004000, /* has zero mean static coefficients (i.e. CMN) */ + _K = 0010000, /* has CRC checksum */ + _O = 0020000, /* has 0th cepstral coefficient */ + _V = 0040000, /* has VQ data */ + _T = 0100000 /* has third differential coefficients */ +} htk_feature_flag_t; + +/** + * Output HTK format header. + */ +static int +output_header_htk(sphinx_wave2feat_t *wtf, int32 nfloat) +{ + int32 samp_period; + int16 samp_size; + int16 param_kind; + int swap = FALSE; + + /* HTK files are big-endian. */ + if (0 == strcmp("little", cmd_ln_str_r(wtf->config, "-mach_endian"))) + swap = TRUE; + /* Same file size thing as in Sphinx files (I think) */ + if (swap) SWAP_INT32(&nfloat); + if (fwrite(&nfloat, 4, 1, wtf->outfh) != 1) + return -1; + /* Sample period in 100ns units. */ + samp_period = (int32)(1e+7 / cmd_ln_float32_r(wtf->config, "-frate")); + if (swap) SWAP_INT32(&samp_period); + if (fwrite(&samp_period, 4, 1, wtf->outfh) != 1) + return -1; + /* Sample size - veclen * sizeof each sample. */ + samp_size = wtf->veclen * 4; + if (swap) SWAP_INT16(&samp_size); + if (fwrite(&samp_size, 2, 1, wtf->outfh) != 1) + return -1; + /* Format and flags. */ + if (cmd_ln_boolean_r(wtf->config, "-logspec") + || cmd_ln_boolean_r(wtf->config, "-cep2spec")) + param_kind = FBANK; /* log mel-filter bank outputs */ + else + param_kind = MFCC | _O; /* MFCC + CEP0 (note reordering...) */ + if (swap) SWAP_INT16(¶m_kind); + if (fwrite(¶m_kind, 2, 1, wtf->outfh) != 1) + return -1; + + return 0; +} + +/** + * Output frames in HTK format. + */ +static int +output_frames_htk(sphinx_wave2feat_t *wtf, mfcc_t **frames, int nfr) +{ + int i, j, swap, htk_reorder, nfloat = 0; + + fe_mfcc_to_float(wtf->fe, frames, (float32 **)frames, nfr); + /* This is possibly inefficient, but probably not a big deal. */ + swap = (0 == strcmp("little", cmd_ln_str_r(wtf->config, "-mach_endian"))); + htk_reorder = (0 == strcmp("htk", wtf->ot->name) + && !(cmd_ln_boolean_r(wtf->config, "-logspec") + || cmd_ln_boolean_r(wtf->config, "-cep2spec"))); + for (i = 0; i < nfr; ++i) { + if (htk_reorder) { + mfcc_t c0 = frames[i][0]; + memmove(frames[i] + 1, frames[i], (wtf->veclen - 1) * 4); + frames[i][wtf->veclen - 1] = c0; + } + if (swap) + for (j = 0; j < wtf->veclen; ++j) + SWAP_FLOAT32(frames[i] + j); + if (fwrite(frames[i], sizeof(float32), wtf->veclen, wtf->outfh) != wtf->veclen) { + E_ERROR_SYSTEM("Writing %d values to %s failed", + wtf->veclen, wtf->outfile); + return -1; + } + nfloat += wtf->veclen; + } + return nfloat; +} + +/** + * Output frames in text format. + */ +static int +output_frames_text(sphinx_wave2feat_t *wtf, mfcc_t **frames, int nfr) +{ + int i, j, nfloat = 0; + + fe_mfcc_to_float(wtf->fe, frames, (float32 **)frames, nfr); + for (i = 0; i < nfr; ++i) { + for (j = 0; j < wtf->veclen; ++j) { + fprintf(wtf->outfh, "%.5g", MFCC2FLOAT(frames[i][j])); + if (j == wtf->veclen - 1) + fprintf(wtf->outfh, "\n"); + else + fprintf(wtf->outfh, " "); + } + nfloat += wtf->veclen; + } + return nfloat; +} + +static const output_type_t outtypes[] = { + { "sphinx", &output_header_sphinx, &output_frames_sphinx }, + { "htk", &output_header_htk, &output_frames_htk }, + { "text", NULL, &output_frames_text } +}; +static const int nouttypes = sizeof(outtypes)/sizeof(outtypes[0]); + +sphinx_wave2feat_t * +sphinx_wave2feat_init(cmd_ln_t *config) +{ + sphinx_wave2feat_t *wtf; + int i; + + wtf = (sphinx_wave2feat_t *)ckd_calloc(1, sizeof(*wtf)); + wtf->refcount = 1; + wtf->config = cmd_ln_retain(config); + wtf->fe = fe_init_auto_r(wtf->config); + if (!wtf->fe) { + E_FATAL("Failed to create feature extraction\n"); + } + + wtf->ot = outtypes; /* Default (sphinx) type. */ + for (i = 0; i < nouttypes; ++i) { + output_type_t const *otype = &outtypes[i]; + if (0 == strcmp(cmd_ln_str_r(config, "-ofmt"), otype->name)) { + wtf->ot = otype; + break; + } + } + if (i == nouttypes) { + E_ERROR("Unknown output type: '%s'\n", + cmd_ln_str_r(config, "-ofmt")); + sphinx_wave2feat_free(wtf); + return NULL; + } + + return wtf; +} + +int +sphinx_wave2feat_free(sphinx_wave2feat_t *wtf) +{ + if (wtf == NULL) + return 0; + if (--wtf->refcount > 0) + return wtf->refcount; + + if (wtf->audio) + ckd_free(wtf->audio); + if (wtf->feat) + ckd_free_2d(wtf->feat); + if (wtf->infile) + ckd_free(wtf->infile); + if (wtf->outfile) + ckd_free(wtf->outfile); + if (wtf->infh) { + if (fclose(wtf->infh) == EOF) + E_ERROR_SYSTEM("Failed to close input file"); + } + if (wtf->outfh) { + if (fclose(wtf->outfh) == EOF) + E_ERROR_SYSTEM("Failed to close output file"); + } + cmd_ln_free_r(wtf->config); + fe_free(wtf->fe); + ckd_free(wtf); + + return 0; +} + +sphinx_wave2feat_t * +sphinx_wave2feat_retain(sphinx_wave2feat_t *wtf) +{ + ++wtf->refcount; + return wtf; +} + +static audio_type_t const * +detect_audio_type(sphinx_wave2feat_t *wtf) +{ + audio_type_t const *atype = NULL; + int i; + + /* Special case audio type for Sphinx MFCC inputs. */ + if (cmd_ln_boolean_r(wtf->config, "-spec2cep") + || cmd_ln_boolean_r(wtf->config, "-cep2spec")) { + int rv = mfcc_type.detect(wtf); + if (rv == -1) + goto error_out; + return &mfcc_type; + } + + /* Try to use the type of infile given on the command line. */ + for (i = 0; i < ntypes; ++i) { + int rv; + atype = &types[i]; + if (cmd_ln_boolean_r(wtf->config, atype->name)) { + rv = (*atype->detect)(wtf); + if (rv == -1) + goto error_out; + else if (rv == TRUE) + break; + } + } + if (i == ntypes) { + /* Detect file type of infile and get parameters. */ + for (i = 0; i < ntypes; ++i) { + int rv; + atype = &types[i]; + rv = (*atype->detect)(wtf); + if (rv == -1) + goto error_out; + else if (rv == TRUE) + break; + } + if (i == ntypes) + goto error_out; + } + return atype; + error_out: + if (wtf->infh) + fclose(wtf->infh); + wtf->infh = NULL; + return NULL; +} + +int +sphinx_wave2feat_convert_file(sphinx_wave2feat_t *wtf, + char const *infile, char const *outfile) +{ + int nchans, nfloat, veclen; + audio_type_t const *atype = NULL; + int fshift, fsize; + + E_INFO("Converting %s to %s\n", infile, outfile); + + wtf->infile = ckd_salloc(infile); + + /* Detect input file type. */ + if ((atype = detect_audio_type(wtf)) == NULL) + return -1; + + /* Determine whether to byteswap input. */ + wtf->byteswap = strcmp(cmd_ln_str_r(wtf->config, "-mach_endian"), + cmd_ln_str_r(wtf->config, "-input_endian")); + + /* Get the output frame size (if not already set). */ + if (wtf->veclen == 0) + wtf->veclen = fe_get_output_size(wtf->fe); + + /* Set up the input and output buffers. */ + fe_get_input_size(wtf->fe, &fshift, &fsize); + /* Want to get at least a whole frame plus shift in here. Also we + will either pick or mix multiple channels so we need to read + them all at once. */ + nchans = cmd_ln_int32_r(wtf->config, "-nchans"); + wtf->blocksize = cmd_ln_int32_r(wtf->config, "-blocksize") * nchans; + if (wtf->blocksize < (fsize + fshift) * nchans) { + E_INFO("Block size of %d too small, increasing to %d\n", + wtf->blocksize, + (fsize + fshift) * nchans); + wtf->blocksize = (fsize + fshift) * nchans; + } + wtf->audio = (short *)ckd_calloc(wtf->blocksize, sizeof(*wtf->audio)); + wtf->featsize = (wtf->blocksize / nchans - fsize) / fshift; + + /* Use the maximum of the input and output frame sizes to allocate this. */ + veclen = wtf->veclen; + if (wtf->in_veclen > veclen) veclen = wtf->in_veclen; + + wtf->feat = (mfcc_t**)ckd_calloc_2d(wtf->featsize, veclen, sizeof(**wtf->feat)); + + /* Let's go! */ + if ((wtf->outfh = fopen(outfile, "wb")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s for writing", outfile); + return -1; + } + /* Write an empty header, which we'll fill in later. */ + if (wtf->ot->output_header && + (*wtf->ot->output_header)(wtf, 0) < 0) { + E_ERROR_SYSTEM("Failed to write empty header to %s\n", outfile); + goto error_out; + } + wtf->outfile = ckd_salloc(outfile); + + if ((nfloat = (*atype->decode)(wtf)) < 0) { + E_ERROR("Failed to convert"); + goto error_out; + } + + if (wtf->ot->output_header) { + if (fseek(wtf->outfh, 0, SEEK_SET) < 0) { + E_ERROR_SYSTEM("Failed to seek to beginning of %s\n", outfile); + goto error_out; + } + if ((*wtf->ot->output_header)(wtf, nfloat) < 0) { + E_ERROR_SYSTEM("Failed to write header to %s\n", outfile); + goto error_out; + } + } + + + if (wtf->audio) + ckd_free(wtf->audio); + if (wtf->feat) + ckd_free_2d(wtf->feat); + if (wtf->infile) + ckd_free(wtf->infile); + if (wtf->outfile) + ckd_free(wtf->outfile); + + wtf->audio = NULL; + wtf->infile = NULL; + wtf->feat = NULL; + wtf->outfile = NULL; + + if (wtf->outfh) + if (fclose(wtf->outfh) == EOF) + E_ERROR_SYSTEM("Failed to close output file"); + wtf->outfh = NULL; + + return 0; + +error_out: + + if (wtf->audio) + ckd_free(wtf->audio); + if (wtf->feat) + ckd_free_2d(wtf->feat); + if (wtf->infile) + ckd_free(wtf->infile); + if (wtf->outfile) + ckd_free(wtf->outfile); + + wtf->audio = NULL; + wtf->infile = NULL; + wtf->feat = NULL; + wtf->outfile = NULL; + + if (wtf->outfh) + if (fclose(wtf->outfh) == EOF) + E_ERROR_SYSTEM("Failed to close output file"); + wtf->outfh = NULL; + + return -1; +} + +void +build_filenames(cmd_ln_t *config, char const *basename, + char **out_infile, char **out_outfile) +{ + char const *di, *do_, *ei, *eo; + + di = cmd_ln_str_r(config, "-di"); + do_ = cmd_ln_str_r(config, "-do"); + ei = cmd_ln_str_r(config, "-ei"); + eo = cmd_ln_str_r(config, "-eo"); + + *out_infile = string_join(di ? di : "", + di ? "/" : "", + basename, + ei ? "." : "", + ei ? ei : "", + NULL); + *out_outfile = string_join(do_ ? do_ : "", + do_ ? "/" : "", + basename, + eo ? "." : "", + eo ? eo : "", + NULL); + /* Build output directory structure if possible/requested (it is + * by default). */ + if (cmd_ln_boolean_r(config, "-build_outdirs")) { + char *dirname = ckd_salloc(*out_outfile); + path2dirname(*out_outfile, dirname); + build_directory(dirname); + ckd_free(dirname); + } +} + +static int +run_control_file(sphinx_wave2feat_t *wtf, char const *ctlfile) +{ + hash_table_t *files; + hash_iter_t *itor; + lineiter_t *li; + FILE *ctlfh; + int nskip, runlen, npart; + + if ((ctlfh = fopen(ctlfile, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open control file %s", ctlfile); + return -1; + } + nskip = cmd_ln_int32_r(wtf->config, "-nskip"); + runlen = cmd_ln_int32_r(wtf->config, "-runlen"); + if ((npart = cmd_ln_int32_r(wtf->config, "-npart"))) { + /* Count lines in the file. */ + int partlen, part, nlines = 0; + part = cmd_ln_int32_r(wtf->config, "-part"); + for (li = lineiter_start(ctlfh); li; li = lineiter_next(li)) + ++nlines; + fseek(ctlfh, 0, SEEK_SET); + partlen = nlines / npart; + nskip = partlen * (part - 1); + if (part == npart) + runlen = -1; + else + runlen = partlen; + } + if (runlen != -1){ + E_INFO("Processing %d utterances at position %d\n", runlen, nskip); + files = hash_table_new(runlen, HASH_CASE_YES); + } + else { + E_INFO("Processing all remaining utterances at position %d\n", nskip); + files = hash_table_new(1000, HASH_CASE_YES); + } + for (li = lineiter_start(ctlfh); li; li = lineiter_next(li)) { + char *c, *infile, *outfile; + + if (nskip-- > 0) + continue; + if (runlen == 0) { + lineiter_free(li); + break; + } + --runlen; + + string_trim(li->buf, STRING_BOTH); + /* Extract the file ID from the control line. */ + if ((c = strchr(li->buf, ' ')) != NULL) + *c = '\0'; + if (strlen(li->buf) == 0) { + E_WARN("Empty line %d in control file, skipping\n", li->lineno); + continue; + } + build_filenames(wtf->config, li->buf, &infile, &outfile); + if (hash_table_lookup(files, infile, NULL) == 0) + continue; + sphinx_wave2feat_convert_file(wtf, infile, outfile); + hash_table_enter(files, infile, outfile); + } + for (itor = hash_table_iter(files); itor; + itor = hash_table_iter_next(itor)) { + ckd_free((void *)hash_entry_key(itor->ent)); + ckd_free(hash_entry_val(itor->ent)); + } + hash_table_free(files); + fclose(ctlfh); + + return 0; +} + +int +main(int argc, char *argv[]) +{ + sphinx_wave2feat_t *wtf; + cmd_ln_t *config; + int rv; + + config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE); + + if (config && cmd_ln_str_r(config, "-argfile")) + config = cmd_ln_parse_file_r(config, defn, + cmd_ln_str_r(config, "-argfile"), FALSE); + if (config == NULL) { + E_ERROR("Command line parsing failed\n"); + return 1; + } + + if ((wtf = sphinx_wave2feat_init(config)) == NULL) { + E_ERROR("Failed to initialize wave2feat object\n"); + return 1; + } + + /* If there's a control file run through it, otherwise we will do + * a single file (which is what run_control_file will do + * internally too) */ + if (cmd_ln_str_r(config, "-c")) + rv = run_control_file(wtf, cmd_ln_str_r(config, "-c")); + else + rv = sphinx_wave2feat_convert_file(wtf, cmd_ln_str_r(config, "-i"), + cmd_ln_str_r(config, "-o")); + + sphinx_wave2feat_free(wtf); + cmd_ln_free_r(config); + return rv; +} diff --git a/src/sphinx_fe/sphinx_wave2feat.h b/src/sphinx_fe/sphinx_wave2feat.h new file mode 100644 index 000000000..89d924188 --- /dev/null +++ b/src/sphinx_fe/sphinx_wave2feat.h @@ -0,0 +1,66 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef __SPHINX_FE_H__ +#define __SPHINX_FE_H__ + +/** + * Waveform to feature converter object. + */ +typedef struct sphinx_wave2feat_s sphinx_wave2feat_t; + +/** + * Initialize waveform to feature converter. + */ +sphinx_wave2feat_t *sphinx_wave2feat_init(cmd_ln_t *config); + +/** + * Release a waveform to feature converter. + */ +int sphinx_wave2feat_free(sphinx_wave2feat_t *w2f); + +/** + * Retain a waveform to feature converter. + */ +sphinx_wave2feat_t *sphinx_wave2feat_retain(sphinx_wave2feat_t *w2f); + +/** + * Convert one file. + */ +int sphinx_wave2feat_convert_file(sphinx_wave2feat_t *w2f, + char const *infile, char const *outfile); + +#endif /* __SPHINX_FE_H__ */ diff --git a/src/sphinx_jsgf2fsg/Makefile.am b/src/sphinx_jsgf2fsg/Makefile.am new file mode 100644 index 000000000..5e2b54b9d --- /dev/null +++ b/src/sphinx_jsgf2fsg/Makefile.am @@ -0,0 +1,10 @@ +bin_PROGRAMS = sphinx_jsgf2fsg + +sphinx_jsgf2fsg_SOURCES = main.c + +sphinx_jsgf2fsg_LDADD = \ + $(top_builddir)/src/libsphinxbase/libsphinxbase.la + +AM_CFLAGS =-I$(top_srcdir)/include -I$(top_builddir)/include + +EXTRA_DIST = fsg2dot.pl diff --git a/src/sphinx_jsgf2fsg/fsg2dot.pl b/src/sphinx_jsgf2fsg/fsg2dot.pl new file mode 100755 index 000000000..784ff3ac5 --- /dev/null +++ b/src/sphinx_jsgf2fsg/fsg2dot.pl @@ -0,0 +1,44 @@ +#!/usr/bin/env perl + +use strict; + +my $nstates; +while (<>) { + chomp; + s/#.*$//; + next if /^$/; + + if (/FSG_BEGIN (\S+)/) { + print "digraph $1 {\n\trankdir=LR;\n\t"; + } + elsif (/NUM_STATES (\d+)/) { + $nstates = $1; + } + elsif (/START_STATE (\d+)/) { + } + elsif (/FINAL_STATE (\d+)/) { + my $end = $1; + + print "\tnode [shape=circle];"; + for (my $i = 0; $i < $nstates; ++$i) { + print " $i" unless $i == $end; + } + print ";\n\tnode [shape=doublecircle]; $end;\n\n"; + } + elsif (/TRANSITION/) { + my (undef, $from, $to, $weight, $word) = split; + + my $label; + if ($weight != 1.0 and defined($word)) { + $label = sprintf "%s/%.2f", $word, $weight; + } + elsif ($weight != 1.0) { + $label = sprintf "%.2f", $weight; + } + elsif ($word) { + $label = $word; + } + print "\t$from -> $to [label=\"$label\"];\n"; + } +} +print "}\n"; diff --git a/src/sphinx_jsgf2fsg/main.c b/src/sphinx_jsgf2fsg/main.c new file mode 100644 index 000000000..b0b904b70 --- /dev/null +++ b/src/sphinx_jsgf2fsg/main.c @@ -0,0 +1,208 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include + +#include +#include +#include +#include +#include + +static const arg_t defn[] = { + { "-help", + ARG_BOOLEAN, + "no", + "Shows the usage of the tool"}, + + { "-jsgf", + REQARG_STRING, + NULL, + "Input grammar in jsgf format (required)"}, + + { "-toprule", + ARG_STRING, + NULL, + "Root rule name (optional)"}, + + { "-fsg", + ARG_STRING, + NULL, + "Output grammar in fsg format"}, + + { "-fsm", + ARG_STRING, + NULL, + "Output grammar in FSM format"}, + + { "-symtab", + ARG_STRING, + NULL, + "Output symtab for grammar in FSM format"}, + + { "-compile", + ARG_BOOLEAN, + "no", + "Compute grammar closure to speedup loading"}, + + { NULL, 0, NULL, NULL } +}; + + +static void +usagemsg(char *pgm) +{ + E_INFO("Usage: %s -jsgf -toprule \\\n", pgm); + E_INFOCONT("\t[-fsm yes/no] [-compile yes/no]\n"); + E_INFOCONT("\t-fsg \n"); + + exit(0); +} + +static fsg_model_t * +get_fsg(jsgf_t *grammar, const char *name) +{ + logmath_t *lmath; + fsg_model_t *fsg; + jsgf_rule_t *rule; + + /* Take the -toprule if specified. */ + if (name) { + rule = jsgf_get_rule(grammar, name); + if (rule == NULL) { + E_ERROR("Start rule %s not found\n", name); + return NULL; + } + } else { + rule = jsgf_get_public_rule(grammar); + if (rule == NULL) { + E_ERROR("No public rules found in grammar %s\n", jsgf_grammar_name(grammar)); + return NULL; + } else { + E_INFO("No -toprule was given; grabbing the first public rule: " + "'%s' of the grammar '%s'.\n", + jsgf_rule_name(rule), jsgf_grammar_name(grammar)); + } + } + + lmath = logmath_init(1.0001, 0, 0); + fsg = jsgf_build_fsg_raw(grammar, rule, lmath, 1.0); + return fsg; +} + +int +main(int argc, char *argv[]) +{ + jsgf_t *jsgf; + fsg_model_t *fsg; + cmd_ln_t *config; + const char *rule; + + if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) + return 1; + + if (cmd_ln_boolean_r(config, "-help")) { + usagemsg(argv[0]); + } + + jsgf = jsgf_parse_file(cmd_ln_str_r(config, "-jsgf"), NULL); + if (jsgf == NULL) { + return 1; + } + + rule = cmd_ln_str_r(config, "-toprule") ? cmd_ln_str_r(config, "-toprule") : NULL; + if (!(fsg = get_fsg(jsgf, rule))) { + E_ERROR("No fsg was built for the given rule '%s'.\n" + "Check rule name; it should be qualified (with grammar name)\n" + "and not enclosed in angle brackets (e.g. 'grammar.rulename').", + rule); + return 1; + } + + + if (cmd_ln_boolean_r(config, "-compile")) { + fsg_model_null_trans_closure(fsg, NULL); + } + + + if (cmd_ln_str_r(config, "-fsm")) { + const char* outfile = cmd_ln_str_r(config, "-fsm"); + const char* symfile = cmd_ln_str_r(config, "-symtab"); + if (outfile) + fsg_model_writefile_fsm(fsg, outfile); + else + fsg_model_write_fsm(fsg, stdout); + if (symfile) + fsg_model_writefile_symtab(fsg, symfile); + } + else { + const char *outfile = cmd_ln_str_r(config, "-fsg"); + if (outfile) + fsg_model_writefile(fsg, outfile); + else + fsg_model_write(fsg, stdout); + } + fsg_model_free(fsg); + jsgf_grammar_free(jsgf); + + return 0; +} + + +#if defined(_WIN32_WCE) +#pragma comment(linker,"/entry:mainWCRTStartup") +#include + +/* Windows Mobile has the Unicode main only */ +int wmain(int32 argc, wchar_t *wargv[]) { + char** argv; + size_t wlen; + size_t len; + int i; + + argv = malloc(argc*sizeof(char*)); + for (i = 0; i < argc; i++){ + wlen = lstrlenW(wargv[i]); + len = wcstombs(NULL, wargv[i], wlen); + argv[i] = malloc(len+1); + wcstombs(argv[i], wargv[i], wlen); + } + + /* assuming ASCII parameters */ + return main(argc, argv); +} +#endif diff --git a/src/sphinx_lmtools/Makefile.am b/src/sphinx_lmtools/Makefile.am new file mode 100644 index 000000000..ea6bed25a --- /dev/null +++ b/src/sphinx_lmtools/Makefile.am @@ -0,0 +1,9 @@ +bin_PROGRAMS = sphinx_lm_eval sphinx_lm_convert + +LDADD = \ + $(top_builddir)/src/libsphinxbase/libsphinxbase.la \ + $(top_builddir)/src/libsphinxbase/lm/libsphinxlm.la + +AM_CFLAGS =-I$(top_srcdir)/include -I$(top_builddir)/include \ + -I$(top_srcdir)/src/libsphinxlm + diff --git a/src/sphinx_lmtools/sphinx_lm_convert.c b/src/sphinx_lmtools/sphinx_lm_convert.c new file mode 100644 index 000000000..eede6b6c7 --- /dev/null +++ b/src/sphinx_lmtools/sphinx_lm_convert.c @@ -0,0 +1,207 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2009 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * \file sphinx_lm_convert.c + * Language model conversion tool. + */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +static const arg_t defn[] = { + { "-help", + ARG_BOOLEAN, + "no", + "Shows the usage of the tool"}, + + { "-logbase", + ARG_FLOAT64, + "1.0001", + "Base in which all log-likelihoods calculated" }, + + { "-i", + REQARG_STRING, + NULL, + "Input language model file (required)"}, + + { "-o", + REQARG_STRING, + NULL, + "Output language model file (required)"}, + + { "-ifmt", + ARG_STRING, + NULL, + "Input language model format (will guess if not specified)"}, + + { "-ofmt", + ARG_STRING, + NULL, + "Output language model file (will guess if not specified)"}, + + { "-case", + ARG_STRING, + NULL, + "Ether 'lower' or 'upper' - case fold to lower/upper case (NOT UNICODE AWARE)" }, + + { "-mmap", + ARG_BOOLEAN, + "no", + "Use memory-mapped I/O for reading binary LM files"}, + + { NULL, 0, NULL, NULL } +}; + +static void +usagemsg(char *pgm) +{ + E_INFO("Usage: %s -i \\\n", pgm); + E_INFOCONT("\t[-ifmt txt] [-ofmt dmp]\n"); + E_INFOCONT("\t-o \n"); + + exit(0); +} + + +int +main(int argc, char *argv[]) +{ + cmd_ln_t *config; + ngram_model_t *lm = NULL; + logmath_t *lmath; + int itype, otype; + char const *kase; + + if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) + return 1; + + if (cmd_ln_boolean_r(config, "-help")) { + usagemsg(argv[0]); + } + + /* Create log math object. */ + if ((lmath = logmath_init + (cmd_ln_float64_r(config, "-logbase"), 0, 0)) == NULL) { + E_FATAL("Failed to initialize log math\n"); + } + + if (cmd_ln_str_r(config, "-i") == NULL || cmd_ln_str_r(config, "-i") == NULL) { + E_ERROR("Please specify both input and output models\n"); + goto error_out; + } + + /* Load the input language model. */ + if (cmd_ln_str_r(config, "-ifmt")) { + if ((itype = ngram_str_to_type(cmd_ln_str_r(config, "-ifmt"))) + == NGRAM_INVALID) { + E_ERROR("Invalid input type %s\n", cmd_ln_str_r(config, "-ifmt")); + goto error_out; + } + lm = ngram_model_read(config, cmd_ln_str_r(config, "-i"), + itype, lmath); + } + else { + lm = ngram_model_read(config, cmd_ln_str_r(config, "-i"), + NGRAM_AUTO, lmath); + } + + if (lm == NULL) { + E_ERROR("Failed to read the model from the file '%s'\n", cmd_ln_str_r(config, "-i")); + goto error_out; + } + + /* Guess or set the output language model type. */ + if (cmd_ln_str_r(config, "-ofmt")) { + if ((otype = ngram_str_to_type(cmd_ln_str_r(config, "-ofmt"))) + == NGRAM_INVALID) { + E_ERROR("Invalid output type %s\n", cmd_ln_str_r(config, "-ofmt")); + goto error_out; + } + } + else { + otype = ngram_file_name_to_type(cmd_ln_str_r(config, "-o")); + } + + /* Case fold if requested. */ + if ((kase = cmd_ln_str_r(config, "-case"))) { + if (0 == strcmp(kase, "lower")) { + ngram_model_casefold(lm, NGRAM_LOWER); + } + else if (0 == strcmp(kase, "upper")) { + ngram_model_casefold(lm, NGRAM_UPPER); + } + else { + E_ERROR("Unknown value for -case: %s\n", kase); + goto error_out; + } + } + + /* Write the output language model. */ + if (ngram_model_write(lm, cmd_ln_str_r(config, "-o"), otype) != 0) { + E_ERROR("Failed to write language model in format %s to %s\n", + ngram_type_to_str(otype), cmd_ln_str_r(config, "-o")); + goto error_out; + } + + /* That's all folks! */ + ngram_model_free(lm); + if (lmath) { + logmath_free(lmath); + } + if (config) { + cmd_ln_free_r(config); + } + return 0; + +error_out: + ngram_model_free(lm); + if (lmath) { + logmath_free(lmath); + } + if (config) { + cmd_ln_free_r(config); + } + return 1; +} diff --git a/src/sphinx_lmtools/sphinx_lm_eval.c b/src/sphinx_lmtools/sphinx_lm_eval.c new file mode 100644 index 000000000..a9a13c1f8 --- /dev/null +++ b/src/sphinx_lmtools/sphinx_lm_eval.c @@ -0,0 +1,324 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * \file sphinx_lm_eval.c + * Language model evaluation tool. + */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +static const arg_t defn[] = { + { "-help", + ARG_BOOLEAN, + "no", + "Shows the usage of the tool"}, + + { "-logbase", + ARG_FLOAT64, + "1.0001", + "Base in which all log-likelihoods calculated" }, + + { "-lm", + ARG_STRING, + NULL, + "Language model file"}, + + { "-probdef", + ARG_STRING, + NULL, + "Probability definition file for classes in LM"}, + + { "-lmctlfn", + ARG_STRING, + NULL, + "Control file listing a set of language models"}, + + { "-lmname", + ARG_STRING, + NULL, + "Name of language model in -lmctlfn to use for all utterances" }, + + { "-lsn", + ARG_STRING, + NULL, + "Transcription file to evaluate"}, + + { "-text", + ARG_STRING, + "Text string to evaluate"}, + + { "-mmap", + ARG_BOOLEAN, + "no", + "Use memory-mapped I/O for reading binary LM files"}, + + { "-lw", + ARG_FLOAT32, + "1.0", + "Language model weight" }, + + { "-wip", + ARG_FLOAT32, + "1.0", + "Word insertion probability" }, + + { "-verbose", + ARG_BOOLEAN, + "no", + "Print details of perplexity calculation" }, + + /* FIXME: Support -lmstartsym, -lmendsym, -lmctlfn, -ctl_lm */ + { NULL, 0, NULL, NULL } +}; + +static int verbose; + +static int +calc_entropy(ngram_model_t *lm, char **words, int32 n, + int32 *out_n_ccs, int32 *out_n_oovs, int32 *out_lm_score) +{ + int32 *wids; + int32 startwid; + int32 i, ch, nccs, noovs, unk; + + if (n == 0) + return 0; + + unk = ngram_unknown_wid(lm); + + /* Reverse this array into an array of word IDs. */ + wids = ckd_calloc(n, sizeof(*wids)); + for (i = 0; i < n; ++i) + wids[n-i-1] = ngram_wid(lm, words[i]); + /* Skip as it's a context cue (HACK, this should be configurable). */ + startwid = ngram_wid(lm, ""); + + /* Now evaluate the list of words in reverse using the + * remainder of the array as the history. */ + ch = noovs = nccs = 0; + for (i = 0; i < n; ++i) { + int32 n_used; + int32 prob; + + /* Skip as it's a context cue (HACK, this should be configurable). */ + if (wids[i] == startwid) { + ++nccs; + continue; + } + /* Skip and count OOVs. */ + if (wids[i] == NGRAM_INVALID_WID || wids[i] == unk) { + ++noovs; + continue; + } + /* Sum up information for each N-gram */ + prob = ngram_ng_score(lm, + wids[i], wids + i + 1, + n - i - 1, &n_used); + if (verbose) { + int m; + printf("log P(%s|", ngram_word(lm, wids[i])); + m = i + ngram_model_get_size(lm) - 1; + if (m >= n) + m = n - 1; + while (m > i) { + printf("%s ", ngram_word(lm, wids[m--])); + } + printf(") = %d\n", prob); + } + ch -= prob; + } + + if (out_n_ccs) *out_n_ccs = nccs; + if (out_n_oovs) *out_n_oovs = noovs; + + /* Calculate cross-entropy CH = - 1/N sum log P(W|H) */ + n -= (nccs + noovs); + if (n <= 0) + return 0; + if (out_lm_score) + *out_lm_score = -ch; + return ch / n; +} + +static void +evaluate_file(ngram_model_t *lm, logmath_t *lmath, const char *lsnfn) +{ + FILE *fh; + lineiter_t *litor; + int32 nccs, noovs, nwords, lscr; + float64 ch, log_to_log2;; + + if ((fh = fopen(lsnfn, "r")) == NULL) + E_FATAL_SYSTEM("failed to open transcript file %s", lsnfn); + + /* We have to keep ch in floating-point to avoid overflows, so + * we might as well use log2. */ + log_to_log2 = log(logmath_get_base(lmath)) / log(2); + lscr = nccs = noovs = nwords = 0; + ch = 0.0; + for (litor = lineiter_start(fh); litor; litor = lineiter_next(litor)) { + char **words; + int32 n, tmp_ch, tmp_noovs, tmp_nccs, tmp_lscr; + + n = str2words(litor->buf, NULL, 0); + if (n < 0) + E_FATAL("str2words(line, NULL, 0) = %d, should not happen\n", n); + if (n == 0) /* Do nothing! */ + continue; + words = ckd_calloc(n, sizeof(*words)); + str2words(litor->buf, words, n); + + /* Remove any utterance ID (FIXME: has to be a single "word") */ + if (words[n-1][0] == '(' + && words[n-1][strlen(words[n-1])-1] == ')') + n = n - 1; + + tmp_ch = calc_entropy(lm, words, n, &tmp_nccs, + &tmp_noovs, &tmp_lscr); + + ch += (float64) tmp_ch * (n - tmp_nccs - tmp_noovs) * log_to_log2; + nccs += tmp_nccs; + noovs += tmp_noovs; + lscr += tmp_lscr; + nwords += n; + + ckd_free(words); + } + + ch /= (nwords - nccs - noovs); + printf("cross-entropy: %f bits\n", ch); + + /* Calculate perplexity pplx = exp CH */ + printf("perplexity: %f\n", pow(2.0, ch)); + printf("lm score: %d\n", lscr); + + /* Report OOVs and CCs */ + printf("%d words evaluated\n", nwords); + printf("%d OOVs (%.2f%%), %d context cues removed\n", + noovs, (double)noovs / nwords * 100, nccs); +} + +static void +evaluate_string(ngram_model_t *lm, logmath_t *lmath, const char *text) +{ + char *textfoo; + char **words; + int32 n, ch, noovs, nccs, lscr; + + /* Split it into an array of strings. */ + textfoo = ckd_salloc(text); + n = str2words(textfoo, NULL, 0); + if (n < 0) + E_FATAL("str2words(textfoo, NULL, 0) = %d, should not happen\n", n); + if (n == 0) /* Do nothing! */ + return; + words = ckd_calloc(n, sizeof(*words)); + str2words(textfoo, words, n); + + ch = calc_entropy(lm, words, n, &nccs, &noovs, &lscr); + + printf("input: %s\n", text); + printf("cross-entropy: %f bits\n", + ch * log(logmath_get_base(lmath)) / log(2)); + + /* Calculate perplexity pplx = exp CH */ + printf("perplexity: %f\n", logmath_exp(lmath, ch)); + printf("lm score: %d\n", lscr); + + /* Report OOVs and CCs */ + printf("%d words evaluated\n", n); + printf("%d OOVs, %d context cues removed\n", + noovs, nccs); + + ckd_free(textfoo); + ckd_free(words); +} + +int +main(int argc, char *argv[]) +{ + cmd_ln_t *config; + ngram_model_t *lm = NULL; + logmath_t *lmath; + const char *lmfn, *probdefn, *lsnfn, *text; + + if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) + return 1; + + verbose = cmd_ln_boolean_r(config, "-verbose"); + + /* Create log math object. */ + if ((lmath = logmath_init + (cmd_ln_float64_r(config, "-logbase"), 0, 0)) == NULL) { + E_FATAL("Failed to initialize log math\n"); + } + + /* Load the language model. */ + lmfn = cmd_ln_str_r(config, "-lm"); + if (lmfn == NULL + || (lm = ngram_model_read(config, lmfn, + NGRAM_AUTO, lmath)) == NULL) { + E_FATAL("Failed to load language model from %s\n", + cmd_ln_str_r(config, "-lm")); + } + if ((probdefn = cmd_ln_str_r(config, "-probdef")) != NULL) + ngram_model_read_classdef(lm, probdefn); + ngram_model_apply_weights(lm, + cmd_ln_float32_r(config, "-lw"), + cmd_ln_float32_r(config, "-wip")); + + /* Now evaluate some text. */ + lsnfn = cmd_ln_str_r(config, "-lsn"); + text = cmd_ln_str_r(config, "-text"); + if (lsnfn) { + evaluate_file(lm, lmath, lsnfn); + } + else if (text) { + evaluate_string(lm, lmath, text); + } + + return 0; +} diff --git a/swig/cmd_ln.i b/swig/cmd_ln.i new file mode 100644 index 000000000..8125abc72 --- /dev/null +++ b/swig/cmd_ln.i @@ -0,0 +1,83 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +%extend Config { + + ~Config() { + cmd_ln_free_r($self); + } + + void set_boolean(const char *key, bool val) { + cmd_ln_set_boolean_r($self, key, val); + } + + void set_int(const char *key, int val) { + cmd_ln_set_int_r($self, key, val); + } + + void set_float(const char *key, double val) { + cmd_ln_set_float_r($self, key, val); + } + + void set_string(const char *key, const char *val) { + cmd_ln_set_str_r($self, key, val); + } + + void set_string_extra(const char *key, const char *val) { + cmd_ln_set_str_extra_r($self, key, val); + } + + bool exists(const char *key) { + return cmd_ln_exists_r($self, key); + } + + bool get_boolean(const char *key) { + return cmd_ln_boolean_r($self, key); + } + + int get_int(const char *key) { + return cmd_ln_int_r($self, key); + } + + double get_float(const char *key) { + return cmd_ln_float_r($self, key); + } + + const char *get_string(const char *key) { + return cmd_ln_str_r($self, key); + } +} diff --git a/swig/fe.i b/swig/fe.i new file mode 100644 index 000000000..b3610cc3c --- /dev/null +++ b/swig/fe.i @@ -0,0 +1,58 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + + +%extend FrontEnd { + + FrontEnd() { + return NULL; + } + + ~FrontEnd() { + fe_free($self); + } + + int output_size() { + return fe_get_output_size($self); + } + + int process_utt(char *spch, size_t nsamps, mfcc_t ***cep_block) { + int nframes; + fe_process_utt($self, (const int16*) spch, nsamps, cep_block, &nframes); + return nframes; + } +} diff --git a/swig/feat.i b/swig/feat.i new file mode 100644 index 000000000..5ab1c2b79 --- /dev/null +++ b/swig/feat.i @@ -0,0 +1,43 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + + +%extend Feature { + ~Feature() { + feat_free($self); + } +}; diff --git a/swig/fsg_model.i b/swig/fsg_model.i new file mode 100644 index 000000000..2782e5d27 --- /dev/null +++ b/swig/fsg_model.i @@ -0,0 +1,149 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + + +// TODO: search for functions returning error code +%extend FsgModel { + + FsgModel(const char *name, LogMath *logmath, float lw, int n) { + return fsg_model_init(name, logmath, lw, n); + } + + FsgModel(const char *path, LogMath *logmath, float lw) { + return fsg_model_readfile(path, logmath, lw); + } + + ~FsgModel() { + fsg_model_free($self); + } + + int word_id(const char *word) { + return fsg_model_word_id($self, word); + } + + const char *word_str(int wid) { + return fsg_model_word_str($self, wid); + } + + int word_add(const char *word) { + return fsg_model_word_add($self, word); + } + + void trans_add(int src, int dst, int logp, int wid) { + fsg_model_trans_add($self, src, dst, logp, wid); + } + + int null_trans_add(int src, int dst, int logp) { + return fsg_model_null_trans_add($self, src, dst, logp); + } + + int tag_trans_add(int src, int dst, int logp, int wid) { + return fsg_model_tag_trans_add($self, src, dst, logp, wid); + } + + int add_silence(const char *silword, int state, float silprob) { + return fsg_model_add_silence($self, silword, state, silprob); + } + + int add_alt(const char *baseword, const char *altword) { + return fsg_model_add_alt($self, baseword, altword); + } + + // TODO: Figure out what to do about null_trans_closure, model_trans, arc iterators, etc + + void writefile(const char *path) { + fsg_model_writefile($self, path); + } + + void writefile_fsm(const char *path) { + fsg_model_writefile_fsm($self, path); + } + + void writefile_symtab(const char *path) { + fsg_model_writefile_symtab($self, path); + } + + // TODO: Figure out if we can support the FILE* versions of those functions + + int get_final_state() { + return fsg_model_final_state($self); + } + + void set_final_state(int state) { + fsg_model_final_state($self) = state; + } + + int get_start_state() { + return fsg_model_start_state($self); + } + + void set_start_state(int state) { + fsg_model_start_state($self) = state; + } + + int log(double logp) { + return fsg_model_log($self, logp); + } + + float get_lw() { + return fsg_model_lw($self); + } + + char const *get_name() { + return fsg_model_name($self); + } + + int get_n_word() { + return fsg_model_n_word($self); + } + + bool has_sil() { + return fsg_model_has_sil($self); + } + + bool has_alt() { + return fsg_model_has_alt($self); + } + + bool is_filler(int wid) { + return fsg_model_is_filler($self, wid); + } + + bool is_alt(int wid) { + return fsg_model_is_alt($self, wid); + } +} diff --git a/swig/iterators.i b/swig/iterators.i new file mode 100644 index 000000000..78a0bfeb4 --- /dev/null +++ b/swig/iterators.i @@ -0,0 +1,221 @@ +// Macro to construct iterable objects. +%define sb_iterator(TYPE, PREFIX, VALUE_TYPE) + +#if !SWIGRUBY + +#if SWIGJAVA +%typemap(javainterfaces) TYPE##Iterator "java.util.Iterator<"#VALUE_TYPE">" +%typemap(javacode) TYPE##Iterator %{ + @Override + public void remove() { + throw new UnsupportedOperationException(); + } +%} +#endif + +#if SWIGCSHARP +%typemap(csinterfaces) TYPE##Iterator "global::System.Collections.IEnumerator" +%typemap(cscode) TYPE##Iterator %{ + public object Current + { + get + { + return GetCurrent(); + } + } +%} +#endif + +// Structure +%begin %{ +typedef struct { + PREFIX##_t *ptr; +} TYPE##Iterator; +%} +typedef struct {} TYPE##Iterator; + +// Exception to end iteration + +#if SWIGJAVA +%exception TYPE##Iterator##::next() { + if (!arg1->ptr) { + jclass cls = (*jenv)->FindClass(jenv, "java/util/NoSuchElementException"); + (*jenv)->ThrowNew(jenv, cls, NULL); + return $null; + } + $action; +} +#elif SWIGPYTHON +%exception TYPE##Iterator##::next() { + if (!arg1->ptr) { + SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); + SWIG_fail; + } + $action; +} +%exception TYPE##Iterator##::__next__() { + if (!arg1->ptr) { + SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); + SWIG_fail; + } + $action; +} +#endif + +// Implementation of the iterator itself + +%extend TYPE##Iterator { + + TYPE##Iterator(void *ptr) { + TYPE##Iterator *iter = (TYPE##Iterator *)ckd_malloc(sizeof *iter); + iter->ptr = (PREFIX##_t *)ptr; + return iter; + } + + ~TYPE##Iterator() { + if ($self->ptr) + PREFIX##_free($self->ptr); + ckd_free($self); + } + +#if SWIGJAVA + %newobject next; + VALUE_TYPE * next() { + if ($self->ptr) { + VALUE_TYPE *value = ##VALUE_TYPE##_fromIter($self->ptr); + $self->ptr = ##PREFIX##_next($self->ptr); + return value; + } + + return NULL; + } + bool hasNext() { + return $self->ptr != NULL; + } +#elif SWIGJAVASCRIPT + %newobject next; + VALUE_TYPE * next() { + if ($self->ptr) { + VALUE_TYPE *value = ##VALUE_TYPE##_fromIter($self->ptr); + $self->ptr = ##PREFIX##_next($self->ptr); + return value; + } + + return NULL; + } +#elif SWIGPYTHON + // Python2 + %newobject next; + VALUE_TYPE * next() { + if ($self->ptr) { + VALUE_TYPE *value = ##VALUE_TYPE##_fromIter($self->ptr); + $self->ptr = ##PREFIX##_next($self->ptr); + return value; + } + return NULL; + } + + // Python3 + %newobject __next__; + VALUE_TYPE * __next__() { + if ($self->ptr) { + VALUE_TYPE *value = ##VALUE_TYPE##_fromIter($self->ptr); + $self->ptr = ##PREFIX##_next($self->ptr); + return value; + } + return NULL; + } +#elif SWIGCSHARP + bool MoveNext() { + if(!$self || !$self->ptr) + return false; + $self->ptr = ##PREFIX##_next($self->ptr); + if ($self->ptr) { + return true; + } + return false; + } + + void Reset() { + return; + } + + VALUE_TYPE *GetCurrent() { + VALUE_TYPE *value = ##VALUE_TYPE##_fromIter($self->ptr); + return value; + } +#endif + + +} + +#endif // SWIGRUBY + +%enddef + + +%define sb_iterable(TYPE, ITER_TYPE, PREFIX, INIT_PREFIX, VALUE_TYPE) + +// Methods to retrieve the iterator from the container + +#if SWIGJAVA +%typemap(javainterfaces) TYPE "Iterable<"#VALUE_TYPE">" +#endif + +#if SWIGCSHARP +%typemap(csinterfaces) TYPE "global::System.Collections.IEnumerable" +%typemap(cscode) TYPE %{ + global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { + return (global::System.Collections.IEnumerator) GetEnumerator(); + } +%} +#endif + +%extend TYPE { + +#if SWIGRUBY + void each() { + ##PREFIX##_t *iter = INIT_PREFIX##($self); + while (iter) { + VALUE_TYPE *value = ##VALUE_TYPE##_fromIter(iter); + rb_yield(SWIG_NewPointerObj(SWIG_as_voidptr(value), SWIGTYPE_p_##VALUE_TYPE##, 0 | 0 )); + iter = PREFIX##_next(iter); + } + return; + } + + void each(int count) { + ##PREFIX##_t *iter = INIT_PREFIX##($self); + int cnt = 0; + while (iter && cnt < count) { + VALUE_TYPE *value = ##VALUE_TYPE##_fromIter(iter); + rb_yield(SWIG_NewPointerObj(SWIG_as_voidptr(value), SWIGTYPE_p_##VALUE_TYPE##, 0 | 0 )); + iter = PREFIX##_next(iter); + cnt++; + } + if (iter) + PREFIX##_free(iter); + return; + } + +#elif SWIGJAVA + %newobject iterator; + ITER_TYPE##Iterator * iterator() { + return new_##ITER_TYPE##Iterator(INIT_PREFIX##($self)); + } +#elif SWIGCSHARP + %newobject get_enumerator; + ITER_TYPE##Iterator *get_enumerator() { + return new_##ITER_TYPE##Iterator(INIT_PREFIX##($self)); + } + +#else /* PYTHON, JS */ + %newobject __iter__; + ITER_TYPE##Iterator * __iter__() { + return new_##ITER_TYPE##Iterator(INIT_PREFIX##($self)); + } +#endif + +} + +%enddef diff --git a/swig/jsgf.i b/swig/jsgf.i new file mode 100644 index 000000000..9794b38f9 --- /dev/null +++ b/swig/jsgf.i @@ -0,0 +1,80 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + + +%extend Jsgf { + + Jsgf(const char *path) { + return jsgf_parse_file(path, NULL); + } + + ~Jsgf() { + jsgf_grammar_free($self); + } + + const char *get_name() { + return jsgf_grammar_name($self); + } + + JsgfRule *get_rule(const char *name) { + return jsgf_get_rule($self, name); + } + + FsgModel *build_fsg(JsgfRule *rule, LogMath *logmath, float lw) { + return jsgf_build_fsg($self, rule, logmath, lw); + } +} + +%extend JsgfRule { + + JsgfRule() { + return NULL; + } + + static JsgfRule *fromIter(void *itor) { + return jsgf_rule_iter_rule((jsgf_rule_iter_t *)itor); + } + + const char *get_name() { + return jsgf_rule_name($self); + } + + bool is_public() { + return jsgf_rule_public($self); + } +} + diff --git a/swig/logmath.i b/swig/logmath.i new file mode 100644 index 000000000..1f58e2374 --- /dev/null +++ b/swig/logmath.i @@ -0,0 +1,83 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + + +%extend LogMath { + LogMath() { + return logmath_init(1.0001f, 0, 0); + } + + ~LogMath() { + logmath_free($self); + } + + double exp(int prob) { + return logmath_exp($self, prob); + } + + int log(double prob) { + return logmath_log($self, prob); + } + + int add(int logb_p, int logb_q) { + return logmath_add($self, logb_p, logb_q); + } + + int ln_to_log(double log_p) { + return logmath_ln_to_log($self, log_p); + } + + double log_to_ln(int logb_p) { + return logmath_log_to_ln($self, logb_p); + } + + int log10_to_log(double log_p) { + return logmath_log10_to_log($self, log_p); + } + + double log_to_log10(int logb_p) { + return logmath_log_to_log10($self, logb_p); + } + + float log10_to_log_float(double log_p) { + return logmath_log10_to_log_float($self, log_p); + } + + double log_float_to_log10(float log_p) { + return logmath_log_float_to_log10($self, log_p); + } +} diff --git a/swig/ngram_model.i b/swig/ngram_model.i new file mode 100644 index 000000000..af33c33ca --- /dev/null +++ b/swig/ngram_model.i @@ -0,0 +1,121 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + + +%extend NGramModel { + + static NGramModel *fromIter(void *itor) { + const char *name; + return ngram_model_set_iter_model((ngram_model_set_iter_t*)itor, &name); + } + + NGramModel(const char *path) { + logmath_t *lmath = logmath_init(1.0001, 0, 0); + ngram_model_t * model = ngram_model_read(NULL, path, NGRAM_AUTO, lmath); + logmath_free(lmath); + return model; + } + + NGramModel(Config *config, LogMath *logmath, const char *path) { + return ngram_model_read(config, path, NGRAM_AUTO, logmath); + } + + ~NGramModel() { + ngram_model_free($self); + } + + void write(const char *path, int ftype, int *errcode) { + *errcode = ngram_model_write($self, path, (ngram_file_type_t)ftype); + } + + int str_to_type(const char *str) { + return ngram_str_to_type(str); + } + + const char * type_to_str(int type) { + return ngram_type_to_str(type); + } + + void casefold(int kase, int *errcode) { + *errcode = ngram_model_casefold($self, kase); + } + + int size() { + return ngram_model_get_size($self); + } + + int add_word(const char *word, float weight) { + return ngram_model_add_word($self, word, weight); + } + + int prob(size_t n, char **ptr) { + return ngram_prob($self, (const char * const *)ptr, n); + } +} + +// TODO: shares ptr type with NGramModel, docstrings are not generated +%extend NGramModelSet { + NGramModelSet(Config *config, LogMath *logmath, const char *path) { + return ngram_model_set_read(config, path, logmath); + } + + ~NGramModelSet() { + ngram_model_free($self); + } + + int count() { + return ngram_model_set_count($self); + } + + NGramModel * add( + NGramModel *model, const char *name, float weight, bool reuse_widmap) { + return ngram_model_set_add($self, model, name, weight, reuse_widmap); + } + + NGramModel * select(const char *name) { + return ngram_model_set_select($self, name); + } + + NGramModel * lookup(const char *name) { + return ngram_model_set_lookup($self, name); + } + + const char * current() { + return ngram_model_set_current($self); + } +} + diff --git a/swig/sphinxbase.i b/swig/sphinxbase.i new file mode 100644 index 000000000..00acb7298 --- /dev/null +++ b/swig/sphinxbase.i @@ -0,0 +1,132 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + + +%define DOCSTRING +"This documentation was automatically generated using original comments in +Doxygen format. As some C types and data structures cannot be directly mapped +into Python types, some non-trivial type conversion could have place. +Basically a type is replaced with another one that has the closest match, and +sometimes one argument of generated function comprises several arguments of the +original function (usually two). + +Functions having error code as the return value and returning effective +value in one of its arguments are transformed so that the effective value is +returned in a regular fashion and run-time exception is being thrown in case of +negative error code." +%enddef + +#if SWIGJAVA +%module SphinxBase +%rename("%(lowercamelcase)s", notregexmatch$name="^[A-Z]") ""; +#elif SWIGJAVASCRIPT +%module SphinxBase +%rename("%(lowercamelcase)s", notregexmatch$name="^[A-Z]") ""; +#elif SWIGCSHARP +%module SphinxBase +%rename("%(camelcase)s", notregexmatch$name="^[A-Z]") ""; +#elif SWIGRUBY +%module sphinxbase +#else +%module(docstring=DOCSTRING) sphinxbase +#endif + +%feature("autodoc", "1"); + +%include typemaps.i +%include iterators.i + +#if SWIGPYTHON +%begin %{ +#include +%} +#endif + +%begin %{ + +#ifndef __cplusplus +#include +#endif + +#include +#include +#include +#include +#include +#include + +typedef cmd_ln_t Config; +typedef jsgf_t Jsgf; +typedef jsgf_rule_t JsgfRule; +typedef feat_t Feature; +typedef fe_t FrontEnd; +typedef fsg_model_t FsgModel; +typedef logmath_t LogMath; +typedef ngram_model_t NGramModel; +typedef ngram_model_t NGramModelSet; +%} + +%nodefaultctor Config; + +typedef struct {} Config; +typedef struct {} FrontEnd; +typedef struct {} Feature; +typedef struct {} FsgModel; +typedef struct {} JsgfRule; +typedef struct {} NGramModel; +typedef struct {} LogMath; + +sb_iterator(NGramModelSet, ngram_model_set_iter, NGramModel); +sb_iterator(Jsgf, jsgf_rule_iter, JsgfRule) + +sb_iterable(NGramModelSet, NGramModelSet, ngram_model_set_iter, ngram_model_set_iter, NGramModel) +sb_iterable(Jsgf, Jsgf, jsgf_rule_iter, jsgf_rule_iter, JsgfRule) + +typedef struct {} NGramModelSet; +typedef struct {} Jsgf; + +#ifdef HAS_DOC +%include pydoc.i +#endif +%include cmd_ln.i +%include fe.i +%include feat.i +%include fsg_model.i +%include jsgf.i +%include ngram_model.i +%include logmath.i + diff --git a/swig/typemaps.i b/swig/typemaps.i new file mode 100644 index 000000000..c3fc2e609 --- /dev/null +++ b/swig/typemaps.i @@ -0,0 +1,101 @@ +%include + +// Support for return of raw data +#if SWIGJAVA +%include +%apply short[] {const short *SDATA}; + +%typemap(in, numinputs=0, noblock=1) int *RAWDATA_SIZE { + int temp_len; + $1 = &temp_len; +} +%typemap(jstype) short *get_rawdata "short[]" +%typemap(jtype) short *get_rawdata "short[]" +%typemap(jni) short *get_rawdata "jshortArray" +%typemap(javaout) short *get_rawdata { + return $jnicall; +} +%typemap(out) short *get_rawdata { + $result = JCALL1(NewShortArray, jenv, temp_len); + JCALL4(SetShortArrayRegion, jenv, $result, 0, temp_len, $1); +} + +#elif SWIGCSHARP +%include +%apply unsigned char INPUT[] {const unsigned char *SDATA}; +#endif + +// Define typemaps to wrap error codes returned by some functions, +// into runtime exceptions. +%typemap(in, numinputs=0, noblock=1) int *errcode { + int errcode; + $1 = &errcode; +} + +%typemap(argout) int *errcode { + if (*$1 < 0) { + char buf[64]; + snprintf(buf, 64, "$symname returned %d", *$1); + SWIG_exception(SWIG_RuntimeError, buf); + } +} + +// Typemap for string arrays used in ngram API +#if SWIGPYTHON + +%typemap(in) (size_t n, char **ptr) { + /* Check if is a list */ + $1 = 0; + if (PyList_Check($input)) { + int i; + $1 = PyList_Size($input); + $2 = (char **) calloc(($1 + 1), sizeof(char *)); + for (i = 0; i < $1; i++) { + PyObject *o = PyList_GetItem($input,i); + $2[i] = SWIG_Python_str_AsChar(o); + } + } else { + PyErr_SetString(PyExc_TypeError, "list type expected"); + return NULL; + } +} + +%typemap(freearg) (size_t n, char **ptr) { + int i; + if ($2 != NULL) { + for (i = 0; $2[i] != NULL; i++) { + SWIG_Python_str_DelForPy3($2[i]); + } + free($2); + } +} + +#elif SWIGJAVA +%typemap(in) (size_t n, char **ptr) { + int i = 0; + $1 = (*jenv)->GetArrayLength(jenv, $input); + $2 = (char **) malloc(($1)*sizeof(char *)); + /* make a copy of each string */ + for (i = 0; i<$1; i++) { + jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i); + const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0); + $2[i] = malloc((strlen(c_string)+1)*sizeof(char)); + strcpy($2[i], c_string); + (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string); + (*jenv)->DeleteLocalRef(jenv, j_string); + } +} + +%typemap(freearg) (size_t n, char **ptr) { + int i; + for (i=0; i<$1; i++) + free($2[i]); + free($2); +} + +%typemap(jni) (size_t n, char **ptr) "jobjectArray" +%typemap(jtype) (size_t n, char **ptr) "String[]" +%typemap(jstype) (size_t n, char **ptr) "String[]" +%typemap(javain) (size_t n, char **ptr) "$javainput" + +#endif diff --git a/test/regression/chan3-dither.cepview b/test/regression/chan3-dither.cepview new file mode 100644 index 000000000..4d626001c --- /dev/null +++ b/test/regression/chan3-dither.cepview @@ -0,0 +1,2178 @@ + 6.458 -1.580 0.214 0.167 -0.124 0.162 0.065 0.054 -0.172 -0.098 -0.090 -0.040 0.030 + 6.529 -1.616 0.271 0.104 -0.230 0.093 -0.188 -0.055 -0.241 -0.199 -0.062 -0.003 -0.117 + 6.690 -1.368 0.277 0.005 -0.346 -0.015 -0.215 0.062 -0.190 -0.105 -0.101 -0.034 -0.190 + 6.789 -1.385 0.084 0.092 -0.400 0.165 -0.166 -0.186 -0.145 -0.009 -0.142 -0.059 0.014 + 6.523 -1.346 0.040 0.157 -0.312 -0.043 -0.124 -0.110 -0.091 0.102 -0.210 -0.062 0.054 + 6.647 -1.436 0.049 0.241 -0.227 -0.199 -0.085 -0.106 -0.201 0.073 -0.246 -0.196 -0.025 + 6.388 -1.354 0.013 0.138 -0.198 -0.165 0.074 0.004 -0.289 0.023 -0.262 -0.005 -0.033 + 6.059 -1.268 0.067 0.278 0.075 -0.116 -0.120 -0.168 -0.176 -0.016 -0.175 -0.157 -0.097 + 6.127 -1.158 0.016 0.243 -0.070 -0.100 -0.344 -0.120 -0.122 0.092 -0.098 -0.160 -0.068 + 5.980 -1.153 -0.229 0.063 0.169 -0.122 -0.262 -0.121 -0.071 0.140 -0.072 -0.038 0.020 + 5.682 -1.070 -0.169 -0.077 0.014 -0.089 -0.107 -0.220 -0.280 -0.089 -0.143 -0.125 -0.037 + 5.548 -0.810 0.050 0.024 -0.010 -0.205 -0.156 0.010 -0.006 0.103 0.015 -0.081 -0.032 + 5.739 -0.378 0.597 0.315 0.014 0.063 0.113 -0.150 -0.105 -0.071 -0.066 -0.020 -0.146 + 5.000 -0.074 0.385 0.163 -0.092 0.044 0.038 0.017 0.020 0.037 -0.005 -0.122 -0.222 + 4.927 -0.223 0.321 -0.017 -0.114 0.062 -0.043 -0.040 0.063 0.115 -0.091 -0.026 -0.192 + 4.490 -0.404 0.154 -0.036 -0.130 -0.037 0.006 -0.154 -0.156 -0.024 -0.157 0.015 0.060 + 4.276 0.005 0.047 0.050 0.089 -0.012 -0.014 -0.094 -0.150 0.209 -0.028 -0.159 -0.096 + 3.756 0.075 0.077 0.190 -0.004 -0.167 -0.349 -0.087 -0.138 0.101 -0.050 -0.167 -0.063 + 3.376 0.151 -0.236 -0.002 -0.054 -0.038 -0.240 -0.115 -0.089 0.125 0.114 -0.033 0.019 + 3.283 0.111 -0.274 0.065 -0.117 0.027 -0.274 -0.254 -0.216 -0.092 0.086 0.028 0.042 + 3.775 0.254 -0.043 -0.033 -0.271 0.005 -0.155 -0.194 -0.125 -0.037 -0.056 -0.159 -0.079 + 3.939 0.265 0.107 -0.010 -0.032 -0.047 0.013 -0.131 -0.069 -0.150 -0.139 -0.198 -0.229 + 3.709 0.340 0.171 0.265 -0.050 -0.048 -0.266 -0.315 -0.163 -0.029 -0.095 -0.216 0.018 + 3.844 0.257 0.306 0.148 0.006 -0.114 -0.159 -0.426 -0.209 -0.017 0.042 0.010 0.058 + 6.780 -0.459 0.712 0.007 -0.551 0.155 -0.063 -0.293 -0.027 -0.062 -0.136 0.019 -0.164 + 9.417 -0.219 0.605 0.300 -0.431 -0.151 -0.260 -0.208 -0.062 -0.299 -0.196 0.074 -0.286 + 10.578 0.200 0.330 0.572 -0.237 -0.480 -0.531 -0.002 -0.256 -0.320 -0.224 -0.047 -0.305 + 12.180 -0.191 0.303 0.567 -0.309 -0.556 -0.614 -0.056 -0.362 -0.316 -0.271 0.043 -0.256 + 13.369 -0.265 0.158 0.461 -0.378 -0.571 -0.597 0.003 -0.469 -0.268 -0.343 0.133 -0.288 + 13.751 0.016 -0.073 0.453 -0.387 -0.609 -0.711 0.037 -0.530 -0.191 -0.385 0.157 -0.249 + 14.173 0.092 -0.208 0.450 -0.436 -0.699 -0.730 0.009 -0.565 -0.070 -0.395 0.210 -0.213 + 14.364 0.115 -0.292 0.421 -0.432 -0.819 -0.712 0.045 -0.584 0.018 -0.387 0.235 -0.179 + 13.980 0.489 -0.567 0.446 -0.426 -0.781 -0.780 0.166 -0.605 0.025 -0.275 0.065 -0.038 + 13.954 0.713 -0.790 0.373 -0.348 -0.773 -0.795 0.074 -0.448 0.017 -0.217 -0.032 0.017 + 14.157 0.741 -0.760 0.194 -0.356 -0.555 -0.970 0.041 -0.495 0.178 -0.245 -0.111 -0.005 + 13.919 0.844 -0.590 -0.083 -0.340 -0.367 -0.827 -0.150 -0.673 0.299 -0.157 -0.269 -0.065 + 13.253 1.122 -0.445 -0.220 -0.491 -0.209 -0.517 -0.266 -0.966 0.212 -0.057 -0.198 -0.137 + 12.590 1.256 -0.278 -0.308 -0.474 -0.296 -0.292 -0.244 -1.016 0.060 -0.052 -0.138 -0.061 + 12.258 1.407 -0.397 -0.268 -0.477 -0.213 -0.334 -0.138 -1.120 0.086 -0.129 -0.054 -0.171 + 12.485 1.239 -0.336 -0.236 -0.387 -0.233 -0.377 -0.184 -1.112 0.157 -0.141 -0.098 -0.267 + 12.852 1.003 -0.348 -0.212 -0.191 -0.239 -0.457 -0.271 -0.984 0.216 -0.125 -0.222 -0.278 + 13.122 0.869 -0.512 -0.031 -0.016 -0.363 -0.649 -0.236 -0.788 0.216 -0.216 -0.326 -0.186 + 13.415 0.513 -0.513 0.221 0.160 -0.646 -0.729 -0.080 -0.644 0.118 -0.368 -0.199 -0.098 + 13.669 0.215 -0.481 0.509 0.026 -0.849 -0.680 0.113 -0.701 -0.005 -0.316 -0.090 -0.085 + 14.023 -0.128 -0.311 0.636 -0.188 -0.945 -0.533 0.142 -0.768 0.000 -0.275 -0.042 -0.107 + 13.859 -0.172 -0.235 0.698 -0.380 -0.895 -0.479 0.082 -0.726 0.000 -0.280 0.032 -0.110 + 13.834 -0.192 -0.080 0.585 -0.502 -0.866 -0.421 -0.047 -0.556 -0.066 -0.266 0.089 -0.148 + 13.802 0.010 -0.197 0.466 -0.542 -0.817 -0.461 -0.033 -0.458 -0.114 -0.217 0.126 -0.135 + 13.639 0.166 -0.325 0.337 -0.615 -0.689 -0.598 0.093 -0.418 -0.110 -0.198 0.187 -0.232 + 13.564 0.200 -0.392 0.189 -0.604 -0.638 -0.647 0.158 -0.379 -0.047 -0.277 0.238 -0.244 + 13.549 0.324 -0.549 0.148 -0.601 -0.533 -0.715 0.105 -0.250 -0.101 -0.230 0.143 -0.167 + 13.358 0.536 -0.689 0.061 -0.526 -0.501 -0.777 0.040 -0.205 -0.050 -0.284 0.138 -0.127 + 13.148 0.544 -0.556 -0.173 -0.310 -0.553 -0.777 -0.085 -0.177 0.039 -0.368 0.110 -0.055 + 12.791 0.398 -0.317 -0.383 -0.165 -0.575 -0.547 -0.476 -0.049 0.129 -0.457 0.037 0.029 + 12.749 0.083 -0.087 -0.370 -0.421 -0.109 -0.598 -0.629 -0.041 0.151 -0.310 -0.039 -0.105 + 12.917 0.379 0.033 -0.432 -0.681 0.292 -0.856 -0.488 -0.169 0.139 -0.280 0.142 -0.371 + 13.190 0.533 0.040 -0.566 -0.861 0.326 -0.810 -0.355 -0.413 0.290 -0.295 0.295 -0.418 + 13.190 0.492 0.218 -0.744 -0.939 0.240 -0.737 -0.194 -0.554 0.241 -0.286 0.469 -0.442 + 12.780 0.695 0.293 -0.856 -0.976 0.125 -0.623 -0.024 -0.658 0.044 -0.252 0.494 -0.396 + 12.526 0.665 0.472 -0.872 -1.007 0.056 -0.571 0.079 -0.696 0.016 -0.361 0.406 -0.262 + 12.121 0.854 0.386 -0.666 -1.153 -0.030 -0.379 -0.069 -0.514 -0.034 -0.485 0.418 -0.307 + 11.404 0.942 0.485 -0.517 -1.179 -0.111 -0.366 -0.073 -0.360 -0.062 -0.671 0.364 -0.281 + 10.918 0.877 0.609 -0.429 -1.132 -0.126 -0.387 -0.016 -0.334 -0.074 -0.769 0.295 -0.302 + 10.774 0.844 0.664 -0.402 -1.065 -0.195 -0.370 -0.010 -0.327 -0.145 -0.768 0.219 -0.373 + 10.731 0.749 0.724 -0.341 -1.018 -0.227 -0.399 -0.028 -0.321 -0.117 -0.719 0.177 -0.471 + 10.873 0.611 0.706 -0.365 -1.032 -0.228 -0.445 -0.093 -0.235 -0.051 -0.630 0.048 -0.480 + 11.283 0.587 0.496 -0.321 -1.069 -0.279 -0.461 -0.095 -0.157 -0.054 -0.651 0.063 -0.346 + 12.396 0.282 0.385 -0.563 -1.148 -0.212 -0.399 -0.030 -0.318 0.041 -0.496 0.056 -0.132 + 13.272 0.159 0.081 -0.800 -1.168 -0.149 -0.385 0.068 -0.318 -0.078 -0.370 0.227 -0.065 + 13.305 0.093 -0.007 -0.884 -1.211 -0.007 -0.451 0.061 -0.284 0.002 -0.314 0.273 -0.083 + 13.356 0.047 -0.060 -0.941 -1.228 0.084 -0.490 0.166 -0.273 0.048 -0.246 0.234 -0.158 + 13.397 0.068 -0.129 -1.003 -1.190 0.159 -0.542 0.261 -0.320 0.104 -0.202 0.222 -0.249 + 13.444 0.152 -0.238 -1.066 -1.135 0.200 -0.459 0.222 -0.324 0.124 -0.166 0.179 -0.289 + 13.488 0.079 -0.239 -1.099 -1.059 0.244 -0.408 0.168 -0.287 0.118 -0.068 0.064 -0.335 + 13.100 0.367 -0.396 -1.032 -0.994 0.251 -0.389 0.066 -0.238 0.078 0.044 0.012 -0.345 + 12.729 0.568 -0.536 -0.917 -0.871 0.218 -0.359 0.003 -0.215 0.052 0.117 -0.050 -0.340 + 12.065 0.587 -0.459 -0.774 -0.791 0.170 -0.393 -0.009 -0.233 0.060 0.131 0.031 -0.396 + 11.842 0.408 -0.470 -0.554 -0.672 0.174 -0.316 -0.244 -0.111 0.078 0.024 0.119 -0.508 + 11.775 0.363 -0.557 -0.286 -0.662 0.136 -0.403 -0.328 -0.064 0.233 -0.113 0.101 -0.530 + 11.653 0.296 -0.762 0.167 -0.511 -0.225 -0.502 -0.179 0.035 0.176 -0.249 0.150 -0.445 + 11.024 0.307 -0.785 0.470 -0.381 -0.382 -0.605 0.021 0.073 0.039 -0.339 0.297 -0.509 + 10.386 0.201 -0.369 0.595 -0.441 -0.476 -0.536 0.144 0.167 -0.243 -0.282 0.348 -0.543 + 9.855 0.137 0.034 0.172 -0.115 -0.500 -0.399 0.184 0.056 -0.324 -0.112 -0.063 -0.384 + 9.038 0.383 0.301 -0.006 -0.015 -0.395 -0.395 0.299 -0.334 -0.253 0.103 -0.326 -0.281 + 8.126 0.681 0.255 -0.018 0.040 -0.267 -0.463 0.347 -0.414 -0.087 -0.122 -0.322 -0.249 + 7.045 0.750 0.605 -0.023 -0.098 -0.297 -0.334 0.106 -0.170 -0.133 -0.348 -0.131 -0.163 + 6.880 0.538 0.701 -0.372 0.069 -0.395 0.046 -0.147 0.026 -0.108 -0.408 -0.164 -0.085 + 8.256 -0.259 0.480 -0.437 0.069 -0.212 0.103 -0.075 0.008 -0.263 -0.202 -0.035 -0.176 + 9.530 -0.399 0.062 -0.259 -0.191 -0.127 -0.102 -0.032 -0.039 -0.155 -0.252 0.098 -0.179 + 9.698 -0.407 0.176 -0.152 -0.063 -0.370 -0.289 -0.217 0.105 -0.164 -0.357 0.042 -0.098 + 10.738 -0.079 0.169 -0.211 -0.173 -0.375 -0.459 -0.344 -0.024 -0.031 -0.433 0.039 -0.095 + 11.355 -0.032 0.033 -0.264 -0.016 -0.375 -0.651 -0.474 -0.078 -0.061 -0.467 -0.015 -0.012 + 11.118 0.149 0.098 -0.415 -0.147 -0.228 -0.580 -0.503 -0.083 -0.027 -0.417 -0.088 -0.047 + 10.765 -0.097 0.340 -0.382 -0.122 -0.219 -0.571 -0.527 -0.008 -0.146 -0.272 -0.212 0.010 + 10.621 -0.875 0.441 -0.493 -0.004 -0.076 -0.164 -0.116 0.051 -0.078 -0.300 -0.177 0.011 + 10.450 -1.087 0.510 -0.545 -0.050 -0.211 -0.069 -0.108 -0.000 -0.033 -0.337 -0.227 -0.114 + 10.686 -1.132 0.499 -0.535 0.207 -0.042 0.015 -0.081 -0.042 -0.046 -0.293 -0.050 -0.211 + 10.825 -1.058 0.429 -0.612 0.338 -0.224 -0.297 -0.165 -0.065 -0.217 -0.201 -0.040 -0.115 + 11.215 -1.050 0.402 -0.657 0.231 -0.310 -0.171 -0.060 -0.095 -0.192 -0.209 -0.100 -0.098 + 11.643 -0.874 0.481 -0.438 0.234 -0.336 -0.038 -0.099 -0.017 -0.261 -0.221 0.070 -0.055 + 11.354 -1.394 0.316 -0.498 0.129 -0.316 -0.038 -0.102 -0.130 -0.381 -0.239 -0.026 -0.066 + 11.594 -1.505 0.276 -0.329 0.134 -0.258 -0.103 -0.134 -0.174 -0.100 -0.171 -0.014 0.010 + 11.021 -1.342 -0.012 -0.131 0.083 -0.675 0.008 -0.011 -0.202 -0.275 0.046 -0.004 -0.016 + 7.127 -0.422 -0.236 -0.075 0.447 -0.613 -0.047 0.077 -0.130 -0.323 0.077 0.064 -0.157 + 4.693 0.110 -0.056 -0.658 0.184 -0.241 0.066 -0.089 -0.119 0.003 -0.022 -0.048 -0.127 + 4.780 0.196 0.004 -0.769 0.003 -0.507 -0.090 -0.220 -0.217 -0.167 -0.084 0.058 0.074 + 8.864 0.027 -0.222 -0.089 -0.733 -0.513 -0.186 -0.190 -0.073 0.030 -0.184 -0.104 -0.027 + 11.560 -0.763 -0.385 -0.013 -0.785 -0.533 -0.023 -0.250 -0.208 -0.021 -0.183 0.011 -0.030 + 12.263 -0.484 -0.157 0.472 -0.416 -0.731 -0.299 -0.230 -0.248 -0.202 -0.085 0.004 -0.163 + 13.613 -0.086 -0.574 0.358 -0.481 -0.715 -0.650 -0.094 -0.197 -0.087 -0.237 0.247 -0.317 + 14.008 -0.107 -0.674 0.101 -0.523 -0.681 -0.728 0.008 -0.163 0.107 -0.317 0.274 -0.308 + 14.086 -0.072 -0.729 -0.109 -0.606 -0.645 -0.698 0.072 -0.044 0.198 -0.271 0.045 -0.221 + 14.227 -0.163 -0.701 -0.201 -0.567 -0.515 -0.759 0.126 -0.051 0.249 -0.313 -0.036 -0.239 + 14.401 -0.052 -0.765 -0.242 -0.599 -0.406 -0.762 0.205 -0.127 0.267 -0.345 -0.161 -0.222 + 14.351 -0.115 -0.712 -0.208 -0.661 -0.301 -0.864 0.187 -0.185 0.331 -0.405 -0.038 -0.302 + 14.139 -0.021 -0.706 -0.213 -0.664 -0.330 -0.905 0.182 -0.124 0.299 -0.425 0.023 -0.291 + 13.601 0.055 -0.634 -0.285 -0.611 -0.454 -0.954 0.142 -0.016 0.272 -0.391 0.096 -0.227 + 11.971 0.528 -0.410 -0.216 -0.382 -0.661 -0.786 -0.033 0.150 -0.035 -0.196 0.202 -0.126 + 10.061 -0.477 0.126 0.122 -0.450 -0.414 -0.304 0.063 0.149 -0.122 -0.356 0.038 0.052 + 10.824 -1.212 0.572 0.811 -0.355 -0.053 -0.273 -0.206 0.124 -0.113 -0.239 -0.007 -0.070 + 11.416 -1.457 0.704 0.879 -0.354 0.029 0.062 -0.179 -0.006 -0.086 -0.395 -0.064 -0.146 + 11.839 -1.776 0.767 0.720 -0.425 0.016 0.053 -0.143 -0.097 -0.035 -0.269 -0.103 -0.178 + 11.839 -2.278 0.306 0.475 -0.595 -0.141 0.069 -0.056 0.090 0.056 -0.295 -0.125 -0.177 + 11.990 -2.469 0.285 0.764 -0.489 -0.204 -0.157 -0.013 0.072 -0.077 -0.180 -0.034 -0.098 + 11.816 -2.356 0.161 0.506 -0.619 -0.198 -0.089 0.069 0.149 0.040 -0.040 -0.149 -0.026 + 12.318 -1.802 0.355 0.841 -0.181 -0.074 -0.038 -0.134 -0.020 -0.052 -0.226 -0.172 0.049 + 11.673 -1.128 0.318 0.731 -0.140 -0.367 0.012 0.004 0.023 -0.022 -0.302 -0.113 0.064 + 10.561 -0.632 0.158 0.566 0.050 -0.152 -0.114 0.019 0.048 -0.148 -0.206 -0.031 -0.018 + 11.260 0.555 -0.479 0.173 -0.371 -0.325 -0.301 -0.050 0.042 0.082 -0.170 -0.056 -0.036 + 11.446 0.889 -0.472 0.060 -0.320 -0.319 -0.455 -0.114 0.024 0.094 -0.441 0.178 -0.289 + 11.438 0.632 -0.430 0.093 -0.422 -0.251 -0.463 -0.231 0.092 0.195 -0.403 0.132 -0.231 + 10.804 0.537 -0.333 0.234 -0.364 -0.266 -0.316 -0.433 0.090 0.257 -0.402 0.038 -0.267 + 10.273 -0.030 0.255 0.390 -0.315 -0.328 -0.166 -0.320 -0.080 0.220 -0.463 0.019 -0.190 + 10.498 -0.216 0.285 0.332 -0.171 -0.384 -0.164 -0.225 -0.170 0.329 -0.530 0.061 -0.326 + 10.644 -0.078 -0.353 0.089 0.049 -0.079 -0.564 -0.276 -0.150 0.366 -0.261 0.076 -0.201 + 11.649 0.100 -0.437 -0.035 -0.121 -0.269 -0.648 -0.141 -0.120 0.302 -0.224 -0.022 -0.246 + 11.759 0.084 -0.521 -0.040 -0.270 -0.272 -0.741 -0.107 -0.072 0.431 -0.286 0.049 -0.349 + 12.239 0.166 -0.661 -0.092 -0.514 -0.286 -0.712 -0.138 0.032 0.393 -0.230 0.028 -0.292 + 12.284 0.352 -0.627 -0.186 -0.407 -0.404 -0.480 -0.332 -0.109 0.357 -0.287 0.043 -0.239 + 10.767 0.547 -0.318 -0.342 -0.249 -0.295 -0.348 -0.541 -0.278 0.261 -0.132 -0.179 -0.285 + 9.517 0.593 -0.239 -0.100 -0.209 -0.240 -0.298 -0.566 -0.455 0.234 -0.008 -0.188 -0.280 + 5.833 0.190 0.223 0.108 -0.103 -0.002 -0.167 -0.147 -0.108 0.244 -0.034 -0.252 -0.260 + 5.505 0.191 0.201 0.169 -0.270 0.077 -0.126 -0.222 0.059 0.211 0.002 -0.244 -0.273 + 5.349 0.288 0.488 0.263 -0.313 -0.250 -0.309 -0.337 -0.008 0.117 -0.069 -0.166 -0.097 + 5.451 -0.033 0.595 0.279 -0.310 -0.294 -0.264 -0.195 -0.071 0.236 -0.187 -0.126 -0.154 + 8.193 -0.581 0.501 -0.070 -0.252 -0.312 -0.322 -0.099 -0.199 -0.022 -0.354 -0.118 -0.212 + 8.853 -0.471 -0.007 0.013 -0.176 -0.210 -0.145 -0.083 0.064 0.189 -0.070 -0.174 -0.060 + 11.472 -0.423 -0.607 0.011 -0.410 -0.348 -0.420 -0.148 -0.021 0.152 -0.160 -0.132 -0.026 + 12.762 -0.073 -0.719 -0.157 -0.593 -0.619 -0.574 -0.110 0.007 0.318 -0.207 -0.095 -0.007 + 13.090 0.012 -0.876 -0.029 -0.625 -0.604 -0.496 -0.097 0.083 0.219 -0.295 -0.081 -0.003 + 13.442 -0.135 -0.928 0.001 -0.678 -0.534 -0.528 -0.043 0.081 0.210 -0.340 -0.043 -0.093 + 13.263 -0.125 -0.955 -0.052 -0.747 -0.420 -0.643 0.121 -0.058 0.342 -0.485 0.049 -0.126 + 13.499 -0.254 -0.941 -0.148 -0.748 -0.406 -0.687 0.216 -0.099 0.443 -0.624 0.009 -0.182 + 13.650 -0.077 -1.001 -0.178 -0.642 -0.419 -0.586 0.191 -0.137 0.430 -0.592 -0.112 -0.140 + 13.632 -0.017 -1.056 -0.296 -0.604 -0.344 -0.526 0.200 -0.242 0.424 -0.559 -0.183 -0.115 + 13.201 0.011 -1.165 -0.468 -0.606 -0.343 -0.467 0.220 -0.214 0.467 -0.632 -0.225 -0.111 + 13.214 -0.050 -1.082 -0.460 -0.678 -0.274 -0.523 0.250 -0.241 0.568 -0.603 -0.237 -0.130 + 13.499 0.004 -1.058 -0.445 -0.709 -0.171 -0.542 0.230 -0.284 0.545 -0.560 -0.289 -0.120 + 13.495 -0.112 -0.976 -0.553 -0.682 -0.183 -0.474 0.229 -0.322 0.491 -0.484 -0.331 -0.108 + 12.974 -0.032 -0.899 -0.644 -0.792 -0.116 -0.516 0.245 -0.337 0.624 -0.485 -0.406 -0.120 + 13.377 -0.030 -0.777 -0.639 -0.798 -0.078 -0.525 0.174 -0.399 0.611 -0.435 -0.362 -0.130 + 13.395 0.059 -0.631 -0.738 -0.725 -0.077 -0.576 0.089 -0.460 0.562 -0.316 -0.297 -0.193 + 12.558 0.213 -0.324 -0.972 -0.696 -0.054 -0.616 -0.030 -0.344 0.515 -0.234 -0.316 -0.197 + 12.310 0.234 -0.285 -1.020 -0.733 -0.113 -0.577 -0.094 -0.346 0.557 -0.206 -0.226 -0.214 + 11.933 0.686 -0.393 -0.917 -0.726 -0.208 -0.483 -0.372 -0.338 0.548 -0.266 -0.003 -0.186 + 11.893 0.344 -0.152 -0.811 -0.572 -0.197 -0.487 -0.523 -0.420 0.511 -0.387 0.147 -0.209 + 10.342 0.273 -0.009 -0.847 -0.475 -0.286 -0.464 -0.706 -0.398 0.676 -0.303 0.251 -0.126 + 10.541 0.371 0.064 -0.639 -0.275 -0.253 -0.363 -0.762 -0.478 0.306 -0.373 0.136 -0.218 + 6.905 0.578 0.098 -0.509 -0.370 -0.224 -0.412 -0.678 -0.354 0.526 -0.510 0.181 -0.258 + 5.618 0.678 -0.078 -0.168 -0.389 -0.230 -0.288 -0.031 0.117 0.374 -0.104 -0.084 -0.149 + 5.625 0.752 -0.041 -0.075 -0.406 -0.203 -0.365 -0.009 0.018 0.421 -0.091 -0.082 -0.018 + 5.206 0.550 -0.356 -0.341 -0.578 -0.281 -0.357 -0.063 0.003 0.472 -0.013 -0.085 -0.092 + 4.998 0.472 -0.366 -0.277 -0.449 -0.212 -0.404 0.062 0.003 0.234 -0.029 -0.248 -0.151 + 4.887 0.354 -0.244 -0.216 -0.553 -0.209 -0.108 0.049 0.079 0.409 0.081 -0.049 -0.080 + 6.730 -0.080 -0.541 0.103 -0.583 -0.489 -0.031 0.003 -0.092 -0.069 -0.189 0.109 -0.046 + 6.295 0.005 -0.539 -0.084 -0.650 -0.383 0.004 -0.155 -0.135 -0.079 -0.202 0.092 -0.067 + 4.975 0.201 -0.309 -0.098 -0.520 -0.270 -0.156 -0.114 -0.082 0.200 0.104 0.159 -0.111 + 4.986 0.165 -0.598 -0.014 -0.309 -0.201 -0.158 -0.111 0.063 0.298 0.044 0.030 0.021 + 5.239 0.193 -0.452 -0.176 -0.343 -0.213 -0.163 -0.259 -0.010 0.107 0.166 0.215 -0.100 + 5.085 -0.052 -0.529 -0.246 -0.300 -0.171 -0.056 -0.173 -0.178 0.157 0.135 0.059 0.028 + 5.249 0.143 -0.593 -0.176 -0.208 -0.096 -0.178 -0.008 -0.084 0.106 0.069 0.113 -0.056 + 5.355 0.081 -0.473 0.130 -0.155 -0.138 -0.308 -0.193 -0.121 0.238 0.166 0.108 -0.074 + 5.363 0.031 -0.498 -0.093 -0.231 -0.148 -0.283 -0.267 -0.186 0.187 0.103 0.019 -0.039 + 5.562 0.093 -0.552 -0.032 -0.332 -0.161 -0.151 -0.170 -0.206 -0.089 -0.121 0.170 -0.003 + 5.733 0.148 -0.444 -0.053 -0.126 0.040 -0.287 -0.284 -0.107 0.047 -0.049 0.088 -0.221 + 5.932 0.236 -0.388 -0.041 -0.220 -0.126 -0.254 -0.138 -0.174 0.099 0.026 0.072 -0.147 + 5.953 0.162 -0.354 0.092 -0.178 -0.173 -0.287 -0.253 -0.109 0.093 0.021 -0.119 -0.070 + 6.312 0.310 -0.129 0.031 -0.205 -0.102 -0.101 -0.146 -0.137 -0.013 -0.042 0.124 0.002 + 6.340 0.422 -0.184 -0.212 -0.227 0.069 -0.153 -0.259 -0.189 -0.134 0.121 0.032 -0.165 + 6.991 0.226 -0.127 -0.289 -0.176 -0.271 -0.051 -0.289 -0.149 -0.101 -0.246 -0.184 -0.012 + 8.542 0.353 0.132 -0.293 -0.115 -0.407 0.028 -0.348 -0.026 -0.147 -0.531 -0.357 -0.009 + 7.651 0.076 0.017 0.013 -0.135 -0.269 -0.047 0.060 -0.187 -0.138 -0.267 -0.167 -0.330 + 7.568 0.005 -0.070 -0.110 -0.213 -0.285 -0.105 -0.101 -0.173 -0.211 -0.232 -0.058 -0.391 + 7.060 -0.093 -0.383 -0.577 -0.479 -0.335 -0.030 -0.215 -0.177 0.039 -0.244 -0.117 -0.184 + 7.236 0.252 -0.468 -0.396 -0.419 -0.293 -0.029 -0.065 -0.221 -0.096 -0.427 -0.079 -0.075 + 7.289 0.143 -0.546 -0.454 -0.467 -0.303 -0.064 -0.028 -0.193 -0.275 -0.378 -0.219 -0.054 + 7.441 0.113 -0.637 -0.442 -0.330 -0.303 -0.266 -0.150 -0.187 -0.282 -0.565 -0.133 0.036 + 7.168 -0.280 -0.549 -0.342 -0.322 -0.189 -0.298 -0.227 -0.115 -0.227 -0.313 0.017 0.030 + 7.317 -0.734 -0.194 -0.049 -0.174 -0.083 -0.294 -0.352 -0.219 -0.179 -0.184 0.037 0.099 + 7.195 -0.401 -0.493 -0.240 -0.326 -0.263 -0.324 -0.217 -0.212 -0.352 -0.504 -0.061 0.058 + 6.459 0.515 -0.207 -0.495 -0.484 -0.334 -0.323 0.098 0.085 -0.186 -0.466 -0.291 -0.099 + 6.131 0.339 -0.093 -0.696 -0.567 -0.224 -0.128 -0.010 0.115 -0.106 -0.474 -0.163 -0.240 + 5.659 0.059 -0.041 -0.613 -0.362 -0.149 -0.025 0.089 0.015 -0.144 -0.319 -0.096 -0.349 + 5.638 -0.077 0.063 -0.378 0.017 -0.186 -0.277 -0.128 -0.078 -0.137 -0.152 -0.052 -0.361 + 5.828 -0.132 0.171 -0.328 -0.238 -0.210 -0.192 -0.237 -0.173 -0.164 -0.083 0.129 -0.158 + 5.892 -0.121 0.205 -0.386 -0.157 -0.199 -0.237 -0.288 -0.142 -0.244 -0.151 0.037 -0.165 + 5.746 -0.021 0.068 -0.355 -0.102 -0.225 -0.129 -0.134 -0.141 -0.136 -0.133 0.040 -0.187 + 5.656 -0.031 -0.046 -0.470 -0.268 -0.365 -0.277 -0.176 -0.087 -0.059 -0.054 0.080 -0.183 + 5.569 0.129 0.039 -0.442 -0.190 -0.204 -0.227 -0.210 -0.114 -0.060 -0.080 0.094 -0.132 + 5.541 0.054 0.037 -0.399 -0.218 -0.280 -0.321 -0.098 -0.098 0.092 -0.026 -0.033 -0.247 + 5.315 0.151 -0.228 -0.492 -0.309 -0.377 -0.267 -0.112 -0.074 0.043 0.004 0.060 -0.057 + 5.553 0.330 -0.108 -0.292 -0.387 -0.204 -0.089 0.014 0.021 -0.098 -0.039 0.047 -0.173 + 5.341 0.509 -0.131 -0.433 -0.450 -0.008 -0.023 0.120 -0.037 -0.183 -0.219 -0.073 -0.198 + 5.298 0.331 -0.306 -0.461 -0.474 -0.156 -0.093 0.156 0.166 0.020 -0.169 -0.176 -0.036 + 4.820 0.111 -0.387 -0.391 -0.424 -0.133 -0.167 0.207 0.242 0.149 -0.285 -0.147 -0.026 + 4.239 0.164 -0.207 -0.289 -0.304 0.082 -0.173 0.021 -0.082 -0.202 -0.190 -0.040 0.015 + 4.705 0.209 -0.231 -0.191 0.005 -0.146 -0.289 -0.261 -0.090 0.038 -0.107 0.103 -0.030 + 4.350 -0.138 -0.313 -0.141 -0.299 -0.151 -0.260 -0.106 0.014 0.144 -0.075 0.169 -0.017 + 2.609 0.327 -0.050 -0.249 -0.090 0.038 -0.071 -0.055 -0.176 0.140 0.134 0.035 0.104 + 2.588 0.222 -0.040 0.047 -0.132 -0.027 -0.068 -0.026 -0.140 0.109 0.171 0.122 -0.031 + 2.386 0.269 0.133 0.082 -0.131 -0.048 -0.297 -0.158 -0.062 0.073 0.071 -0.046 -0.107 + 2.728 0.403 0.055 0.003 -0.073 -0.028 -0.166 -0.220 -0.151 0.022 0.149 -0.007 -0.111 + 2.491 0.317 -0.101 -0.249 -0.057 -0.187 -0.265 -0.298 -0.084 0.129 0.293 0.048 -0.145 + 2.186 0.226 -0.053 -0.179 -0.119 0.052 -0.147 -0.264 -0.020 0.079 0.107 0.043 -0.042 + 2.127 0.406 -0.090 -0.253 -0.049 0.018 -0.110 -0.099 -0.150 0.138 -0.034 -0.113 -0.027 + 2.122 0.404 -0.249 -0.332 -0.138 -0.112 -0.166 -0.066 -0.205 0.017 0.013 0.043 0.024 + 1.884 0.275 -0.132 -0.150 -0.247 -0.132 -0.189 -0.001 0.043 0.085 0.075 0.030 0.005 + 1.900 0.454 -0.027 -0.082 0.026 0.082 -0.029 -0.045 -0.005 -0.006 0.078 0.073 0.090 + 2.585 0.846 0.208 0.047 0.032 -0.082 -0.184 -0.265 -0.237 -0.067 0.089 0.227 0.125 + 5.831 1.369 0.391 -0.083 -0.095 -0.239 -0.307 -0.174 -0.251 -0.058 -0.112 -0.100 -0.155 + 7.371 1.286 0.383 0.084 -0.107 -0.283 -0.357 -0.206 -0.324 -0.053 -0.100 -0.101 -0.225 + 6.683 1.461 -0.074 0.506 -0.181 -0.644 -0.152 -0.192 -0.438 0.130 -0.107 -0.173 -0.169 + 5.514 1.268 0.271 0.492 -0.194 -0.456 -0.184 -0.238 -0.335 0.050 0.041 -0.140 -0.127 + 4.052 0.307 0.744 0.449 -0.327 0.021 -0.285 -0.309 -0.332 0.010 0.055 -0.051 -0.160 + 2.622 0.292 0.354 0.039 -0.346 -0.078 -0.210 -0.332 -0.136 0.011 -0.007 -0.010 0.071 + 4.525 0.025 0.100 0.133 -0.464 -0.296 -0.045 -0.155 -0.153 -0.041 -0.128 -0.100 -0.047 + 8.005 -0.033 -0.403 0.011 -0.545 -0.275 0.106 0.057 -0.012 0.092 -0.226 -0.201 -0.191 + 5.282 -0.095 0.085 0.008 -0.395 -0.238 0.312 0.053 0.157 0.041 -0.231 -0.240 -0.193 + 4.006 -0.890 0.354 0.082 -0.145 -0.262 0.145 -0.135 -0.027 -0.126 -0.175 -0.054 -0.125 + 4.929 -0.886 0.216 0.069 -0.069 -0.307 -0.206 -0.048 0.117 0.028 -0.147 -0.035 -0.023 + 5.372 -0.910 -0.175 -0.115 -0.127 -0.453 -0.285 0.053 0.364 0.042 -0.174 0.070 -0.046 + 5.726 -0.640 -0.129 -0.071 -0.104 -0.474 -0.174 0.196 0.320 -0.038 -0.342 -0.095 -0.116 + 4.881 -0.346 -0.129 -0.036 -0.123 -0.435 -0.095 -0.055 0.147 0.079 -0.238 -0.097 -0.253 + 3.915 0.197 0.178 -0.092 -0.382 -0.172 0.114 0.157 -0.051 -0.059 -0.027 0.029 -0.046 + 3.666 0.638 0.312 0.217 -0.144 -0.095 -0.092 -0.058 -0.178 -0.028 -0.106 -0.184 -0.118 + 3.414 0.647 0.133 0.179 -0.040 -0.110 -0.099 -0.024 -0.137 -0.108 0.010 -0.120 -0.151 + 3.120 0.565 0.132 -0.015 -0.105 -0.114 -0.081 0.110 -0.192 -0.059 -0.007 -0.054 -0.128 + 3.397 0.541 0.078 0.220 -0.102 -0.151 -0.038 -0.216 -0.230 -0.009 -0.066 -0.159 -0.108 + 3.460 0.586 0.078 0.217 -0.292 -0.135 0.014 -0.039 -0.235 -0.174 -0.060 -0.080 -0.028 + 3.656 0.235 0.340 0.209 -0.275 -0.165 0.002 0.057 -0.013 -0.050 -0.042 0.018 -0.072 + 5.588 -0.342 0.456 0.229 -0.363 -0.249 0.097 -0.285 0.212 -0.194 -0.041 -0.099 -0.172 + 4.428 -0.249 0.570 0.111 -0.365 -0.137 0.092 -0.307 0.056 -0.252 -0.015 0.042 -0.137 + 4.532 0.455 0.219 0.230 -0.462 -0.072 -0.082 -0.051 0.092 -0.152 -0.180 -0.136 -0.104 + 3.553 0.301 0.209 0.169 -0.139 -0.081 0.029 -0.040 0.103 -0.233 -0.063 -0.169 -0.018 + 3.543 0.202 0.151 0.168 -0.276 -0.114 -0.021 -0.158 -0.013 -0.289 -0.140 -0.181 -0.081 + 4.407 0.612 0.114 -0.033 -0.379 -0.058 -0.074 0.139 0.120 -0.204 -0.224 -0.183 -0.077 + 4.197 0.312 0.195 0.130 -0.140 0.025 -0.048 0.069 0.022 -0.168 -0.291 -0.208 -0.187 + 4.593 -0.038 0.085 -0.096 -0.240 -0.121 -0.046 0.205 -0.074 0.173 -0.037 -0.004 -0.166 + 4.837 -0.395 0.113 -0.249 -0.204 -0.117 0.087 0.057 -0.137 -0.049 -0.212 -0.082 -0.077 + 5.251 -0.473 -0.034 -0.165 -0.027 0.027 0.052 -0.023 0.006 -0.023 -0.254 -0.009 0.033 + 5.486 -0.496 -0.188 -0.287 -0.153 -0.066 0.193 -0.022 -0.069 -0.018 -0.129 -0.133 -0.090 + 5.211 -0.763 -0.434 -0.524 -0.356 -0.334 0.083 0.050 0.127 0.217 -0.008 -0.039 0.073 + 4.408 -0.917 -0.248 -0.142 -0.130 -0.153 0.058 -0.106 -0.014 0.120 -0.064 -0.055 0.043 + 4.133 -0.697 -0.152 -0.125 -0.132 -0.151 -0.004 -0.223 -0.070 -0.024 -0.210 -0.054 0.147 + 3.252 -0.101 -0.112 -0.225 -0.197 -0.156 0.042 0.082 -0.031 -0.086 -0.124 0.047 0.141 + 2.881 0.343 -0.075 -0.306 -0.151 -0.015 -0.109 -0.098 -0.080 0.045 -0.133 -0.206 -0.107 + 2.024 -0.012 -0.210 0.159 0.078 0.079 -0.093 -0.057 -0.054 0.142 0.017 0.019 0.032 + 2.079 -0.055 0.059 0.134 -0.054 -0.113 -0.157 0.020 -0.113 0.002 0.064 0.008 -0.068 + 2.299 0.017 0.034 0.014 -0.010 -0.022 0.114 -0.113 -0.082 0.032 -0.056 -0.012 -0.152 + 3.051 -0.594 0.312 -0.209 0.092 0.124 -0.064 -0.088 -0.113 -0.127 -0.010 -0.035 -0.126 + 3.013 -0.562 0.269 -0.188 -0.035 -0.166 -0.118 0.023 -0.004 0.065 0.140 0.052 0.033 + 1.950 -0.038 -0.378 -0.032 -0.037 0.036 -0.100 0.001 -0.206 0.020 0.087 -0.057 -0.073 + 2.149 0.043 -0.302 -0.105 0.015 0.188 -0.046 -0.085 -0.134 -0.024 0.074 -0.091 -0.014 + 2.030 0.124 -0.182 0.105 0.033 0.211 -0.013 -0.201 -0.145 0.030 0.123 0.149 -0.018 + 2.019 0.063 -0.112 -0.064 -0.242 -0.031 -0.081 -0.081 0.022 -0.049 -0.016 -0.021 0.029 + 2.126 0.201 0.228 0.064 -0.122 0.122 -0.074 -0.163 -0.080 0.048 0.159 0.029 0.027 + 2.133 0.308 0.193 0.139 -0.003 0.082 -0.088 -0.062 -0.152 0.042 0.087 0.058 -0.038 + 2.346 0.333 0.080 -0.054 0.041 0.116 -0.074 -0.161 -0.269 0.027 0.102 0.095 -0.038 + 2.341 0.393 -0.056 -0.256 -0.246 -0.106 -0.080 -0.096 -0.100 0.082 0.148 0.108 -0.009 + 1.680 0.074 -0.083 -0.283 -0.009 -0.067 -0.184 -0.218 0.102 0.199 -0.007 0.098 -0.030 + 1.978 0.355 0.130 -0.056 -0.143 -0.041 -0.257 -0.170 -0.076 -0.031 0.094 0.017 -0.094 + 1.970 0.339 0.100 0.067 -0.009 -0.205 -0.250 -0.266 -0.256 0.049 0.117 -0.035 -0.077 + 2.038 0.273 -0.252 0.005 0.007 -0.074 -0.204 -0.338 -0.008 0.026 -0.032 0.021 -0.143 + 1.492 0.026 -0.183 0.050 0.122 0.213 -0.091 -0.114 0.129 0.107 -0.005 -0.055 -0.214 + 2.303 0.458 0.200 0.331 0.110 -0.120 -0.201 -0.100 -0.052 -0.014 0.135 -0.005 -0.087 + 2.215 0.748 0.219 0.119 0.171 -0.106 -0.387 -0.326 -0.082 0.018 0.072 -0.008 -0.156 + 4.989 -0.349 -0.171 0.070 0.161 -0.032 -0.428 0.147 -0.038 -0.174 -0.043 -0.050 -0.059 + 7.100 -0.562 -0.286 0.048 -0.032 -0.224 -0.545 0.293 0.063 -0.326 -0.105 -0.017 0.005 + 3.928 -0.639 -0.716 0.267 0.072 0.112 -0.507 0.189 -0.034 -0.291 0.090 0.068 0.018 + 2.035 -0.339 -0.407 0.011 0.124 -0.036 -0.162 0.010 -0.200 -0.182 0.113 0.185 -0.115 + 2.649 -0.238 -0.291 -0.093 0.082 0.132 0.001 0.034 -0.203 0.030 0.021 -0.038 -0.047 + 5.455 -0.747 -0.590 -0.121 -0.244 -0.083 0.022 0.132 -0.149 -0.081 0.201 0.166 -0.149 + 6.972 -0.898 -1.300 -0.143 -0.320 -0.293 -0.203 0.307 -0.032 -0.205 0.040 0.193 -0.261 + 8.820 -0.812 -1.130 -0.187 -0.077 -0.249 -0.140 0.061 -0.150 -0.094 0.072 0.184 -0.310 + 10.338 -0.546 -1.082 -0.244 0.042 -0.312 0.120 0.086 -0.090 -0.145 -0.168 0.013 -0.230 + 12.020 0.358 -0.982 -0.447 -0.103 -0.498 0.013 -0.106 -0.251 -0.027 -0.386 0.071 -0.240 + 13.169 0.836 -1.361 -0.356 -0.237 -0.376 -0.255 0.111 -0.162 0.006 -0.366 -0.075 -0.166 + 14.176 0.461 -1.720 -0.169 -0.351 -0.285 -0.186 0.265 -0.086 0.028 -0.376 -0.255 -0.064 + 14.008 0.482 -1.812 -0.253 -0.343 -0.274 -0.171 0.239 -0.040 -0.028 -0.322 -0.308 0.005 + 14.332 0.400 -1.759 -0.165 -0.466 -0.144 -0.255 0.283 -0.091 0.035 -0.345 -0.327 0.020 + 14.535 0.410 -1.635 -0.243 -0.579 -0.022 -0.330 0.245 -0.190 0.160 -0.361 -0.342 -0.064 + 14.518 0.662 -1.504 -0.354 -0.684 0.081 -0.306 0.178 -0.350 0.318 -0.308 -0.315 -0.244 + 13.705 1.233 -1.230 -0.365 -0.791 -0.083 -0.194 0.022 -0.488 0.274 -0.148 -0.232 -0.239 + 12.032 1.250 -0.829 -0.014 -0.706 -0.316 0.143 -0.081 -0.439 0.221 -0.256 0.085 -0.103 + 10.844 0.640 -0.503 0.309 -0.114 -0.137 0.447 -0.063 -0.560 0.111 -0.748 0.068 -0.124 + 10.759 0.593 -0.490 0.330 -0.128 -0.191 0.437 -0.087 -0.459 0.064 -0.697 0.045 -0.026 + 10.857 0.421 -0.436 0.305 -0.082 -0.068 0.371 -0.005 -0.555 -0.009 -0.759 -0.016 0.068 + 10.622 0.494 -0.451 0.360 -0.051 -0.072 0.399 0.048 -0.700 -0.019 -0.798 0.006 0.098 + 10.367 0.784 -0.534 0.370 -0.185 -0.079 0.269 0.227 -0.697 0.018 -0.687 -0.130 0.065 + 11.584 1.080 -0.441 -0.168 -0.352 -0.264 -0.200 -0.002 -0.668 0.066 -0.087 0.003 0.139 + 13.029 1.135 -0.983 -0.458 -0.570 -0.132 -0.397 -0.090 -0.581 0.364 -0.007 -0.114 -0.111 + 13.623 0.933 -1.286 -0.345 -0.704 -0.126 -0.546 -0.131 -0.386 0.470 -0.093 -0.315 -0.260 + 13.749 0.743 -1.210 -0.284 -0.471 -0.362 -0.498 -0.275 -0.075 0.456 -0.156 -0.358 -0.128 + 13.252 0.707 -0.887 -0.270 -0.137 -0.719 -0.412 -0.374 0.042 0.466 -0.392 -0.031 -0.033 + 11.665 0.270 -0.240 0.364 -0.230 -0.759 -0.472 -0.121 0.101 -0.018 -0.317 -0.057 -0.052 + 8.778 -0.001 -0.191 0.162 -0.363 -0.181 -0.450 -0.065 0.184 0.208 -0.134 0.055 -0.069 + 7.427 0.485 -0.658 -0.085 -0.387 -0.393 -0.047 -0.203 0.221 0.240 -0.231 -0.302 -0.116 + 7.948 -0.214 -0.615 -0.185 -0.484 -0.279 0.003 -0.061 0.391 0.317 -0.200 -0.321 -0.241 + 7.034 0.123 -0.404 -0.321 -0.431 -0.324 -0.016 -0.113 0.307 0.329 -0.224 -0.170 -0.060 + 10.636 -1.339 -0.306 0.005 -0.888 0.129 -0.219 -0.143 0.067 -0.196 -0.109 -0.138 -0.148 + 11.020 -1.741 -0.102 0.012 -0.931 -0.039 -0.115 -0.223 -0.077 -0.190 -0.081 -0.136 -0.117 + 11.050 -2.473 0.023 0.354 -0.365 -0.231 -0.040 -0.094 -0.037 0.030 -0.163 -0.176 -0.009 + 12.460 -1.736 -0.437 -0.080 -0.304 -0.398 -0.292 -0.147 -0.162 -0.139 -0.154 -0.003 0.052 + 12.012 -1.182 -0.318 0.407 0.125 -0.165 -0.406 -0.095 -0.213 -0.202 -0.194 -0.171 -0.013 + 11.487 0.143 -0.210 0.117 0.661 0.095 -0.249 -0.287 -0.187 -0.371 -0.376 -0.280 -0.255 + 11.432 0.730 -0.252 -0.133 0.275 -0.168 -0.380 -0.285 -0.142 -0.044 -0.048 -0.156 -0.372 + 11.297 1.214 -0.078 0.063 0.206 -0.046 -0.210 -0.245 -0.190 -0.030 -0.098 -0.277 -0.269 + 11.039 1.294 -0.045 0.213 0.072 0.083 -0.269 -0.309 -0.181 -0.059 -0.214 -0.072 -0.272 + 11.035 1.365 0.022 0.170 -0.090 0.062 -0.322 -0.182 -0.060 -0.130 -0.272 -0.105 -0.128 + 10.255 1.338 0.110 0.142 -0.069 0.126 -0.237 -0.187 -0.328 -0.220 -0.243 -0.129 -0.305 + 9.699 0.725 -0.231 0.033 0.037 0.218 0.002 -0.071 -0.363 -0.466 -0.130 0.044 -0.123 + 9.861 0.571 -0.556 -0.093 0.045 0.214 0.077 -0.115 -0.451 -0.415 0.003 0.106 -0.076 + 9.122 0.325 -0.762 -0.296 -0.021 0.453 0.031 -0.410 -0.586 -0.289 0.050 -0.013 0.030 + 8.449 0.651 -0.328 -0.026 -0.151 0.049 -0.245 -0.547 -0.405 -0.202 -0.037 0.088 -0.085 + 6.706 0.344 -0.236 -0.208 0.003 -0.014 -0.324 -0.519 -0.356 -0.005 0.114 -0.048 -0.109 + 6.181 0.086 -0.308 -0.123 0.097 -0.139 -0.120 -0.261 -0.343 -0.023 0.055 -0.225 -0.033 + 6.311 -0.308 -0.666 0.231 -0.148 -0.050 -0.286 -0.279 -0.131 -0.141 -0.095 -0.123 0.085 + 7.215 -0.372 -0.744 0.285 -0.227 -0.274 -0.432 -0.186 0.051 -0.165 0.157 -0.050 0.233 + 8.196 -0.633 -0.770 0.100 -0.495 -0.264 -0.293 -0.120 0.112 -0.106 0.264 -0.019 0.167 + 9.218 -0.552 -0.979 -0.156 -0.328 -0.232 -0.208 0.118 0.213 -0.299 0.059 -0.021 0.129 + 10.373 -0.185 -0.645 -0.116 -0.188 -0.290 -0.473 0.165 0.012 -0.084 -0.149 0.015 -0.028 + 10.630 -0.597 -0.899 -0.309 -0.168 -0.148 -0.200 0.292 -0.079 -0.250 -0.263 0.046 -0.102 + 11.223 -0.444 -1.177 -0.364 -0.057 -0.342 -0.026 0.372 0.069 -0.389 -0.214 0.175 -0.166 + 11.752 -0.455 -1.199 -0.194 0.009 -0.488 -0.011 0.071 -0.088 -0.323 -0.081 0.283 -0.155 + 12.116 -0.480 -1.241 -0.137 0.060 -0.308 0.045 0.084 -0.205 -0.258 -0.306 -0.046 -0.215 + 12.199 -0.474 -1.131 -0.208 0.142 -0.069 -0.008 0.033 -0.192 -0.294 -0.428 0.069 -0.162 + 13.021 0.187 -0.987 -0.337 -0.081 -0.274 -0.262 0.122 -0.191 -0.099 -0.484 0.008 -0.152 + 13.968 0.564 -1.407 -0.535 -0.162 -0.365 -0.238 0.221 -0.170 -0.089 -0.376 -0.014 -0.236 + 14.614 0.366 -1.682 -0.399 -0.260 -0.267 -0.366 0.370 -0.160 -0.007 -0.361 -0.168 -0.248 + 14.580 0.420 -1.645 -0.420 -0.343 -0.314 -0.354 0.334 -0.126 -0.009 -0.383 -0.292 -0.089 + 14.867 0.336 -1.417 -0.385 -0.361 -0.320 -0.476 0.399 -0.251 0.151 -0.431 -0.297 -0.161 + 14.901 0.459 -1.318 -0.568 -0.291 -0.345 -0.480 0.254 -0.284 0.311 -0.349 -0.342 -0.304 + 14.539 0.839 -1.242 -0.587 -0.341 -0.396 -0.450 0.047 -0.382 0.524 -0.324 -0.286 -0.464 + 14.336 1.039 -0.785 -0.912 -0.440 -0.407 -0.286 -0.002 -0.608 0.485 -0.301 -0.175 -0.362 + 13.910 1.125 -0.340 -0.947 -0.542 -0.339 -0.190 -0.267 -0.764 0.278 -0.225 0.113 -0.248 + 13.371 1.023 0.122 -0.823 -0.622 -0.230 -0.325 -0.295 -0.788 0.114 -0.428 0.304 -0.241 + 12.809 0.948 0.460 -0.817 -0.522 -0.234 -0.178 -0.345 -0.838 -0.067 -0.572 0.239 -0.189 + 12.319 1.034 0.504 -0.805 -0.411 -0.317 -0.140 -0.332 -0.758 0.009 -0.658 0.130 -0.217 + 11.435 1.268 0.359 -0.761 -0.187 -0.315 -0.033 -0.329 -0.765 0.049 -0.653 0.034 -0.252 + 10.609 1.613 -0.043 -0.627 0.165 -0.360 0.129 -0.462 -0.877 0.055 -0.529 -0.065 -0.364 + 10.680 1.361 -0.391 -0.197 0.487 -0.504 -0.038 -0.586 -0.698 0.091 -0.401 -0.406 -0.258 + 11.021 0.934 -0.563 0.365 0.392 -0.723 -0.346 -0.315 -0.489 0.146 -0.511 -0.455 -0.175 + 11.154 0.355 -0.422 0.631 0.150 -0.835 -0.067 -0.159 -0.613 -0.037 -0.309 -0.294 -0.222 + 11.108 -0.316 0.036 0.807 -0.167 -0.393 0.036 -0.348 -0.505 -0.041 -0.442 -0.296 -0.366 + 10.848 -0.389 0.449 0.503 -0.194 -0.363 -0.116 -0.176 -0.489 -0.019 -0.366 -0.348 -0.291 + 11.029 -0.467 0.695 0.379 0.046 -0.290 -0.191 -0.089 -0.532 -0.032 -0.305 -0.417 -0.364 + 11.952 -0.720 0.806 0.386 -0.193 -0.150 -0.326 0.072 -0.583 0.028 -0.345 -0.325 -0.306 + 12.689 -1.045 0.758 0.511 -0.102 -0.226 -0.475 0.058 -0.536 0.130 -0.296 -0.245 -0.284 + 12.837 -1.087 0.856 0.472 -0.197 -0.187 -0.348 0.124 -0.712 0.101 -0.267 -0.295 -0.278 + 12.984 -0.972 0.768 0.478 -0.229 -0.103 -0.357 0.156 -0.776 0.093 -0.294 -0.287 -0.229 + 13.012 -0.807 0.673 0.451 -0.297 -0.114 -0.431 0.193 -0.675 0.065 -0.334 -0.273 -0.196 + 12.854 -0.561 0.476 0.561 -0.347 -0.152 -0.493 0.116 -0.646 0.081 -0.268 -0.321 -0.199 + 12.990 -0.524 0.386 0.554 -0.358 -0.104 -0.522 0.027 -0.781 0.119 -0.275 -0.251 -0.195 + 12.840 -0.398 0.269 0.565 -0.291 -0.192 -0.456 -0.086 -0.788 0.031 -0.323 -0.130 -0.259 + 12.864 -0.420 0.237 0.648 -0.218 -0.349 -0.337 -0.299 -0.664 -0.104 -0.302 -0.128 -0.239 + 13.112 -0.448 0.174 0.445 -0.301 -0.187 -0.194 -0.282 -0.768 -0.331 -0.223 -0.011 -0.394 + 13.207 -0.413 0.148 0.242 -0.071 -0.467 -0.226 -0.286 -0.548 -0.248 -0.220 -0.157 -0.434 + 12.834 -0.422 -0.070 0.190 -0.117 -0.644 -0.243 -0.328 -0.235 -0.423 -0.258 0.062 -0.434 + 12.754 -0.406 0.041 -0.027 0.009 -0.658 -0.244 -0.291 -0.338 -0.455 -0.224 -0.049 -0.433 + 12.867 -0.642 0.261 -0.186 0.041 -0.561 -0.291 -0.223 -0.451 -0.518 -0.314 -0.058 -0.271 + 12.978 -0.537 0.228 -0.109 0.018 -0.656 -0.187 -0.242 -0.289 -0.528 -0.237 -0.093 -0.350 + 13.011 -0.545 0.212 0.009 0.043 -0.492 -0.314 -0.172 -0.470 -0.411 -0.249 -0.106 -0.397 + 13.119 -0.707 0.272 0.333 -0.057 -0.459 -0.163 -0.179 -0.468 -0.358 -0.187 -0.145 -0.396 + 13.055 -0.528 0.226 0.423 -0.129 -0.358 -0.297 -0.067 -0.539 -0.367 -0.178 -0.310 -0.338 + 12.993 -0.627 0.387 0.676 -0.289 -0.395 -0.209 -0.012 -0.616 -0.167 -0.246 -0.378 -0.295 + 12.880 -0.636 0.260 0.935 -0.444 -0.174 -0.272 0.075 -0.703 -0.037 -0.415 -0.236 -0.312 + 12.766 -0.743 0.297 0.902 -0.278 -0.207 -0.257 0.032 -0.703 0.029 -0.423 -0.227 -0.274 + 12.459 -0.629 0.233 0.749 -0.096 -0.358 -0.191 0.079 -0.684 0.092 -0.408 -0.199 -0.241 + 12.133 -0.437 0.096 0.692 0.085 -0.453 -0.212 0.165 -0.653 0.093 -0.406 -0.150 -0.234 + 11.774 -0.317 0.099 0.497 0.305 -0.445 -0.335 0.203 -0.625 0.119 -0.402 -0.170 -0.142 + 11.032 -0.050 0.091 0.287 0.446 -0.324 -0.379 0.127 -0.662 0.184 -0.450 -0.182 -0.009 + 10.556 0.071 0.151 0.179 0.411 -0.203 -0.275 -0.042 -0.689 0.284 -0.543 -0.202 0.095 + 10.343 0.142 0.104 0.060 0.442 -0.103 -0.332 -0.117 -0.654 0.373 -0.534 -0.264 0.037 + 10.313 0.109 0.225 -0.015 0.433 -0.083 -0.376 -0.126 -0.643 0.381 -0.472 -0.270 -0.050 + 10.589 0.042 0.138 0.081 0.427 -0.125 -0.413 -0.044 -0.725 0.428 -0.563 -0.236 -0.078 + 10.768 0.023 0.087 0.188 0.434 -0.222 -0.454 -0.014 -0.653 0.397 -0.645 -0.166 -0.103 + 10.933 0.006 -0.057 0.434 0.355 -0.292 -0.451 0.012 -0.587 0.315 -0.669 -0.141 -0.082 + 10.814 0.080 -0.150 0.601 0.384 -0.454 -0.379 0.012 -0.467 0.106 -0.620 -0.124 -0.158 + 10.848 -0.134 -0.060 0.655 0.455 -0.565 -0.330 0.066 -0.511 0.128 -0.575 -0.139 -0.143 + 10.724 -0.205 0.048 0.660 0.350 -0.558 -0.290 0.224 -0.679 0.171 -0.511 -0.191 -0.086 + 10.241 -0.206 0.126 0.631 0.358 -0.600 -0.192 0.249 -0.763 0.285 -0.570 -0.071 -0.264 + 9.987 -0.306 0.102 0.625 0.339 -0.517 -0.148 0.220 -0.645 0.065 -0.471 -0.189 -0.152 + 9.944 -0.397 0.276 0.539 0.253 -0.375 -0.184 0.115 -0.475 0.008 -0.513 -0.393 0.040 + 10.165 -0.011 0.228 0.350 0.326 -0.210 -0.308 -0.009 -0.391 0.160 -0.517 -0.578 -0.053 + 10.060 0.163 0.136 0.133 0.461 -0.200 -0.203 -0.135 -0.446 0.330 -0.324 -0.566 0.031 + 10.179 0.401 0.374 -0.251 0.210 -0.093 -0.195 -0.158 -0.534 0.335 -0.082 -0.363 0.042 + 10.482 0.878 0.359 -0.505 0.071 -0.149 -0.188 -0.254 -0.716 0.063 -0.070 -0.510 0.039 + 10.674 1.165 0.014 -0.456 -0.188 -0.138 0.047 -0.327 -0.569 0.011 0.045 -0.333 0.083 + 10.985 1.194 0.044 -0.449 -0.365 -0.403 0.201 -0.483 -0.277 -0.175 0.063 -0.321 0.151 + 11.304 1.216 0.019 -0.548 -0.656 -0.294 0.084 -0.394 -0.207 -0.195 0.024 -0.264 0.247 + 11.424 1.133 0.017 -0.446 -0.989 -0.203 0.039 -0.257 -0.084 -0.238 -0.106 -0.096 0.158 + 11.382 0.925 0.131 -0.528 -1.013 -0.347 0.103 -0.236 0.159 -0.325 -0.023 -0.126 0.066 + 10.913 1.170 -0.019 -0.525 -1.049 -0.320 0.041 -0.228 0.315 -0.403 0.057 -0.136 -0.125 + 11.315 1.169 -0.160 -0.669 -1.170 -0.014 -0.061 -0.096 0.067 -0.263 -0.016 -0.039 -0.151 + 11.754 1.077 -0.391 -0.774 -1.111 0.162 -0.002 -0.192 -0.046 -0.112 0.015 0.025 -0.253 + 11.653 1.180 -0.573 -0.891 -0.932 0.163 -0.064 -0.173 -0.047 -0.015 -0.047 0.074 -0.402 + 11.895 0.928 -0.727 -0.736 -0.863 0.152 0.020 -0.395 0.041 0.161 -0.104 0.120 -0.549 + 11.590 1.057 -0.976 -0.503 -0.736 0.147 -0.131 -0.429 0.073 0.201 -0.127 0.091 -0.580 + 11.501 1.053 -0.927 -0.505 -0.623 0.127 -0.389 -0.366 0.081 0.234 -0.154 0.124 -0.561 + 9.569 0.569 -0.341 -0.041 -0.340 0.263 -0.315 -0.362 0.086 0.110 -0.312 0.132 -0.352 + 9.357 0.651 -0.019 0.155 -0.451 0.034 -0.246 -0.340 -0.012 0.120 -0.424 0.114 -0.292 + 9.697 0.529 -0.188 0.248 -0.420 -0.098 -0.154 -0.343 -0.082 0.123 -0.380 0.056 -0.212 + 12.598 0.242 -1.067 0.005 -0.090 -0.420 -0.591 0.065 -0.269 0.501 -0.315 0.075 -0.365 + 12.535 0.485 -1.053 -0.088 -0.313 -0.279 -0.642 0.028 -0.192 0.459 -0.345 0.013 -0.367 + 12.381 0.624 -0.951 -0.122 -0.618 -0.235 -0.630 0.029 0.003 0.340 -0.353 0.011 -0.282 + 12.218 0.753 -1.033 0.032 -0.706 -0.220 -0.701 0.049 0.105 0.216 -0.342 0.085 -0.246 + 11.740 0.858 -0.761 0.097 -0.737 -0.201 -0.719 -0.134 0.101 0.213 -0.223 0.030 -0.169 + 11.105 1.074 -0.628 0.098 -0.449 -0.265 -0.652 -0.214 -0.131 0.277 -0.254 -0.090 -0.201 + 8.647 1.024 0.011 0.032 0.144 -0.140 -0.345 -0.139 -0.213 0.169 -0.175 -0.387 -0.336 + 8.681 0.897 -0.086 0.152 0.161 -0.084 -0.339 -0.009 -0.232 0.033 -0.258 -0.583 -0.061 + 8.846 0.795 -0.052 0.117 0.210 -0.318 -0.319 0.107 -0.371 0.192 -0.245 -0.602 0.048 + 8.948 0.694 -0.111 0.161 0.169 -0.317 -0.282 0.089 -0.364 0.234 -0.293 -0.552 0.026 + 8.960 0.617 -0.066 0.138 0.166 -0.351 -0.187 -0.009 -0.329 0.273 -0.330 -0.630 0.171 + 9.241 0.579 -0.146 0.080 0.219 -0.272 -0.129 -0.054 -0.428 0.315 -0.352 -0.489 0.092 + 11.549 0.272 -0.472 0.068 -0.032 -0.313 -0.525 0.062 -0.155 0.168 -0.272 -0.131 0.054 + 12.326 -0.026 -0.265 0.179 -0.460 -0.597 -0.554 0.095 -0.324 0.163 -0.049 -0.033 0.004 + 12.629 -0.197 -0.139 0.354 -0.790 -0.525 -0.464 0.058 -0.388 0.352 -0.174 0.010 -0.107 + 12.915 -0.279 -0.101 0.364 -0.817 -0.611 -0.488 0.094 -0.443 0.377 -0.157 0.016 -0.192 + 13.127 -0.390 0.062 0.293 -0.879 -0.475 -0.659 0.162 -0.511 0.449 -0.308 0.140 -0.257 + 12.885 -0.391 0.273 0.261 -0.942 -0.436 -0.586 0.044 -0.538 0.394 -0.247 0.094 -0.190 + 12.791 -0.512 0.432 0.330 -0.937 -0.410 -0.608 0.006 -0.534 0.336 -0.226 0.093 -0.193 + 12.614 -0.614 0.650 0.371 -0.919 -0.377 -0.525 -0.129 -0.502 0.281 -0.265 0.034 -0.169 + 12.017 -0.585 0.726 0.466 -0.756 -0.267 -0.508 -0.225 -0.536 0.229 -0.327 0.015 -0.137 + 11.267 -0.641 0.776 0.575 -0.741 -0.294 -0.353 -0.227 -0.607 0.212 -0.376 -0.101 -0.174 + 8.753 -0.637 0.557 0.447 -0.459 -0.239 -0.258 -0.093 -0.359 0.181 -0.310 -0.071 0.027 + 6.756 -0.300 0.521 0.181 -0.131 -0.183 0.100 -0.163 0.092 -0.008 -0.203 -0.234 -0.260 + 5.791 -0.193 0.750 0.171 0.070 -0.156 -0.146 -0.489 -0.015 -0.150 0.010 0.008 -0.285 + 4.900 0.389 0.257 0.037 -0.203 -0.210 -0.537 -0.231 -0.311 0.249 -0.157 -0.090 -0.091 + 4.958 0.350 0.149 0.083 -0.186 -0.210 -0.513 -0.152 -0.391 0.140 -0.030 0.094 -0.215 + 6.166 -0.115 -0.171 0.121 -0.445 -0.076 -0.342 -0.228 -0.143 -0.097 -0.098 0.115 -0.142 + 10.287 -1.278 -0.414 0.031 -0.511 0.003 -0.160 -0.167 0.150 0.053 -0.078 -0.112 -0.280 + 11.804 -1.488 -0.488 -0.021 -0.721 -0.076 -0.300 -0.278 -0.049 -0.145 -0.217 -0.218 -0.180 + 11.321 -0.915 0.843 -0.106 -0.617 0.039 -0.397 -0.264 -0.446 -0.076 -0.218 -0.207 -0.092 + 11.056 -0.096 1.112 0.072 -0.449 -0.382 -0.636 -0.007 -0.561 -0.168 -0.180 -0.060 -0.100 + 11.392 0.333 0.443 0.312 -0.426 -0.577 -0.696 0.088 -0.560 -0.226 -0.073 0.120 -0.278 + 11.469 0.447 -0.033 0.290 -0.366 -0.541 -0.705 0.007 -0.421 -0.177 -0.173 0.236 -0.393 + 11.602 0.305 -0.175 0.348 -0.461 -0.417 -0.848 -0.047 -0.409 -0.204 -0.223 0.287 -0.306 + 11.257 0.162 -0.397 0.469 -0.282 -0.228 -0.757 -0.024 -0.329 -0.166 -0.344 0.248 -0.301 + 6.982 -0.372 0.291 0.512 -0.152 -0.182 -0.791 -0.041 -0.059 -0.174 -0.114 0.317 -0.061 + 6.412 -0.225 0.282 0.635 -0.157 0.027 -0.616 0.140 -0.003 -0.008 -0.001 0.112 -0.002 + 5.704 0.188 -0.346 0.267 -0.032 -0.086 -0.344 -0.052 -0.095 0.068 -0.030 0.141 -0.110 + 8.183 0.088 -1.311 -0.272 -0.114 -0.095 -0.377 -0.238 -0.234 -0.222 -0.166 -0.115 -0.031 + 8.202 -0.811 -0.416 -0.149 -0.041 -0.082 -0.406 -0.114 -0.130 -0.199 -0.063 -0.275 -0.011 + 7.941 -0.687 0.128 -0.112 -0.334 -0.203 -0.290 0.036 -0.153 0.013 -0.146 -0.105 -0.009 + 9.037 -0.888 -0.163 0.129 -0.260 -0.156 -0.207 0.075 -0.018 -0.089 -0.178 0.033 -0.087 + 10.835 -0.624 -0.631 -0.010 -0.131 -0.136 -0.190 0.094 0.003 -0.114 -0.297 -0.146 -0.156 + 11.252 -0.274 -0.477 -0.028 0.036 -0.063 -0.161 -0.040 -0.030 0.003 -0.234 -0.240 -0.144 + 11.901 0.185 -0.203 0.167 0.175 -0.177 -0.331 -0.255 -0.038 -0.159 -0.327 -0.295 -0.118 + 12.889 0.323 0.006 0.456 0.068 -0.121 -0.487 -0.408 -0.114 -0.164 -0.308 -0.420 -0.379 + 12.295 -0.016 -0.146 0.426 0.136 0.143 -0.435 -0.216 -0.144 -0.120 -0.328 -0.336 -0.236 + 11.379 0.361 -0.352 0.367 0.358 0.046 -0.543 -0.303 -0.278 -0.254 -0.142 -0.429 -0.134 + 11.494 1.385 -0.992 -0.472 -0.047 -0.095 -0.717 -0.317 -0.229 -0.167 -0.066 -0.178 -0.157 + 10.826 2.063 -0.889 -0.391 -0.015 0.124 -0.684 -0.484 -0.152 -0.120 -0.138 -0.051 -0.124 + 9.641 2.226 -0.408 -0.450 0.103 0.252 -0.503 -0.360 -0.099 -0.242 -0.080 -0.193 -0.165 + 6.752 1.691 0.255 -0.075 0.078 0.056 -0.247 -0.077 -0.047 -0.053 -0.057 -0.024 -0.181 + 4.726 0.914 0.104 0.093 0.155 0.265 -0.193 -0.250 -0.133 0.047 0.037 0.041 -0.081 + 4.444 0.706 -0.032 0.017 -0.009 0.118 -0.138 -0.240 -0.062 0.004 0.070 0.058 -0.102 + 4.429 0.413 -0.115 -0.024 -0.096 -0.113 -0.353 -0.281 -0.095 0.181 0.131 0.045 0.097 + 4.322 0.263 -0.009 -0.072 0.087 -0.048 -0.339 -0.231 -0.069 -0.004 0.061 -0.059 -0.009 + 4.685 0.340 -0.036 -0.031 0.038 -0.023 -0.173 -0.296 -0.232 0.154 -0.138 -0.011 -0.075 + 7.301 -0.821 0.030 0.269 0.042 -0.103 -0.370 -0.048 -0.148 -0.182 0.064 -0.148 0.115 + 11.949 0.507 0.313 0.046 -0.393 -0.228 -0.160 -0.103 -0.334 -0.364 -0.141 -0.250 -0.047 + 13.325 1.250 0.110 0.474 -0.511 -0.402 0.183 -0.259 -0.392 -0.313 -0.230 -0.174 -0.120 + 11.355 0.943 0.418 0.581 -0.565 -0.515 0.069 -0.215 -0.226 -0.126 -0.281 -0.142 -0.080 + 9.617 -0.447 0.460 0.627 -0.095 -0.394 0.207 -0.334 -0.494 -0.192 -0.272 -0.117 -0.131 + 10.564 -0.336 0.276 0.406 -0.430 -0.204 -0.184 -0.345 -0.364 -0.262 -0.247 -0.176 -0.121 + 11.375 -0.394 0.201 0.722 -0.212 -0.387 -0.263 -0.070 -0.635 -0.136 -0.230 -0.197 -0.082 + 11.711 -0.593 0.273 0.737 -0.261 -0.238 -0.179 -0.156 -0.755 -0.015 -0.380 -0.135 -0.142 + 11.496 -0.610 0.296 0.783 -0.190 -0.422 0.016 -0.086 -0.873 -0.010 -0.321 -0.246 -0.100 + 10.798 -0.298 -0.085 0.652 0.259 -0.533 -0.185 0.181 -0.974 -0.119 -0.393 -0.204 -0.085 + 9.375 0.454 -0.086 0.513 0.542 -0.468 -0.311 0.424 -0.788 0.061 -0.244 -0.200 -0.132 + 6.855 0.683 0.259 -0.052 0.281 0.023 -0.096 0.090 -0.305 0.097 -0.078 -0.161 -0.050 + 8.810 -0.818 0.373 0.067 0.537 -0.351 -0.029 0.033 0.110 -0.214 -0.513 0.047 -0.034 + 9.127 -1.082 0.092 0.191 0.337 -0.236 0.066 -0.072 0.108 -0.335 -0.464 0.117 -0.059 + 8.172 -0.687 -0.169 0.067 0.155 -0.029 0.070 -0.085 0.082 -0.338 -0.389 0.043 0.015 + 11.382 -0.451 0.220 0.125 -0.100 -0.028 -0.106 -0.125 -0.192 -0.152 -0.156 -0.019 -0.059 + 12.338 1.087 0.193 -0.326 -0.398 -0.210 -0.181 -0.044 -0.187 -0.263 -0.196 -0.015 0.095 + 12.217 1.199 0.340 -0.037 -0.444 -0.054 -0.318 -0.193 -0.255 -0.309 -0.239 -0.160 0.003 + 11.684 1.316 0.505 -0.121 -0.615 0.183 -0.164 -0.151 -0.089 -0.370 -0.188 -0.183 -0.040 + 11.457 1.061 0.806 -0.378 -1.005 0.011 0.024 -0.323 -0.146 -0.504 -0.104 -0.210 0.044 + 10.755 1.079 0.864 -0.760 -0.809 -0.031 -0.022 -0.323 -0.085 -0.412 -0.086 -0.048 0.114 + 10.389 0.411 0.813 -0.772 -0.662 -0.085 -0.085 -0.157 -0.265 -0.312 -0.239 0.158 -0.197 + 7.438 0.309 0.663 0.004 -0.389 -0.016 0.063 0.080 -0.208 -0.139 -0.356 0.110 -0.092 + 5.754 0.217 0.596 0.438 -0.178 -0.217 -0.036 -0.171 -0.017 0.002 -0.227 0.014 -0.103 + 5.407 0.179 0.370 0.349 -0.039 -0.120 0.050 -0.283 -0.004 -0.197 -0.089 0.180 -0.085 + 8.733 -0.956 -0.070 0.414 -0.383 -0.022 -0.329 0.046 0.139 0.055 -0.113 -0.163 -0.129 + 10.833 -1.266 0.197 0.016 -0.410 0.056 -0.377 0.001 0.105 0.107 -0.109 -0.207 -0.200 + 10.009 -0.656 0.934 -0.084 -0.470 -0.011 -0.429 -0.292 -0.410 -0.135 -0.195 -0.050 -0.295 + 10.714 0.176 0.468 -0.075 -0.335 0.339 -0.099 -0.455 -0.558 -0.179 -0.039 0.123 -0.261 + 8.317 0.965 0.537 -0.310 -0.154 0.440 -0.178 -0.524 -0.383 -0.184 0.136 0.132 -0.220 + 5.658 0.918 0.346 0.152 -0.085 0.169 0.200 -0.236 -0.390 -0.158 -0.020 -0.270 -0.151 + 5.454 0.979 0.665 -0.090 -0.048 0.166 0.315 -0.063 -0.307 -0.275 -0.197 -0.019 -0.073 + 5.633 1.076 0.456 -0.018 -0.051 0.102 0.150 -0.131 -0.251 -0.134 -0.121 -0.154 -0.032 + 5.926 1.003 0.369 0.220 -0.241 0.002 0.241 -0.049 -0.295 -0.221 -0.047 0.061 -0.056 + 5.415 0.709 0.387 0.259 -0.049 -0.125 0.212 0.010 -0.087 -0.066 -0.039 -0.003 -0.253 + 5.204 0.726 0.360 0.076 0.054 -0.034 0.045 -0.012 0.003 0.015 -0.203 0.006 -0.117 + 4.853 0.660 0.162 0.226 0.294 0.130 0.207 0.043 -0.219 0.052 -0.108 -0.171 -0.140 + 10.083 0.531 0.477 0.095 -0.048 -0.088 -0.322 -0.181 -0.320 -0.279 -0.050 -0.180 -0.112 + 11.639 1.296 0.703 0.037 -0.097 -0.191 -0.429 -0.129 -0.274 -0.451 -0.159 -0.322 -0.121 + 10.325 1.142 0.805 0.051 -0.076 -0.005 -0.471 -0.179 -0.155 -0.180 -0.037 -0.242 -0.155 + 8.349 0.519 0.830 0.117 -0.182 -0.121 -0.269 -0.057 -0.179 0.030 -0.071 -0.258 -0.137 + 8.129 0.756 1.059 -0.601 -0.726 -0.403 -0.366 -0.118 -0.279 -0.047 -0.445 -0.080 -0.251 + 9.134 0.536 1.161 -0.491 -0.835 -0.285 -0.478 -0.119 -0.154 -0.022 -0.543 -0.054 -0.257 + 9.578 0.331 1.196 -0.588 -1.067 -0.263 -0.150 -0.053 -0.180 -0.351 -0.321 -0.199 -0.228 + 10.686 0.241 0.386 -0.289 -1.002 0.031 -0.223 -0.299 -0.013 -0.513 -0.413 -0.209 -0.200 + 11.300 0.566 -0.254 -0.057 -0.560 0.288 -0.147 -0.801 -0.055 -0.285 -0.358 -0.093 -0.139 + 11.794 0.646 -0.782 0.737 -0.342 -0.022 -0.482 -0.603 -0.125 -0.193 -0.289 -0.170 -0.131 + 11.913 0.158 -0.501 1.148 -0.341 -0.363 -0.551 -0.239 -0.366 -0.165 -0.397 -0.136 -0.102 + 11.352 -0.183 0.060 1.122 -0.197 -0.643 -0.216 -0.211 -0.618 0.097 -0.520 -0.058 -0.335 + 10.868 -0.603 0.502 0.883 -0.058 -0.341 -0.293 -0.165 -0.560 0.113 -0.416 -0.136 -0.278 + 10.294 -0.501 0.379 1.092 -0.383 -0.133 -0.189 -0.163 -0.518 -0.009 -0.250 -0.183 -0.265 + 10.088 -0.558 0.452 0.879 -0.206 -0.197 -0.049 -0.170 -0.662 0.048 -0.275 -0.134 -0.119 + 10.542 -0.826 0.462 0.843 -0.206 -0.298 -0.164 0.039 -0.631 0.134 -0.350 -0.133 -0.131 + 10.213 -0.586 -0.077 1.050 -0.014 -0.481 -0.152 0.131 -0.795 0.270 -0.265 -0.147 -0.225 + 7.925 0.198 -0.191 0.771 0.095 -0.385 -0.021 0.493 -0.745 0.097 -0.411 -0.240 -0.259 + 5.184 0.937 0.208 0.294 -0.079 0.045 0.292 0.190 -0.345 -0.021 -0.239 -0.150 -0.054 + 5.138 0.856 0.051 0.464 -0.157 -0.247 0.285 0.061 -0.335 0.156 -0.055 -0.235 -0.110 + 4.742 0.702 0.044 0.426 0.124 -0.138 0.144 0.023 -0.413 0.150 -0.137 -0.028 -0.034 + 4.537 0.517 -0.151 0.282 0.034 -0.105 -0.007 -0.098 -0.419 0.006 -0.139 -0.014 -0.075 + 4.011 0.459 -0.331 0.109 0.078 -0.055 0.057 -0.125 -0.380 0.110 0.032 0.138 -0.102 + 7.172 -0.373 -0.102 0.097 0.023 0.045 -0.070 -0.040 -0.120 -0.161 -0.062 -0.024 -0.112 + 12.427 1.041 0.148 -0.088 -0.209 -0.353 -0.319 -0.092 0.032 -0.163 -0.243 -0.179 -0.368 + 12.816 1.318 0.143 0.118 -0.198 -0.290 -0.342 -0.153 0.035 -0.214 -0.281 -0.133 -0.308 + 11.135 0.884 0.817 0.233 -0.296 -0.221 -0.169 -0.009 -0.041 -0.216 -0.302 -0.064 -0.343 + 9.090 -0.086 0.739 0.590 0.043 -0.068 0.071 0.004 -0.015 -0.191 -0.130 0.040 -0.262 + 7.857 -0.547 0.456 0.272 -0.070 0.010 0.051 0.084 -0.065 -0.168 -0.147 -0.004 -0.192 + 7.601 -0.882 0.354 0.362 0.147 -0.319 -0.163 -0.084 0.091 -0.106 -0.239 -0.026 -0.060 + 8.490 -0.520 0.173 0.298 0.022 -0.208 -0.046 0.011 0.001 -0.208 -0.271 -0.007 -0.051 + 9.776 -0.310 0.179 0.212 -0.047 -0.241 -0.038 0.029 0.111 -0.397 -0.314 0.035 -0.108 + 8.920 -0.383 0.292 0.170 -0.063 -0.304 -0.199 -0.132 0.050 -0.048 -0.348 0.121 -0.234 + 9.685 0.177 -0.235 0.450 -0.480 -0.505 -0.404 -0.217 -0.085 0.118 -0.305 0.057 -0.157 + 11.714 0.399 -0.550 0.075 -0.437 -0.390 -0.724 0.170 -0.047 0.172 -0.439 0.246 -0.236 + 12.050 0.422 -0.421 -0.053 -0.556 -0.308 -1.007 0.376 0.054 0.108 -0.246 0.308 -0.341 + 11.953 0.268 -0.281 0.263 -0.866 -0.117 -0.783 0.303 -0.012 0.029 -0.122 0.240 -0.439 + 12.237 0.213 -0.113 0.007 -0.659 -0.147 -0.842 0.495 -0.260 0.094 -0.105 0.175 -0.500 + 12.414 -0.078 -0.004 0.221 -0.724 -0.238 -0.589 0.361 -0.355 0.179 -0.021 -0.039 -0.385 + 12.094 -0.254 0.256 0.274 -0.863 -0.170 -0.397 0.137 -0.268 0.179 -0.014 -0.148 -0.287 + 11.288 -0.341 0.407 0.341 -0.877 -0.150 -0.183 -0.082 -0.155 0.250 -0.124 -0.148 -0.092 + 10.395 -0.195 0.496 0.014 -0.260 -0.356 -0.164 0.016 -0.078 0.019 -0.140 -0.194 -0.020 + 9.806 0.247 0.479 -0.245 0.174 -0.550 -0.189 0.178 -0.233 0.046 -0.126 -0.303 0.065 + 9.770 0.367 0.409 -0.292 0.191 -0.574 -0.218 0.285 -0.407 0.177 -0.180 -0.320 0.052 + 9.632 0.356 0.406 -0.307 0.245 -0.614 -0.140 0.286 -0.485 0.186 -0.256 -0.310 0.093 + 9.100 0.377 0.454 -0.144 -0.024 -0.737 0.178 0.140 -0.417 0.150 -0.228 -0.386 0.130 + 8.672 0.207 0.430 0.194 0.062 -0.920 0.081 0.140 -0.318 -0.004 -0.247 -0.342 0.153 + 8.799 0.317 -0.081 0.504 -0.096 -0.683 -0.241 0.159 -0.134 0.133 -0.142 -0.367 0.131 + 9.461 0.230 -0.336 0.264 0.240 -0.501 -0.477 -0.211 -0.122 0.131 -0.224 -0.284 0.070 + 9.739 -0.200 -0.031 0.011 0.191 -0.597 -0.423 -0.141 0.127 -0.022 -0.285 -0.144 0.028 + 9.074 -0.835 0.411 0.003 0.045 -0.535 -0.216 -0.018 0.089 -0.169 -0.213 -0.124 0.080 + 8.575 -1.213 0.503 0.019 0.111 -0.320 -0.271 -0.190 -0.060 -0.151 -0.194 -0.020 0.137 + 8.875 -1.126 0.339 -0.418 0.163 -0.311 -0.143 -0.044 -0.078 -0.140 -0.194 -0.035 -0.074 + 8.976 -1.375 0.384 -0.404 0.142 -0.287 -0.116 -0.019 -0.049 -0.020 -0.146 -0.124 -0.120 + 9.366 -1.386 0.268 -0.498 0.158 -0.359 -0.061 -0.008 -0.001 -0.042 -0.113 -0.099 -0.004 + 10.069 -1.109 0.495 -0.106 0.199 -0.343 -0.316 -0.133 0.068 -0.113 -0.191 -0.053 -0.090 + 10.990 -0.533 0.454 -0.121 0.047 -0.517 -0.370 -0.376 -0.167 0.080 -0.255 -0.072 -0.185 + 11.445 0.634 -0.146 -0.169 -0.489 -0.606 -0.341 -0.454 0.055 0.006 -0.378 0.191 -0.075 + 11.821 1.043 -0.738 -0.189 -0.429 -0.570 -0.399 -0.379 0.137 0.131 -0.352 0.210 -0.094 + 12.763 0.637 -0.913 -0.122 -0.471 -0.474 -0.470 -0.065 0.126 0.031 -0.265 0.029 -0.066 + 13.209 0.305 -0.873 -0.086 -0.479 -0.606 -0.526 0.143 0.108 0.018 -0.331 0.141 -0.127 + 12.880 0.236 -0.628 -0.184 -0.593 -0.567 -0.547 0.295 0.003 0.163 -0.461 0.190 -0.247 + 13.181 0.385 -0.789 -0.373 -0.571 -0.294 -0.775 0.233 0.175 0.052 -0.409 0.082 -0.242 + 13.209 0.434 -0.914 -0.440 -0.441 -0.427 -0.669 0.331 0.043 0.002 -0.267 -0.068 -0.155 + 13.574 0.066 -0.987 -0.253 -0.559 -0.449 -0.462 0.261 0.040 0.127 -0.396 -0.072 -0.123 + 13.058 0.359 -0.956 -0.441 -0.550 -0.299 -0.676 0.317 -0.061 0.284 -0.451 -0.086 -0.146 + 13.524 0.139 -1.084 -0.299 -0.558 -0.495 -0.467 0.271 0.028 0.200 -0.437 -0.129 -0.151 + 13.290 0.254 -1.039 -0.330 -0.614 -0.401 -0.490 0.287 -0.074 0.261 -0.396 -0.201 -0.141 + 13.654 0.205 -1.037 -0.378 -0.541 -0.379 -0.506 0.314 -0.192 0.323 -0.415 -0.243 -0.092 + 13.496 0.181 -1.052 -0.367 -0.596 -0.270 -0.584 0.322 -0.128 0.233 -0.367 -0.246 -0.022 + 13.145 0.377 -1.140 -0.474 -0.483 -0.302 -0.555 0.363 -0.131 0.236 -0.424 -0.211 -0.044 + 12.916 0.407 -1.040 -0.720 -0.374 -0.383 -0.417 0.291 -0.132 0.311 -0.411 -0.377 -0.035 + 13.068 0.506 -1.219 -0.660 -0.345 -0.302 -0.540 0.312 -0.160 0.383 -0.440 -0.426 -0.011 + 13.037 0.651 -1.218 -0.785 -0.286 -0.127 -0.582 0.181 -0.191 0.446 -0.419 -0.415 -0.043 + 12.900 0.860 -1.484 -0.600 -0.336 -0.332 -0.318 -0.024 -0.089 0.358 -0.314 -0.349 -0.167 + 12.268 0.918 -1.089 -0.922 -0.389 -0.188 -0.376 0.025 -0.189 0.427 -0.259 -0.423 -0.113 + 11.904 0.949 -0.867 -1.117 -0.402 -0.075 -0.460 0.015 -0.266 0.537 -0.218 -0.402 -0.176 + 12.205 0.904 -0.716 -0.994 -0.577 -0.022 -0.480 -0.021 -0.361 0.507 -0.099 -0.326 -0.238 + 11.893 1.098 -0.645 -1.109 -0.395 -0.062 -0.550 0.032 -0.371 0.332 0.037 -0.287 -0.227 + 11.337 1.112 -0.548 -1.052 -0.420 -0.141 -0.342 -0.147 -0.387 0.304 0.102 -0.214 -0.291 + 11.228 1.040 -0.606 -0.897 -0.520 -0.191 -0.364 -0.210 -0.438 0.354 0.174 -0.199 -0.299 + 11.475 0.934 -0.626 -0.618 -0.570 -0.157 -0.450 -0.230 -0.493 0.344 0.132 -0.189 -0.222 + 11.276 0.929 -0.582 -0.791 -0.334 -0.390 -0.418 -0.509 -0.299 0.186 0.061 -0.146 -0.181 + 9.295 0.823 -0.370 -0.761 -0.232 -0.449 -0.424 -0.664 -0.161 0.252 0.241 -0.074 -0.113 + 9.190 0.857 -0.255 -0.899 0.101 -0.385 -0.499 -0.718 -0.113 0.041 0.063 -0.068 -0.136 + 6.107 0.455 -0.412 -0.514 -0.080 -0.570 -0.451 -0.675 0.032 0.528 0.226 -0.052 -0.109 + 5.610 0.533 -0.667 -0.296 -0.096 -0.433 -0.414 -0.232 0.037 0.407 0.042 -0.102 -0.177 + 5.263 0.793 -0.657 -0.338 -0.267 -0.358 -0.297 -0.121 0.052 0.389 0.108 -0.054 -0.099 + 4.894 0.600 -0.646 -0.418 -0.322 -0.381 -0.397 -0.082 0.152 0.297 0.103 -0.015 -0.092 + 4.650 0.604 -0.496 -0.451 -0.221 -0.309 -0.459 0.064 0.193 0.341 0.061 0.002 -0.166 + 4.469 0.524 -0.408 -0.188 -0.347 -0.534 -0.523 -0.103 0.003 0.312 0.079 -0.051 -0.170 + 4.678 0.624 -0.594 -0.340 -0.125 -0.248 -0.282 0.030 0.196 0.221 0.007 0.062 -0.104 + 5.063 0.702 -0.454 -0.279 -0.136 -0.212 -0.333 -0.217 0.003 0.297 0.090 0.026 -0.278 + 4.959 0.364 -0.692 -0.237 -0.085 -0.127 -0.051 -0.236 0.062 0.269 0.038 0.121 -0.347 + 8.947 -0.232 -0.631 -0.491 -0.152 -0.326 -0.379 -0.180 -0.042 -0.055 0.050 -0.046 -0.202 + 9.304 -0.203 -0.379 -0.499 -0.029 -0.342 -0.413 -0.209 0.020 -0.048 0.063 -0.056 -0.253 + 8.362 -0.936 -0.215 -0.450 0.142 -0.285 -0.227 -0.187 -0.105 -0.003 0.083 -0.195 -0.079 + 9.424 -1.377 -0.422 -0.595 0.306 -0.172 0.005 -0.044 -0.066 -0.175 -0.055 -0.043 0.014 + 10.187 -1.235 -0.385 -0.590 0.087 -0.229 -0.155 -0.040 0.050 0.035 -0.004 0.007 0.057 + 10.469 -1.092 -0.200 -0.559 -0.001 -0.267 -0.279 -0.265 -0.081 -0.177 -0.088 0.014 0.020 + 10.581 -1.053 -0.156 -0.552 0.071 -0.234 -0.043 -0.148 -0.057 -0.185 -0.224 -0.096 -0.080 + 10.604 -0.849 -0.004 -0.721 -0.033 -0.337 -0.229 0.027 -0.096 -0.130 -0.179 0.034 -0.119 + 10.499 -1.006 -0.100 -0.615 -0.105 -0.317 -0.286 -0.050 0.138 0.027 -0.221 0.013 0.076 + 10.413 -1.058 -0.164 -0.659 -0.161 -0.372 -0.241 -0.104 0.071 0.112 -0.372 0.082 -0.076 + 10.355 -0.152 0.386 -0.455 -0.207 -0.450 -0.524 -0.487 0.032 0.094 -0.394 -0.061 -0.017 + 10.454 0.667 0.259 -0.356 -0.474 -0.115 -0.575 -0.788 0.106 0.001 -0.229 0.080 -0.019 + 11.092 0.648 0.183 -0.468 -0.599 0.141 -0.769 -0.807 0.048 0.265 -0.392 0.176 -0.130 + 11.966 0.382 0.152 -0.426 -0.516 -0.143 -0.680 -0.631 0.031 0.351 -0.478 0.119 -0.128 + 12.270 0.246 -0.091 -0.392 -0.456 -0.271 -0.650 -0.560 0.159 0.243 -0.402 0.070 -0.155 + 12.497 0.031 -0.235 -0.349 -0.486 -0.446 -0.588 -0.462 0.233 0.219 -0.352 0.066 -0.075 + 12.430 0.070 -0.268 -0.299 -0.544 -0.404 -0.612 -0.379 0.183 0.292 -0.364 0.039 -0.066 + 12.602 0.099 -0.313 -0.254 -0.636 -0.297 -0.570 -0.349 0.164 0.274 -0.335 -0.139 -0.023 + 12.733 0.094 -0.602 -0.270 -0.559 -0.247 -0.537 -0.375 0.210 0.223 -0.323 -0.143 -0.030 + 11.724 0.467 -0.523 -0.474 -0.620 -0.054 -0.718 -0.311 0.232 0.295 -0.277 -0.101 -0.029 + 12.620 0.220 -0.712 -0.366 -0.586 -0.238 -0.565 -0.297 0.194 0.256 -0.242 -0.199 -0.011 + 12.506 0.419 -0.648 -0.397 -0.591 -0.213 -0.498 -0.357 0.180 0.268 -0.297 -0.272 0.027 + 11.901 0.784 -0.739 -0.455 -0.543 -0.113 -0.595 -0.254 0.102 0.236 -0.257 -0.230 -0.088 + 11.447 0.945 -0.754 -0.614 -0.453 -0.089 -0.614 -0.373 0.181 0.304 -0.259 -0.249 -0.010 + 12.129 0.726 -0.923 -0.390 -0.492 -0.217 -0.518 -0.431 0.214 0.260 -0.190 -0.258 -0.023 + 12.380 0.646 -0.864 -0.347 -0.551 -0.154 -0.525 -0.335 0.133 0.153 -0.142 -0.266 -0.031 + 12.259 0.639 -0.928 -0.225 -0.636 -0.183 -0.317 -0.375 0.109 0.168 -0.219 -0.200 -0.092 + 12.049 0.541 -1.082 -0.207 -0.659 -0.171 -0.189 -0.415 0.240 0.097 -0.121 -0.246 -0.062 + 12.117 0.256 -1.080 -0.202 -0.620 -0.156 -0.088 -0.414 0.303 0.050 -0.108 -0.242 -0.211 + 11.589 0.191 -0.911 -0.177 -0.438 -0.169 -0.166 -0.319 0.374 0.076 -0.026 -0.127 -0.269 + 10.906 0.336 -0.830 -0.177 -0.270 -0.045 -0.091 -0.536 0.351 -0.093 0.027 -0.164 -0.416 + 9.578 0.559 -0.562 -0.354 -0.137 0.078 -0.124 -0.489 0.318 -0.139 0.034 -0.263 -0.454 + 8.489 0.610 -0.369 -0.376 -0.117 0.107 -0.013 -0.412 0.333 -0.175 0.143 -0.223 -0.446 + 7.304 0.230 -0.196 -0.228 -0.068 0.073 -0.010 -0.252 0.249 -0.229 -0.065 -0.104 -0.343 + 6.843 -0.141 -0.382 -0.502 -0.049 0.306 0.070 0.071 0.186 -0.029 -0.097 -0.245 -0.265 + 6.161 -0.260 -0.069 -0.453 -0.045 0.140 -0.174 -0.024 0.311 0.043 -0.103 -0.146 -0.286 + 5.613 -0.262 -0.205 -0.558 -0.150 -0.139 -0.147 -0.022 -0.076 0.079 0.003 -0.092 -0.065 + 5.307 -0.175 0.067 -0.299 -0.306 -0.243 -0.125 -0.073 -0.059 0.132 -0.126 -0.135 -0.012 + 5.285 -0.028 -0.232 -0.067 -0.070 -0.203 -0.352 -0.192 -0.068 0.127 -0.043 0.026 -0.157 + 5.831 -0.244 -0.060 -0.125 0.167 -0.335 -0.411 -0.079 0.001 0.273 -0.084 -0.016 -0.067 + 5.718 -0.466 -0.300 -0.141 0.258 -0.140 -0.443 -0.138 0.172 0.255 -0.254 -0.035 -0.037 + 5.545 -0.327 -0.335 -0.167 0.294 -0.118 -0.345 0.036 0.011 0.156 -0.164 -0.010 0.014 + 4.629 0.008 -0.362 0.004 -0.018 -0.121 -0.120 -0.054 -0.056 0.203 0.015 -0.114 -0.044 + 6.448 -0.302 -0.300 -0.004 -0.061 -0.085 -0.322 -0.036 0.017 -0.034 -0.117 -0.078 0.040 + 9.697 -0.420 -0.362 -0.243 -0.072 -0.081 -0.466 -0.121 -0.001 -0.153 -0.185 -0.117 -0.015 + 7.535 -0.308 -0.300 -0.082 0.043 -0.073 -0.475 -0.077 0.069 -0.190 -0.227 -0.129 -0.037 + 7.413 -0.229 -0.381 0.120 0.077 -0.016 -0.286 -0.081 -0.118 -0.317 -0.511 -0.185 0.033 + 7.881 -0.190 -0.538 -0.169 -0.083 -0.067 -0.355 -0.099 0.056 -0.172 -0.203 0.031 -0.149 + 8.241 -0.390 -0.537 -0.254 -0.001 -0.211 -0.331 -0.148 -0.186 -0.200 -0.127 0.045 -0.068 + 8.608 -0.520 -0.505 -0.189 0.172 -0.198 -0.287 -0.028 -0.086 -0.016 -0.346 -0.199 -0.097 + 8.857 -0.686 -0.546 -0.268 -0.096 -0.173 -0.255 0.108 -0.131 -0.148 -0.205 0.190 0.044 + 9.050 -0.641 -0.598 -0.212 -0.131 -0.341 -0.452 -0.027 -0.285 -0.307 -0.278 0.177 -0.035 + 9.052 -0.719 -0.425 -0.214 -0.114 -0.456 -0.353 -0.022 -0.181 -0.225 -0.233 0.177 -0.040 + 8.926 -0.782 -0.471 0.051 -0.063 -0.446 -0.410 -0.065 -0.061 -0.297 -0.354 0.086 -0.108 + 9.279 -0.729 -0.359 -0.224 -0.231 -0.450 -0.343 0.063 -0.074 -0.354 -0.162 0.123 -0.056 + 9.357 -1.006 -0.525 -0.150 -0.193 -0.325 -0.256 0.065 -0.009 -0.359 -0.217 0.176 0.117 + 9.325 -1.002 -0.495 -0.232 -0.197 -0.370 -0.295 -0.010 -0.022 -0.211 -0.165 0.269 0.158 + 8.997 -0.906 -0.431 -0.173 -0.165 -0.440 -0.426 -0.060 -0.101 0.037 -0.074 0.243 -0.074 + 8.713 -0.943 -0.491 -0.188 -0.272 -0.358 -0.247 0.085 -0.061 0.104 -0.190 0.206 -0.115 + 8.861 -0.984 -0.473 -0.134 -0.358 -0.400 -0.568 0.007 -0.009 0.036 -0.109 0.209 -0.034 + 9.168 -0.872 -0.181 0.038 -0.175 -0.554 -0.500 -0.090 0.001 -0.117 -0.348 0.010 -0.084 + 9.167 -0.967 -0.389 0.221 -0.252 -0.621 -0.506 -0.024 0.149 -0.058 -0.361 -0.007 -0.081 + 9.123 -1.212 -0.440 -0.039 -0.423 -0.569 -0.573 -0.008 -0.016 -0.091 -0.247 0.047 0.141 + 9.134 -1.156 -0.323 -0.197 -0.293 -0.365 -0.411 0.163 -0.025 -0.079 -0.187 -0.046 -0.020 + 8.890 -1.078 -0.261 -0.323 -0.253 -0.273 -0.465 0.152 0.145 0.114 -0.205 -0.047 -0.035 + 9.133 -1.137 -0.341 -0.129 -0.126 -0.444 -0.569 -0.000 0.171 -0.162 -0.214 0.074 -0.064 + 9.276 -0.968 -0.440 -0.286 -0.063 -0.431 -0.509 0.018 0.058 -0.131 -0.184 0.114 -0.214 + 10.044 -0.738 -0.290 -0.206 -0.168 -0.239 -0.431 0.246 0.044 0.115 -0.259 0.043 -0.057 + 9.973 -0.964 -0.340 -0.068 -0.135 -0.388 -0.408 0.298 0.032 0.062 -0.226 -0.051 -0.116 + 9.684 -1.140 -0.344 -0.094 -0.036 -0.707 -0.742 0.088 -0.119 -0.120 -0.243 0.113 -0.235 + 9.338 -1.395 -0.220 -0.040 -0.167 -0.612 -0.622 0.118 0.032 -0.001 -0.212 0.236 -0.051 + 8.999 -1.190 -0.305 0.101 -0.121 -0.658 -0.652 0.013 0.024 0.062 -0.100 0.244 -0.043 + 8.962 -0.736 -0.277 0.089 -0.038 -0.606 -0.661 0.049 -0.203 -0.044 -0.088 0.287 -0.059 + 8.541 -0.797 -0.471 0.041 0.081 -0.683 -0.693 -0.098 -0.112 -0.006 0.009 0.453 0.008 + 8.441 -1.054 -0.161 0.003 0.138 -0.740 -0.725 -0.172 -0.064 -0.023 -0.198 0.330 0.061 + 8.529 -0.872 0.037 0.200 0.188 -0.844 -0.763 -0.038 -0.138 0.006 -0.102 0.239 0.051 + 8.775 -0.784 0.030 0.035 0.010 -0.692 -0.607 -0.019 -0.174 0.003 -0.235 0.225 0.157 + 8.385 -0.787 0.191 0.077 0.173 -0.719 -0.762 0.081 -0.247 -0.157 -0.213 0.212 0.112 + 8.065 -0.620 -0.084 0.102 0.155 -0.418 -0.706 0.045 -0.277 -0.037 -0.267 0.113 0.067 + 8.132 -0.448 -0.074 -0.068 0.226 -0.165 -0.656 -0.108 -0.072 0.074 -0.026 0.270 -0.033 + 8.076 -0.416 0.174 0.064 0.311 -0.113 -0.523 -0.143 -0.061 -0.061 -0.219 0.192 -0.035 + 7.653 -0.657 0.174 -0.041 0.347 -0.465 -0.756 -0.078 -0.173 -0.195 -0.088 0.211 0.082 + 7.020 -0.640 0.272 0.021 0.316 -0.604 -0.579 -0.139 -0.118 -0.022 -0.220 0.190 -0.012 + 7.368 -0.539 0.090 0.077 0.481 -0.513 -0.451 0.032 -0.063 -0.243 -0.312 0.229 0.020 + 7.114 -0.394 -0.155 0.196 0.343 -0.318 -0.434 0.082 0.060 -0.114 -0.296 0.342 -0.009 + 6.740 -0.270 0.159 0.300 0.280 -0.170 -0.399 0.104 0.060 -0.034 -0.162 0.185 -0.161 + 6.369 -0.354 -0.137 0.157 0.276 -0.179 -0.438 -0.098 -0.116 -0.163 -0.229 0.139 0.095 + 5.833 -0.119 -0.096 0.340 0.345 -0.328 -0.385 -0.012 -0.032 -0.370 -0.244 0.130 0.004 + 5.315 -0.347 -0.090 0.089 0.469 -0.375 -0.421 0.185 -0.056 -0.321 -0.122 0.287 0.166 + 8.295 1.522 0.206 -0.141 -0.241 -0.593 -0.184 -0.103 -0.244 -0.073 -0.221 -0.093 -0.101 + 9.609 1.776 0.115 0.038 -0.407 -0.682 -0.113 -0.272 -0.203 -0.106 -0.201 -0.100 -0.168 + 6.939 1.597 0.558 -0.417 -0.660 -0.740 -0.354 -0.219 -0.130 -0.169 -0.241 0.066 0.075 + 6.329 1.059 0.737 -0.195 -0.637 -0.477 -0.278 0.136 0.087 -0.102 -0.018 0.000 -0.145 + 5.722 0.759 0.798 -0.000 -0.385 -0.311 -0.148 0.036 -0.132 -0.247 -0.021 0.055 -0.140 + 4.844 0.321 0.608 0.069 -0.160 -0.359 -0.303 -0.056 0.082 -0.007 0.012 0.028 -0.124 + 4.496 0.454 0.356 -0.054 -0.023 -0.037 -0.201 0.048 -0.161 -0.124 -0.051 -0.051 -0.163 + 4.434 0.314 0.150 0.118 -0.011 -0.008 -0.154 0.097 0.029 -0.024 -0.135 -0.176 -0.382 + 4.824 0.407 0.315 0.137 0.077 -0.110 -0.163 0.026 -0.239 0.038 -0.076 -0.031 -0.250 + 4.798 0.199 0.170 -0.033 -0.035 -0.131 -0.127 0.148 -0.165 -0.121 -0.078 0.100 -0.232 + 4.787 0.159 0.198 0.067 -0.088 -0.228 -0.232 0.086 -0.177 -0.107 -0.018 0.096 -0.085 + 4.866 0.293 0.046 -0.094 -0.085 -0.153 -0.228 0.035 -0.071 -0.246 -0.067 0.047 -0.068 + 5.444 0.693 0.266 -0.047 -0.086 -0.337 -0.317 -0.013 -0.016 -0.102 -0.070 -0.015 0.080 + 5.551 0.736 0.305 0.052 -0.201 -0.447 -0.384 -0.122 -0.049 -0.029 -0.188 -0.075 -0.137 + 5.678 0.726 0.249 -0.016 -0.073 -0.313 -0.340 -0.007 -0.126 -0.048 -0.184 0.092 -0.082 + 7.640 1.244 0.035 -0.409 0.125 -0.025 -0.437 -0.186 -0.222 0.042 -0.234 0.003 -0.026 + 6.811 1.083 0.189 0.015 0.046 0.023 -0.212 -0.254 -0.132 0.097 -0.215 -0.133 -0.170 + 5.365 0.125 0.182 -0.006 -0.337 -0.206 -0.373 -0.222 -0.136 0.032 -0.125 -0.170 -0.180 + 6.714 -0.233 0.069 -0.009 -0.283 -0.248 -0.396 -0.251 -0.167 -0.082 -0.172 -0.159 -0.093 + 7.455 -0.382 0.174 0.116 -0.229 -0.137 -0.356 -0.172 -0.128 -0.103 -0.126 -0.149 -0.066 + 7.109 -0.242 -0.006 0.015 -0.138 -0.258 -0.340 -0.211 -0.160 0.177 -0.028 0.024 -0.038 + 7.138 -0.207 0.186 0.005 -0.206 -0.304 -0.403 -0.421 -0.226 -0.222 -0.057 0.177 -0.054 + 8.205 -0.087 0.531 0.304 -0.197 -0.234 -0.445 -0.313 -0.250 -0.139 -0.110 -0.044 -0.052 + 8.309 -0.441 0.293 0.125 -0.177 0.106 -0.354 -0.276 -0.051 -0.185 -0.174 -0.060 -0.191 + 8.561 -0.139 0.293 0.124 0.048 0.007 -0.388 -0.319 0.017 -0.030 -0.242 -0.217 -0.075 + 8.092 0.324 0.028 0.011 0.156 0.045 -0.433 -0.351 -0.022 -0.236 -0.352 -0.094 -0.012 + 6.371 0.773 -0.219 0.041 0.207 0.063 -0.266 -0.376 -0.212 -0.023 -0.392 -0.165 -0.076 + 5.559 0.983 0.108 0.028 0.296 0.188 0.035 -0.139 -0.181 -0.130 -0.347 -0.327 -0.215 + 3.753 -0.051 0.174 0.246 0.239 0.023 0.025 -0.066 -0.007 -0.046 -0.174 -0.101 -0.101 + 3.514 -0.287 0.055 0.229 0.121 0.199 -0.179 -0.005 -0.169 -0.187 -0.024 -0.263 -0.077 + 3.831 -0.143 0.002 0.170 -0.047 0.071 -0.071 0.031 -0.109 -0.111 -0.088 -0.177 0.001 + 3.445 -0.125 -0.025 0.024 0.146 -0.010 -0.113 0.082 -0.181 -0.045 -0.125 -0.106 -0.027 + 3.971 0.301 0.068 0.306 -0.074 0.004 -0.120 0.005 -0.089 -0.051 -0.119 -0.032 -0.035 + 3.603 0.056 0.062 0.351 -0.125 0.065 -0.058 -0.046 -0.069 -0.061 -0.298 -0.015 -0.015 + 3.670 0.027 0.124 0.195 0.067 0.136 -0.014 -0.019 -0.083 -0.102 -0.218 0.201 0.007 + 3.545 -0.104 0.182 0.206 0.094 0.100 -0.084 -0.059 0.142 0.114 -0.076 0.150 -0.003 + 3.788 0.067 0.148 0.071 0.021 0.056 -0.125 0.046 -0.082 0.072 -0.165 -0.107 -0.063 + 4.071 0.210 -0.061 -0.107 -0.071 0.120 -0.176 -0.114 0.047 0.041 -0.063 0.029 -0.009 + 4.158 0.046 -0.072 0.040 -0.085 0.104 -0.134 -0.043 -0.175 -0.037 0.027 0.083 -0.119 + 4.377 0.212 -0.160 -0.058 0.039 -0.161 -0.291 0.046 -0.083 -0.114 -0.095 -0.006 -0.136 + 4.812 0.239 0.024 0.050 0.039 -0.203 -0.307 0.139 -0.012 -0.080 -0.149 0.006 0.044 + 4.742 0.082 -0.151 0.208 0.210 -0.187 -0.471 0.062 -0.027 0.009 0.013 0.103 -0.047 + 4.735 0.007 -0.169 0.163 0.164 -0.304 -0.386 -0.005 -0.007 -0.053 -0.031 0.191 0.091 + 5.256 0.116 -0.200 0.142 0.037 -0.387 -0.386 0.233 0.077 -0.088 -0.078 0.083 -0.092 + 5.458 0.155 -0.373 0.249 0.297 -0.318 -0.358 0.190 -0.019 -0.150 -0.092 0.045 -0.047 + 5.479 0.090 -0.536 0.286 0.258 -0.339 -0.396 0.190 0.095 -0.137 -0.115 0.175 -0.069 + 5.550 -0.043 -0.598 0.027 0.153 -0.253 -0.420 0.242 -0.012 -0.142 0.009 0.017 -0.008 + 5.318 -0.187 -0.399 0.153 0.308 -0.514 -0.468 0.180 0.024 -0.253 -0.211 0.092 0.016 + 5.391 -0.493 -0.615 0.166 0.488 -0.450 -0.513 0.113 -0.030 -0.173 0.170 0.234 -0.072 + 5.120 -0.732 -0.487 0.302 0.375 -0.382 -0.363 0.024 0.037 -0.075 0.186 0.155 0.001 + 5.283 -0.814 -0.381 0.267 0.499 -0.174 -0.341 0.056 -0.047 -0.196 0.121 0.072 -0.055 + 5.498 -0.695 -0.534 0.170 0.456 -0.275 -0.441 0.235 0.144 -0.304 0.099 0.270 -0.059 + 5.594 -0.666 -0.664 0.201 0.254 -0.292 -0.306 0.196 0.059 -0.330 0.140 0.171 -0.028 + 5.506 -0.752 -0.470 0.192 0.556 -0.315 -0.245 0.235 0.003 -0.205 0.029 0.140 -0.095 + 5.764 -0.758 -0.683 0.113 0.247 -0.077 -0.328 0.392 0.262 -0.068 0.067 -0.089 -0.121 + 6.038 -0.533 -0.554 0.013 0.102 -0.278 -0.361 0.369 0.203 -0.073 0.099 0.028 -0.085 + 5.643 -0.748 -0.721 0.099 0.290 -0.017 -0.277 0.035 0.171 -0.159 -0.106 0.050 -0.000 + 5.998 -0.498 -0.496 0.281 0.399 -0.020 -0.230 0.313 -0.023 -0.251 0.033 -0.027 -0.127 + 5.996 -0.511 -0.514 0.110 0.372 -0.161 -0.430 0.086 0.082 -0.232 -0.007 0.007 -0.079 + 5.725 -0.516 -0.299 0.250 0.231 -0.487 -0.370 0.151 0.188 -0.298 -0.018 0.007 0.050 + 5.440 -0.248 -0.276 0.564 0.283 -0.408 -0.346 0.122 0.097 -0.361 -0.134 0.146 -0.113 + 5.759 -0.337 -0.415 0.501 0.322 -0.281 -0.459 0.141 0.030 -0.382 -0.135 0.114 -0.071 + 5.757 -0.345 -0.393 0.335 0.205 -0.397 -0.538 0.257 0.252 -0.099 -0.103 0.005 -0.192 + 5.956 -0.188 -0.264 0.272 0.082 -0.394 -0.487 0.073 0.099 -0.213 0.026 -0.010 0.030 + 6.074 0.362 0.248 0.646 0.485 -0.293 -0.744 0.049 0.031 -0.163 0.176 0.014 -0.132 + 5.938 0.136 0.180 0.640 0.372 -0.118 -0.559 0.012 0.041 0.050 0.040 0.059 -0.057 + 5.720 -0.226 -0.225 0.562 0.203 -0.523 -0.391 0.233 0.126 -0.326 -0.007 0.071 -0.164 + 5.693 -0.249 -0.334 0.134 0.075 -0.500 -0.222 0.364 0.043 -0.382 -0.023 0.061 0.004 + 5.499 -0.379 -0.341 0.113 -0.035 -0.386 -0.246 0.210 -0.051 -0.321 -0.125 -0.050 -0.041 + 5.058 -0.404 -0.512 0.120 0.238 -0.406 -0.378 0.285 -0.199 -0.362 0.095 -0.056 -0.028 + 5.191 -0.268 -0.564 0.034 0.280 -0.424 -0.468 0.221 -0.034 -0.228 -0.034 0.151 -0.017 + 5.060 -0.111 -0.499 0.086 0.226 -0.299 -0.417 -0.014 0.045 -0.273 -0.093 0.182 -0.003 + 4.719 -0.040 -0.322 0.148 0.035 -0.328 -0.464 0.096 0.039 -0.133 -0.010 0.027 -0.100 + 4.362 0.048 -0.190 0.291 -0.157 -0.262 -0.467 0.153 0.138 -0.175 0.002 0.064 0.010 + 4.460 0.020 -0.123 0.097 -0.278 -0.116 -0.253 0.046 -0.093 -0.204 -0.222 0.067 0.094 + 5.128 0.062 -0.188 0.059 -0.196 -0.165 -0.407 0.132 0.146 0.033 -0.024 0.063 -0.113 + 4.760 -0.016 -0.089 0.177 -0.065 -0.070 -0.291 0.179 0.117 -0.123 -0.165 -0.037 -0.143 + 4.506 0.059 -0.101 0.300 -0.037 -0.324 -0.605 0.106 0.176 -0.046 -0.051 0.083 -0.160 + 3.845 -0.329 -0.153 0.583 0.301 0.019 -0.398 0.093 -0.006 -0.323 -0.169 0.050 0.021 + 3.650 0.040 -0.188 0.361 0.138 -0.005 -0.264 0.103 -0.069 -0.180 -0.123 0.132 0.006 + 3.370 0.412 -0.123 0.279 0.082 -0.065 -0.157 0.255 0.048 -0.006 -0.219 0.021 -0.238 + 3.019 0.412 -0.169 0.255 -0.170 -0.042 -0.303 0.114 0.168 -0.056 -0.164 -0.014 -0.067 + 3.515 0.580 -0.021 0.387 -0.015 -0.425 -0.426 0.054 0.142 0.098 -0.164 -0.010 -0.033 + 3.265 0.079 -0.080 0.193 0.058 -0.342 -0.459 0.049 -0.016 -0.001 -0.131 0.088 0.182 + 4.288 0.016 0.395 0.134 -0.031 -0.063 -0.231 -0.087 -0.156 -0.003 -0.187 -0.164 0.003 + 4.738 -0.574 0.339 -0.135 -0.253 -0.279 -0.341 -0.081 0.056 -0.105 -0.049 0.097 0.019 + 4.809 -0.441 0.433 0.111 -0.296 -0.051 -0.312 -0.146 -0.175 0.003 0.122 0.045 -0.023 + 6.048 -0.497 0.214 0.018 -0.022 -0.009 -0.230 0.021 -0.142 -0.061 0.009 0.211 -0.169 + 7.280 -0.102 0.208 -0.201 -0.035 0.002 -0.190 0.015 -0.103 0.002 -0.135 -0.048 -0.208 + 6.414 -0.148 0.308 -0.113 -0.061 -0.121 -0.225 -0.161 -0.210 0.022 -0.239 0.152 -0.041 + 5.375 -0.470 0.645 0.315 -0.193 -0.152 -0.372 -0.076 -0.179 -0.081 -0.042 0.084 -0.091 + 4.800 -0.538 0.643 0.210 -0.049 -0.151 -0.207 0.058 -0.164 -0.157 -0.104 0.005 -0.103 + 5.260 -0.404 0.404 -0.058 -0.226 -0.310 -0.332 -0.093 -0.120 -0.039 -0.191 0.076 -0.031 + 5.329 -0.287 0.318 -0.106 -0.255 -0.294 -0.264 -0.099 -0.056 0.015 -0.063 0.044 -0.124 + 5.610 -0.233 0.849 -0.261 -0.113 0.000 -0.165 0.043 -0.192 -0.128 -0.168 0.073 -0.277 + 6.151 -0.488 0.296 -0.107 -0.015 -0.064 0.069 -0.045 -0.241 -0.048 -0.204 -0.021 -0.135 + 7.159 -0.152 -0.024 -0.231 -0.187 -0.171 -0.022 -0.280 -0.017 -0.045 -0.083 -0.137 -0.008 + 6.310 0.442 -0.293 -0.588 -0.624 -0.199 -0.271 -0.196 0.017 0.130 -0.148 -0.039 0.018 + 6.746 0.660 -0.363 -0.538 -0.390 -0.183 -0.564 -0.205 0.204 0.115 -0.388 -0.141 0.011 + 7.486 0.469 -0.632 -0.273 -0.591 -0.489 -0.655 -0.413 0.189 0.214 -0.420 -0.107 0.070 + 8.083 0.141 -0.678 -0.149 -0.578 -0.557 -0.617 -0.470 0.008 0.287 0.049 -0.094 -0.008 + 7.848 0.250 -0.611 -0.027 -0.439 -0.428 -0.559 -0.465 -0.181 0.220 -0.269 -0.039 0.026 + 7.434 0.166 -0.213 0.035 -0.110 -0.518 -0.613 -0.418 -0.087 0.236 -0.501 0.077 0.167 + 6.671 0.280 -0.149 0.107 -0.186 -0.619 -0.429 -0.140 -0.052 0.180 -0.376 0.015 0.094 + 5.723 0.257 -0.018 -0.005 -0.045 -0.345 -0.256 0.021 0.009 0.072 -0.293 -0.109 0.023 + 4.807 0.089 -0.215 0.083 0.056 -0.276 -0.197 0.003 0.171 0.348 -0.161 -0.083 0.046 + 4.741 0.322 -0.072 0.060 -0.115 -0.277 -0.134 -0.026 0.054 0.241 -0.212 -0.203 -0.072 + 4.905 0.280 -0.003 0.077 -0.288 -0.306 -0.147 -0.121 0.033 0.160 -0.109 -0.156 -0.066 + 4.873 0.093 -0.038 0.096 -0.153 -0.235 -0.072 -0.206 -0.048 0.095 -0.243 0.103 0.083 + 5.088 -0.107 -0.181 0.243 -0.517 -0.404 -0.195 -0.324 0.044 -0.028 -0.417 0.062 -0.063 + 4.939 -0.349 -0.063 0.213 -0.360 -0.042 0.049 -0.198 0.189 0.114 -0.179 -0.071 -0.076 + 5.232 -0.302 0.061 0.173 -0.440 -0.480 -0.022 -0.317 -0.085 0.084 0.073 0.195 0.054 + 6.091 -0.189 0.170 0.440 -0.660 -0.487 -0.131 -0.427 -0.028 0.095 -0.042 0.208 0.030 + 6.783 -0.316 0.233 0.324 -0.804 -0.583 -0.176 -0.396 -0.185 -0.026 -0.210 0.217 0.016 + 7.098 -0.766 -0.095 0.364 -0.891 -0.636 -0.322 -0.425 -0.245 -0.015 -0.004 0.308 0.029 + 7.487 -0.687 -0.005 0.607 -0.796 -0.613 -0.251 -0.534 -0.400 -0.080 -0.011 0.265 0.017 + 7.569 -0.731 0.107 0.876 -0.577 -0.539 -0.242 -0.647 -0.462 -0.077 -0.053 0.284 0.040 + 7.751 -0.772 0.068 0.737 -0.460 -0.535 -0.404 -0.739 -0.396 0.063 -0.184 0.217 -0.048 + 7.465 -0.662 0.256 0.686 -0.611 -0.472 -0.463 -0.662 -0.462 -0.072 -0.220 0.253 -0.100 + 6.991 -0.389 0.337 0.635 -0.756 -0.621 -0.212 -0.574 -0.402 -0.096 -0.047 0.180 -0.121 + 6.776 0.220 0.697 0.812 -0.376 -0.450 -0.054 -0.450 -0.366 -0.137 -0.205 0.062 -0.181 + 6.354 0.681 0.873 0.701 -0.092 -0.364 -0.208 -0.306 -0.228 -0.059 -0.272 0.075 -0.261 + 5.587 0.162 0.815 0.803 -0.025 -0.242 -0.031 -0.181 -0.415 -0.071 -0.167 0.027 -0.195 + 5.397 0.043 0.506 0.533 -0.173 -0.240 0.036 -0.156 -0.463 -0.318 -0.259 0.064 -0.201 + 5.320 0.226 0.325 0.378 -0.167 -0.052 0.176 -0.128 -0.206 -0.177 -0.219 -0.049 -0.171 + 6.168 0.190 0.353 0.142 -0.267 -0.128 -0.098 -0.241 -0.182 -0.103 -0.125 -0.111 -0.144 + 8.403 1.441 0.555 -0.071 -0.236 -0.157 -0.177 -0.193 -0.349 -0.118 -0.265 -0.205 -0.170 + 7.120 0.983 0.658 0.147 -0.186 -0.075 -0.028 -0.141 -0.271 -0.258 -0.184 -0.157 -0.295 + 6.601 0.411 0.491 -0.302 -0.518 -0.189 -0.045 -0.102 -0.062 -0.140 -0.226 -0.021 -0.229 + 6.444 -0.207 0.089 -0.135 -0.147 -0.046 -0.053 -0.016 -0.020 -0.081 -0.224 -0.054 -0.127 + 6.561 0.284 0.049 0.301 -0.069 -0.178 -0.327 -0.229 -0.027 -0.156 -0.211 0.266 -0.168 + 7.083 0.516 0.118 0.385 -0.243 -0.261 -0.416 -0.386 -0.078 -0.264 -0.437 0.235 -0.076 + 7.574 0.715 -0.018 0.152 -0.055 -0.130 -0.619 -0.337 -0.090 -0.078 -0.373 0.182 0.036 + 7.625 0.621 0.063 -0.055 -0.062 -0.080 -0.529 -0.351 -0.138 -0.195 -0.480 0.021 0.042 + 7.430 0.952 0.077 -0.039 0.052 -0.003 -0.435 -0.382 -0.085 -0.209 -0.398 0.026 -0.114 + 6.319 0.840 -0.168 0.150 -0.030 -0.204 -0.399 -0.205 0.010 -0.219 -0.305 0.066 -0.091 + 5.767 0.569 0.032 0.214 -0.061 -0.119 -0.308 -0.165 -0.117 0.002 -0.231 0.040 -0.124 + 5.455 0.843 0.058 0.076 -0.060 -0.013 -0.150 -0.216 -0.174 -0.039 -0.259 -0.149 -0.154 + 5.584 0.965 -0.117 0.071 0.021 0.092 0.047 -0.107 -0.121 -0.117 -0.269 -0.080 -0.075 + 5.569 1.123 0.359 0.325 -0.027 -0.217 -0.128 -0.112 -0.040 -0.288 -0.422 -0.167 -0.199 + 5.454 1.332 0.456 0.396 -0.076 -0.199 0.057 -0.107 -0.092 -0.206 -0.267 -0.166 -0.158 + 5.561 0.743 -0.118 0.346 -0.212 -0.248 -0.270 -0.219 -0.061 -0.124 -0.064 0.134 -0.159 + 7.110 0.558 -0.172 0.362 -0.443 -0.251 -0.378 -0.274 -0.202 -0.196 -0.042 0.402 -0.151 + 7.872 0.083 -0.243 0.340 -0.813 -0.468 -0.413 -0.022 0.007 -0.024 -0.120 0.591 -0.155 + 8.340 -0.059 -0.283 0.455 -0.591 -0.676 -0.499 -0.221 -0.144 -0.136 -0.066 0.570 -0.210 + 8.496 -0.179 -0.310 0.505 -0.503 -0.830 -0.605 -0.051 -0.206 -0.181 0.049 0.609 -0.083 + 8.628 -0.283 -0.206 0.451 -0.631 -0.699 -0.628 -0.280 -0.133 -0.245 0.042 0.588 -0.232 + 8.517 -0.244 -0.149 0.242 -0.724 -0.654 -0.455 -0.111 0.005 -0.151 0.016 0.516 -0.176 + 8.225 -0.139 -0.153 0.032 -0.498 -0.668 -0.323 -0.053 -0.040 -0.097 0.077 0.351 -0.364 + 7.546 -0.099 0.116 0.159 -0.350 -0.717 -0.378 -0.004 0.017 -0.074 0.062 0.408 -0.142 + 7.692 0.437 -0.043 -0.123 -0.345 -0.353 -0.307 -0.155 -0.101 -0.112 0.033 0.271 -0.267 + 6.989 0.571 0.155 -0.039 -0.230 -0.413 -0.439 -0.204 -0.146 -0.253 -0.111 0.316 -0.175 + 6.588 0.416 0.338 0.058 -0.065 -0.213 -0.106 -0.040 -0.259 -0.261 -0.291 0.083 -0.191 + 6.197 0.443 0.479 0.363 -0.279 -0.444 -0.266 -0.136 -0.191 -0.176 -0.093 0.016 -0.128 + 6.024 0.151 0.455 0.167 -0.176 -0.429 -0.395 -0.082 -0.040 -0.267 -0.045 0.353 -0.090 + 6.341 0.189 0.598 0.185 -0.118 -0.240 -0.161 0.062 -0.045 -0.234 -0.078 0.175 -0.135 + 7.829 0.575 -0.023 0.169 0.208 -0.108 0.014 -0.173 -0.173 -0.214 -0.234 0.051 -0.208 + 8.506 0.678 -0.126 0.004 0.170 -0.078 0.139 -0.133 -0.100 -0.349 -0.333 0.065 -0.252 + 6.950 0.471 0.678 -0.119 -0.251 -0.342 -0.002 -0.071 -0.309 -0.058 -0.135 0.025 0.012 + 6.905 0.322 0.807 -0.106 -0.157 -0.208 0.178 -0.033 -0.248 -0.199 -0.217 -0.058 -0.218 + 6.438 -0.089 0.526 0.075 -0.044 -0.259 -0.102 -0.107 -0.124 -0.057 -0.223 0.140 -0.095 + 6.263 -0.170 0.595 -0.212 0.051 -0.139 -0.115 -0.026 -0.114 -0.143 -0.064 -0.110 -0.112 + 6.426 -0.208 0.501 -0.089 0.222 -0.280 -0.155 -0.296 -0.161 -0.180 -0.198 -0.156 -0.037 + 6.185 -0.338 0.330 0.117 0.047 -0.464 -0.166 0.082 -0.050 -0.171 -0.216 -0.104 -0.165 + 9.374 0.072 -0.068 0.400 -0.125 -0.618 0.030 -0.079 0.147 -0.419 -0.099 -0.138 -0.260 + 10.107 0.554 -0.250 0.218 0.010 -0.419 0.144 -0.108 0.149 -0.456 -0.207 -0.196 -0.254 + 9.607 1.268 -0.377 -0.007 0.280 -0.549 0.076 0.180 -0.212 -0.332 -0.313 -0.236 -0.267 + 9.976 1.239 -0.324 -0.037 0.303 -0.515 -0.133 0.453 -0.304 -0.380 -0.296 -0.277 -0.291 + 11.173 1.169 -0.356 -0.089 -0.024 -0.464 -0.282 0.215 -0.188 -0.277 -0.140 -0.138 -0.202 + 12.303 1.604 -0.444 -0.401 -0.090 -0.539 -0.443 0.069 -0.165 -0.281 -0.129 -0.092 -0.193 + 12.056 2.451 -0.736 -0.754 -0.339 -0.532 -0.540 0.211 -0.252 -0.327 -0.238 0.148 0.090 + 12.771 2.519 -0.636 -0.895 -0.266 -0.357 -0.826 0.446 -0.366 -0.352 -0.332 0.099 0.110 + 12.629 2.777 -0.689 -1.034 -0.271 -0.224 -0.872 0.370 -0.290 -0.251 -0.340 -0.020 0.193 + 12.896 2.610 -0.630 -1.112 -0.262 -0.031 -0.897 0.180 -0.228 -0.191 -0.270 -0.107 0.240 + 13.337 2.436 -0.707 -1.080 -0.164 -0.080 -0.812 0.076 -0.330 -0.112 -0.267 0.005 0.110 + 13.128 2.736 -1.022 -1.025 -0.003 -0.075 -0.931 0.080 -0.463 0.036 -0.254 0.031 0.038 + 13.192 2.491 -0.890 -0.986 0.089 -0.121 -0.897 -0.097 -0.367 0.041 -0.246 0.094 -0.096 + 13.250 2.286 -0.949 -0.817 0.210 -0.085 -0.986 -0.217 -0.275 -0.022 -0.168 -0.012 -0.144 + 12.586 2.106 -1.026 -0.404 0.347 0.141 -1.212 -0.304 -0.137 -0.112 -0.184 -0.088 -0.174 + 11.964 1.558 -0.887 -0.304 0.625 0.089 -1.206 -0.306 -0.007 -0.291 -0.203 -0.134 -0.131 + 10.821 1.149 -0.801 -0.139 0.568 0.030 -1.113 -0.129 0.169 -0.220 -0.345 -0.169 -0.171 + 9.516 0.706 -0.717 0.306 0.645 -0.081 -0.886 0.062 0.180 -0.414 -0.479 0.025 -0.139 + 9.377 0.717 -0.519 0.439 0.581 -0.339 -0.996 0.228 0.030 -0.429 -0.330 0.114 -0.107 + 11.484 0.124 -0.551 0.400 0.438 -0.336 -0.820 0.312 -0.419 -0.549 -0.099 0.030 -0.127 + 13.238 0.289 -0.466 0.371 0.318 -0.475 -1.197 0.406 -0.499 -0.471 -0.103 0.036 -0.233 + 13.655 0.519 -0.687 0.273 0.007 -0.570 -1.165 0.430 -0.268 -0.246 -0.034 0.135 -0.251 + 13.112 1.001 -0.857 0.179 0.094 -0.521 -1.159 0.368 -0.116 -0.216 -0.157 0.170 -0.262 + 11.161 0.949 -0.727 0.248 -0.048 -0.567 -0.805 0.091 0.112 0.019 -0.361 0.168 -0.020 + 10.379 0.969 -0.548 0.200 0.012 -0.282 -0.352 -0.476 0.176 0.230 -0.761 0.092 0.057 + 10.408 1.000 -0.540 0.053 0.025 -0.197 -0.286 -0.586 0.149 0.310 -0.713 0.017 -0.047 + 10.444 1.105 -0.651 0.002 -0.069 -0.227 -0.079 -0.576 0.089 0.241 -0.510 0.083 -0.208 + 10.544 1.064 -0.610 0.062 -0.294 -0.196 0.019 -0.482 -0.106 0.196 -0.391 0.202 -0.239 + 11.325 0.856 -0.506 -0.210 -0.210 -0.209 0.006 -0.411 -0.114 0.142 -0.401 0.228 -0.265 + 11.540 1.165 -0.760 -0.278 -0.142 -0.193 -0.147 -0.272 -0.089 0.072 -0.390 0.250 -0.142 + 11.530 1.213 -0.746 -0.065 -0.280 -0.372 -0.076 -0.173 0.017 -0.159 -0.233 0.063 -0.116 + 11.563 0.640 -0.658 0.217 -0.453 -0.430 -0.007 -0.090 -0.083 0.068 -0.284 -0.026 0.001 + 11.413 0.708 -0.692 0.171 -0.354 -0.544 -0.113 -0.066 -0.001 0.048 -0.167 -0.060 0.011 + 10.867 1.390 -1.026 0.094 -0.480 -0.700 0.014 -0.107 0.160 0.038 -0.075 -0.172 -0.072 + 10.673 1.907 -1.299 -0.090 -0.453 -0.882 0.124 -0.048 0.071 0.095 -0.224 -0.059 -0.147 + 10.693 1.879 -1.327 -0.204 -0.513 -0.937 0.180 0.049 0.093 0.168 -0.302 -0.008 -0.184 + 10.776 1.665 -1.386 -0.096 -0.453 -0.810 0.246 0.031 0.075 0.054 -0.271 -0.046 -0.076 + 10.864 1.744 -1.515 0.046 -0.604 -0.690 0.198 0.094 0.046 -0.007 -0.318 -0.016 -0.069 + 10.732 1.663 -1.418 -0.074 -0.393 -0.716 0.120 0.165 -0.031 -0.089 -0.204 -0.060 -0.087 + 11.886 0.841 -0.854 -0.584 -0.528 -0.563 0.089 0.396 -0.395 -0.041 0.185 -0.208 0.049 + 12.149 0.725 -0.817 -0.698 -0.549 -0.408 -0.014 0.283 -0.363 0.080 0.196 -0.215 -0.115 + 11.383 0.828 -0.653 -0.917 -0.575 -0.274 -0.386 -0.021 -0.434 0.091 -0.004 -0.124 0.036 + 8.522 0.741 -0.460 -0.327 0.176 -0.338 -0.258 -0.053 -0.381 0.134 0.022 -0.039 0.053 + 8.744 -0.011 -0.393 -0.236 0.420 -0.462 -0.132 -0.109 -0.062 0.024 -0.092 -0.101 -0.123 + 9.912 -0.464 -0.634 -0.516 0.283 -0.524 -0.293 -0.116 -0.218 -0.003 -0.071 -0.000 0.035 + 8.868 -1.254 0.129 -0.416 0.090 -0.355 -0.227 -0.245 0.026 0.035 -0.067 -0.179 0.043 + 9.462 -1.898 0.415 -0.270 0.309 -0.263 -0.362 -0.129 -0.049 -0.097 -0.106 -0.135 -0.090 + 9.768 -1.761 0.445 -0.483 0.368 -0.299 -0.177 -0.048 -0.018 0.094 -0.038 0.034 -0.096 + 9.380 -1.865 0.201 -0.487 0.196 -0.312 0.040 0.108 0.069 -0.032 -0.266 -0.021 0.018 + 7.905 -1.453 0.282 -0.775 0.174 -0.584 -0.285 0.192 0.034 -0.061 -0.204 -0.030 -0.201 + 6.415 -0.508 0.283 -0.148 0.064 -0.476 0.021 0.029 -0.037 0.141 -0.052 -0.194 -0.169 + 5.941 0.093 -0.133 -0.125 0.079 -0.394 -0.058 -0.092 0.053 0.101 0.069 -0.075 -0.083 + 6.409 -0.117 -0.199 -0.145 0.370 -0.334 -0.180 -0.165 -0.113 0.095 -0.135 0.058 -0.012 + 9.487 -0.737 -0.313 -0.433 0.157 -0.416 -0.172 0.075 -0.315 -0.106 -0.285 0.067 -0.254 + 10.903 -0.998 0.044 -0.588 -0.076 -0.399 -0.378 -0.033 -0.311 -0.159 -0.205 0.043 -0.072 + 10.524 -0.886 0.107 -0.409 -0.295 -0.286 -0.498 -0.088 0.205 -0.094 -0.086 -0.032 0.192 + 11.672 0.727 -0.455 0.064 -0.214 -0.204 -0.546 -0.240 -0.079 -0.094 -0.184 -0.194 0.101 + 11.099 1.375 -1.006 0.366 -0.157 -0.421 -0.348 -0.466 -0.070 -0.013 -0.273 -0.007 -0.029 + 10.262 1.194 -0.875 0.303 -0.043 -0.421 -0.205 -0.458 -0.129 0.008 -0.120 -0.076 -0.147 + 8.928 0.722 -0.304 0.535 0.160 -0.325 -0.030 -0.332 -0.227 -0.043 -0.164 -0.092 -0.350 + 8.947 0.692 -0.324 0.615 0.205 -0.340 -0.184 -0.356 -0.248 0.074 -0.132 0.017 -0.413 + 8.951 0.806 -0.440 0.582 0.247 -0.361 -0.210 -0.389 -0.212 -0.053 -0.029 -0.115 -0.341 + 8.917 0.916 -0.486 0.474 0.266 -0.376 -0.185 -0.285 -0.253 -0.138 0.038 -0.222 -0.353 + 10.708 0.950 -0.818 0.034 0.420 -0.464 -0.556 -0.228 -0.132 0.026 -0.029 -0.312 0.005 + 11.577 0.955 -1.090 0.446 0.059 -0.647 -0.722 -0.060 -0.033 -0.028 -0.213 -0.024 0.119 + 11.978 0.680 -0.816 0.411 -0.080 -0.878 -0.633 0.053 -0.113 -0.055 -0.144 0.140 0.030 + 12.275 0.443 -0.557 0.410 -0.196 -0.958 -0.523 0.095 -0.261 -0.042 -0.074 0.151 -0.100 + 12.255 0.507 -0.459 0.388 -0.257 -0.934 -0.396 -0.018 -0.337 -0.044 -0.082 0.134 -0.180 + 11.880 0.144 0.030 0.553 -0.374 -0.770 -0.376 -0.037 -0.400 -0.148 -0.161 0.149 -0.215 + 10.478 -0.052 0.372 0.620 -0.495 -0.750 -0.424 -0.117 -0.403 -0.185 -0.050 0.122 -0.208 + 9.842 0.046 0.036 0.550 -0.258 -0.491 -0.243 -0.396 -0.322 -0.183 -0.124 -0.069 -0.000 + 7.444 -0.152 -0.278 0.219 -0.075 -0.467 -0.059 -0.231 -0.150 -0.044 -0.119 -0.064 -0.009 + 5.427 -0.206 0.224 0.064 0.039 -0.537 -0.527 -0.095 -0.077 0.042 -0.069 -0.059 -0.215 + 6.715 -0.571 -0.024 0.078 0.034 -0.534 -0.217 -0.125 -0.122 0.135 -0.098 0.091 0.007 + 10.340 -1.069 -0.542 0.266 -0.061 -0.424 -0.164 -0.305 -0.194 0.004 -0.166 0.034 -0.030 + 10.835 -0.759 -0.302 0.157 -0.142 -0.370 -0.346 -0.471 -0.257 -0.038 -0.260 0.109 -0.021 + 10.564 0.185 0.242 0.762 -0.319 -0.716 -0.523 -0.089 -0.504 -0.098 -0.198 -0.041 -0.166 + 11.981 0.613 0.174 0.174 -0.381 -0.500 -0.930 0.226 -0.678 0.013 -0.271 0.128 -0.149 + 12.077 1.051 -0.518 0.011 -0.034 -0.801 -0.900 0.248 -0.510 0.002 -0.240 0.189 -0.063 + 11.512 1.111 -0.555 0.016 -0.048 -0.896 -0.804 0.102 -0.305 -0.017 -0.256 0.256 -0.081 + 10.531 0.992 -0.221 -0.218 -0.039 -0.706 -0.864 -0.121 -0.304 0.108 -0.472 0.189 0.129 + 7.576 0.754 0.235 0.167 0.097 -0.359 -0.278 -0.157 -0.228 -0.077 -0.214 -0.123 -0.024 + 7.424 0.040 0.310 0.280 -0.088 -0.323 -0.337 0.135 -0.331 -0.126 -0.011 -0.097 -0.026 + 9.986 -0.365 -0.762 0.053 -0.199 -0.630 -0.333 0.314 -0.375 -0.212 0.045 0.045 -0.067 + 11.187 -0.142 -0.561 0.147 0.002 -0.598 -0.449 0.295 -0.309 -0.194 -0.182 0.020 -0.143 + 10.974 0.361 -0.791 -0.113 0.363 0.026 -0.404 0.311 -0.113 -0.124 -0.245 -0.080 -0.041 + 11.762 -0.513 -0.770 -0.397 0.174 0.260 0.037 0.114 -0.046 -0.167 -0.125 -0.104 -0.035 + 11.097 -0.354 -0.658 -0.473 0.103 0.125 0.065 0.117 -0.404 -0.185 0.078 -0.224 0.135 + 11.221 0.634 -0.281 -0.074 0.115 0.081 0.056 0.090 -0.455 -0.281 -0.307 -0.258 -0.016 + 11.692 0.009 -0.463 0.064 0.093 0.356 -0.169 0.212 -0.458 -0.044 0.073 -0.548 0.033 + 11.745 -0.567 -0.873 -0.160 -0.384 0.272 -0.182 0.271 -0.435 -0.054 0.327 -0.511 0.131 + 11.159 -0.296 -0.606 -0.118 -0.274 0.323 -0.126 0.286 -0.519 -0.012 0.084 -0.518 -0.150 + 10.778 0.634 -0.396 -0.439 -0.207 0.259 -0.065 0.337 -0.621 -0.110 -0.260 -0.423 -0.261 + 10.596 1.494 -0.335 -0.409 -0.374 -0.071 -0.107 0.132 -0.482 0.105 -0.120 -0.271 -0.219 + 11.034 2.174 -0.659 -1.087 -0.638 -0.057 -0.234 0.156 -0.414 -0.099 -0.034 -0.090 -0.085 + 11.418 2.356 -1.198 -1.047 -0.286 -0.237 -0.659 0.569 -0.567 -0.204 0.212 -0.085 -0.276 + 11.480 2.235 -1.281 -1.030 -0.276 -0.200 -0.662 0.468 -0.582 -0.132 0.280 -0.074 -0.230 + 11.667 2.061 -1.211 -1.122 -0.275 -0.136 -0.739 0.355 -0.455 -0.111 0.234 -0.029 -0.175 + 11.953 2.037 -1.319 -1.079 -0.160 -0.094 -0.860 0.269 -0.364 -0.104 0.210 -0.140 -0.034 + 11.786 2.209 -1.400 -1.168 0.030 -0.084 -0.929 0.183 -0.313 0.036 0.016 -0.127 0.102 + 11.305 2.177 -1.317 -1.197 0.009 -0.003 -0.955 0.078 -0.315 0.117 -0.021 -0.017 -0.004 + 11.383 1.798 -1.132 -1.278 0.059 -0.032 -1.008 -0.038 -0.169 0.122 0.006 -0.042 -0.018 + 11.559 1.854 -1.152 -1.195 -0.001 0.071 -1.157 -0.097 -0.115 0.141 -0.049 -0.086 0.104 + 11.706 1.805 -1.226 -1.125 -0.002 0.084 -1.115 -0.182 -0.084 0.106 -0.004 -0.149 0.091 + 11.358 1.810 -1.285 -1.025 0.042 -0.018 -1.127 -0.129 -0.118 0.173 -0.035 -0.149 0.096 + 11.073 1.855 -1.398 -0.945 0.128 -0.081 -1.179 -0.202 -0.019 0.162 -0.017 -0.144 0.117 + 11.552 1.654 -1.436 -0.780 0.223 -0.176 -1.146 -0.310 0.048 0.107 -0.113 -0.110 0.090 + 11.667 1.498 -1.304 -0.699 0.185 -0.184 -1.254 -0.205 0.042 0.068 -0.146 -0.153 0.138 + 11.261 1.414 -1.263 -0.590 0.183 -0.199 -1.373 -0.066 0.115 -0.113 -0.057 -0.088 0.043 + 11.171 1.319 -1.261 -0.488 0.250 -0.256 -1.428 -0.081 0.075 -0.130 -0.099 -0.031 0.059 + 11.435 1.392 -1.265 -0.394 0.245 -0.244 -1.428 -0.057 0.052 -0.272 -0.058 -0.121 0.151 + 11.589 1.188 -1.228 -0.169 0.108 -0.085 -1.484 0.036 0.045 -0.387 -0.059 -0.121 0.093 + 11.321 0.956 -1.184 0.056 0.187 -0.258 -1.328 -0.006 0.096 -0.474 -0.112 -0.022 0.059 + 11.136 0.892 -1.138 0.091 0.253 -0.378 -1.318 -0.015 0.067 -0.588 -0.057 -0.029 -0.012 + 10.985 0.767 -0.948 0.216 0.254 -0.283 -1.226 0.123 -0.066 -0.554 -0.196 0.001 -0.144 + 8.340 0.464 -0.945 0.279 0.621 -0.313 -0.865 0.397 -0.176 -0.372 -0.167 0.169 -0.198 + 8.966 -0.525 -0.700 0.377 0.292 -0.248 -0.246 0.193 -0.181 -0.198 -0.201 -0.081 -0.148 + 7.974 -0.180 -0.299 0.080 0.577 -0.356 -0.222 0.197 -0.128 -0.313 -0.085 -0.007 0.024 + 7.469 -0.056 0.057 -0.145 0.490 -0.180 -0.510 0.190 -0.108 -0.245 0.047 0.012 0.050 + 9.728 -0.469 -0.518 0.089 -0.036 -0.214 -0.225 -0.018 -0.161 -0.120 -0.132 -0.054 -0.102 + 11.803 -0.559 -0.555 -0.366 -0.310 -0.479 -0.111 -0.046 -0.137 -0.266 -0.248 -0.055 -0.113 + 11.107 -0.476 -0.256 -0.032 -0.257 -0.645 -0.199 -0.138 0.088 -0.387 -0.130 -0.126 -0.059 + 11.157 -0.476 -0.724 0.058 0.162 -0.318 0.055 0.114 0.153 -0.615 -0.163 -0.122 -0.115 + 10.850 -0.157 -1.251 0.183 0.104 -0.564 -0.013 0.154 0.040 -0.383 -0.109 -0.046 -0.043 + 10.947 -0.060 -1.224 0.236 -0.029 -0.323 -0.070 0.119 -0.035 -0.157 -0.071 0.001 0.015 + 11.050 -0.011 -1.092 0.047 0.035 -0.329 -0.219 0.322 0.124 -0.207 0.076 0.136 -0.255 + 10.715 -0.353 -0.894 -0.054 -0.089 -0.234 -0.313 0.018 0.126 -0.311 -0.229 0.311 -0.237 + 10.116 -0.382 -0.706 0.188 0.187 -0.192 -0.282 0.099 0.144 -0.336 -0.397 -0.021 -0.182 + 9.756 0.046 -0.414 0.228 0.421 0.038 -0.260 0.257 0.128 -0.338 -0.461 -0.272 -0.315 + 9.668 -0.328 -0.820 -0.034 0.176 -0.103 -0.348 0.208 -0.156 -0.197 -0.189 0.024 -0.150 + 9.804 -0.395 -0.835 -0.083 0.307 -0.001 -0.285 0.123 0.105 -0.258 -0.243 -0.057 -0.227 + 9.199 -0.289 -0.496 -0.101 0.510 -0.260 -0.356 0.178 -0.000 -0.161 -0.259 0.163 -0.000 + 8.766 -0.153 -0.395 -0.175 0.244 -0.273 -0.328 0.225 -0.062 -0.183 -0.109 0.252 -0.002 + 8.622 -0.020 -0.574 -0.122 0.524 -0.177 -0.143 0.357 0.095 -0.292 -0.481 0.044 -0.046 + 9.123 0.182 -0.404 -0.077 0.418 -0.484 -0.373 0.030 0.099 -0.174 -0.525 0.032 -0.051 + 9.001 0.450 -0.043 -0.010 0.065 -0.485 -0.491 -0.079 0.159 -0.073 -0.501 0.224 -0.205 + 5.838 0.567 -0.028 -0.009 -0.001 -0.307 -0.427 -0.206 0.162 0.011 -0.322 0.233 -0.239 + 5.830 0.953 -0.116 -0.099 -0.010 -0.169 -0.231 0.107 -0.114 -0.123 -0.226 -0.022 -0.066 + 5.734 0.631 -0.071 -0.390 -0.093 -0.064 -0.246 -0.037 0.032 0.023 -0.157 0.050 0.132 + 5.140 0.232 -0.322 -0.266 0.063 0.107 -0.053 0.012 -0.075 0.056 -0.106 -0.203 -0.011 + 5.295 0.297 -0.468 -0.205 0.113 -0.122 -0.238 -0.064 0.007 0.034 -0.020 -0.079 -0.013 + 5.224 0.237 -0.452 -0.189 0.164 0.043 -0.364 -0.098 -0.087 0.010 0.010 0.028 -0.062 + 8.769 0.424 -1.182 -0.153 -0.126 -0.420 -0.231 -0.244 0.066 -0.082 -0.105 -0.110 0.006 + 11.577 0.179 -1.003 -0.044 -0.360 -0.495 -0.244 -0.284 0.353 -0.089 -0.107 -0.065 0.010 + 12.215 -0.226 -0.726 -0.314 0.052 -0.292 -0.110 -0.167 0.287 -0.169 -0.270 0.068 -0.078 + 13.066 -0.405 -0.243 -0.113 0.107 -0.281 -0.128 -0.022 -0.202 -0.364 -0.304 -0.080 -0.106 + 13.753 -0.071 -0.167 -0.109 0.189 -0.503 -0.191 0.075 -0.205 -0.252 -0.279 -0.152 -0.317 + 12.760 -0.299 -0.219 -0.030 0.376 -0.197 -0.040 -0.103 -0.290 -0.016 -0.254 0.069 -0.215 + 12.041 -0.708 -0.755 0.048 0.478 0.054 -0.011 -0.243 -0.261 0.044 -0.098 0.077 -0.198 + 11.872 -0.792 -1.190 -0.100 0.486 -0.093 -0.133 -0.085 -0.099 0.227 -0.029 0.017 -0.136 + 11.576 -1.030 -1.288 -0.252 0.062 -0.490 -0.346 -0.091 0.247 0.294 0.100 0.027 -0.160 + 11.508 -1.073 -1.118 -0.170 0.150 -0.533 -0.392 0.005 0.433 0.081 0.135 0.060 -0.188 + 11.168 -1.292 -1.087 -0.181 0.166 -0.459 -0.406 -0.120 0.422 0.148 0.125 0.219 -0.067 + 10.782 -1.044 -0.754 -0.169 0.213 -0.336 -0.487 -0.294 0.331 0.137 -0.050 0.038 -0.192 + 10.799 -0.881 -0.533 -0.066 0.296 -0.397 -0.380 -0.255 0.264 0.195 0.023 -0.097 -0.157 + 10.772 -0.945 -0.663 -0.191 0.178 -0.302 -0.354 -0.161 0.206 0.301 0.137 -0.202 -0.084 + 10.693 -1.191 -0.761 -0.229 0.115 -0.621 -0.299 -0.119 0.246 0.241 0.114 -0.035 -0.196 + 10.496 -1.051 -0.686 -0.057 0.176 -0.462 -0.153 -0.095 0.141 0.172 0.270 -0.118 -0.068 + 10.366 -1.250 -0.860 -0.401 0.258 -0.556 -0.210 0.010 0.148 0.203 0.215 -0.023 0.026 + 10.306 -1.056 -0.725 -0.281 0.279 -0.541 -0.237 -0.018 0.113 0.247 0.174 -0.026 -0.066 + 10.199 -1.111 -0.739 -0.380 0.112 -0.422 -0.176 -0.016 -0.003 0.335 0.252 -0.134 -0.040 + 10.367 -1.088 -0.654 -0.235 0.195 -0.627 -0.398 -0.282 -0.132 0.129 0.294 -0.105 -0.166 + 10.551 -1.028 -0.902 -0.108 0.326 -0.670 -0.418 -0.042 -0.095 -0.038 0.232 0.037 -0.368 + 10.385 -1.049 -0.885 -0.110 0.364 -0.765 -0.541 -0.068 0.011 0.005 -0.002 0.008 -0.209 + 10.231 -0.788 -0.842 -0.147 0.326 -0.543 -0.383 -0.076 0.127 -0.054 -0.121 -0.008 -0.152 + 10.444 -0.663 -0.934 -0.065 0.266 -0.681 -0.229 0.054 0.122 -0.147 -0.216 -0.142 -0.064 + 10.079 -0.835 -0.809 -0.181 -0.105 -0.569 -0.194 -0.149 0.027 -0.105 0.002 -0.054 -0.078 + 10.036 -0.758 -0.695 -0.186 0.141 -0.427 -0.214 -0.199 0.114 0.053 -0.254 -0.152 -0.204 + 9.957 -0.614 -0.593 -0.123 -0.040 -0.458 -0.273 -0.101 -0.126 -0.219 -0.221 -0.119 -0.153 + 9.999 -0.559 -0.579 -0.004 0.125 -0.630 -0.295 -0.192 -0.127 -0.269 -0.173 -0.052 -0.115 + 9.856 -0.390 -0.606 0.009 0.090 -0.539 -0.460 -0.191 -0.102 -0.249 -0.215 -0.008 -0.080 + 9.738 -0.320 -0.703 -0.040 0.068 -0.480 -0.376 -0.291 -0.082 -0.242 -0.254 -0.064 -0.076 + 9.687 -0.336 -0.602 0.001 0.160 -0.541 -0.154 -0.228 -0.178 -0.134 -0.115 0.029 -0.178 + 9.613 -0.231 -0.506 -0.027 0.127 -0.578 -0.185 -0.210 -0.075 -0.174 -0.210 -0.008 -0.148 + 9.501 -0.233 -0.515 -0.159 0.160 -0.607 -0.181 -0.187 -0.085 -0.310 -0.072 -0.043 -0.050 + 9.464 -0.206 -0.597 -0.160 0.126 -0.649 -0.160 -0.313 -0.079 -0.196 -0.067 -0.061 -0.069 + 9.340 -0.136 -0.564 -0.134 0.108 -0.658 -0.301 -0.173 -0.036 -0.046 -0.011 -0.035 -0.085 + 8.889 -0.318 -0.635 -0.202 -0.075 -0.552 -0.357 -0.069 0.025 -0.166 -0.154 0.137 -0.066 + 8.896 -0.259 -0.389 -0.126 0.111 -0.649 -0.285 -0.054 0.177 -0.289 -0.116 0.053 -0.074 + 9.255 0.076 -0.156 -0.138 0.089 -0.424 -0.133 -0.105 0.012 -0.226 -0.182 0.083 -0.155 + 9.673 0.505 -0.090 -0.057 0.212 -0.363 -0.180 -0.007 0.014 -0.322 -0.322 0.098 -0.093 + 8.759 -0.134 -0.616 -0.353 -0.006 -0.445 -0.134 0.030 0.210 -0.254 -0.083 0.059 -0.110 + 8.247 -0.428 -0.653 -0.329 -0.228 -0.555 -0.324 -0.120 0.157 -0.081 -0.052 0.031 -0.075 + 7.799 -0.221 -0.571 -0.386 -0.054 -0.601 -0.221 0.006 0.212 -0.069 -0.108 0.109 -0.163 + 7.771 -0.493 -0.647 -0.483 -0.021 -0.475 -0.208 0.057 0.226 0.130 -0.022 0.003 -0.067 + 7.957 -0.350 -0.539 -0.516 -0.425 -0.461 -0.169 0.080 0.339 0.133 0.016 -0.034 -0.059 + 8.033 -0.150 -0.460 -0.514 -0.417 -0.643 -0.256 0.030 0.405 0.081 0.036 0.074 -0.117 + 7.712 -0.228 -0.533 -0.357 -0.216 -0.722 -0.388 -0.043 0.344 0.075 0.170 0.082 -0.134 + 7.769 -0.040 -0.566 -0.500 -0.188 -0.624 -0.353 0.116 0.371 0.081 0.070 0.087 -0.112 + 8.123 0.321 -0.351 -0.214 -0.032 -0.348 -0.335 0.082 0.386 0.020 0.015 0.089 -0.224 + 7.958 0.266 -0.339 -0.074 -0.035 -0.363 -0.388 -0.013 0.360 0.048 0.053 0.155 -0.112 + 7.702 -0.054 -0.731 -0.526 -0.202 -0.217 -0.228 0.093 0.301 -0.074 -0.052 -0.049 -0.051 + 7.481 -0.111 -0.739 -0.435 -0.326 -0.201 -0.159 0.100 0.439 -0.006 -0.147 -0.067 -0.107 + 7.576 -0.126 -0.517 -0.176 -0.252 -0.334 -0.345 0.095 0.265 -0.077 -0.177 -0.183 -0.085 + 7.386 -0.387 -0.643 -0.262 -0.145 -0.319 -0.258 0.104 0.133 -0.017 -0.296 -0.283 -0.092 + 7.446 -0.098 -0.396 -0.160 0.080 -0.138 -0.129 0.128 0.125 -0.046 -0.299 -0.283 -0.273 + 8.507 0.423 0.286 0.342 0.138 -0.153 -0.253 -0.135 -0.107 -0.105 -0.165 -0.139 -0.088 + 8.362 0.177 0.261 0.078 0.103 -0.162 -0.238 -0.055 0.048 -0.023 -0.147 -0.160 -0.123 + 8.718 -0.297 -0.371 -0.164 0.001 -0.087 -0.392 -0.118 -0.032 -0.052 -0.072 0.044 -0.155 + 8.806 -0.349 -0.329 -0.272 -0.219 -0.261 -0.233 -0.224 -0.045 -0.049 -0.115 0.006 -0.031 + 9.444 -0.419 0.001 -0.211 -0.125 -0.128 -0.165 -0.177 -0.147 -0.124 -0.115 -0.035 -0.095 + 10.074 -0.287 -0.023 -0.167 -0.180 -0.048 -0.375 -0.332 -0.167 -0.203 -0.183 -0.135 -0.195 + 10.114 -0.377 -0.249 -0.248 -0.164 -0.182 -0.298 -0.276 -0.042 -0.183 -0.218 -0.102 -0.102 + 9.716 -0.363 -0.129 -0.274 -0.247 -0.062 -0.247 -0.229 0.164 0.051 -0.282 -0.163 -0.100 + 9.498 -0.394 -0.274 -0.462 -0.068 -0.020 -0.208 -0.247 0.108 -0.065 -0.263 -0.120 -0.220 + 9.643 -0.446 -0.331 -0.421 0.043 -0.295 -0.366 -0.082 -0.035 -0.203 -0.237 0.034 -0.133 + 9.931 -0.544 -0.491 -0.180 -0.034 0.041 -0.167 -0.254 0.028 -0.225 -0.232 -0.088 -0.030 + 10.165 -0.559 -0.461 -0.510 -0.283 -0.148 -0.239 -0.228 -0.056 -0.316 -0.317 -0.162 -0.088 + 9.637 -0.907 -0.566 -0.610 -0.257 -0.178 -0.144 -0.046 0.153 -0.090 -0.175 0.012 -0.133 + 9.370 -0.478 -0.394 -0.371 -0.148 -0.275 -0.304 -0.179 0.145 -0.179 -0.273 -0.019 -0.077 + 9.232 -0.600 -0.174 -0.367 -0.130 -0.293 -0.325 -0.247 0.206 0.066 -0.148 -0.005 -0.022 + 9.191 -0.387 0.175 -0.351 -0.392 -0.543 -0.105 -0.136 0.122 0.031 -0.209 -0.185 -0.035 + 9.266 -0.052 0.163 -0.322 -0.091 -0.200 -0.220 -0.272 0.197 0.029 -0.099 -0.170 -0.239 + 8.497 -0.496 -0.011 -0.544 -0.269 -0.446 -0.368 -0.200 0.379 0.106 -0.183 0.003 -0.156 + 8.401 -0.519 -0.252 -0.514 -0.238 -0.574 -0.428 -0.224 0.344 0.029 -0.227 -0.011 -0.185 + 8.574 -0.437 -0.220 -0.437 -0.219 -0.432 -0.311 -0.230 0.301 -0.023 -0.202 -0.024 -0.199 + 8.777 -0.669 -0.369 -0.336 -0.368 -0.344 -0.316 0.037 0.348 -0.015 -0.225 -0.000 -0.146 + 8.507 -0.460 -0.271 -0.215 -0.383 -0.037 0.026 0.117 0.484 0.043 -0.244 -0.052 -0.205 + 8.374 -0.252 -0.384 -0.083 -0.388 -0.277 -0.022 0.056 0.393 0.028 -0.308 -0.065 -0.139 + 8.351 -0.470 -0.357 0.094 -0.558 -0.585 -0.062 0.208 0.260 -0.017 -0.145 -0.029 -0.090 + 7.547 -0.322 -0.120 -0.068 -0.574 -0.270 -0.167 0.124 0.312 0.145 -0.037 -0.031 -0.198 + 11.486 0.663 -0.453 0.069 -0.093 -0.297 -0.307 0.121 -0.179 -0.063 -0.343 -0.078 -0.288 + 12.931 0.653 -0.381 0.021 -0.167 -0.377 -0.388 0.204 -0.217 0.018 -0.311 0.115 -0.280 + 12.307 0.431 -0.435 0.007 -0.159 -0.530 -0.511 0.155 -0.168 0.109 -0.200 0.287 -0.162 + 8.791 0.430 0.041 -0.203 0.018 -0.476 -0.631 0.223 0.013 0.120 -0.223 0.033 -0.145 + 7.722 -0.027 -0.236 -0.140 -0.238 -0.589 -0.348 0.067 0.258 0.160 -0.243 0.034 -0.142 + 7.743 -0.180 -0.419 -0.370 -0.157 -0.603 -0.417 -0.053 0.254 0.093 -0.269 0.099 -0.074 + 8.042 -0.170 -0.328 -0.317 -0.148 -0.487 -0.265 0.024 0.243 -0.087 -0.155 0.105 0.080 + 8.176 -0.296 -0.306 -0.426 -0.124 -0.660 -0.145 0.144 0.286 -0.287 -0.264 0.214 0.132 + 8.267 -0.380 -0.236 -0.471 -0.165 -0.571 -0.190 0.226 0.068 -0.254 -0.153 0.124 0.063 + 8.311 -0.503 -0.238 -0.584 -0.066 -0.474 -0.261 0.130 0.176 -0.272 -0.341 0.048 0.060 + 7.847 -0.684 -0.339 -0.467 -0.117 -0.646 -0.187 0.107 0.359 -0.265 -0.536 0.039 0.121 + 7.864 -0.655 -0.411 -0.369 -0.050 -0.266 -0.151 0.202 0.236 -0.398 -0.396 -0.130 0.044 + 7.983 -0.555 -0.464 -0.250 0.072 -0.553 -0.043 0.168 0.320 -0.281 -0.435 -0.294 0.056 + 8.107 -0.638 -0.443 -0.346 0.099 -0.391 -0.058 0.207 0.300 -0.251 -0.324 -0.205 0.077 + 8.101 -0.450 -0.242 -0.277 -0.019 -0.439 -0.076 0.191 0.272 -0.183 -0.434 -0.277 -0.090 + 7.636 -0.507 -0.388 -0.381 0.069 -0.413 -0.113 0.087 0.221 -0.364 -0.463 -0.382 -0.154 + 7.344 -0.580 -0.454 -0.450 0.064 -0.509 -0.103 0.006 0.378 -0.200 -0.326 -0.371 -0.134 + 7.516 -0.492 -0.329 -0.386 0.087 -0.488 -0.239 -0.055 0.536 -0.030 -0.280 -0.285 -0.174 + 7.425 -0.466 -0.341 -0.357 0.068 -0.601 -0.170 0.113 0.513 -0.181 -0.424 -0.370 -0.192 + 7.804 -0.168 -0.214 -0.575 0.160 -0.659 -0.326 -0.049 0.531 -0.020 -0.353 -0.255 -0.034 + 7.595 -0.222 -0.215 -0.467 0.102 -0.596 -0.283 0.055 0.542 0.114 -0.425 -0.262 0.083 + 7.556 -0.078 -0.332 -0.504 0.149 -0.408 -0.419 0.087 0.446 0.092 -0.175 -0.205 -0.039 + 6.960 -0.459 -0.477 -0.617 0.125 -0.338 -0.404 0.025 0.501 0.017 -0.022 -0.216 -0.197 + 7.017 -0.223 -0.228 -0.411 0.267 -0.511 -0.435 -0.119 0.285 -0.100 -0.070 -0.176 -0.193 + 6.887 -0.244 -0.068 -0.320 0.376 -0.344 -0.219 0.035 0.331 -0.312 -0.079 -0.191 -0.208 + 7.164 0.086 0.163 -0.269 0.280 -0.479 -0.281 -0.209 0.268 -0.072 0.011 -0.034 -0.033 + 7.485 0.077 0.205 -0.099 0.156 -0.319 -0.133 -0.245 -0.101 -0.305 -0.135 0.001 0.052 + 7.447 -0.014 0.136 -0.042 -0.001 -0.140 -0.373 -0.373 -0.073 -0.306 -0.039 0.107 0.058 + 7.276 0.086 -0.234 -0.064 0.115 0.029 -0.242 -0.446 -0.082 -0.294 -0.059 -0.076 0.008 + 6.683 0.304 -0.068 -0.257 0.148 -0.072 -0.274 -0.127 -0.246 -0.357 -0.006 0.024 0.037 + 5.965 0.430 0.196 -0.177 0.250 -0.407 -0.383 0.036 -0.053 -0.222 -0.026 0.175 0.115 + 5.738 0.412 0.285 -0.248 0.270 -0.250 -0.244 0.149 0.126 -0.087 -0.293 -0.032 -0.043 + 5.654 0.222 -0.017 -0.122 0.020 -0.092 -0.246 -0.149 0.117 0.047 -0.161 0.082 0.201 + 5.874 0.482 -0.045 0.024 0.039 -0.046 -0.454 -0.178 -0.055 -0.118 -0.126 -0.074 -0.045 + 6.111 0.408 0.177 0.048 0.002 -0.122 -0.264 -0.136 0.015 -0.082 -0.041 0.004 0.019 + 5.843 0.575 0.001 0.002 0.062 -0.015 -0.313 -0.140 -0.033 0.022 -0.201 -0.010 0.015 + 5.656 0.631 0.032 -0.018 -0.123 -0.036 -0.325 -0.096 0.081 -0.062 -0.114 0.019 0.021 + 6.155 0.564 0.333 0.214 0.173 0.207 -0.360 -0.223 -0.257 -0.107 -0.125 -0.111 -0.054 + 5.921 0.710 0.037 -0.107 0.008 0.159 -0.321 -0.201 -0.396 -0.097 -0.021 -0.015 -0.030 + 5.563 0.395 0.015 -0.142 -0.106 0.037 -0.437 -0.142 -0.370 -0.078 -0.140 0.062 0.114 + 3.960 0.309 -0.143 -0.054 0.046 -0.114 -0.280 -0.056 -0.048 0.199 0.031 -0.141 -0.025 + 3.786 0.279 -0.381 0.121 -0.011 -0.224 -0.258 -0.093 -0.198 -0.078 -0.046 0.085 -0.048 + 3.854 0.525 -0.553 0.098 0.011 -0.460 -0.318 -0.197 -0.190 0.016 -0.108 -0.063 0.245 + 3.585 0.292 -0.488 0.150 -0.070 -0.278 0.112 -0.153 -0.213 0.258 0.157 -0.142 0.060 + 4.558 -0.122 -0.311 0.284 -0.297 -0.074 -0.020 -0.290 -0.020 0.077 0.060 0.171 -0.068 + 5.186 -0.468 0.002 0.363 -0.546 -0.139 -0.267 -0.100 0.123 0.117 -0.005 0.251 -0.057 + 5.151 -0.645 0.213 0.448 -0.504 -0.165 -0.250 -0.021 0.139 0.062 0.020 0.068 -0.161 + 5.041 -0.671 0.278 0.398 -0.285 -0.065 -0.043 -0.268 0.136 0.208 0.064 0.033 -0.042 + 5.252 -0.781 0.082 0.316 -0.399 -0.286 0.015 -0.226 0.026 0.107 0.007 0.075 0.066 + 5.989 -0.708 -0.184 0.284 -0.381 -0.246 0.249 0.042 -0.134 -0.138 -0.011 0.069 -0.082 + 6.169 -0.583 -0.235 0.133 -0.396 -0.226 0.274 0.131 -0.073 -0.265 -0.122 -0.006 -0.062 + 6.168 -0.368 -0.538 0.294 -0.298 -0.110 0.084 0.168 0.107 -0.146 -0.205 0.096 0.073 + 6.802 -0.208 -0.875 0.175 -0.334 -0.237 -0.161 0.153 0.175 -0.103 -0.118 0.059 -0.167 + 6.897 -0.085 -1.284 0.116 -0.269 0.008 -0.143 0.170 0.261 -0.198 -0.061 0.179 -0.127 + 7.053 -0.113 -1.478 -0.030 -0.173 0.119 -0.350 0.023 0.129 -0.093 -0.034 0.348 0.033 + 7.467 -0.084 -1.511 0.152 -0.244 0.187 -0.470 -0.124 0.340 -0.056 -0.130 0.253 -0.064 + 7.680 -0.089 -1.521 0.143 -0.306 0.365 -0.567 -0.210 0.290 -0.160 -0.165 0.287 0.022 + 7.953 -0.083 -1.507 -0.045 -0.249 0.404 -0.481 -0.205 0.362 -0.165 -0.077 0.256 -0.013 + 8.297 -0.244 -1.254 -0.342 -0.263 0.383 -0.477 -0.255 0.234 -0.219 -0.116 0.125 -0.044 + 8.428 -0.440 -1.202 -0.510 -0.274 0.407 -0.401 -0.142 0.355 -0.121 -0.005 0.110 0.039 + 8.317 -0.460 -1.024 -0.503 -0.312 0.553 -0.462 -0.155 0.249 -0.177 0.115 0.049 0.004 + 7.975 -0.467 -0.834 -0.482 -0.456 0.623 -0.379 -0.184 0.177 -0.172 0.187 0.095 -0.141 + 7.720 -0.421 -0.691 -0.463 -0.412 0.534 -0.304 -0.146 0.207 -0.131 0.094 0.079 -0.118 + 7.333 -0.171 -0.334 -0.300 -0.409 0.348 -0.258 -0.199 0.152 -0.049 -0.072 0.095 -0.091 + 7.162 -0.022 -0.635 -0.013 -0.358 -0.115 -0.066 0.084 0.023 0.001 -0.059 0.008 -0.013 + 7.150 0.315 -0.584 0.062 -0.215 -0.256 -0.226 -0.064 0.069 0.002 -0.133 -0.100 0.005 + 6.861 0.602 -0.555 0.054 -0.234 -0.202 -0.320 -0.029 -0.004 0.054 -0.147 -0.082 -0.038 + 6.176 0.581 -0.572 0.091 -0.213 -0.064 0.051 0.082 0.047 -0.069 -0.160 -0.074 -0.169 + 7.322 1.445 -0.133 0.181 -0.212 -0.120 -0.296 -0.068 -0.059 -0.038 -0.054 -0.111 -0.129 + 7.222 1.235 0.008 0.174 -0.048 -0.166 -0.386 0.023 -0.045 0.071 -0.051 -0.090 -0.065 + 6.226 0.170 -0.649 0.691 0.308 -0.027 -0.199 0.119 -0.110 -0.086 -0.282 -0.128 -0.112 + 6.276 0.213 -0.746 0.726 0.030 -0.276 -0.214 -0.070 -0.135 -0.154 -0.125 0.113 -0.104 + 6.538 0.260 -0.646 0.740 -0.085 -0.469 -0.426 0.033 -0.105 -0.052 -0.039 0.248 -0.034 + 6.853 0.521 -0.674 0.692 -0.112 -0.586 -0.483 0.144 -0.053 -0.204 0.041 0.354 0.099 + 6.619 0.153 -0.959 0.673 0.091 -0.778 -0.786 0.168 -0.026 -0.236 0.134 0.264 0.161 + 6.733 0.404 -0.848 0.487 0.044 -0.657 -0.789 0.218 -0.027 -0.091 -0.031 0.108 0.156 + 6.643 0.542 -0.636 0.072 -0.113 -0.623 -0.898 0.144 0.049 -0.140 -0.016 0.156 0.229 + 6.245 0.618 -0.740 0.053 -0.304 -0.636 -0.763 0.020 -0.186 -0.332 -0.077 0.054 0.054 + 6.232 0.608 -0.673 0.177 -0.234 -0.474 -0.659 0.141 -0.223 -0.225 0.028 0.099 0.258 + 6.811 0.110 -0.348 0.494 0.094 -0.597 -0.579 -0.093 -0.211 -0.274 -0.037 0.048 0.004 + 7.379 -0.129 -0.242 0.567 0.243 -0.459 -0.551 -0.062 -0.194 -0.434 -0.071 0.055 -0.004 + 7.454 0.055 -0.261 0.568 0.041 -0.581 -0.496 -0.210 -0.090 -0.290 -0.168 0.065 0.100 + 7.322 -0.067 -0.383 0.565 -0.186 -0.530 -0.320 -0.225 -0.096 -0.134 -0.030 0.051 -0.012 + 6.939 -0.097 -0.444 0.606 -0.224 -0.661 -0.420 -0.291 -0.205 0.034 0.093 0.014 0.078 + 6.633 -0.188 -0.117 0.565 -0.514 -0.572 -0.181 -0.182 0.040 0.021 -0.002 0.031 0.005 + 6.760 -0.184 -0.065 0.507 -0.474 -0.495 -0.199 -0.288 -0.003 -0.203 0.134 0.162 -0.218 + 6.858 -0.476 -0.023 0.375 -0.606 -0.552 -0.181 0.002 -0.046 -0.175 0.071 0.228 -0.294 + 6.967 -0.288 0.149 0.186 -0.309 -0.713 -0.493 -0.097 -0.077 -0.062 -0.100 0.247 -0.183 + 6.308 -0.213 0.260 0.133 -0.190 -0.582 -0.582 -0.087 -0.098 -0.166 -0.042 0.211 -0.149 + 5.922 0.097 0.230 0.238 -0.103 -0.288 -0.470 -0.007 -0.082 -0.431 -0.146 0.181 -0.216 + 5.182 0.296 0.217 0.133 -0.223 -0.205 -0.401 -0.141 -0.119 -0.259 -0.033 0.165 -0.154 + 4.593 0.325 -0.015 0.141 -0.093 -0.225 -0.324 -0.125 -0.079 -0.282 -0.182 0.140 -0.062 + 4.604 0.353 0.094 0.346 -0.000 -0.394 -0.359 -0.334 -0.184 -0.342 -0.172 0.004 -0.046 + 4.559 0.144 0.115 0.349 0.093 -0.284 -0.365 -0.268 -0.179 -0.293 -0.071 0.005 -0.224 + 4.752 0.318 0.084 0.243 0.039 -0.253 -0.363 -0.314 -0.210 -0.283 -0.200 0.011 -0.101 + 5.104 0.192 0.176 0.141 -0.249 -0.388 -0.506 -0.280 0.018 -0.128 -0.131 -0.073 -0.208 + 5.522 -0.118 0.037 0.307 -0.403 -0.330 -0.307 -0.209 0.069 0.030 0.044 -0.069 -0.168 + 5.872 -0.295 0.185 0.364 -0.304 -0.253 -0.347 -0.369 -0.037 -0.078 0.067 0.043 -0.192 + 5.962 -0.224 0.181 -0.239 -0.079 -0.001 -0.375 -0.409 -0.014 0.018 -0.051 -0.046 -0.127 + 6.131 -0.342 0.279 -0.148 -0.232 -0.182 -0.612 -0.411 0.024 0.028 -0.156 -0.045 -0.022 + 6.386 -0.329 0.054 -0.019 -0.195 0.020 -0.408 -0.486 -0.179 -0.050 -0.128 0.016 0.100 + 6.477 -0.049 0.047 -0.105 -0.258 -0.019 -0.364 -0.523 -0.212 -0.099 -0.060 0.016 -0.011 + 4.966 0.154 -0.019 0.044 -0.131 0.045 -0.236 -0.446 -0.197 -0.145 -0.193 -0.059 -0.053 + 4.040 0.470 -0.001 0.383 -0.035 -0.289 -0.624 -0.236 0.018 -0.100 -0.149 0.070 -0.050 + 4.761 0.323 -0.207 0.201 -0.074 -0.309 -0.720 -0.133 0.098 -0.071 -0.316 0.134 -0.121 + 5.489 0.377 -0.581 -0.071 -0.280 -0.314 -0.779 0.021 0.271 -0.166 -0.482 0.199 -0.249 + 6.095 0.108 -0.630 -0.336 -0.356 -0.300 -0.735 0.102 0.326 -0.240 -0.471 0.226 -0.165 + 6.160 -0.039 -0.949 -0.472 -0.101 -0.094 -0.638 0.137 0.076 -0.290 -0.587 0.065 -0.137 + 6.500 -0.015 -0.978 -0.565 -0.133 -0.002 -0.636 0.092 0.152 -0.196 -0.588 0.127 -0.201 + 6.612 -0.010 -1.001 -0.420 -0.108 0.116 -0.614 0.134 0.129 -0.194 -0.571 0.146 -0.098 + 6.603 -0.106 -1.184 -0.395 -0.305 0.283 -0.491 -0.014 0.233 -0.262 -0.405 0.158 -0.007 + 6.349 -0.067 -1.302 -0.324 -0.281 0.382 -0.410 0.032 0.268 -0.388 -0.438 0.187 -0.127 + 6.305 -0.297 -1.246 -0.546 -0.033 0.415 -0.318 0.176 0.179 -0.347 -0.544 0.340 -0.143 + 6.594 -0.126 -1.179 -0.538 -0.027 0.318 -0.401 0.149 0.113 -0.187 -0.382 0.344 -0.112 + 6.519 -0.244 -1.282 -0.635 -0.063 0.261 -0.425 -0.014 -0.016 -0.242 -0.450 0.335 -0.164 + 6.479 -0.204 -1.425 -0.573 -0.121 0.252 -0.352 -0.047 -0.006 -0.163 -0.273 0.325 -0.181 + 6.676 -0.157 -1.317 -0.646 -0.439 0.234 -0.478 -0.024 0.011 -0.137 -0.272 0.238 -0.219 + 6.573 -0.204 -1.441 -0.577 -0.598 -0.056 -0.509 -0.118 -0.036 -0.058 -0.279 0.315 -0.270 + 6.334 -0.103 -1.291 -0.372 -0.448 -0.223 -0.508 0.100 -0.110 0.074 -0.194 0.426 -0.292 + 6.269 -0.082 -1.316 -0.466 -0.227 -0.145 -0.659 0.075 -0.141 0.042 -0.196 0.370 -0.235 + 6.276 -0.014 -1.263 -0.659 -0.287 0.104 -0.441 0.027 0.098 0.020 -0.333 0.302 -0.154 + 6.008 0.241 -1.016 -0.672 -0.184 0.158 -0.329 0.151 0.226 -0.115 -0.184 0.233 -0.256 + 4.787 0.427 -0.474 -0.577 -0.075 0.086 -0.325 0.073 0.158 -0.013 -0.225 0.144 -0.114 + 4.583 0.552 -0.508 -0.504 -0.170 0.002 -0.259 -0.072 0.186 -0.087 -0.181 0.152 -0.033 + 4.648 0.421 -0.563 -0.423 -0.288 -0.060 -0.266 0.113 0.212 0.111 -0.179 0.014 -0.227 + 4.329 0.523 -0.556 -0.389 -0.192 0.044 -0.260 0.079 0.423 0.101 -0.223 -0.028 -0.153 + 3.873 0.530 -0.430 -0.112 -0.099 -0.001 -0.346 0.056 0.183 0.142 0.063 0.127 -0.114 + 5.093 -0.341 -0.460 -0.117 0.025 0.338 0.131 -0.233 0.037 -0.052 0.045 -0.014 -0.078 + 8.098 -0.766 -0.589 -0.150 -0.227 0.311 0.143 -0.527 -0.042 0.063 0.090 0.020 -0.042 + 8.906 -0.656 -0.617 -0.006 -0.232 0.097 -0.036 -0.562 -0.033 -0.035 -0.201 -0.054 -0.036 + 9.166 -0.647 -0.676 -0.098 -0.264 0.099 -0.015 -0.401 0.086 0.075 0.008 0.016 0.040 + 9.091 -0.446 -0.319 -0.161 -0.198 0.146 -0.013 -0.520 -0.050 0.155 0.003 -0.019 -0.069 + 9.523 -0.322 -0.335 -0.187 -0.328 0.072 -0.175 -0.480 -0.102 -0.010 -0.152 0.025 -0.103 + 9.732 -0.448 -0.370 -0.049 -0.131 0.012 -0.335 -0.400 0.018 0.151 -0.116 -0.025 0.010 + 9.714 -0.476 -0.477 -0.094 -0.138 0.053 -0.077 -0.318 0.201 0.024 -0.035 -0.046 0.002 + 9.654 0.038 -0.323 -0.153 -0.218 -0.088 -0.183 -0.286 0.134 0.021 -0.065 -0.119 -0.034 + 8.556 0.192 -0.045 -0.211 -0.070 0.053 -0.179 -0.363 -0.201 0.063 -0.155 -0.058 0.013 + 7.567 -0.034 -0.212 -0.301 -0.154 0.123 -0.333 -0.214 -0.045 0.153 -0.008 0.017 -0.078 + 6.856 -0.072 0.103 -0.148 -0.216 -0.129 -0.224 -0.012 0.050 0.136 0.010 -0.037 -0.043 + 5.706 -0.076 0.009 -0.009 -0.104 0.076 -0.166 0.104 0.060 0.055 -0.069 -0.220 -0.038 + 4.551 -0.079 0.091 0.051 -0.180 -0.022 -0.127 -0.177 -0.027 0.056 0.018 0.011 0.063 + 4.123 -0.302 0.110 0.017 -0.256 0.072 -0.426 -0.117 0.046 0.090 -0.164 0.035 0.167 + 4.138 -0.458 -0.144 0.150 -0.154 -0.014 -0.154 0.070 -0.102 0.073 0.064 0.081 0.065 + 4.405 -0.138 0.008 0.178 -0.088 0.057 -0.183 -0.064 -0.087 0.008 -0.112 -0.091 -0.060 + 4.692 -0.138 0.124 0.081 0.037 0.063 -0.354 -0.190 0.109 0.028 -0.095 -0.058 0.001 + 5.003 -0.354 -0.108 -0.043 -0.045 0.265 -0.147 0.025 0.151 0.058 -0.165 -0.086 -0.171 + 4.970 -0.212 0.061 0.056 -0.095 0.013 -0.147 0.155 -0.054 -0.031 -0.054 -0.054 -0.082 + 5.158 -0.183 0.037 -0.012 -0.308 -0.239 -0.365 0.005 -0.060 0.046 -0.075 0.002 -0.019 + 5.449 0.072 0.080 -0.055 -0.248 0.022 -0.119 -0.043 -0.113 -0.162 -0.139 -0.087 -0.169 + 6.496 0.401 0.212 0.111 -0.047 0.182 0.141 0.099 -0.126 -0.087 -0.168 -0.009 -0.067 + 5.695 0.215 0.332 0.152 -0.129 0.105 -0.194 0.039 -0.080 0.009 -0.076 0.009 -0.297 + 5.309 -0.149 -0.111 -0.118 -0.499 -0.174 -0.160 0.127 -0.155 -0.013 0.129 -0.058 -0.115 + 5.472 -0.125 -0.077 0.017 -0.281 -0.048 -0.203 0.031 -0.084 0.056 -0.144 -0.072 0.042 + 5.195 0.014 0.032 -0.047 -0.182 0.120 -0.101 -0.010 -0.087 -0.059 -0.061 -0.038 -0.090 + 5.398 0.092 0.040 0.194 -0.114 0.083 -0.153 0.031 -0.053 -0.110 -0.106 -0.071 -0.223 + 5.672 0.552 0.424 0.386 -0.059 -0.040 -0.360 -0.184 0.084 0.133 -0.136 -0.230 -0.078 + 5.325 0.565 0.181 0.215 0.006 0.035 -0.270 -0.386 -0.301 0.111 -0.102 -0.216 -0.011 + 7.237 0.571 -0.519 -0.328 0.052 -0.247 -0.211 -0.071 -0.107 -0.109 -0.159 -0.047 -0.087 + 8.081 0.568 -0.421 -0.386 0.198 -0.267 -0.183 -0.069 -0.073 -0.181 -0.160 -0.033 -0.128 + 4.216 0.434 0.626 0.343 -0.079 -0.073 -0.204 -0.155 -0.174 0.044 -0.124 -0.211 -0.105 + 4.190 0.501 0.460 0.183 -0.026 0.090 -0.110 -0.133 -0.211 -0.069 -0.135 -0.026 -0.220 + 4.278 0.430 0.392 0.013 -0.019 0.158 0.070 0.039 -0.080 0.005 -0.165 -0.086 -0.215 + 4.353 0.288 0.156 0.041 -0.189 -0.140 -0.053 -0.013 -0.096 0.095 -0.044 -0.092 -0.112 + 5.658 -0.244 0.055 -0.229 0.044 -0.006 -0.070 0.029 -0.222 -0.077 -0.151 -0.072 -0.053 + 3.647 0.358 -0.088 0.088 0.040 -0.109 -0.122 -0.160 -0.119 -0.039 -0.076 0.036 -0.041 + 3.444 0.283 -0.087 0.163 0.098 0.009 -0.022 0.102 -0.023 -0.028 -0.050 -0.021 -0.075 + 3.661 0.526 -0.016 0.050 -0.007 -0.088 -0.143 -0.005 -0.076 -0.038 -0.094 -0.106 -0.024 + 3.681 0.403 -0.150 0.066 0.059 -0.032 -0.090 0.065 -0.164 -0.047 -0.110 -0.113 -0.012 + 4.021 0.377 -0.093 -0.112 -0.188 -0.098 -0.136 -0.181 -0.237 -0.031 -0.035 0.020 -0.028 + 3.623 0.361 -0.157 -0.006 -0.045 -0.167 -0.265 -0.071 -0.118 -0.016 -0.076 -0.026 -0.171 + 3.760 0.336 -0.196 -0.073 -0.057 -0.047 0.087 -0.096 -0.070 -0.004 0.009 0.132 0.034 + 3.709 0.320 -0.186 0.008 -0.069 -0.144 -0.010 -0.022 -0.185 -0.103 -0.216 0.050 -0.004 + 3.953 0.349 -0.179 -0.072 -0.147 -0.194 -0.061 -0.034 -0.018 0.029 0.001 -0.097 0.060 + 5.822 -0.920 0.087 -0.002 -0.153 -0.133 -0.263 -0.167 -0.150 -0.027 -0.048 -0.017 -0.091 + 5.050 -0.354 0.366 -0.012 -0.240 -0.149 -0.150 -0.158 -0.158 -0.132 -0.131 -0.059 -0.061 + 3.892 0.438 0.070 0.324 -0.288 -0.224 -0.174 -0.164 -0.113 -0.201 0.007 0.024 0.062 + 3.512 0.500 0.248 0.033 0.011 -0.127 -0.105 -0.133 -0.221 -0.145 -0.148 -0.102 -0.058 + 3.566 0.089 -0.055 0.029 -0.053 0.072 0.050 -0.077 -0.002 -0.062 -0.148 -0.065 -0.037 + 3.329 0.000 0.069 0.021 -0.017 -0.067 -0.052 -0.189 -0.223 0.104 -0.050 -0.071 -0.182 + 2.601 0.048 -0.067 0.077 0.015 -0.173 -0.055 -0.231 -0.108 -0.094 -0.095 -0.026 -0.169 + 2.690 -0.128 -0.162 0.075 -0.011 -0.121 -0.050 0.055 -0.088 0.061 0.024 -0.063 -0.176 + 2.674 -0.142 -0.129 0.112 0.050 -0.105 -0.081 -0.013 -0.168 -0.005 -0.053 0.085 0.090 + 2.832 0.045 -0.130 0.137 -0.000 -0.152 -0.064 0.149 -0.152 -0.001 -0.146 -0.123 -0.073 + 2.501 0.039 0.065 0.258 0.045 -0.013 -0.039 -0.001 -0.236 -0.099 -0.025 -0.061 -0.096 + 2.361 -0.020 -0.035 0.156 0.105 -0.034 0.043 0.121 0.013 -0.131 -0.120 -0.114 -0.007 + 2.417 -0.132 -0.073 0.149 0.056 -0.042 0.265 0.163 0.003 -0.060 -0.006 -0.041 -0.171 + 2.469 0.153 -0.008 -0.057 -0.130 0.049 -0.048 -0.005 -0.080 0.026 0.026 0.042 -0.085 + 2.195 0.007 0.113 0.055 -0.024 0.055 -0.005 -0.087 0.007 -0.063 -0.079 0.002 -0.071 + 2.427 -0.117 0.254 -0.199 0.016 -0.071 -0.067 0.081 -0.119 -0.090 -0.149 0.005 -0.179 + 2.881 0.017 0.378 -0.382 0.032 0.047 -0.101 0.100 -0.136 0.029 0.046 -0.044 -0.160 + 2.692 0.570 -0.019 -0.084 -0.214 0.007 -0.100 -0.008 0.033 0.040 -0.031 0.023 -0.054 + 2.655 0.382 -0.157 -0.165 -0.158 0.043 0.108 0.045 -0.100 -0.132 -0.068 -0.129 -0.149 + 2.442 0.644 0.084 -0.234 -0.292 -0.027 -0.001 0.103 0.003 -0.013 0.067 -0.065 -0.173 + 2.388 0.308 -0.076 0.016 -0.218 -0.449 -0.239 -0.033 0.080 0.022 -0.103 -0.068 -0.066 + 3.191 0.308 0.255 0.218 -0.300 -0.297 -0.029 0.085 0.095 -0.031 -0.067 -0.102 -0.285 + 4.024 0.740 0.002 0.009 -0.324 -0.106 0.017 0.013 -0.182 -0.165 -0.042 -0.129 -0.108 + 4.161 0.335 0.061 -0.076 -0.570 -0.362 0.038 -0.032 -0.108 -0.062 -0.092 0.038 -0.090 + 4.103 0.314 0.142 0.055 -0.593 -0.210 0.173 -0.058 -0.210 -0.034 -0.140 -0.145 -0.171 + 3.886 0.822 -0.461 0.156 -0.402 -0.094 -0.050 -0.102 -0.171 -0.018 0.009 -0.003 -0.073 + 3.139 0.849 -0.044 0.260 -0.345 -0.113 -0.058 -0.153 -0.026 -0.056 -0.251 -0.135 -0.075 + 3.545 1.007 -0.347 -0.008 -0.279 -0.122 0.035 -0.136 -0.115 0.047 -0.049 -0.027 -0.058 + 3.441 0.977 -0.189 -0.023 -0.309 0.012 0.120 0.023 -0.057 -0.175 -0.244 -0.012 -0.021 + 3.297 0.899 -0.217 -0.012 -0.492 -0.106 -0.040 -0.047 -0.145 0.012 -0.172 -0.081 -0.060 + 3.867 1.160 -0.365 -0.116 -0.459 -0.116 -0.011 -0.100 0.011 -0.093 -0.148 -0.173 -0.030 + 3.999 1.137 -0.257 0.308 -0.367 -0.078 0.166 -0.248 -0.232 0.003 -0.145 -0.080 -0.165 + 3.674 0.774 0.079 0.373 -0.385 -0.264 0.049 -0.066 -0.212 -0.002 -0.186 -0.015 -0.038 + 3.793 1.057 -0.043 0.318 -0.560 -0.088 -0.009 -0.226 -0.086 -0.072 -0.314 0.002 0.022 + 3.559 0.728 -0.380 0.616 -0.391 -0.312 0.020 -0.021 -0.091 -0.240 -0.105 0.058 0.143 + 4.277 0.936 -0.280 0.371 -0.079 -0.176 -0.144 -0.213 -0.192 -0.039 -0.037 0.068 -0.123 + 4.825 0.641 0.119 0.317 -0.074 -0.127 -0.248 -0.445 -0.150 -0.025 0.029 0.081 -0.329 + 5.170 0.541 0.060 0.175 -0.313 -0.238 -0.183 -0.242 -0.314 0.170 -0.048 0.063 -0.219 + 5.072 0.727 0.230 0.186 -0.448 -0.150 -0.109 -0.373 -0.349 0.207 -0.093 -0.068 -0.231 + 5.111 0.641 0.297 0.161 -0.489 -0.079 -0.181 -0.328 -0.385 0.233 -0.113 -0.006 -0.225 + 5.158 0.668 0.496 0.174 -0.409 -0.145 -0.152 -0.356 -0.492 0.189 -0.029 -0.078 -0.261 + 5.568 0.650 0.022 0.111 -0.285 -0.168 -0.121 -0.363 -0.403 0.137 -0.199 0.017 -0.325 + 5.593 0.601 -0.007 0.097 -0.021 0.027 -0.092 -0.244 -0.486 -0.153 -0.130 0.063 -0.248 + 5.189 0.571 0.250 0.267 -0.108 -0.037 -0.235 -0.298 -0.527 -0.021 0.040 -0.024 -0.077 + 5.647 0.862 0.366 -0.027 -0.078 -0.083 0.125 0.087 -0.157 -0.128 -0.219 -0.249 -0.296 + 5.605 0.853 0.736 0.277 -0.123 -0.022 -0.022 -0.079 -0.179 -0.127 -0.297 -0.248 -0.286 + 5.067 0.589 0.328 0.026 -0.304 -0.098 -0.087 -0.205 -0.153 -0.030 -0.074 -0.035 0.001 + 4.774 0.112 0.172 0.316 0.003 -0.145 -0.276 -0.222 -0.303 -0.065 -0.134 -0.008 -0.015 + 5.300 -0.164 -0.019 0.359 -0.024 -0.311 -0.172 -0.400 -0.305 -0.068 -0.114 -0.019 0.056 + 6.808 0.010 0.054 0.276 -0.379 -0.310 -0.084 -0.295 -0.200 0.194 -0.096 -0.041 -0.077 + 8.777 0.393 0.281 0.124 -0.491 -0.088 -0.352 -0.300 -0.091 0.229 -0.063 -0.060 -0.191 + 7.440 0.157 0.252 0.531 -0.285 -0.230 0.110 -0.326 -0.202 0.127 -0.240 -0.046 -0.189 + 8.737 0.509 0.116 0.181 -0.258 -0.072 0.062 -0.200 -0.273 0.039 -0.299 -0.047 -0.203 + 9.199 0.668 0.204 0.171 -0.317 0.099 0.170 -0.305 -0.262 -0.046 -0.295 -0.017 -0.201 + 6.554 -0.096 0.441 0.388 -0.351 -0.212 0.393 -0.189 -0.196 0.157 -0.344 0.085 -0.163 + 5.845 -0.226 0.291 0.308 -0.585 -0.352 0.224 -0.493 -0.201 0.137 -0.235 0.125 0.005 + 5.556 -0.277 0.320 0.302 -0.472 -0.408 0.155 -0.623 -0.152 0.121 -0.247 0.267 -0.102 + 5.755 -0.182 0.455 0.544 -0.527 -0.307 0.057 -0.621 -0.291 0.068 -0.311 0.044 -0.115 + 6.441 -0.388 0.433 0.578 -0.518 -0.335 -0.117 -0.752 -0.292 0.147 -0.366 -0.065 -0.186 + 6.325 -0.278 0.456 0.623 -0.679 -0.452 0.088 -0.793 -0.420 -0.001 -0.416 -0.076 -0.250 + 6.515 -0.340 0.477 0.543 -0.747 -0.554 0.262 -0.536 -0.294 0.122 -0.412 -0.059 -0.298 + 6.474 -0.524 0.416 0.445 -0.909 -0.788 0.172 -0.538 -0.210 0.272 -0.216 0.028 -0.223 + 6.416 -0.444 0.232 0.271 -0.858 -0.641 0.277 -0.527 -0.068 0.243 -0.221 0.043 -0.113 + 6.342 -0.334 0.147 0.361 -0.860 -0.601 0.200 -0.619 -0.156 0.193 -0.201 -0.005 -0.071 + 6.172 -0.141 0.315 0.378 -0.566 -0.744 0.074 -0.454 -0.096 0.104 -0.432 0.011 -0.089 + 5.314 -0.146 0.449 0.243 -0.524 -0.353 0.285 -0.547 -0.228 0.089 -0.398 -0.010 -0.113 + 5.328 0.160 0.364 0.343 -0.344 -0.338 0.109 -0.235 -0.074 0.277 -0.331 -0.078 -0.196 + 5.328 0.161 0.327 0.268 -0.122 -0.172 0.113 -0.185 -0.066 -0.036 -0.120 0.016 -0.142 + 5.288 0.062 0.324 0.208 0.046 -0.191 0.020 -0.133 -0.119 0.043 -0.126 -0.093 -0.125 + 4.707 0.235 0.166 0.215 -0.160 -0.177 -0.142 -0.119 -0.192 -0.084 0.029 -0.038 -0.124 + 4.866 0.442 0.118 0.397 -0.237 -0.121 0.030 -0.212 -0.119 -0.009 -0.240 -0.039 -0.053 + 5.048 0.342 0.306 0.347 -0.082 0.034 -0.135 -0.120 -0.202 0.090 -0.172 -0.038 -0.095 + 4.979 -0.038 0.165 0.115 -0.213 0.082 0.074 -0.226 -0.059 0.087 -0.110 0.005 -0.015 + 5.281 -0.046 0.212 0.306 -0.322 -0.204 0.139 -0.312 -0.086 0.072 -0.259 -0.035 -0.189 + 5.306 -0.287 0.386 0.479 -0.319 -0.317 0.100 -0.422 -0.116 0.079 -0.232 -0.012 -0.164 + 5.418 -0.412 0.582 0.516 -0.557 -0.356 0.019 -0.512 -0.235 0.211 -0.128 0.028 -0.187 + 6.190 -0.339 0.462 0.633 -0.672 -0.612 -0.020 -0.319 -0.194 0.123 0.056 0.009 -0.267 + 6.315 -0.462 -0.002 0.410 -0.414 -0.558 0.055 -0.148 -0.153 -0.083 -0.151 0.100 -0.226 + 5.907 -0.678 -0.161 0.302 -0.212 -0.381 0.229 0.076 -0.096 0.049 -0.073 0.123 -0.424 + 5.973 -0.520 -0.073 0.282 -0.092 -0.386 0.025 -0.015 -0.018 -0.013 -0.067 0.089 -0.449 + 6.158 -0.377 -0.128 0.350 -0.031 -0.488 -0.049 -0.153 -0.086 -0.076 -0.077 0.158 -0.343 + 6.083 -0.310 -0.273 0.066 -0.087 -0.509 -0.011 0.043 0.025 -0.055 -0.120 0.328 -0.312 + 5.970 -0.137 -0.637 -0.244 -0.164 -0.541 -0.061 0.223 0.075 -0.137 -0.262 0.310 -0.357 + 8.920 1.368 -0.150 -0.148 -0.059 -0.264 -0.226 -0.177 -0.144 -0.204 -0.261 0.076 -0.213 + 9.455 1.320 -0.072 0.032 -0.103 -0.269 -0.188 -0.156 -0.169 -0.143 -0.191 0.080 -0.056 + 6.961 0.862 -0.056 0.169 -0.046 -0.374 -0.038 0.175 0.039 -0.288 -0.172 0.213 -0.301 + 5.693 -0.013 -0.144 -0.030 -0.130 -0.344 -0.090 0.268 0.346 -0.093 -0.255 0.304 -0.185 + 5.616 -0.116 -0.313 0.069 -0.131 -0.336 -0.189 0.378 0.183 -0.286 -0.245 0.222 -0.341 + 5.643 0.091 -0.432 -0.019 -0.224 -0.372 -0.207 0.228 -0.008 -0.187 -0.220 0.240 -0.379 + 5.752 0.460 -0.387 0.045 -0.097 -0.336 -0.300 0.215 0.240 -0.299 -0.195 0.168 -0.310 + 8.123 0.258 0.050 -0.380 -0.270 -0.363 -0.136 -0.117 -0.215 0.019 -0.244 -0.004 -0.135 + 8.404 -0.072 0.176 -0.063 -0.417 -0.354 -0.024 -0.055 -0.128 0.180 -0.200 0.031 -0.040 + 9.396 -0.410 0.331 0.035 -0.276 -0.237 -0.173 -0.009 -0.214 0.168 -0.378 -0.063 -0.037 + 5.929 0.282 0.336 0.429 0.000 -0.321 -0.239 0.091 0.003 0.148 -0.145 0.054 -0.095 + 5.351 0.497 0.376 0.132 -0.192 -0.310 -0.114 0.136 -0.018 -0.097 -0.069 -0.125 -0.317 + 4.942 0.327 0.206 0.115 -0.008 -0.227 -0.119 0.026 -0.160 -0.182 -0.190 0.010 -0.192 + 5.298 0.499 0.156 0.026 -0.194 -0.264 0.043 0.035 -0.060 -0.278 -0.039 -0.092 -0.265 + 5.425 0.479 0.418 0.213 -0.154 -0.151 -0.041 -0.071 -0.261 -0.183 -0.112 0.014 -0.205 + 5.336 0.371 0.358 0.133 -0.160 -0.031 -0.123 -0.127 -0.406 -0.183 -0.109 -0.092 -0.360 + 5.144 0.319 0.204 0.055 -0.174 -0.393 -0.096 -0.156 -0.292 -0.167 -0.106 -0.050 -0.187 + 4.790 0.132 0.163 0.208 -0.219 -0.344 -0.169 -0.083 -0.151 0.002 -0.119 -0.135 -0.104 + 4.862 0.214 0.141 0.134 -0.183 -0.378 -0.053 0.045 -0.204 -0.066 -0.157 -0.230 -0.243 + 5.471 0.369 0.268 -0.081 -0.240 -0.194 -0.137 -0.117 -0.345 -0.108 -0.030 0.061 -0.118 + 5.151 0.429 0.057 -0.066 -0.158 -0.133 0.076 0.008 -0.350 -0.255 -0.180 0.074 -0.215 + 5.426 0.398 0.103 -0.001 -0.222 -0.226 0.035 -0.017 -0.176 0.158 -0.035 -0.122 -0.155 + 5.800 0.620 0.387 0.023 -0.046 -0.022 0.186 -0.049 -0.133 0.044 0.026 -0.214 -0.241 + 5.524 0.238 0.227 -0.072 -0.067 -0.048 0.041 -0.035 -0.139 0.011 -0.044 0.026 0.019 + 5.002 -0.043 0.227 -0.085 -0.216 -0.192 -0.056 0.059 -0.118 -0.098 -0.058 -0.079 -0.232 + 4.668 -0.089 0.180 0.020 -0.268 -0.207 0.036 0.106 -0.109 -0.210 -0.094 -0.169 -0.147 + 4.591 -0.027 0.238 0.048 -0.099 -0.169 -0.055 0.100 -0.016 -0.037 -0.206 -0.279 -0.111 + 4.722 -0.060 0.182 -0.037 -0.125 -0.133 -0.104 0.016 -0.216 -0.152 -0.202 -0.109 -0.080 + 4.732 -0.086 0.247 0.001 -0.173 -0.199 -0.146 0.004 -0.024 -0.034 -0.101 -0.147 -0.107 + 4.800 -0.213 0.106 -0.320 -0.058 -0.259 -0.084 -0.046 -0.027 -0.061 -0.072 0.026 -0.235 + 4.291 -0.112 0.468 0.004 -0.192 -0.239 -0.024 0.002 -0.079 -0.075 -0.113 -0.019 -0.086 + 3.982 -0.080 0.430 -0.060 -0.235 -0.201 -0.024 0.088 0.081 -0.024 -0.074 -0.082 -0.063 + 4.187 0.131 0.271 -0.083 -0.125 0.017 0.100 -0.030 -0.197 -0.113 -0.182 -0.171 -0.178 + 3.794 -0.013 0.319 0.057 -0.135 -0.071 0.003 0.000 -0.025 0.228 0.028 -0.099 -0.123 + 3.173 0.112 0.445 0.293 -0.144 -0.147 -0.061 0.055 -0.130 -0.007 -0.077 -0.148 -0.196 + 3.568 0.198 0.471 0.129 -0.210 -0.105 -0.191 -0.029 -0.028 0.016 -0.109 -0.053 0.026 + 3.511 0.272 0.330 0.024 -0.223 -0.181 -0.055 -0.023 -0.176 -0.012 0.105 -0.054 -0.058 + 3.386 0.147 -0.020 -0.201 -0.121 -0.033 -0.160 -0.109 -0.217 -0.058 -0.112 -0.163 -0.161 + 3.070 0.139 0.027 0.030 -0.093 -0.134 -0.191 -0.076 -0.133 -0.089 -0.157 -0.230 -0.148 + 3.244 0.184 -0.014 0.190 0.040 0.007 0.039 -0.045 -0.174 -0.067 -0.114 -0.158 -0.091 + 2.986 0.188 0.100 0.311 0.009 -0.064 -0.224 -0.035 -0.210 -0.257 -0.129 -0.133 -0.031 + 2.193 0.122 0.228 0.214 -0.012 -0.103 0.007 0.128 0.084 0.154 0.101 -0.119 0.097 + 2.238 0.210 0.177 0.140 -0.080 -0.080 0.101 0.292 0.075 -0.102 -0.039 -0.172 0.014 + 2.589 0.168 -0.002 0.088 0.068 -0.097 0.164 0.254 -0.079 -0.135 -0.180 -0.253 -0.114 + 2.541 0.180 0.039 0.088 -0.041 -0.150 0.183 0.100 -0.085 0.004 -0.072 -0.146 -0.098 + 2.198 0.166 0.155 0.106 -0.137 -0.131 0.029 0.069 -0.242 -0.178 -0.052 -0.009 -0.112 + 2.412 0.488 0.238 0.044 -0.022 -0.060 0.111 0.020 -0.297 -0.231 -0.234 -0.043 -0.057 + 2.300 0.325 0.312 0.168 0.004 -0.003 -0.018 -0.043 -0.193 -0.068 -0.039 -0.098 -0.199 + 1.983 0.051 0.240 0.295 0.110 -0.134 0.096 -0.118 -0.327 -0.153 -0.005 -0.046 -0.134 + 2.239 -0.165 0.182 0.354 -0.172 -0.160 0.069 0.115 -0.033 0.045 -0.077 -0.063 -0.011 + 3.055 0.119 0.247 0.020 -0.176 -0.178 -0.114 0.120 0.011 0.142 -0.182 -0.081 -0.155 + 3.399 0.501 0.314 0.137 -0.406 -0.027 -0.001 0.019 -0.106 -0.027 0.014 -0.015 -0.119 + 5.117 0.254 0.634 0.402 -0.499 -0.182 0.063 -0.027 -0.215 -0.008 -0.111 -0.025 -0.123 + 5.144 0.029 0.358 0.637 -0.432 -0.266 -0.006 -0.159 -0.100 0.061 -0.042 0.002 -0.100 + 5.511 -0.191 0.246 0.788 -0.414 -0.155 -0.045 -0.198 -0.164 0.031 -0.016 0.067 -0.056 + 5.965 0.032 0.244 0.493 -0.446 -0.323 -0.172 -0.157 -0.249 0.035 -0.026 -0.069 -0.217 + 6.557 0.206 0.398 0.540 -0.400 -0.310 0.115 0.001 0.040 0.042 -0.094 -0.119 -0.237 + 7.089 0.862 0.566 0.255 -0.412 -0.113 0.101 -0.279 -0.209 -0.245 -0.102 0.029 -0.081 + 7.640 0.635 0.333 0.226 -0.382 -0.041 -0.085 -0.183 -0.231 -0.071 -0.232 0.049 -0.122 + 7.984 0.659 0.071 0.154 -0.103 -0.165 -0.183 -0.301 -0.207 -0.069 -0.364 0.024 -0.008 + 8.373 0.866 0.214 0.190 0.013 -0.070 -0.206 -0.332 -0.376 -0.031 -0.383 -0.083 -0.040 + 6.990 -0.006 0.158 0.135 -0.107 -0.331 -0.381 -0.156 -0.092 -0.172 -0.226 -0.016 -0.039 + 7.870 -0.616 -0.093 -0.035 -0.113 -0.330 -0.060 -0.150 -0.171 0.095 -0.180 -0.010 -0.053 + 7.025 -0.459 0.151 0.092 -0.094 -0.289 -0.186 -0.135 -0.082 0.058 -0.161 -0.021 0.003 + 6.244 -0.673 0.403 0.370 0.167 -0.008 -0.351 -0.147 -0.266 -0.202 -0.253 0.082 0.075 + 7.107 -0.645 0.424 0.189 0.063 -0.111 -0.181 -0.012 -0.179 0.012 -0.031 -0.056 0.056 + 6.624 -0.308 0.591 0.009 -0.029 -0.062 -0.217 0.092 -0.095 -0.031 -0.158 -0.175 -0.124 + 6.238 -0.384 0.526 0.066 -0.168 -0.141 -0.304 0.032 -0.288 -0.117 -0.154 -0.080 -0.192 + 5.398 -0.420 0.585 0.200 -0.073 -0.009 -0.057 -0.051 -0.292 -0.143 -0.250 -0.024 -0.099 + 4.453 -0.133 0.341 0.136 -0.031 -0.080 -0.254 -0.058 -0.088 -0.109 -0.077 -0.024 -0.074 + 4.737 0.122 0.408 0.093 0.243 0.300 -0.025 -0.028 -0.044 -0.218 -0.158 -0.024 -0.123 + 4.426 0.032 0.358 0.130 0.098 0.067 -0.078 0.003 -0.112 -0.065 -0.192 -0.107 -0.186 + 4.253 -0.161 0.226 0.175 0.025 0.003 -0.027 -0.014 -0.021 -0.063 -0.254 -0.314 -0.269 + 5.343 0.498 0.178 -0.056 -0.088 -0.146 -0.364 -0.194 -0.149 -0.139 -0.165 -0.149 -0.263 + 5.566 1.086 0.539 -0.065 -0.141 -0.207 -0.342 -0.281 -0.113 -0.065 -0.073 0.001 -0.146 + 3.918 -0.161 0.563 0.019 0.103 -0.024 -0.143 -0.179 -0.076 0.013 0.068 0.059 0.023 + 3.729 -0.238 0.094 -0.124 -0.197 -0.117 -0.123 -0.171 -0.103 -0.011 0.155 0.135 -0.083 + 3.765 -0.136 0.175 -0.031 -0.226 -0.119 -0.067 -0.132 0.052 -0.051 0.071 0.053 -0.039 + 3.217 -0.221 0.101 0.030 0.022 -0.130 -0.120 -0.077 -0.066 0.097 0.188 0.095 -0.024 + 3.450 -0.173 0.277 0.074 -0.059 -0.192 0.025 -0.043 -0.041 -0.015 -0.014 -0.000 -0.000 + 3.495 -0.224 0.272 0.164 0.032 -0.136 -0.079 -0.138 -0.146 -0.098 -0.022 -0.051 -0.011 + 3.268 0.335 0.300 0.205 -0.023 -0.146 -0.076 -0.093 -0.227 -0.146 -0.102 0.125 0.005 + 3.238 0.133 0.254 0.139 -0.132 0.008 -0.065 -0.112 -0.128 -0.156 0.081 0.032 -0.224 + 3.161 -0.012 0.164 0.077 -0.275 0.127 0.097 0.119 -0.004 -0.071 0.033 0.123 0.016 + 3.429 0.033 0.140 0.105 -0.188 -0.170 -0.155 -0.079 -0.069 0.002 0.066 0.103 -0.002 + 3.366 0.276 0.458 0.156 -0.103 0.005 -0.112 -0.160 -0.057 0.001 -0.048 0.050 -0.084 + 2.657 0.224 0.382 0.022 -0.185 -0.161 0.015 -0.003 -0.031 -0.225 0.014 0.121 -0.036 + 2.807 0.220 0.448 -0.022 -0.141 -0.155 0.016 0.088 -0.144 -0.170 0.090 0.143 -0.020 + 2.770 -0.062 0.381 0.009 -0.079 -0.166 -0.122 0.191 0.073 -0.118 0.011 0.124 0.007 + 2.940 0.261 0.439 0.016 -0.064 -0.075 0.079 -0.017 -0.232 -0.009 -0.212 -0.209 0.010 + 2.999 0.355 0.415 -0.174 -0.192 0.099 0.088 -0.159 -0.320 -0.083 -0.073 -0.037 -0.001 + 3.330 -0.027 0.754 -0.140 -0.089 -0.018 -0.135 0.062 -0.019 -0.103 -0.146 -0.058 -0.064 + 3.284 -0.304 0.702 -0.029 0.090 -0.108 -0.287 0.006 -0.033 -0.172 -0.128 -0.028 -0.057 + 3.274 -0.496 0.523 -0.136 0.228 0.110 -0.285 -0.006 -0.119 -0.058 -0.097 -0.003 0.085 + 3.671 -0.545 0.499 0.123 0.102 0.073 -0.187 -0.054 -0.241 -0.058 -0.276 -0.111 0.147 + 3.705 -0.648 0.334 0.169 -0.020 0.010 -0.186 -0.009 -0.160 0.189 0.095 0.157 0.026 + 4.411 -0.806 0.384 0.162 0.017 -0.010 0.028 -0.035 0.031 0.116 -0.025 0.006 -0.101 + 4.672 -0.960 0.103 -0.015 0.042 -0.052 -0.093 -0.182 -0.166 -0.071 0.030 -0.010 -0.048 + 4.248 -0.564 0.102 0.121 -0.151 0.014 -0.046 -0.043 -0.106 -0.045 -0.036 -0.192 -0.133 + 3.518 -0.680 0.019 0.182 -0.165 0.058 0.015 -0.023 -0.077 -0.059 -0.172 -0.152 -0.166 + 3.832 -0.292 -0.012 0.156 -0.560 -0.329 -0.254 0.052 -0.007 0.053 -0.037 0.131 -0.114 + 3.112 0.495 0.312 0.098 -0.360 -0.356 -0.088 0.158 -0.076 -0.134 -0.244 -0.038 0.102 + 2.946 -0.173 0.309 0.130 -0.203 0.101 -0.027 0.121 -0.090 -0.108 -0.090 -0.064 0.082 + 3.920 0.496 0.549 0.083 -0.474 0.111 -0.172 -0.041 -0.041 -0.041 -0.014 0.072 -0.064 + 4.310 0.757 0.606 -0.123 -0.468 0.143 0.035 -0.002 0.020 -0.040 -0.031 0.041 -0.057 + 4.758 0.777 0.454 0.078 -0.407 -0.026 0.026 0.056 -0.089 0.003 -0.162 0.066 -0.025 + 5.573 0.559 0.353 -0.104 -0.471 0.128 0.019 0.003 -0.096 -0.056 -0.018 -0.066 -0.196 + 6.506 0.395 0.349 0.132 -0.342 -0.038 -0.011 -0.248 -0.117 -0.063 -0.109 -0.042 -0.132 + 7.111 0.237 0.084 0.084 -0.227 -0.105 -0.090 -0.251 -0.100 -0.067 -0.073 -0.082 -0.093 + 6.813 0.129 0.237 -0.098 -0.234 0.024 -0.087 -0.024 -0.057 -0.102 -0.158 -0.013 -0.093 + 6.557 0.198 0.126 -0.154 -0.297 0.124 -0.097 -0.019 0.062 -0.065 -0.239 0.146 -0.012 + 6.608 0.370 -0.012 0.004 -0.296 0.069 -0.148 -0.008 -0.094 -0.054 -0.173 0.154 -0.080 + 6.865 0.303 0.174 0.067 -0.215 -0.002 0.021 -0.190 -0.250 -0.035 -0.234 -0.020 -0.173 + 6.150 -0.029 0.298 0.425 -0.167 -0.199 -0.360 -0.135 -0.034 0.075 -0.062 0.056 -0.143 + 6.981 -0.765 0.106 -0.079 -0.389 -0.424 -0.339 -0.121 0.042 0.202 0.020 0.295 0.236 + 7.741 -0.392 0.276 -0.032 -0.256 -0.096 -0.169 0.011 -0.047 0.080 0.020 -0.068 0.007 + 7.806 -0.262 0.292 0.120 -0.257 -0.193 -0.233 -0.169 -0.202 -0.098 -0.042 -0.037 -0.070 + 7.925 -0.529 0.152 0.154 -0.235 -0.090 -0.177 -0.362 -0.157 -0.055 0.048 0.056 -0.119 + 7.814 -0.593 -0.000 0.113 -0.334 -0.067 -0.133 -0.201 -0.045 0.055 0.055 0.110 0.007 + 7.457 -0.601 0.050 -0.100 -0.496 -0.147 -0.139 -0.304 -0.183 0.075 0.002 -0.091 0.046 + 7.825 -0.549 -0.014 0.096 -0.381 -0.115 -0.170 -0.356 -0.151 0.001 -0.120 0.014 -0.102 + 7.892 -0.567 0.024 0.083 -0.536 -0.361 -0.156 -0.304 -0.100 -0.143 -0.103 0.083 -0.055 + 7.246 -0.738 -0.174 0.059 -0.606 -0.310 -0.080 -0.326 -0.086 -0.014 0.031 0.079 -0.056 + 6.933 -0.676 0.006 0.069 -0.274 -0.125 0.120 -0.375 -0.090 0.029 0.015 -0.127 -0.079 + 6.765 -0.752 -0.255 0.116 -0.263 -0.267 0.130 -0.242 -0.102 -0.056 0.025 0.028 -0.077 + 6.903 -1.116 -0.361 0.142 -0.400 -0.260 0.127 -0.352 -0.129 -0.111 -0.018 0.037 -0.000 + 6.331 -1.373 -0.467 0.107 -0.048 -0.212 -0.191 -0.420 -0.123 -0.054 0.082 0.189 -0.055 + 6.221 -0.955 -0.306 0.157 -0.061 -0.107 -0.263 -0.344 -0.180 -0.023 0.013 0.149 -0.100 + 5.706 -0.786 -0.271 0.209 -0.006 0.125 -0.166 -0.456 -0.364 -0.024 -0.023 0.123 -0.045 + 5.137 0.025 -0.206 -0.067 -0.402 -0.183 -0.085 -0.042 0.048 -0.008 -0.078 0.051 -0.011 + 4.352 0.195 0.247 -0.185 -0.553 -0.032 0.017 -0.116 -0.090 0.012 -0.059 -0.022 -0.017 + 4.400 0.820 0.249 -0.024 -0.284 -0.152 -0.413 -0.233 -0.209 -0.086 -0.133 0.014 -0.088 + 6.370 1.122 -0.310 -0.082 -0.416 0.028 -0.438 -0.400 -0.062 -0.062 -0.164 -0.015 0.016 + 6.987 1.193 -0.506 -0.009 -0.518 0.105 -0.504 -0.505 -0.035 0.000 -0.186 -0.056 0.088 + 7.372 0.982 -0.384 -0.033 -0.532 0.155 -0.477 -0.546 -0.033 0.074 -0.208 -0.063 0.100 + 7.153 1.103 -0.428 0.064 -0.548 0.160 -0.422 -0.605 0.001 0.041 -0.193 -0.051 0.081 + 6.858 1.188 -0.369 0.085 -0.472 0.095 -0.363 -0.668 -0.037 0.034 -0.188 -0.012 0.041 + 6.600 1.121 -0.223 0.082 -0.346 0.080 -0.312 -0.586 -0.147 0.019 -0.171 -0.054 -0.027 + 6.243 1.005 -0.172 0.081 -0.159 0.109 -0.229 -0.566 -0.156 -0.030 -0.271 -0.051 -0.012 + 5.308 0.918 0.056 0.213 -0.118 0.027 -0.030 -0.392 -0.117 -0.063 -0.347 -0.232 0.040 + 4.596 0.600 0.206 0.269 0.020 0.060 -0.116 -0.311 -0.042 -0.091 -0.203 -0.002 0.028 + 4.334 0.608 0.298 -0.056 -0.035 -0.089 -0.375 -0.282 -0.038 -0.065 -0.022 0.072 0.081 + 3.912 0.502 0.321 0.153 0.022 -0.210 -0.349 -0.297 0.041 -0.032 -0.053 0.021 0.087 + 3.873 0.481 0.270 0.056 0.044 -0.202 -0.309 -0.248 -0.161 0.005 0.068 0.147 0.064 + 3.831 0.362 0.011 -0.055 -0.015 0.076 -0.223 -0.227 -0.057 0.016 0.043 0.056 0.061 + 3.902 0.498 0.177 -0.037 -0.189 0.028 -0.319 -0.225 -0.009 0.001 0.065 0.080 0.061 + 4.095 0.635 0.087 -0.054 -0.047 0.116 -0.100 -0.215 -0.009 -0.014 -0.015 -0.043 0.010 + 4.677 0.729 0.069 -0.214 -0.098 0.019 -0.022 -0.131 -0.121 0.144 0.091 -0.026 0.059 + 5.107 1.012 -0.137 -0.275 -0.113 0.088 0.049 -0.048 -0.004 0.202 -0.050 -0.072 0.012 + 5.367 1.192 -0.413 -0.305 -0.139 0.068 0.120 -0.053 -0.078 0.335 -0.032 -0.185 -0.068 + 5.659 1.268 -0.613 -0.285 -0.061 0.115 -0.061 -0.097 -0.034 0.251 -0.137 -0.133 -0.011 + 5.525 1.251 -0.469 -0.303 -0.243 0.093 -0.059 -0.124 -0.067 0.256 -0.082 -0.177 0.093 + 5.233 1.012 -0.426 -0.187 -0.156 -0.063 -0.127 -0.063 -0.041 0.232 -0.040 -0.014 0.065 + 4.766 0.825 -0.327 0.099 -0.236 -0.159 -0.192 -0.118 -0.027 0.125 0.045 0.025 0.144 + 4.212 0.736 -0.069 0.360 -0.263 -0.051 -0.084 -0.133 -0.044 0.258 0.143 0.007 0.115 + 3.036 0.657 0.051 0.084 -0.209 -0.090 -0.038 -0.099 -0.074 0.173 0.018 -0.064 -0.076 + 3.166 0.618 -0.051 0.099 -0.127 0.006 0.107 -0.113 -0.078 0.149 0.025 0.127 0.046 + 2.628 0.737 0.184 0.287 0.046 -0.016 -0.004 -0.026 0.103 0.067 -0.049 0.099 0.054 + 2.560 0.630 -0.098 0.079 0.120 0.189 -0.146 -0.090 0.076 0.085 -0.048 0.067 -0.032 + 2.505 0.661 -0.125 -0.020 -0.095 0.024 -0.216 -0.136 -0.106 -0.101 0.017 -0.059 -0.046 + 2.296 0.593 0.039 0.194 -0.032 -0.083 -0.232 -0.171 0.010 -0.089 0.045 -0.006 -0.022 + 2.471 0.811 0.119 0.242 0.069 0.010 -0.066 -0.188 -0.210 -0.008 0.131 -0.048 -0.005 + 2.577 0.824 -0.149 -0.018 0.058 -0.041 -0.162 -0.105 -0.030 0.149 0.084 -0.059 0.087 + 4.703 0.126 0.509 0.289 -0.057 0.191 -0.041 -0.323 -0.082 -0.095 -0.039 -0.204 -0.013 + 7.208 -0.276 0.039 0.290 0.150 0.270 -0.278 -0.392 -0.039 0.015 -0.006 -0.367 0.042 + 5.039 -0.476 -0.274 0.092 0.018 0.311 -0.153 -0.255 0.178 0.268 0.239 -0.249 -0.061 + 2.339 0.025 0.038 0.111 -0.011 0.170 -0.036 -0.016 0.009 0.093 0.123 0.007 0.084 + 3.295 -0.182 0.241 -0.114 0.083 0.088 -0.031 -0.186 -0.260 -0.021 0.022 0.006 0.045 + 3.568 -0.275 -0.018 0.083 0.175 -0.020 -0.060 -0.103 -0.142 -0.126 -0.090 0.015 0.020 + 4.937 -1.005 0.010 0.257 -0.132 -0.074 0.100 -0.302 0.048 0.140 0.043 -0.010 -0.050 + 5.580 -0.798 0.030 0.250 -0.411 0.034 0.108 -0.305 -0.129 0.128 -0.008 -0.054 -0.142 + 5.663 -1.357 -0.157 0.319 -0.189 0.226 -0.027 -0.159 -0.045 0.172 0.073 0.085 -0.091 + 5.147 -0.730 -0.010 0.330 -0.005 0.105 0.021 -0.113 -0.191 0.111 0.056 -0.145 -0.019 + 5.462 -0.142 0.123 0.123 0.164 -0.167 -0.203 -0.410 -0.241 0.222 -0.044 -0.118 -0.040 + 5.039 -0.131 0.498 0.103 -0.175 -0.191 -0.135 -0.133 0.063 0.030 0.017 0.007 -0.005 + 4.652 0.229 0.459 0.187 0.013 -0.229 -0.218 -0.179 -0.089 -0.070 -0.049 -0.137 0.002 + 4.106 0.067 -0.074 0.182 0.007 -0.040 -0.112 -0.210 -0.036 -0.125 -0.117 -0.057 0.019 + 4.200 -0.095 0.077 0.106 -0.064 -0.045 -0.057 -0.132 -0.125 -0.032 -0.092 -0.158 -0.054 + 3.872 0.224 0.103 0.066 -0.201 -0.085 0.047 -0.164 -0.079 -0.073 -0.077 -0.150 -0.228 + 3.791 0.042 0.087 0.049 -0.279 -0.097 0.026 -0.157 -0.175 -0.080 -0.107 0.036 -0.065 + 2.997 0.114 0.026 0.170 -0.056 0.093 -0.097 -0.114 -0.074 0.034 0.022 0.004 0.052 + 2.797 0.253 0.181 0.022 -0.228 0.017 -0.123 -0.130 -0.201 -0.131 0.005 0.046 -0.154 + 3.117 -0.370 -0.054 0.128 -0.281 0.067 -0.218 -0.181 -0.055 -0.147 -0.109 0.108 0.028 + 3.589 -0.339 -0.061 0.013 -0.177 0.107 0.072 -0.156 -0.016 0.041 0.027 0.019 -0.023 + 3.846 -0.115 0.146 -0.246 -0.252 0.199 0.107 -0.127 -0.035 0.037 -0.070 0.029 0.079 + 4.732 -1.154 0.098 0.124 0.140 0.169 -0.182 -0.194 -0.133 0.044 0.044 -0.004 -0.014 + 4.123 -0.857 0.174 0.081 -0.101 -0.021 -0.146 -0.136 -0.020 0.131 0.045 0.046 -0.004 + 5.101 0.351 0.674 -0.036 -0.418 -0.297 -0.354 -0.093 -0.284 -0.135 -0.136 -0.035 -0.002 + 4.679 -0.099 0.329 0.283 -0.116 -0.316 -0.228 -0.269 -0.255 0.082 -0.079 0.054 -0.086 + 6.667 -0.293 0.116 0.159 -0.442 -0.425 -0.181 -0.153 -0.279 0.086 0.007 -0.094 0.124 + 6.740 -0.342 0.208 0.222 -0.649 -0.358 -0.173 -0.294 -0.123 0.122 -0.069 -0.142 -0.000 + 6.019 -0.346 0.231 0.661 -0.842 -0.418 -0.299 -0.295 -0.235 0.063 0.045 0.046 -0.168 + 5.850 -0.282 0.127 0.557 -0.960 -0.465 -0.285 0.039 -0.257 0.023 -0.039 0.052 -0.110 + 4.296 -0.279 0.073 0.439 -0.328 -0.240 -0.270 -0.014 -0.227 0.080 -0.098 -0.017 -0.172 + 3.524 -0.156 0.333 0.252 -0.377 -0.392 -0.214 -0.061 -0.216 0.068 -0.174 0.001 -0.022 + 3.686 0.042 0.635 0.301 -0.294 -0.316 -0.167 -0.202 -0.254 -0.074 0.019 0.044 0.010 + 3.588 0.392 0.436 0.428 -0.356 -0.089 -0.113 -0.023 -0.256 -0.196 -0.104 -0.064 -0.067 + 3.235 0.071 0.288 0.263 -0.203 -0.186 -0.019 -0.066 -0.131 -0.110 -0.366 -0.105 -0.038 + 4.021 0.113 0.233 0.056 -0.389 -0.253 -0.075 -0.211 -0.170 -0.094 -0.211 0.053 0.031 + 3.723 -0.404 0.297 0.191 -0.351 -0.286 -0.184 -0.244 -0.091 -0.254 0.096 0.235 0.027 + 4.949 -0.144 -0.110 0.506 -0.278 -0.586 -0.523 -0.402 -0.024 -0.255 -0.013 0.308 0.143 + 6.283 -0.374 -0.528 0.294 -0.515 -0.526 -0.727 -0.476 -0.069 -0.301 -0.152 0.421 0.081 + 7.131 -0.316 -0.367 0.178 -0.516 -0.353 -0.741 -0.306 0.032 -0.199 -0.330 0.440 -0.091 + 7.342 -0.301 -0.409 0.052 -0.649 -0.369 -0.848 -0.221 0.143 -0.038 -0.330 0.416 -0.201 + 7.286 -0.372 -0.419 -0.027 -0.644 -0.272 -0.688 -0.085 0.295 0.097 -0.426 0.303 -0.241 + 7.419 -0.091 -0.292 0.028 -0.641 -0.327 -0.720 -0.126 0.329 0.188 -0.452 0.209 -0.159 + 7.205 0.048 -0.390 -0.283 -0.760 -0.328 -0.687 -0.216 0.283 0.081 -0.460 0.212 -0.160 + 7.052 0.186 0.292 -0.341 -0.537 -0.237 -0.628 -0.121 0.149 -0.039 -0.092 0.254 -0.241 + 6.561 0.338 -0.023 -0.171 -0.366 -0.197 -0.755 -0.196 0.063 0.040 -0.253 0.337 -0.189 + 5.655 0.709 -0.293 -0.176 -0.313 -0.138 -0.457 -0.236 0.091 0.055 -0.115 0.069 -0.128 + 4.947 0.611 -0.239 -0.126 -0.235 -0.109 -0.345 -0.008 0.208 0.051 -0.279 0.034 -0.118 + 4.956 0.754 0.047 -0.004 -0.362 -0.247 -0.264 -0.196 -0.025 0.195 -0.205 0.089 -0.141 + 4.671 0.590 -0.112 0.008 -0.184 -0.093 -0.208 -0.225 -0.284 -0.072 -0.145 -0.041 -0.180 + 4.510 0.511 -0.340 -0.172 -0.202 -0.315 -0.313 -0.332 -0.188 0.030 -0.120 -0.118 -0.112 + 4.588 0.372 -0.237 -0.182 -0.371 -0.156 -0.260 -0.286 -0.084 0.063 -0.060 -0.068 0.050 + 4.808 0.404 -0.354 -0.160 -0.407 -0.176 -0.298 -0.374 -0.220 0.061 -0.104 -0.030 0.032 + 4.933 0.365 -0.136 -0.119 -0.254 -0.257 -0.302 -0.309 -0.055 -0.001 -0.155 0.009 -0.064 + 5.158 0.418 -0.033 0.012 -0.164 -0.108 -0.237 -0.093 -0.144 -0.035 -0.250 -0.047 -0.084 + 5.228 0.431 -0.180 0.029 -0.162 0.011 -0.192 -0.278 -0.217 -0.156 -0.224 0.016 -0.012 + 5.393 0.600 0.068 -0.322 -0.198 -0.158 -0.216 -0.264 -0.189 -0.064 -0.158 -0.068 0.008 + 5.069 0.835 0.184 -0.225 -0.395 -0.137 -0.300 -0.266 -0.151 -0.067 -0.169 -0.111 0.065 + 7.129 -0.237 0.060 -0.183 -0.281 -0.330 -0.213 -0.198 -0.194 -0.051 -0.129 0.080 0.031 + 6.148 -0.044 -0.043 -0.475 -0.585 -0.430 -0.218 -0.161 -0.207 -0.095 -0.185 0.025 0.034 + 5.101 0.827 0.022 -0.528 -0.507 0.247 -0.334 -0.016 -0.131 -0.304 -0.155 -0.169 -0.133 + 4.992 0.930 -0.042 -0.478 -0.464 0.030 -0.286 -0.039 -0.082 -0.089 -0.111 -0.104 -0.163 + 5.207 1.052 -0.336 -0.661 -0.388 0.078 -0.378 -0.110 -0.171 0.079 -0.015 -0.051 -0.139 + 5.732 1.028 -0.510 -0.660 -0.294 0.262 -0.477 -0.127 -0.060 0.112 -0.110 -0.098 -0.197 + 5.989 0.509 -0.685 -0.441 -0.310 0.283 -0.421 -0.036 0.045 0.010 -0.225 -0.160 -0.315 + 6.623 0.064 -0.914 -0.420 -0.705 0.046 -0.424 0.187 0.203 -0.017 -0.276 0.092 -0.018 + 7.072 0.009 -0.949 -0.169 -0.703 -0.131 -0.545 0.201 0.217 -0.073 -0.273 0.186 -0.147 + 7.442 -0.243 -0.859 -0.113 -0.696 -0.218 -0.401 0.379 0.122 0.033 -0.218 0.263 -0.124 + 7.023 -0.462 -0.800 -0.001 -0.836 -0.430 -0.257 0.198 -0.040 0.131 -0.155 0.032 -0.272 + 6.806 -0.404 -0.502 0.269 -0.739 -0.455 -0.144 0.152 -0.125 0.254 -0.236 0.019 -0.174 + 6.514 -0.543 -0.385 0.327 -0.851 -0.513 -0.164 0.021 -0.266 0.042 -0.113 0.148 -0.015 + 5.840 -0.702 -0.262 0.444 -0.608 -0.442 0.070 0.001 -0.165 0.015 -0.093 0.143 -0.056 + 4.838 -0.355 -0.477 0.301 -0.349 -0.133 0.136 -0.189 -0.229 0.031 -0.120 0.049 -0.043 + 5.229 -0.383 0.040 0.158 -0.176 -0.132 -0.204 -0.126 -0.023 -0.090 -0.185 -0.110 0.031 + 5.389 -0.291 0.235 -0.067 0.018 -0.056 -0.267 -0.150 -0.041 -0.105 -0.213 -0.015 -0.002 + 7.062 -0.525 0.272 0.186 -0.134 -0.109 -0.459 -0.296 -0.162 -0.151 -0.147 -0.158 -0.108 + 7.790 -0.834 0.078 0.288 -0.033 0.034 -0.284 -0.262 -0.183 -0.161 -0.055 0.003 -0.151 + 7.371 -0.501 -0.063 0.041 -0.005 -0.067 -0.275 -0.176 -0.055 -0.025 0.066 -0.115 -0.091 + 7.401 -0.248 -0.128 -0.172 -0.163 -0.047 -0.100 -0.299 -0.109 0.020 -0.076 -0.262 -0.068 + 6.283 -0.085 -0.373 0.027 -0.558 0.046 -0.035 -0.074 -0.133 0.039 -0.110 -0.167 -0.049 + 6.338 -0.227 -0.335 0.201 -0.534 -0.229 -0.256 -0.343 -0.270 -0.099 -0.003 0.143 -0.090 + 8.060 -0.383 -0.304 0.217 -0.330 -0.142 -0.310 -0.198 -0.031 0.087 -0.004 0.089 -0.129 + 6.399 -0.537 -0.201 0.184 -0.275 -0.010 -0.168 0.004 -0.273 0.069 0.052 0.091 -0.069 + 4.853 0.048 -0.055 0.225 -0.223 -0.100 -0.080 -0.211 -0.307 0.053 0.073 0.030 -0.057 + 5.730 -0.532 -0.101 0.472 -0.664 -0.170 -0.118 -0.041 -0.171 0.084 0.117 0.049 -0.026 + 5.904 -0.373 -0.109 0.381 -0.503 -0.075 -0.304 -0.125 -0.273 -0.024 0.039 0.150 -0.031 + 6.211 -0.424 -0.335 0.243 -0.498 -0.165 -0.227 -0.253 -0.237 0.207 -0.071 -0.021 -0.182 + 6.143 -0.356 -0.084 0.412 -0.325 -0.080 -0.109 -0.418 -0.446 -0.009 -0.341 -0.128 -0.134 + 6.735 -0.522 -0.098 0.376 -0.117 -0.019 -0.207 -0.322 -0.385 -0.139 -0.246 -0.039 -0.149 + 6.516 -0.635 0.047 0.441 -0.062 -0.116 -0.113 -0.187 -0.265 -0.203 -0.178 -0.162 -0.345 + 5.985 -0.397 0.387 0.258 -0.243 -0.012 -0.114 -0.353 -0.338 -0.025 -0.256 -0.079 -0.141 + 5.471 -0.436 0.561 0.494 -0.363 -0.059 -0.068 -0.358 -0.274 0.163 -0.248 -0.072 -0.142 + 5.139 -0.505 0.462 0.352 -0.306 -0.051 0.148 -0.329 -0.365 0.035 -0.517 -0.166 -0.094 + 5.228 -0.295 0.681 0.522 -0.368 -0.144 0.201 -0.187 -0.308 0.039 -0.510 -0.195 -0.164 + 6.744 0.023 0.358 0.271 -0.557 -0.117 -0.043 -0.266 -0.268 0.066 -0.299 0.011 -0.014 + 7.109 0.190 0.416 -0.234 -0.609 -0.061 -0.144 -0.376 -0.334 -0.163 -0.190 -0.042 -0.023 + 6.812 0.242 0.224 -0.126 -0.600 0.022 -0.197 -0.369 -0.278 -0.046 -0.235 0.040 -0.079 + 4.897 0.118 0.269 0.009 -0.597 0.021 -0.181 -0.299 -0.232 -0.082 -0.017 -0.057 -0.113 + 4.935 -0.047 0.399 0.195 -0.503 -0.144 -0.326 -0.451 -0.261 -0.142 -0.043 0.144 -0.025 + 4.834 -0.166 -0.004 0.110 -0.631 -0.044 -0.243 -0.254 -0.047 0.102 -0.047 0.225 0.015 + 5.014 -0.486 -0.289 0.044 -0.482 0.177 -0.052 -0.241 -0.179 0.157 -0.039 0.016 -0.083 + 5.096 -0.682 -0.109 0.185 -0.513 -0.017 -0.426 -0.287 -0.168 0.086 -0.087 -0.056 0.023 + 4.672 0.146 0.066 0.280 -0.469 -0.377 -0.478 -0.386 -0.112 -0.002 -0.111 -0.081 0.012 + 2.948 0.113 0.015 0.273 -0.371 -0.092 -0.151 -0.224 -0.093 -0.042 -0.172 0.001 -0.027 + 2.381 0.257 0.129 0.351 -0.195 -0.057 -0.103 -0.078 -0.114 0.074 -0.212 0.078 0.038 + 2.392 0.386 0.107 0.118 -0.181 -0.052 0.005 -0.047 -0.041 0.010 -0.091 0.174 -0.128 + 2.401 0.244 0.090 0.028 0.017 0.074 -0.085 -0.114 -0.019 -0.079 -0.083 -0.194 -0.254 + 2.500 0.167 -0.009 0.010 0.007 0.202 0.011 -0.150 -0.053 0.025 -0.160 -0.056 -0.349 + 3.292 0.321 0.003 -0.104 -0.155 0.035 -0.304 -0.102 -0.102 0.184 0.078 0.030 -0.081 + 5.785 0.405 -0.547 -0.364 -0.427 0.063 -0.833 -0.117 -0.040 0.298 -0.145 0.049 0.018 + 6.724 0.250 -0.586 -0.505 -0.550 0.041 -0.923 -0.060 0.025 0.094 -0.346 0.016 -0.019 + 7.161 0.043 -0.620 -0.363 -0.582 0.144 -0.953 -0.094 0.021 0.032 -0.411 -0.009 -0.099 + 7.201 -0.052 -0.765 -0.274 -0.556 0.235 -0.980 -0.188 -0.095 0.019 -0.411 0.036 -0.126 + 7.383 0.109 -0.723 -0.279 -0.673 0.242 -0.857 0.064 -0.102 0.005 -0.415 0.022 -0.145 + 7.470 0.196 -0.695 -0.277 -0.579 0.219 -0.874 0.006 -0.032 -0.057 -0.445 0.169 -0.177 + 7.488 -0.048 -0.734 -0.386 -0.590 -0.045 -0.971 0.036 -0.085 -0.207 -0.401 0.184 -0.233 + 7.954 -0.202 -0.647 -0.180 -0.509 -0.098 -0.828 0.171 -0.023 0.034 -0.387 0.133 -0.469 + 7.663 -0.082 -0.772 -0.216 -0.753 -0.248 -0.539 0.265 0.115 -0.081 -0.331 0.183 -0.501 + 6.902 -0.159 -0.721 -0.215 -0.806 -0.347 -0.618 0.308 0.213 -0.057 -0.300 0.257 -0.281 + 6.115 -0.050 -0.637 -0.040 -0.627 -0.363 -0.645 0.272 0.109 -0.006 -0.154 0.308 -0.213 + 5.342 0.133 -0.498 0.091 -0.642 -0.518 -0.579 0.184 0.016 0.064 -0.062 0.193 -0.579 + 5.574 0.272 -0.524 0.146 -0.663 -0.518 -0.653 0.213 0.127 0.121 0.129 0.203 -0.199 + 5.434 0.385 -0.483 0.175 -0.712 -0.412 -0.762 0.156 0.166 -0.049 -0.091 0.121 -0.172 + 5.376 0.030 -0.560 0.240 -0.740 -0.267 -0.751 -0.030 0.040 -0.123 -0.011 0.221 -0.101 + 5.024 0.354 -0.550 0.270 -0.539 -0.253 -0.660 -0.072 -0.047 -0.115 -0.067 0.157 -0.126 + 4.649 0.353 -0.290 0.093 -0.330 -0.207 -0.572 -0.080 0.139 -0.076 -0.009 0.331 -0.105 + 4.349 0.327 -0.139 0.071 -0.224 -0.187 -0.628 -0.172 -0.038 -0.167 0.132 0.176 -0.205 + 3.967 0.159 -0.192 0.022 -0.237 -0.092 -0.374 0.080 0.096 -0.075 -0.102 -0.002 -0.117 + 3.824 0.349 -0.181 0.039 -0.186 -0.220 -0.318 0.077 -0.057 -0.024 -0.012 0.091 -0.033 + 3.527 0.151 -0.357 -0.173 -0.194 -0.192 -0.535 0.065 -0.161 0.064 0.063 0.038 -0.035 + 3.795 0.166 -0.274 0.109 0.100 0.006 -0.156 0.061 0.042 0.010 -0.038 0.087 -0.271 + 3.642 0.304 -0.186 0.131 -0.156 0.052 -0.345 -0.001 0.011 0.012 0.043 0.022 -0.199 + 3.766 0.228 -0.236 0.081 -0.097 0.063 -0.364 -0.002 -0.030 -0.103 0.022 0.134 0.001 + 3.438 0.104 -0.320 -0.028 -0.171 0.113 -0.176 0.063 0.042 -0.125 0.040 0.125 0.070 + 3.310 -0.019 -0.480 0.017 -0.112 -0.017 -0.275 -0.096 0.034 0.011 0.089 0.054 -0.057 + 3.341 0.030 -0.516 0.050 -0.071 -0.038 -0.176 0.061 0.175 0.085 0.128 0.168 0.043 + 3.390 0.244 -0.452 0.087 -0.014 0.102 -0.214 0.013 0.006 -0.099 0.090 -0.003 -0.111 + 3.485 0.293 -0.203 0.042 0.043 -0.043 -0.218 -0.060 0.057 0.018 -0.093 0.207 0.072 + 3.237 0.077 -0.350 -0.103 -0.070 -0.020 -0.095 0.038 0.167 -0.021 -0.013 0.062 0.097 + 3.164 0.259 -0.063 -0.070 -0.164 0.053 -0.293 -0.009 0.132 0.024 -0.072 0.096 0.139 + 3.105 0.177 -0.157 -0.094 -0.285 -0.205 -0.164 -0.003 0.027 -0.075 0.070 0.022 -0.043 + 2.999 -0.071 -0.436 -0.103 -0.060 -0.070 -0.168 -0.001 0.050 0.048 0.123 0.050 -0.014 + 3.186 0.147 -0.442 0.003 -0.035 -0.056 -0.258 0.015 -0.024 -0.043 -0.015 -0.051 -0.022 + 3.002 0.193 -0.252 -0.159 -0.005 0.016 -0.155 -0.148 -0.106 -0.088 0.168 0.121 0.029 + 3.002 0.257 -0.139 -0.056 0.017 -0.015 -0.215 -0.105 -0.041 0.028 -0.097 0.208 0.202 + 2.877 0.333 -0.063 -0.032 -0.199 -0.060 -0.124 0.005 -0.039 -0.066 -0.048 0.044 -0.099 + 2.787 0.151 -0.364 0.159 -0.098 -0.200 -0.244 -0.062 -0.020 0.153 -0.033 0.010 0.028 + 2.460 0.033 -0.355 0.029 -0.210 -0.154 -0.126 0.112 0.097 0.141 -0.149 -0.035 0.136 + 2.395 0.144 -0.295 0.043 -0.157 -0.027 -0.253 -0.001 -0.180 0.061 -0.067 0.029 0.057 + 2.528 0.104 -0.304 0.114 -0.124 -0.149 -0.101 -0.129 -0.086 0.077 0.066 0.131 0.036 + 2.164 0.020 -0.270 0.160 -0.015 0.019 -0.128 -0.172 -0.010 0.233 0.117 0.168 0.109 + 2.284 0.277 -0.275 0.242 -0.058 -0.027 -0.203 -0.146 -0.101 0.072 0.085 0.219 0.040 + 2.289 0.226 -0.252 0.135 -0.233 -0.091 -0.119 -0.079 0.011 -0.041 0.122 0.199 0.003 + 2.214 0.175 -0.299 -0.028 -0.305 -0.107 -0.043 -0.112 -0.066 0.089 0.144 0.183 0.030 + 2.008 0.296 0.027 0.142 -0.032 0.048 -0.293 -0.155 -0.047 0.002 0.024 -0.038 -0.044 + 1.586 0.077 -0.193 0.173 -0.164 -0.030 -0.217 -0.054 -0.003 0.074 0.018 -0.040 -0.090 + 1.384 0.114 -0.564 -0.046 0.087 -0.136 -0.202 0.065 0.123 -0.004 -0.028 0.096 0.056 + 1.495 0.265 -0.294 0.095 0.069 0.098 -0.290 -0.153 -0.037 0.017 -0.019 0.037 0.016 + 1.385 0.419 -0.052 -0.002 -0.066 0.048 -0.201 -0.185 0.102 0.031 0.092 0.033 0.043 + 1.442 0.436 -0.297 -0.056 0.070 -0.150 -0.370 -0.158 0.027 0.063 0.192 -0.035 -0.017 + 1.224 -0.086 -0.267 -0.102 -0.335 0.083 -0.035 0.026 -0.073 0.073 0.274 0.185 0.107 + 1.579 0.268 -0.272 -0.346 0.029 0.170 0.031 0.035 -0.153 0.083 0.244 0.203 0.074 + 1.800 0.400 -0.100 -0.286 -0.259 -0.008 -0.181 -0.137 -0.080 -0.042 -0.088 0.162 0.089 + 2.027 0.500 0.034 -0.025 -0.081 -0.035 -0.002 -0.147 0.102 0.172 -0.077 0.052 -0.121 + 1.321 0.490 -0.127 0.007 -0.088 -0.008 -0.238 -0.245 0.128 -0.005 0.076 0.052 0.062 + 1.812 0.350 -0.131 0.434 0.186 0.195 -0.251 -0.299 -0.046 0.112 0.093 0.125 0.055 + 1.507 -0.108 -0.349 0.188 0.268 0.113 -0.090 -0.087 -0.050 0.044 0.011 0.031 0.013 + 2.020 0.490 -0.227 0.219 0.013 -0.034 -0.027 -0.212 -0.168 -0.098 0.028 0.051 0.029 + 2.610 0.544 0.060 0.392 0.008 -0.075 -0.261 -0.349 -0.111 -0.085 0.060 0.007 -0.050 + 2.775 0.000 -0.228 0.163 -0.224 -0.060 -0.161 -0.072 0.040 -0.065 -0.040 -0.001 -0.071 + 2.420 -0.249 -0.174 0.294 -0.150 -0.156 -0.110 -0.211 -0.010 0.069 0.107 0.132 -0.044 + 2.226 -0.072 -0.172 -0.052 -0.214 -0.020 -0.075 -0.109 -0.165 0.042 0.057 0.085 -0.047 + 2.216 0.147 -0.002 0.242 -0.003 0.031 -0.007 0.121 -0.091 -0.025 -0.127 0.004 0.048 + 2.250 0.110 -0.130 0.234 0.024 -0.064 0.094 0.024 0.033 0.036 -0.053 -0.033 -0.153 + 2.525 0.282 -0.429 0.131 -0.056 -0.000 -0.007 -0.205 0.034 0.211 0.156 0.017 0.029 + 2.322 0.024 -0.418 0.059 0.045 0.054 -0.073 -0.283 -0.026 0.050 0.203 0.053 -0.059 + 2.484 0.243 -0.126 0.071 -0.039 0.141 0.049 -0.124 -0.050 -0.014 0.084 0.002 0.028 + 2.399 0.385 -0.442 -0.058 0.076 0.227 0.070 -0.161 -0.078 -0.073 -0.055 -0.054 0.116 + 2.401 0.176 -0.361 0.048 0.172 0.178 0.024 -0.108 -0.023 0.061 -0.123 0.029 -0.022 + 2.772 -0.054 -0.366 0.043 0.098 -0.019 0.021 -0.037 -0.047 0.021 0.074 0.116 0.062 + 2.754 -0.517 -0.389 -0.122 0.067 0.119 0.211 -0.039 -0.035 0.018 -0.105 -0.067 -0.065 + 3.117 -0.817 -0.323 -0.058 0.020 0.145 0.089 -0.102 -0.057 0.202 0.079 0.019 0.056 + 3.579 -1.031 -0.143 -0.036 -0.318 -0.101 0.134 0.182 -0.121 0.307 0.136 -0.052 0.097 + 4.525 -0.730 0.037 0.000 -0.224 -0.013 -0.004 0.121 -0.155 0.114 0.021 -0.061 -0.018 + 4.905 -0.812 -0.080 -0.122 -0.169 -0.064 -0.101 -0.124 -0.225 0.126 -0.088 -0.030 -0.029 + 5.158 -1.067 0.027 -0.094 -0.201 -0.023 0.028 -0.130 -0.052 -0.026 -0.137 -0.009 -0.075 + 5.502 -1.149 -0.046 0.075 0.062 0.002 -0.210 -0.072 -0.123 0.064 -0.122 0.018 0.034 + 5.309 -1.284 -0.238 0.014 0.116 0.047 -0.128 0.081 -0.031 0.158 0.107 -0.007 -0.036 + 5.790 -1.177 -0.063 0.273 0.086 -0.067 -0.359 -0.168 -0.122 0.118 0.047 0.027 0.155 + 5.873 -1.280 -0.178 -0.063 -0.117 -0.176 0.081 -0.148 -0.219 0.230 -0.016 -0.013 -0.056 + 5.855 -1.130 -0.482 -0.039 0.102 -0.045 0.108 0.034 -0.200 0.088 -0.081 -0.156 -0.074 + 5.773 -1.242 -0.413 -0.081 -0.012 0.031 -0.002 0.014 -0.139 0.034 -0.091 -0.129 -0.073 + 5.491 -1.095 -0.271 0.112 0.088 0.017 -0.000 0.069 -0.200 -0.095 0.005 -0.056 0.158 + 5.297 -1.334 -0.118 0.204 0.014 0.030 0.024 0.021 -0.077 0.014 0.060 -0.086 0.075 + 4.699 -1.375 -0.251 -0.021 -0.008 -0.251 -0.004 0.094 0.097 0.137 -0.051 0.037 0.048 + 5.206 -1.122 -0.182 0.000 -0.077 -0.021 -0.115 -0.026 -0.133 0.082 -0.069 -0.045 -0.016 + 5.454 -1.044 -0.242 0.007 -0.116 -0.083 0.133 -0.067 -0.328 0.177 -0.006 0.020 -0.055 + 4.964 -0.795 -0.226 0.062 -0.098 -0.079 0.099 -0.111 -0.243 0.095 0.076 -0.040 0.026 + 4.616 -0.365 0.047 -0.117 0.064 0.066 0.014 0.023 -0.247 -0.004 -0.002 0.088 0.024 + 4.800 -0.377 -0.471 0.351 0.117 0.173 -0.217 -0.226 -0.055 -0.047 -0.015 -0.017 -0.012 + 4.496 -0.461 -0.490 0.270 0.024 0.092 -0.366 -0.156 0.032 0.095 -0.021 0.056 -0.008 + 3.142 0.177 -0.114 0.028 0.126 0.044 -0.155 -0.109 0.012 0.160 0.050 0.045 -0.127 + 2.529 0.230 0.179 0.183 0.052 0.139 -0.041 0.051 -0.033 0.006 -0.007 -0.084 -0.104 + 4.906 -0.620 0.463 0.159 0.194 -0.330 0.055 -0.204 -0.319 0.026 0.040 -0.125 0.191 + 4.592 -0.818 0.389 0.281 0.159 -0.215 0.057 -0.266 -0.187 0.054 0.084 -0.172 0.202 + 2.351 0.018 -0.042 -0.071 0.093 0.239 0.109 -0.287 -0.096 0.021 -0.084 0.220 0.065 + 3.081 -0.303 0.116 -0.180 0.077 0.036 -0.142 -0.320 -0.223 -0.002 -0.083 0.098 0.023 + 3.253 -0.436 0.315 -0.005 0.138 0.353 -0.330 -0.200 -0.119 0.115 0.030 0.091 0.020 + 3.110 0.252 0.262 0.093 0.068 -0.055 -0.184 -0.137 -0.141 0.001 -0.049 0.110 -0.075 + 2.867 0.223 0.182 0.277 -0.137 -0.102 -0.186 -0.175 -0.087 -0.036 -0.024 0.141 -0.000 + 4.543 0.087 0.262 0.260 -0.324 0.018 -0.200 -0.096 -0.093 0.007 -0.046 0.132 -0.142 + 9.861 -0.297 0.566 0.217 -0.052 -0.205 -0.238 -0.166 -0.075 -0.246 -0.081 0.058 -0.245 + 12.345 -0.380 0.412 0.442 0.002 -0.284 -0.445 -0.161 -0.317 -0.352 -0.184 -0.104 -0.339 + 13.929 -0.458 0.120 0.624 -0.284 -0.205 -0.645 0.010 -0.585 -0.313 -0.282 0.037 -0.346 + 14.748 -0.547 0.135 0.641 -0.405 -0.248 -0.724 0.066 -0.640 -0.314 -0.266 0.020 -0.371 + 14.912 -0.590 0.153 0.673 -0.436 -0.240 -0.789 0.091 -0.679 -0.325 -0.288 0.064 -0.470 + 14.911 -0.665 0.206 0.721 -0.408 -0.286 -0.759 0.053 -0.690 -0.318 -0.297 0.075 -0.496 + 14.667 -0.597 0.223 0.709 -0.386 -0.269 -0.744 0.036 -0.694 -0.267 -0.328 0.088 -0.528 + 13.997 -0.511 0.215 0.682 -0.286 -0.208 -0.691 0.032 -0.609 -0.254 -0.381 0.122 -0.511 + 12.119 -0.109 0.125 0.196 -0.327 -0.337 -0.351 0.134 -0.427 -0.191 -0.392 0.060 -0.348 + 7.671 0.195 0.558 0.403 0.020 -0.095 -0.151 0.193 -0.263 -0.017 -0.374 0.017 -0.287 + 6.307 0.322 0.534 0.626 0.131 -0.040 -0.313 0.375 -0.221 -0.095 -0.363 0.193 -0.430 + 6.107 0.459 0.630 0.791 0.091 -0.083 -0.328 0.246 -0.156 -0.073 -0.190 0.216 -0.435 + 5.988 0.563 0.541 0.716 0.057 -0.070 -0.340 0.343 -0.205 -0.087 -0.285 0.250 -0.385 + 7.369 0.175 0.420 0.420 0.418 -0.010 -0.081 -0.278 -0.249 -0.128 -0.265 0.139 -0.328 + 11.081 -0.511 0.330 0.191 0.103 -0.219 -0.198 -0.201 -0.206 -0.296 -0.272 -0.017 -0.444 + 11.855 -0.867 0.424 0.278 0.064 -0.392 -0.281 -0.047 -0.242 -0.329 -0.133 -0.020 -0.310 + 12.547 -0.465 0.225 0.380 -0.092 -0.342 -0.368 -0.040 -0.438 -0.337 -0.298 0.032 -0.466 + 13.393 -0.339 0.073 0.544 -0.092 -0.432 -0.418 -0.139 -0.560 -0.297 -0.165 -0.020 -0.480 + 13.453 -0.145 0.031 0.660 -0.236 -0.412 -0.479 -0.113 -0.557 -0.277 -0.181 -0.073 -0.484 + 13.565 -0.063 -0.081 0.715 -0.407 -0.321 -0.506 -0.118 -0.500 -0.284 -0.232 -0.064 -0.501 + 13.135 0.040 -0.157 0.730 -0.349 -0.282 -0.525 -0.071 -0.490 -0.278 -0.250 -0.062 -0.537 + 12.013 0.099 -0.144 0.626 -0.109 -0.290 -0.373 -0.025 -0.442 -0.326 -0.279 0.009 -0.563 + 8.713 -0.020 0.263 0.591 0.096 -0.264 -0.296 0.097 -0.327 -0.237 -0.307 0.165 -0.424 + 5.951 0.349 0.607 0.620 0.199 -0.272 -0.015 0.241 -0.072 -0.241 -0.162 0.046 -0.387 + 6.095 0.238 0.391 0.331 0.028 -0.010 0.182 0.378 -0.120 -0.139 -0.217 -0.202 -0.338 + 6.048 0.302 0.743 0.207 0.046 -0.157 -0.051 0.225 -0.106 -0.228 -0.198 -0.115 -0.314 + 5.696 0.170 0.685 0.008 0.126 -0.173 -0.039 -0.167 -0.090 -0.171 -0.107 -0.163 -0.167 + 5.822 -0.069 0.893 0.234 0.252 -0.148 0.078 -0.199 -0.188 -0.309 -0.063 -0.247 -0.228 + 5.976 -0.219 0.854 0.184 0.115 0.033 0.010 0.117 -0.188 -0.276 -0.075 -0.327 -0.348 + 8.700 -0.469 0.521 -0.130 -0.111 0.097 -0.094 -0.010 -0.070 -0.027 -0.128 -0.146 -0.319 + 10.366 -0.584 0.598 0.003 -0.120 -0.115 -0.210 -0.112 -0.180 -0.168 -0.166 -0.112 -0.351 + 11.212 -0.781 0.611 0.238 -0.062 -0.470 -0.243 -0.008 -0.273 -0.459 -0.062 -0.016 -0.432 + 12.582 -0.500 0.220 0.381 0.057 -0.468 -0.346 -0.179 -0.296 -0.414 -0.156 -0.039 -0.428 + 13.656 -0.382 0.088 0.486 -0.309 -0.296 -0.459 -0.050 -0.559 -0.329 -0.173 -0.003 -0.382 + 14.085 -0.342 -0.003 0.684 -0.399 -0.250 -0.604 -0.051 -0.612 -0.273 -0.325 0.058 -0.413 + 14.383 -0.318 -0.088 0.684 -0.413 -0.298 -0.590 -0.043 -0.620 -0.298 -0.340 0.060 -0.413 + 14.441 -0.288 -0.073 0.632 -0.401 -0.348 -0.536 -0.125 -0.561 -0.349 -0.347 0.057 -0.405 + 14.048 -0.197 -0.117 0.642 -0.237 -0.352 -0.583 -0.078 -0.537 -0.364 -0.430 0.146 -0.437 + 13.398 -0.258 0.057 0.518 -0.066 -0.378 -0.579 -0.039 -0.407 -0.405 -0.470 0.184 -0.322 + 12.120 -0.122 0.234 0.273 -0.169 -0.346 -0.535 0.208 -0.265 -0.303 -0.480 0.003 -0.268 + 12.344 -0.252 0.326 0.423 -0.123 -0.253 -0.670 -0.039 -0.375 -0.286 -0.459 0.061 -0.296 + 12.637 -0.308 0.157 0.547 0.026 -0.277 -0.527 -0.163 -0.478 -0.361 -0.412 0.214 -0.137 + 12.748 0.007 -0.098 0.716 -0.192 -0.310 -0.547 -0.133 -0.421 -0.266 -0.437 0.174 -0.192 + 13.207 0.118 -0.266 0.668 -0.347 -0.180 -0.606 -0.054 -0.456 -0.350 -0.370 0.143 -0.275 + 13.601 0.075 -0.308 0.717 -0.452 -0.179 -0.655 -0.041 -0.503 -0.309 -0.345 0.143 -0.388 + 13.540 0.112 -0.390 0.774 -0.475 -0.204 -0.695 0.019 -0.477 -0.227 -0.374 0.135 -0.508 + 13.074 0.157 -0.391 0.840 -0.449 -0.167 -0.695 0.056 -0.375 -0.090 -0.483 0.074 -0.487 + 11.586 0.479 -0.543 0.817 -0.359 -0.094 -0.500 0.051 -0.211 -0.202 -0.530 -0.031 -0.369 + 7.432 0.775 -0.325 0.411 0.097 0.008 -0.154 0.067 -0.252 -0.061 -0.421 -0.344 -0.373 + 5.600 0.699 0.077 0.616 0.395 -0.044 -0.341 0.026 -0.159 -0.091 -0.331 -0.228 -0.404 + 5.770 0.879 0.084 0.453 0.401 -0.006 -0.198 -0.048 -0.166 -0.109 -0.400 -0.073 -0.448 + 5.330 0.704 0.259 0.514 0.391 -0.083 -0.157 0.021 -0.218 -0.015 -0.262 -0.192 -0.420 + 5.642 0.454 0.095 0.523 0.299 -0.067 -0.231 -0.058 -0.185 -0.236 -0.277 -0.046 -0.305 + 5.969 0.321 -0.059 0.266 0.050 -0.048 0.077 0.070 -0.033 0.028 -0.245 -0.121 -0.236 + 8.598 0.115 -0.441 0.163 -0.187 -0.181 0.020 -0.003 -0.005 -0.014 -0.416 -0.336 -0.241 + 6.319 0.407 -0.053 0.212 -0.094 -0.088 0.040 0.056 -0.023 0.023 -0.361 -0.305 -0.190 + 4.850 0.320 0.310 0.346 0.064 -0.122 -0.119 -0.071 -0.163 0.019 0.071 0.190 -0.179 + 4.847 0.240 0.016 0.211 -0.045 -0.188 -0.217 0.118 -0.118 -0.065 -0.028 -0.092 -0.087 + 4.793 0.083 -0.098 0.153 0.038 -0.179 -0.187 -0.091 -0.236 -0.164 -0.074 -0.076 -0.183 + 4.704 0.065 0.008 0.221 -0.008 -0.289 -0.134 -0.005 -0.227 -0.097 -0.160 -0.103 -0.127 + 5.033 -0.024 -0.179 0.255 0.097 -0.131 -0.048 -0.047 -0.282 -0.050 -0.012 -0.015 -0.192 + 5.289 0.072 -0.210 0.227 0.049 -0.175 -0.129 0.003 -0.219 -0.063 -0.119 0.137 -0.006 + 5.082 0.129 0.038 0.191 -0.122 -0.124 -0.203 -0.096 -0.081 -0.197 -0.055 0.095 -0.115 + 5.219 0.049 -0.032 0.115 -0.040 -0.078 -0.098 0.085 -0.157 -0.057 0.163 0.154 -0.134 + 5.335 0.010 -0.036 0.157 0.013 -0.137 -0.119 0.047 -0.070 0.054 -0.012 0.046 -0.043 + 5.636 0.060 -0.240 0.089 -0.024 0.044 -0.100 -0.093 -0.289 -0.276 -0.106 -0.008 -0.037 + 5.676 0.149 -0.202 0.133 -0.005 -0.207 -0.156 -0.071 -0.241 -0.101 -0.041 0.058 -0.019 + 5.860 0.184 -0.366 0.078 0.004 -0.064 -0.156 -0.174 -0.142 0.014 -0.052 0.009 -0.051 + 6.170 0.091 -0.083 0.236 0.081 -0.059 0.006 -0.111 -0.194 -0.149 -0.042 -0.096 -0.100 + 5.929 0.033 -0.043 0.133 -0.030 -0.188 -0.231 -0.044 -0.152 0.135 0.007 0.028 -0.068 + 6.065 0.062 0.017 0.075 0.131 -0.036 -0.235 -0.163 -0.167 0.024 0.086 0.079 -0.131 + 6.393 0.017 -0.052 0.258 0.145 0.014 -0.079 -0.143 -0.260 0.029 0.116 0.101 -0.067 + 9.469 0.005 -0.318 0.245 -0.126 -0.273 -0.686 -0.486 -0.210 -0.026 -0.123 -0.227 -0.039 + 9.175 0.146 -0.257 0.135 -0.089 -0.345 -0.968 -0.720 -0.094 0.160 0.017 -0.230 0.104 + 7.788 -0.562 0.061 0.223 -0.269 -0.873 -0.602 -0.359 0.278 0.481 0.266 -0.343 0.051 + 7.824 -0.274 -0.513 0.016 -0.029 -0.353 -0.432 -0.075 0.130 0.159 -0.022 -0.265 -0.099 + 9.996 0.317 -1.146 -0.331 -0.336 -0.057 -0.383 -0.085 -0.200 0.269 -0.013 -0.200 0.089 + 12.329 0.825 -1.190 -0.852 -0.340 0.079 -0.435 0.216 -0.355 0.243 -0.355 -0.305 -0.057 + 12.946 0.858 -1.402 -0.655 -0.379 0.038 -0.346 0.226 -0.302 0.277 -0.582 -0.241 -0.061 + 13.531 0.542 -1.440 -0.304 -0.515 -0.088 -0.315 0.161 -0.148 0.277 -0.650 -0.190 -0.004 + 13.694 0.644 -1.359 -0.276 -0.490 -0.215 -0.278 0.096 -0.134 0.159 -0.503 -0.211 -0.047 + 14.416 0.358 -1.272 -0.136 -0.495 -0.437 -0.277 0.170 -0.089 0.091 -0.508 -0.102 -0.143 + 14.057 0.524 -1.064 -0.035 -0.477 -0.623 -0.351 0.172 -0.188 0.063 -0.431 0.101 -0.281 + 13.989 0.491 -0.847 0.289 -0.534 -0.655 -0.541 0.166 -0.425 0.076 -0.469 0.220 -0.338 + 13.116 0.463 -0.685 0.639 -0.444 -0.660 -0.580 0.017 -0.492 0.016 -0.547 0.332 -0.381 + 12.539 0.403 -0.572 0.814 -0.361 -0.506 -0.424 -0.115 -0.469 -0.090 -0.676 0.303 -0.386 + 12.496 0.565 -0.482 0.760 -0.355 -0.602 -0.464 -0.218 -0.472 -0.054 -0.587 0.325 -0.411 + 13.256 0.316 -0.416 0.811 -0.454 -0.590 -0.457 -0.160 -0.520 -0.037 -0.448 0.219 -0.450 + 13.631 0.206 -0.435 0.816 -0.576 -0.636 -0.399 -0.086 -0.550 -0.020 -0.413 0.149 -0.465 + 13.548 0.119 -0.326 0.819 -0.658 -0.566 -0.396 -0.084 -0.579 -0.046 -0.358 0.015 -0.418 + 13.414 -0.129 -0.120 0.881 -0.634 -0.535 -0.422 -0.064 -0.541 0.044 -0.316 0.035 -0.383 + 12.802 -0.033 -0.071 0.732 -0.707 -0.419 -0.213 0.037 -0.454 0.040 -0.349 -0.067 -0.375 + 11.928 0.184 -0.033 0.564 -0.609 -0.391 -0.004 0.052 -0.387 0.046 -0.279 -0.139 -0.304 + 10.359 0.646 0.098 0.317 0.035 -0.294 0.099 0.041 -0.364 0.119 -0.376 -0.161 -0.311 + 10.015 0.809 0.113 0.199 0.187 -0.447 0.204 -0.062 -0.260 0.324 -0.598 -0.113 -0.227 + 10.467 0.673 0.166 0.130 0.182 -0.491 0.121 0.014 -0.332 0.280 -0.612 -0.136 -0.158 + 10.694 0.516 0.198 0.205 0.109 -0.503 0.060 -0.017 -0.314 0.231 -0.599 -0.191 -0.116 + 11.222 0.068 0.339 0.341 -0.236 -0.321 -0.060 -0.130 -0.296 0.175 -0.453 -0.201 -0.147 + 11.791 -0.140 0.378 0.334 -0.631 -0.198 -0.097 -0.202 -0.267 0.332 -0.326 -0.242 -0.195 + 11.805 -0.240 0.269 0.381 -0.876 0.001 -0.234 -0.103 -0.401 0.309 -0.291 -0.319 -0.217 + 11.714 -0.353 0.430 0.343 -0.821 0.035 -0.250 -0.113 -0.400 0.167 -0.312 -0.394 -0.191 + 11.586 -0.348 0.505 0.389 -0.736 0.026 -0.296 -0.090 -0.454 0.112 -0.292 -0.391 -0.181 + 11.590 -0.418 0.566 0.418 -0.660 -0.023 -0.301 -0.154 -0.497 0.117 -0.215 -0.347 -0.212 + 11.715 -0.419 0.401 0.526 -0.666 -0.218 -0.201 -0.117 -0.534 0.099 -0.232 -0.301 -0.212 + 11.612 0.037 -0.004 0.573 -0.300 -0.589 -0.102 -0.037 -0.593 0.051 -0.220 -0.339 -0.140 + 11.077 0.419 -0.101 0.353 0.152 -0.706 -0.272 0.063 -0.636 0.026 -0.218 -0.397 -0.051 + 10.416 0.801 -0.207 0.347 0.349 -0.652 -0.324 -0.099 -0.553 0.028 -0.252 -0.352 -0.027 + 10.217 1.055 -0.323 0.409 0.121 -0.537 -0.337 0.023 -0.412 -0.069 -0.367 -0.304 0.020 + 10.704 0.610 0.049 0.271 0.107 -0.569 -0.325 0.093 -0.392 -0.116 -0.313 -0.405 0.088 + 10.819 0.631 -0.029 0.511 -0.058 -0.632 -0.276 0.092 -0.542 0.001 -0.228 -0.358 -0.035 + 11.424 0.328 -0.094 0.831 -0.190 -0.727 -0.226 0.069 -0.507 -0.021 -0.207 -0.224 -0.166 + 11.200 0.155 0.180 0.788 -0.341 -0.543 -0.207 0.111 -0.469 0.034 -0.272 -0.128 -0.145 + 9.417 0.566 0.514 0.525 0.092 -0.272 -0.174 -0.031 -0.239 0.085 -0.581 -0.059 -0.243 + 9.256 0.492 0.595 0.514 0.166 -0.304 -0.129 -0.139 -0.005 -0.198 -0.471 0.043 -0.265 + 9.322 0.540 0.622 0.323 0.128 -0.249 -0.018 -0.132 -0.086 -0.248 -0.486 -0.022 -0.161 + 9.195 0.385 0.756 0.336 0.005 -0.257 0.032 -0.098 -0.217 -0.034 -0.468 -0.075 -0.310 + 8.682 0.417 0.527 0.338 -0.031 -0.429 0.096 0.002 -0.043 -0.016 -0.411 -0.149 -0.268 + 7.702 0.354 0.049 0.273 -0.030 -0.145 0.158 -0.096 0.022 -0.004 -0.273 -0.218 -0.297 + 6.358 0.372 0.183 0.294 -0.070 -0.206 0.082 0.018 0.151 0.062 -0.326 -0.230 -0.235 + 5.847 0.125 -0.081 0.109 -0.197 -0.216 0.186 0.183 0.260 0.101 -0.472 -0.210 -0.188 + 5.254 0.096 -0.007 0.001 -0.333 -0.120 0.074 0.116 0.028 -0.011 -0.466 -0.174 -0.186 + 9.107 -0.779 -0.147 0.181 -0.483 0.095 -0.394 -0.015 -0.092 -0.194 -0.044 -0.139 -0.132 + 11.707 -1.464 0.131 -0.173 -0.313 0.078 -0.391 -0.254 -0.073 -0.144 -0.182 -0.070 -0.234 + 12.255 -2.321 0.533 -0.007 -0.265 0.045 -0.368 -0.187 -0.063 -0.177 -0.068 -0.149 -0.170 + 12.408 -2.807 0.653 0.120 -0.482 0.158 -0.089 -0.290 0.001 -0.085 0.002 -0.077 -0.174 + 12.780 -2.699 0.550 0.309 -0.461 0.084 0.019 -0.219 -0.147 -0.274 -0.131 -0.174 -0.119 + 12.748 -2.500 0.418 0.414 -0.418 0.050 -0.024 -0.289 -0.200 -0.194 -0.028 -0.136 -0.312 + 12.519 -2.437 0.248 0.494 -0.202 -0.075 0.006 -0.025 -0.093 -0.230 0.001 -0.054 -0.284 + 12.791 -2.228 0.415 0.562 -0.326 -0.146 0.022 -0.023 -0.111 -0.238 -0.014 0.037 -0.085 + 12.106 -2.009 0.167 0.704 -0.545 -0.156 -0.059 -0.065 -0.091 -0.304 -0.205 0.141 -0.098 + 10.358 -1.293 0.126 0.980 -0.448 -0.130 0.044 -0.078 -0.070 -0.109 -0.182 0.035 -0.188 + 12.689 0.575 -0.516 0.274 -0.408 -0.647 -0.246 -0.218 -0.131 -0.192 -0.205 0.057 -0.236 + 14.627 0.471 -0.894 0.232 -0.518 -0.797 -0.324 -0.129 -0.224 -0.064 -0.201 0.203 -0.291 + 15.281 0.122 -0.813 0.084 -0.663 -0.832 -0.452 0.085 -0.224 0.059 -0.211 0.140 -0.367 + 15.462 0.049 -0.904 -0.006 -0.681 -0.750 -0.606 0.231 -0.327 0.061 -0.230 0.152 -0.426 + 15.488 -0.124 -0.828 -0.250 -0.580 -0.775 -0.488 0.415 -0.328 0.179 -0.325 0.046 -0.463 + 15.174 -0.242 -0.773 -0.249 -0.493 -0.783 -0.483 0.412 -0.298 0.219 -0.269 0.023 -0.413 + 14.856 -0.245 -0.790 -0.269 -0.497 -0.823 -0.440 0.388 -0.328 0.193 -0.233 0.003 -0.377 + 14.229 0.002 -0.624 -0.192 -0.434 -0.954 -0.403 0.231 -0.321 0.189 -0.147 0.024 -0.361 + 12.811 0.124 -0.062 0.115 -0.598 -1.103 -0.212 0.048 -0.276 0.167 -0.197 0.104 -0.355 + 10.743 -0.220 0.222 0.246 -0.579 -0.994 -0.168 -0.204 -0.321 0.126 -0.117 0.077 -0.184 + 8.176 -0.133 -0.212 0.045 -0.445 -0.664 -0.046 0.229 -0.045 0.305 0.091 -0.002 -0.201 + 7.172 -0.070 0.011 0.044 -0.688 -0.778 -0.380 0.332 -0.059 0.034 0.112 0.179 -0.350 + 6.753 -0.210 -0.033 0.083 -0.410 -0.785 -0.268 0.352 -0.108 0.098 0.130 0.157 -0.188 + 7.785 -1.173 0.134 0.364 -0.578 -0.244 -0.592 0.106 0.044 -0.076 0.073 -0.008 -0.200 + 8.243 -1.231 -0.024 0.135 -0.566 -0.113 -0.579 0.027 0.219 0.071 0.089 -0.138 -0.257 + 6.364 -0.179 -0.115 -0.081 -0.378 -0.618 -0.437 0.150 0.123 0.178 -0.038 -0.019 -0.154 + 6.268 -0.289 -0.151 -0.304 -0.430 -0.523 -0.316 0.371 0.177 0.268 -0.058 -0.055 -0.124 + 6.433 -0.198 -0.136 -0.161 -0.264 -0.678 -0.507 0.406 -0.025 0.104 -0.076 0.079 -0.237 + 10.851 -1.364 -0.067 -0.217 -0.184 -0.075 -0.441 0.003 -0.060 -0.230 -0.239 0.024 -0.042 + 11.475 -1.293 -0.278 -0.321 -0.341 -0.164 -0.507 -0.039 -0.124 -0.170 -0.153 0.061 0.005 + 8.586 -1.260 0.083 -0.411 -0.244 -0.052 -0.344 0.112 -0.084 -0.086 -0.101 0.023 -0.039 + 9.614 -0.887 0.537 -0.499 -0.281 -0.005 -0.469 0.048 -0.199 -0.096 -0.163 -0.123 -0.117 + 10.890 -0.474 0.531 -0.115 -0.327 -0.255 -0.401 -0.190 -0.328 -0.301 -0.117 -0.185 -0.242 + 12.153 -0.140 0.378 0.259 -0.332 -0.531 -0.691 0.178 -0.724 -0.061 -0.224 0.002 -0.372 + 12.656 0.113 0.134 0.178 -0.377 -0.641 -0.657 0.084 -0.582 -0.167 -0.162 0.062 -0.240 + 12.772 0.110 0.168 0.132 -0.556 -0.612 -0.667 0.106 -0.412 -0.125 -0.164 0.076 -0.215 + 13.121 0.178 -0.204 0.066 -0.489 -0.561 -0.815 0.204 -0.422 -0.007 -0.192 0.321 -0.351 + 13.332 0.147 -0.358 -0.107 -0.393 -0.630 -0.809 0.300 -0.233 0.030 -0.235 0.312 -0.455 + 13.306 0.162 -0.387 -0.204 -0.353 -0.621 -0.846 0.258 -0.130 0.065 -0.293 0.321 -0.372 + 13.037 0.314 -0.242 -0.356 -0.406 -0.459 -0.826 -0.024 0.045 0.162 -0.464 0.412 -0.339 + 12.327 0.164 -0.185 -0.385 -0.298 -0.393 -0.527 -0.183 0.169 0.201 -0.536 0.195 -0.123 + 11.416 0.080 -0.451 -0.557 -0.303 -0.312 -0.514 -0.017 0.202 0.135 -0.521 -0.015 -0.090 + 10.398 -1.473 0.690 -0.596 -0.005 -0.198 -0.365 0.124 0.180 0.013 -0.243 -0.134 -0.018 + 10.456 -2.030 0.997 -0.687 0.155 -0.020 -0.158 -0.059 0.006 -0.166 -0.128 -0.124 -0.033 + 9.918 -2.050 1.212 -0.749 -0.021 -0.079 -0.124 -0.019 0.036 -0.150 -0.220 0.052 -0.001 + 10.014 -1.980 1.153 -0.726 0.051 -0.236 -0.319 -0.081 -0.202 -0.121 -0.263 0.105 -0.014 + 9.797 -1.854 1.064 -0.552 0.058 -0.423 -0.227 0.045 -0.106 -0.063 -0.164 -0.049 -0.260 + 8.645 -1.625 0.692 -0.533 0.087 -0.305 -0.253 -0.078 -0.189 -0.015 0.027 0.053 -0.034 + 7.806 -0.852 0.536 -0.560 -0.184 -0.411 -0.409 -0.244 -0.287 -0.247 -0.155 0.094 -0.074 + 8.013 -0.834 0.310 -0.332 -0.231 -0.058 -0.485 -0.098 -0.354 -0.160 -0.357 -0.197 -0.215 + 9.198 -1.256 0.486 -0.263 -0.369 0.034 -0.530 -0.081 -0.317 -0.238 -0.272 -0.293 -0.232 + 10.381 -1.978 0.731 0.152 -0.568 0.076 -0.350 -0.013 -0.162 -0.093 -0.237 -0.174 -0.096 + 12.469 -1.735 0.441 -0.150 -0.707 -0.023 -0.312 -0.106 -0.171 -0.160 -0.157 -0.179 -0.215 + 12.916 -1.440 0.096 -0.179 -0.794 -0.081 -0.356 -0.215 -0.208 -0.245 -0.203 -0.063 -0.192 + 12.006 -0.243 0.227 0.403 -0.408 -0.305 -0.419 -0.320 -0.083 -0.174 -0.364 0.024 -0.082 + 11.765 0.694 -0.265 0.341 -0.023 -0.562 -0.649 0.014 -0.530 0.003 -0.507 -0.001 -0.085 + 11.708 0.587 -0.286 0.360 -0.001 -0.391 -0.978 0.358 -0.627 -0.043 -0.407 0.040 -0.095 + 11.264 0.365 -0.269 0.635 -0.013 -0.283 -0.805 -0.018 -0.410 -0.085 -0.435 0.046 0.027 + 9.203 0.263 -0.071 0.827 0.188 -0.436 -0.700 -0.068 -0.356 -0.121 -0.383 -0.003 0.102 + 6.832 -0.120 0.304 0.577 0.075 -0.160 -0.247 0.078 -0.013 -0.057 -0.405 -0.124 0.212 + 6.721 -0.399 0.480 0.760 0.248 -0.095 0.011 0.010 -0.059 -0.162 -0.348 -0.333 -0.083 + 7.811 -0.261 0.101 0.565 -0.150 -0.013 -0.204 -0.100 0.019 -0.078 -0.320 -0.091 -0.085 + 12.181 -0.322 -0.335 0.481 -0.251 -0.288 -0.698 0.022 -0.329 -0.093 -0.382 0.160 -0.146 + 12.988 0.022 -0.368 0.106 -0.128 -0.765 -0.637 0.021 -0.313 0.043 -0.294 0.205 -0.067 + 13.053 0.151 -0.439 0.065 -0.096 -0.947 -0.610 -0.025 -0.314 0.143 -0.306 0.339 -0.133 + 13.354 0.173 -0.490 0.108 -0.249 -0.942 -0.584 -0.009 -0.337 0.137 -0.258 0.281 -0.171 + 13.472 0.012 -0.353 0.202 -0.331 -0.897 -0.535 0.020 -0.364 0.065 -0.145 0.160 -0.118 + 13.067 0.049 -0.289 0.332 -0.371 -0.821 -0.604 0.177 -0.509 0.057 -0.075 0.027 -0.056 + 12.857 -0.026 -0.211 0.367 -0.321 -0.801 -0.538 0.057 -0.502 0.107 -0.174 0.079 -0.078 + 12.497 0.009 -0.208 0.430 -0.302 -0.790 -0.519 0.118 -0.675 0.173 -0.205 0.057 -0.100 + 12.231 -0.004 -0.194 0.415 -0.095 -0.863 -0.502 0.205 -0.789 0.136 -0.185 -0.038 -0.125 + 12.032 0.092 -0.072 0.241 0.293 -0.834 -0.558 0.168 -0.779 0.067 -0.387 -0.023 -0.216 + 11.373 0.619 -0.043 -0.036 0.243 -0.416 -0.411 -0.169 -0.745 0.204 -0.450 -0.264 -0.202 + 10.458 0.900 0.215 -0.367 0.033 -0.241 -0.119 -0.159 -0.809 0.058 -0.442 -0.029 -0.134 + 9.945 0.855 0.471 -0.427 -0.213 -0.294 -0.002 -0.081 -0.774 0.027 -0.474 -0.034 -0.090 + 9.993 0.836 0.516 -0.374 -0.272 -0.353 -0.076 0.048 -0.793 0.011 -0.451 -0.148 -0.108 + 10.493 0.806 0.467 -0.370 -0.406 -0.362 -0.161 0.115 -0.847 -0.062 -0.423 -0.176 -0.071 + 11.001 0.966 0.286 -0.503 -0.419 -0.358 -0.187 0.072 -1.003 0.016 -0.293 -0.084 -0.083 + 11.808 0.834 0.099 -0.441 -0.367 -0.342 -0.297 -0.048 -0.865 0.074 -0.148 -0.019 -0.118 + 12.169 0.900 -0.200 -0.543 -0.425 -0.360 -0.292 -0.221 -0.718 0.247 0.025 -0.017 -0.111 + 12.541 0.868 -0.504 -0.592 -0.408 -0.321 -0.392 -0.320 -0.504 0.270 0.060 -0.139 -0.112 + 12.813 0.824 -0.676 -0.504 -0.465 -0.399 -0.385 -0.380 -0.321 0.437 0.126 -0.262 -0.129 + 13.071 0.645 -0.834 -0.309 -0.487 -0.382 -0.396 -0.391 -0.204 0.490 -0.010 -0.355 -0.112 + 13.257 0.520 -0.963 -0.306 -0.626 -0.385 -0.368 -0.224 -0.112 0.429 -0.257 -0.203 -0.069 + 13.428 0.283 -0.788 -0.192 -0.748 -0.161 -0.599 -0.135 -0.093 0.434 -0.395 -0.129 -0.056 + 13.056 0.310 -0.674 -0.229 -0.665 -0.191 -0.587 -0.184 -0.111 0.445 -0.366 -0.086 -0.026 + 12.647 0.332 -0.596 -0.208 -0.685 -0.152 -0.761 -0.222 -0.175 0.619 -0.388 -0.051 0.033 + 11.954 0.118 -0.314 0.044 -0.537 -0.038 -0.864 -0.326 -0.458 0.638 -0.373 -0.093 0.049 + 10.548 0.153 -0.039 0.071 -0.288 0.041 -0.609 -0.276 -0.531 0.330 -0.338 -0.209 -0.024 + 10.989 0.149 -0.094 0.084 -0.313 0.139 -0.759 -0.235 -0.464 0.299 -0.457 -0.087 -0.029 + 11.850 0.031 -0.176 0.153 -0.496 0.054 -0.808 -0.288 -0.348 0.407 -0.456 -0.055 0.046 + 12.362 0.012 -0.238 0.087 -0.497 -0.074 -0.931 -0.255 -0.307 0.468 -0.464 0.009 0.064 + 12.642 -0.012 -0.290 0.064 -0.477 -0.196 -0.954 -0.256 -0.221 0.455 -0.410 -0.010 0.102 + 12.728 0.094 -0.467 0.233 -0.443 -0.357 -0.873 -0.252 -0.184 0.350 -0.359 -0.111 0.076 + 12.507 0.404 -0.655 0.123 -0.040 -0.487 -0.902 -0.062 -0.317 0.177 -0.194 -0.146 -0.078 + 11.682 1.104 -0.893 -0.226 0.278 -0.377 -0.996 -0.063 -0.211 -0.008 -0.206 0.055 -0.265 + 10.922 1.355 -0.784 -0.377 0.355 -0.246 -0.991 -0.228 -0.205 -0.010 -0.296 0.133 -0.267 + 10.332 1.567 -0.727 -0.508 0.317 -0.205 -0.846 -0.418 -0.209 0.030 -0.333 0.102 -0.170 + 9.890 1.837 -0.675 -0.588 0.121 -0.032 -0.719 -0.461 -0.232 -0.091 -0.269 0.133 -0.151 + 10.130 1.987 -0.766 -0.645 0.069 -0.129 -0.558 -0.367 -0.287 -0.205 -0.237 0.161 -0.181 + 10.146 1.775 -0.595 -0.654 0.066 -0.174 -0.504 -0.259 -0.396 -0.255 -0.181 0.221 -0.187 + 9.831 1.417 -0.544 -0.646 0.047 -0.259 -0.498 -0.295 -0.391 -0.381 -0.056 0.300 -0.218 + 10.626 1.430 -0.570 -0.766 0.206 -0.482 -0.349 -0.275 -0.525 -0.284 -0.087 0.255 -0.310 + 10.794 1.188 -0.402 -0.698 0.180 -0.417 -0.356 -0.211 -0.513 -0.251 0.095 0.060 -0.315 + 10.394 1.107 -0.525 -0.614 0.134 -0.439 -0.361 -0.354 -0.507 -0.246 0.215 0.030 -0.394 + 11.021 1.189 -0.715 -0.446 0.092 -0.569 -0.398 -0.459 -0.466 -0.130 0.202 -0.009 -0.475 + 11.426 1.010 -0.627 -0.126 -0.049 -0.553 -0.420 -0.421 -0.370 -0.023 0.139 -0.186 -0.289 + 11.651 0.714 -0.522 0.014 -0.156 -0.389 -0.507 -0.504 -0.280 0.128 -0.168 -0.113 -0.152 + 11.949 0.338 -0.408 0.099 -0.239 -0.285 -0.747 -0.389 -0.359 0.288 -0.292 -0.076 0.028 + 12.312 0.088 -0.241 0.042 -0.319 -0.218 -0.806 -0.316 -0.336 0.315 -0.401 -0.078 0.047 + 11.885 -0.029 -0.119 0.059 -0.251 -0.100 -0.612 -0.297 -0.253 0.321 -0.487 -0.144 0.087 + 11.125 -0.517 0.548 -0.189 -0.108 -0.024 -0.715 -0.129 -0.162 -0.043 -0.472 -0.116 -0.013 + 10.291 -1.458 0.922 -0.293 0.245 -0.085 -0.666 -0.058 -0.237 -0.079 -0.463 0.007 -0.030 + 9.920 -1.769 1.273 -0.287 0.086 -0.065 -0.590 -0.135 -0.247 -0.084 -0.466 0.025 -0.013 + 10.002 -1.860 1.285 -0.426 0.031 -0.051 -0.581 -0.120 -0.238 -0.080 -0.265 0.033 -0.090 + 10.606 -1.609 1.030 -0.502 -0.095 0.108 -0.597 0.090 -0.009 -0.011 -0.370 -0.090 -0.122 + 10.401 -1.571 0.827 -0.227 -0.263 0.257 -0.816 0.025 -0.065 -0.113 -0.283 0.102 0.119 + 9.293 -0.732 0.352 0.295 -0.427 0.077 -0.622 -0.153 0.252 -0.218 -0.201 0.077 0.104 + 8.472 0.469 0.151 -0.077 -0.192 -0.277 -0.248 -0.108 0.089 0.018 -0.391 -0.078 -0.003 + 8.515 0.538 0.163 0.126 0.367 -0.247 -0.139 -0.076 0.044 -0.250 -0.341 -0.226 -0.122 + 8.966 0.699 0.093 0.083 0.309 -0.273 -0.047 -0.149 -0.073 -0.089 -0.281 -0.262 -0.283 + 9.478 0.455 0.133 0.097 0.303 -0.204 -0.173 -0.121 -0.073 0.022 -0.150 -0.307 -0.291 + 9.974 0.509 -0.164 0.330 0.391 -0.409 -0.102 -0.109 -0.192 -0.047 -0.157 -0.239 -0.243 + 9.961 0.086 0.124 0.324 0.443 -0.314 -0.095 -0.034 -0.505 0.161 -0.230 -0.193 -0.286 + 9.788 0.169 0.251 0.144 0.395 -0.360 -0.025 -0.028 -0.584 0.089 -0.219 -0.166 -0.141 + 10.316 0.438 0.175 -0.149 0.195 -0.381 -0.166 -0.130 -0.474 0.119 -0.016 -0.244 -0.088 + 11.061 0.666 0.025 -0.338 0.038 -0.471 -0.401 -0.111 -0.605 0.271 -0.000 -0.232 -0.051 + 11.465 0.605 0.129 -0.447 0.134 -0.383 -0.503 -0.113 -0.627 0.378 -0.098 -0.256 -0.024 + 11.629 0.584 -0.018 -0.279 0.198 -0.447 -0.525 -0.109 -0.643 0.407 -0.104 -0.401 0.079 + 11.946 0.458 -0.105 -0.218 0.182 -0.416 -0.539 -0.090 -0.610 0.318 -0.133 -0.391 -0.018 + 11.659 0.502 -0.072 -0.214 0.194 -0.454 -0.502 -0.148 -0.643 0.344 -0.202 -0.348 -0.041 + 11.526 0.592 -0.157 -0.204 0.278 -0.513 -0.501 -0.162 -0.670 0.319 -0.258 -0.351 -0.075 + 11.563 0.601 -0.257 -0.067 0.319 -0.488 -0.507 -0.240 -0.674 0.226 -0.234 -0.366 -0.079 + 11.714 0.577 -0.306 -0.102 0.199 -0.346 -0.512 -0.282 -0.644 0.154 -0.183 -0.493 0.039 + 11.471 0.589 -0.221 -0.059 0.237 -0.244 -0.485 -0.109 -0.654 0.239 -0.316 -0.321 -0.049 + 11.190 0.419 -0.100 -0.095 0.225 -0.201 -0.385 -0.180 -0.474 0.155 -0.219 -0.399 -0.077 + 10.461 0.351 -0.104 -0.229 0.138 -0.165 -0.396 -0.095 -0.501 0.260 -0.122 -0.291 -0.067 + 10.141 0.046 -0.107 -0.223 0.025 -0.286 -0.599 -0.089 -0.587 0.305 -0.138 -0.348 -0.015 + 10.139 0.088 -0.332 -0.106 0.095 -0.422 -0.576 0.104 -0.363 0.246 -0.176 -0.366 0.039 + 11.133 0.164 -0.453 -0.192 -0.080 -0.344 -0.596 0.143 -0.493 0.229 -0.193 -0.339 0.032 + 11.558 0.113 -0.673 -0.247 -0.099 -0.543 -0.732 0.213 -0.510 0.238 -0.171 -0.328 0.096 + 12.210 0.148 -0.705 -0.082 -0.153 -0.636 -0.761 0.230 -0.391 0.351 -0.110 -0.231 0.203 + 12.489 0.199 -0.844 0.060 -0.282 -0.903 -0.631 0.194 -0.219 0.207 0.029 -0.192 0.232 + 13.211 0.131 -0.651 0.125 -0.244 -0.875 -0.557 0.318 -0.205 0.105 0.023 -0.316 0.139 + 12.978 0.196 -0.826 0.325 -0.435 -0.656 -0.515 0.325 -0.243 0.158 0.035 -0.163 0.047 + 12.593 0.155 -0.877 0.526 -0.715 -0.540 -0.377 0.449 -0.340 0.279 0.001 -0.087 -0.053 + 12.301 0.079 -0.596 0.459 -0.786 -0.598 -0.237 0.429 -0.424 0.358 -0.041 -0.140 -0.071 + 11.931 0.295 -0.592 0.490 -0.796 -0.628 -0.128 0.380 -0.552 0.493 -0.174 -0.084 -0.140 + 11.316 0.333 -0.342 0.308 -0.613 -0.521 0.094 0.140 -0.523 0.493 -0.198 -0.200 -0.076 + 10.381 0.366 0.004 -0.072 -0.280 -0.390 0.011 0.106 -0.381 0.382 -0.431 -0.111 0.007 + 9.576 0.511 -0.194 -0.298 -0.012 -0.612 -0.062 0.197 -0.318 0.251 -0.275 -0.009 -0.079 + 8.855 0.333 -0.060 -0.073 0.230 -0.613 0.059 0.149 -0.268 0.085 -0.287 -0.008 -0.032 + 8.041 -0.233 0.366 0.039 0.187 -0.720 0.046 0.018 -0.258 0.034 -0.374 -0.218 -0.101 + 6.923 0.094 0.076 0.548 -0.376 -0.461 -0.330 0.192 -0.229 -0.044 -0.197 -0.153 -0.025 + 6.673 -0.023 -0.054 0.612 -0.485 -0.320 -0.190 0.214 -0.413 -0.361 -0.223 -0.068 -0.038 + 6.633 -0.069 -0.139 0.657 -0.405 -0.169 -0.198 0.109 -0.355 -0.186 -0.150 -0.084 -0.078 + 6.754 0.049 -0.064 0.737 -0.303 -0.110 -0.383 0.163 -0.415 -0.194 -0.117 -0.130 -0.035 + 6.692 0.099 -0.115 0.753 -0.233 -0.303 -0.537 -0.000 -0.340 -0.296 -0.199 -0.022 0.055 + 6.535 0.167 -0.092 0.690 -0.153 -0.204 -0.335 0.059 -0.426 -0.262 -0.350 -0.228 -0.082 + 6.214 0.222 -0.081 0.614 -0.044 -0.202 -0.377 -0.031 -0.255 -0.255 -0.310 -0.213 -0.089 + 6.291 0.200 -0.135 0.566 -0.178 -0.243 -0.463 -0.068 -0.324 -0.292 -0.174 -0.213 0.014 + 6.686 0.319 -0.338 0.493 -0.106 -0.206 -0.419 0.049 -0.130 -0.249 -0.269 -0.076 0.045 + 7.230 -0.079 -0.376 0.415 -0.248 -0.029 -0.279 0.001 0.105 -0.195 -0.225 0.024 -0.001 + 7.370 0.086 -0.280 0.408 -0.274 -0.140 -0.389 -0.118 0.096 -0.166 -0.173 0.031 -0.018 + 7.266 0.447 -0.130 0.254 -0.247 -0.205 -0.464 -0.101 -0.063 -0.373 -0.230 -0.174 0.058 + 7.560 0.650 -0.309 0.301 -0.186 -0.269 -0.518 -0.291 0.034 -0.336 -0.374 -0.198 0.003 + 7.376 0.768 -0.424 0.306 -0.115 -0.224 -0.741 -0.253 0.005 -0.364 -0.455 -0.306 -0.020 + 7.591 0.589 -0.496 0.317 0.026 -0.278 -0.699 -0.287 -0.286 -0.303 -0.360 -0.219 -0.055 + 7.660 0.546 -0.533 0.047 -0.158 -0.279 -0.679 -0.346 -0.316 -0.088 -0.276 -0.144 -0.019 + 7.607 0.509 -0.400 -0.136 -0.320 -0.293 -0.514 -0.093 -0.436 -0.282 -0.287 -0.158 0.050 + 7.680 0.302 -0.204 0.134 -0.258 -0.201 -0.356 -0.005 -0.550 -0.188 -0.413 -0.161 -0.056 + 7.722 0.378 -0.157 0.264 -0.330 -0.411 -0.366 0.217 -0.387 -0.196 -0.334 -0.261 -0.217 + 7.748 0.453 -0.243 0.130 -0.324 -0.414 -0.255 0.170 -0.384 -0.270 -0.380 -0.192 -0.101 + 7.812 0.308 -0.197 0.114 -0.394 -0.308 -0.212 0.023 -0.370 -0.119 -0.391 -0.186 -0.217 + 7.794 0.303 -0.282 0.183 -0.411 -0.333 -0.042 0.045 -0.551 -0.361 -0.402 -0.158 -0.141 + 7.914 0.364 -0.355 0.150 -0.539 -0.354 -0.161 -0.027 -0.579 -0.330 -0.224 -0.047 -0.018 + 7.771 0.363 -0.510 -0.075 -0.407 -0.261 -0.182 -0.043 -0.402 -0.133 -0.005 0.084 -0.178 + 7.689 0.246 -0.662 0.105 -0.344 -0.198 -0.224 -0.107 -0.264 0.043 0.008 -0.040 -0.337 + 7.634 0.241 -0.645 -0.024 -0.230 -0.182 -0.213 -0.106 -0.355 -0.009 0.128 -0.087 -0.257 + 7.355 0.011 -0.816 0.107 -0.352 -0.194 -0.346 -0.072 -0.155 0.272 0.244 0.099 -0.361 + 6.920 -0.108 -0.593 0.219 -0.225 -0.323 -0.419 -0.027 -0.228 0.144 -0.033 -0.065 -0.281 + 6.783 -0.362 -0.602 0.134 -0.091 -0.234 -0.254 0.179 -0.262 0.101 0.048 -0.053 -0.300 + 6.500 -0.539 -0.285 0.139 0.001 -0.262 -0.255 0.112 -0.085 0.169 0.034 -0.148 -0.352 + 6.966 -0.466 -0.290 0.192 -0.329 -0.303 -0.319 0.155 -0.193 0.033 0.123 0.060 -0.272 + 7.200 -0.483 -0.454 0.007 -0.279 -0.339 -0.342 0.194 -0.078 0.199 0.106 -0.052 -0.311 + 7.345 -0.426 -0.429 -0.181 -0.421 -0.209 -0.313 0.154 0.049 0.305 0.074 -0.149 -0.207 + 7.242 -0.437 -0.507 -0.374 -0.651 -0.248 -0.264 0.241 0.167 0.221 0.069 -0.001 -0.220 + 7.418 -0.299 -0.488 -0.417 -0.551 -0.288 -0.316 0.219 0.017 0.107 0.047 0.074 -0.322 + 7.545 -0.352 -0.396 -0.366 -0.467 -0.259 -0.351 0.305 0.064 0.016 -0.185 0.014 -0.165 + 7.281 -0.374 -0.290 -0.157 -0.376 -0.242 -0.454 0.254 0.297 0.066 -0.257 0.029 -0.171 + 7.280 -0.409 -0.232 0.061 -0.161 -0.260 -0.465 0.366 0.127 -0.025 -0.143 0.041 -0.195 + 7.051 -0.617 -0.175 0.192 -0.074 -0.170 -0.361 0.434 0.070 0.044 -0.120 0.006 -0.166 + 7.142 -0.361 -0.017 -0.002 -0.263 -0.380 -0.429 0.377 0.184 0.041 -0.227 0.154 -0.054 + 6.744 -0.595 -0.070 0.077 -0.202 -0.465 -0.419 0.329 0.072 0.030 -0.033 0.153 -0.110 + 6.041 -1.077 -0.232 0.183 -0.182 -0.355 -0.283 0.346 0.021 0.002 -0.060 0.009 -0.117 + 5.962 -0.915 -0.384 0.202 -0.072 -0.454 -0.419 0.206 -0.086 0.148 0.037 0.002 -0.107 + 5.910 -1.052 -0.244 0.166 0.130 -0.379 -0.462 0.131 -0.086 0.110 0.205 0.135 -0.162 + 5.832 -1.106 -0.161 0.011 -0.077 -0.226 -0.373 0.117 -0.026 0.037 0.183 -0.022 -0.072 + 5.635 -1.129 -0.113 -0.121 -0.284 -0.375 -0.520 0.157 0.082 0.121 0.193 0.153 -0.067 + 5.709 -1.102 0.088 -0.034 -0.110 -0.241 -0.207 0.253 -0.061 -0.040 0.203 0.074 -0.116 + 5.234 -1.238 0.106 0.058 -0.215 -0.153 -0.165 0.169 -0.115 0.090 0.265 0.169 -0.056 + 5.579 -1.286 -0.164 0.160 -0.119 -0.356 -0.201 0.286 -0.055 0.036 0.181 0.180 -0.075 + 5.793 -1.203 -0.102 0.114 -0.040 -0.417 -0.284 0.411 0.127 -0.023 0.221 0.052 -0.092 + 5.541 -1.065 -0.253 -0.006 -0.129 -0.272 -0.302 0.341 -0.152 -0.133 0.045 0.013 -0.168 + 5.415 -1.081 -0.306 -0.032 -0.194 -0.223 -0.335 0.299 -0.079 -0.046 0.047 0.219 0.039 + 5.281 -1.139 -0.303 0.146 -0.176 -0.348 -0.357 0.165 -0.069 -0.044 0.057 0.077 0.069 + 5.579 -0.594 -0.180 0.161 -0.167 -0.409 -0.453 0.236 -0.120 -0.076 0.089 -0.023 -0.204 + 6.673 -0.059 -0.102 0.102 -0.029 -0.280 -0.577 -0.013 -0.175 -0.156 0.009 0.011 0.072 + 7.412 0.213 -0.147 -0.335 -0.138 -0.156 -0.554 -0.193 -0.109 0.034 -0.016 -0.059 0.054 + 7.622 0.396 -0.469 -0.487 -0.190 -0.339 -0.727 0.014 0.015 0.013 -0.013 -0.069 -0.101 + 7.667 0.447 -0.422 -0.285 -0.350 -0.406 -0.742 -0.211 -0.002 0.109 0.142 -0.176 -0.074 + 7.764 0.644 -0.382 -0.323 -0.323 -0.240 -0.565 -0.250 0.021 0.099 0.115 -0.078 -0.066 + 8.093 0.366 -0.499 -0.173 -0.294 -0.265 -0.530 -0.114 -0.069 0.153 0.103 -0.017 -0.123 + 8.178 0.513 -0.470 -0.197 -0.372 -0.322 -0.584 -0.391 -0.113 0.039 -0.093 0.040 -0.056 + 8.257 0.545 -0.413 -0.205 -0.300 -0.293 -0.842 -0.369 -0.087 -0.071 -0.100 -0.029 -0.110 + 8.107 0.492 -0.430 0.076 -0.308 -0.276 -0.731 -0.270 -0.041 0.040 -0.046 -0.042 -0.087 + 8.065 0.490 -0.467 0.231 -0.205 -0.233 -0.672 -0.302 -0.159 0.054 -0.121 -0.171 -0.106 + 8.076 0.239 -0.255 0.694 -0.304 -0.379 -0.689 -0.237 -0.037 0.037 -0.114 -0.128 -0.083 + 7.655 0.171 -0.280 0.504 -0.439 -0.097 -0.644 -0.223 0.025 0.003 0.044 0.067 -0.083 + 7.026 0.502 -0.118 0.568 -0.167 -0.489 -0.597 -0.276 -0.044 0.032 -0.089 -0.053 -0.126 + 5.818 0.139 -0.310 0.369 -0.034 -0.113 -0.476 -0.103 0.073 0.169 0.005 -0.078 -0.066 + 5.888 0.424 -0.247 0.133 -0.079 -0.350 -0.574 -0.058 0.030 0.170 -0.010 -0.014 -0.096 + 5.472 0.257 -0.326 0.159 -0.106 -0.160 -0.568 -0.189 -0.112 0.150 -0.237 -0.138 0.071 + 6.026 -0.153 -0.434 0.083 0.098 -0.364 -0.442 -0.091 0.044 0.004 -0.127 -0.062 -0.078 + 6.383 -0.190 -0.143 0.013 0.186 -0.600 -0.549 -0.126 -0.025 -0.344 -0.149 0.013 -0.018 + 6.526 -0.281 -0.172 0.140 -0.177 -0.367 -0.331 -0.388 0.056 -0.255 -0.339 0.013 0.000 + 6.500 -0.492 -0.139 0.596 -0.177 -0.220 -0.530 -0.311 -0.014 -0.226 -0.235 0.092 -0.146 + 7.302 -0.294 -0.054 0.630 -0.401 -0.216 -0.690 -0.295 0.011 -0.263 -0.159 0.090 -0.247 + 7.186 -0.520 -0.049 0.737 -0.384 -0.283 -0.607 -0.109 0.115 -0.196 -0.055 0.309 -0.209 + 7.013 -0.358 0.113 0.824 -0.410 -0.306 -0.709 -0.166 -0.065 -0.107 0.042 0.280 -0.257 + 7.080 -0.482 0.021 0.777 -0.452 -0.289 -0.739 -0.177 -0.155 -0.156 0.054 0.276 -0.209 + 7.179 -0.457 -0.084 0.689 -0.527 -0.267 -0.856 -0.236 -0.148 -0.175 0.001 0.046 -0.227 + 7.264 -0.352 -0.079 0.531 -0.676 -0.523 -0.790 -0.075 -0.201 -0.185 -0.102 0.087 -0.338 + 6.363 -0.265 -0.120 0.500 -0.475 -0.522 -0.740 -0.057 -0.050 -0.075 -0.125 0.147 -0.140 + 6.107 0.110 -0.001 0.228 -0.188 -0.261 -0.680 0.018 -0.135 -0.190 -0.279 0.074 -0.224 + 5.970 0.219 -0.039 0.357 -0.075 -0.252 -0.803 -0.081 -0.238 -0.187 -0.236 0.110 -0.228 + 5.788 0.162 -0.026 0.542 -0.019 -0.146 -0.664 -0.129 -0.205 -0.324 -0.274 0.044 -0.163 + 5.096 0.212 -0.071 0.448 -0.199 -0.160 -0.678 -0.172 -0.190 -0.327 -0.183 0.148 -0.237 + 5.014 0.366 -0.081 0.333 -0.092 -0.164 -0.618 -0.197 -0.050 -0.159 -0.280 0.095 -0.078 + 5.226 0.140 -0.070 0.448 -0.110 -0.267 -0.749 -0.138 -0.142 -0.195 -0.177 0.090 -0.168 + 4.878 0.167 0.064 0.500 -0.218 -0.266 -0.562 -0.136 -0.219 -0.187 -0.337 0.111 -0.159 + 4.402 0.131 -0.078 0.358 -0.141 -0.341 -0.560 0.026 -0.187 -0.056 -0.182 -0.056 -0.062 + 4.198 0.055 -0.072 0.375 -0.130 -0.311 -0.497 0.041 -0.167 -0.194 -0.233 0.151 -0.211 + 4.474 -0.033 -0.087 0.428 0.048 0.011 -0.751 -0.112 0.049 0.006 -0.164 0.003 -0.200 + 4.612 -0.141 -0.369 0.368 0.064 -0.007 -0.653 -0.132 -0.053 -0.163 -0.228 0.253 0.050 + 4.301 0.097 -0.220 0.282 -0.180 -0.054 -0.556 0.000 -0.004 -0.080 -0.258 -0.203 -0.147 + 4.559 0.210 -0.307 0.189 -0.276 0.080 -0.536 -0.042 0.129 0.016 -0.229 -0.170 -0.153 + 4.856 0.394 -0.588 0.092 -0.403 -0.191 -0.503 0.119 0.192 0.131 -0.224 -0.242 -0.060 + 5.008 0.387 -0.706 -0.147 -0.296 0.134 -0.641 -0.049 0.195 0.164 -0.125 -0.247 -0.131 + 5.642 0.026 -0.692 0.014 -0.361 0.217 -0.713 0.005 0.300 0.206 -0.299 -0.194 -0.030 + 6.024 -0.036 -0.648 0.009 -0.335 0.236 -0.755 0.006 0.309 0.314 -0.219 -0.126 0.133 + 6.339 0.228 -0.514 0.001 -0.325 0.031 -0.702 -0.014 0.156 0.378 -0.150 0.016 -0.085 + 5.384 0.473 -0.359 0.214 -0.272 -0.185 -0.708 -0.002 0.130 0.302 -0.243 -0.075 0.003 + 4.893 0.690 -0.148 0.300 -0.109 -0.110 -0.777 -0.015 -0.035 0.071 -0.290 -0.143 -0.065 + 4.216 0.716 -0.087 0.051 -0.353 -0.281 -0.677 -0.122 -0.130 0.051 -0.353 -0.154 -0.122 + 3.589 0.306 -0.437 -0.020 -0.200 -0.294 -0.491 -0.032 0.050 0.232 -0.314 -0.179 -0.035 + 3.596 0.276 -0.225 -0.019 -0.061 -0.130 -0.245 -0.112 0.023 0.234 -0.237 -0.115 0.083 + 4.243 -0.330 0.133 0.147 -0.102 0.078 -0.432 -0.169 0.012 0.000 -0.077 -0.133 -0.057 + 3.588 -0.051 0.133 0.093 -0.105 -0.072 -0.239 -0.178 -0.074 -0.064 -0.035 -0.081 -0.166 + 3.216 -0.071 -0.032 0.133 -0.098 -0.080 -0.185 -0.266 -0.217 -0.108 -0.129 -0.070 -0.010 + 3.500 -0.109 -0.073 0.223 -0.087 -0.028 -0.321 -0.210 -0.085 -0.023 -0.061 0.085 -0.021 + 3.976 -0.057 0.134 0.464 -0.117 -0.073 -0.353 -0.154 -0.150 -0.172 -0.201 -0.135 0.073 + 3.950 -0.155 -0.205 0.434 0.069 -0.088 -0.384 -0.130 -0.233 -0.163 -0.204 -0.183 0.037 + 4.062 -0.077 -0.401 0.209 -0.208 -0.380 -0.157 -0.110 -0.207 -0.276 -0.227 -0.078 -0.036 + 4.308 -0.083 -0.548 0.276 -0.237 -0.160 -0.032 -0.116 -0.080 -0.311 -0.214 -0.159 -0.014 + 4.786 -0.215 -0.687 0.260 -0.320 -0.123 0.000 0.171 -0.083 -0.251 -0.145 -0.112 -0.117 + 5.108 -0.181 -0.650 0.471 -0.299 -0.076 -0.036 0.105 -0.135 -0.232 -0.135 -0.313 -0.357 + 5.654 0.022 -0.400 0.487 -0.554 -0.414 -0.175 0.198 -0.022 -0.051 -0.158 -0.300 -0.336 + 6.081 0.094 -0.694 0.272 -0.647 -0.260 -0.323 0.118 -0.103 0.044 0.031 -0.117 -0.273 + 5.418 0.134 -0.653 0.331 -0.648 -0.184 -0.197 0.127 -0.172 0.014 -0.068 -0.159 -0.043 + 5.748 -0.040 -0.547 0.386 -0.847 -0.209 -0.164 0.208 -0.081 -0.013 -0.177 -0.161 -0.204 + 5.745 -0.093 -0.554 0.286 -0.836 -0.313 0.049 0.227 -0.095 0.078 -0.157 -0.105 -0.151 + 5.932 0.014 -0.224 0.296 -0.977 -0.303 -0.032 0.265 -0.162 -0.015 -0.228 -0.097 -0.181 + 5.469 0.076 0.022 0.116 -0.971 -0.096 0.039 0.263 -0.160 -0.131 -0.312 -0.022 -0.206 + 4.988 -0.030 0.114 0.306 -0.766 -0.183 -0.056 0.033 -0.125 0.147 -0.151 -0.052 -0.124 + 4.487 -0.201 -0.159 0.127 -0.765 -0.303 -0.013 -0.100 -0.064 0.144 -0.243 -0.090 -0.072 + 3.816 0.227 -0.340 0.115 -0.479 -0.100 -0.024 0.034 -0.133 0.038 -0.085 -0.093 -0.091 + 3.765 -0.010 -0.499 0.415 -0.254 -0.349 -0.081 0.096 0.003 -0.033 -0.243 -0.106 -0.117 + 4.811 -0.505 -0.537 0.283 0.196 -0.075 0.075 0.128 -0.059 -0.090 -0.183 -0.004 -0.001 + 5.778 -1.184 -0.290 -0.051 -0.033 -0.079 -0.102 0.086 0.091 -0.155 -0.162 0.070 -0.013 + 6.523 -1.523 -0.300 0.073 -0.097 -0.048 -0.144 -0.215 -0.089 -0.106 -0.272 -0.019 0.024 + 6.999 -1.637 -0.250 0.270 -0.172 -0.207 -0.165 -0.023 -0.121 -0.137 -0.169 -0.004 -0.188 + 7.419 -1.510 -0.204 -0.030 -0.226 -0.140 -0.259 0.049 0.164 -0.159 -0.103 -0.016 -0.052 + 7.873 -1.473 -0.176 0.253 0.016 -0.169 -0.160 -0.051 0.046 -0.029 -0.036 0.043 -0.119 + 8.003 -1.322 -0.302 0.184 -0.051 -0.233 -0.185 0.001 -0.041 -0.189 -0.391 0.076 0.029 + 8.055 -0.812 -0.498 0.054 0.011 0.037 -0.306 0.122 -0.096 -0.098 -0.321 0.175 0.054 + 7.355 -0.020 -0.357 -0.026 0.144 -0.037 -0.167 0.018 -0.014 -0.004 -0.260 0.080 -0.016 + 9.279 0.784 0.333 0.009 -0.151 -0.429 -0.569 -0.112 -0.020 0.158 -0.427 0.094 -0.060 + 11.291 0.704 0.079 -0.181 -0.277 -0.345 -0.782 -0.151 -0.086 0.285 -0.392 0.133 -0.083 + 12.124 0.657 -0.173 -0.366 -0.306 -0.273 -1.054 0.034 -0.162 0.369 -0.403 0.158 -0.189 + 10.834 1.000 -0.257 -0.041 -0.308 -0.454 -1.159 0.145 0.174 0.250 -0.275 -0.130 -0.184 + 10.935 0.859 -0.304 0.034 -0.338 -0.408 -0.984 0.157 -0.039 0.331 -0.311 -0.136 -0.095 + 10.908 0.827 -0.354 -0.200 -0.252 -0.334 -0.890 0.069 0.015 0.374 -0.217 -0.139 -0.291 + 11.154 0.776 -0.406 -0.331 -0.243 -0.295 -0.863 0.109 -0.008 0.403 -0.190 -0.154 -0.264 + 11.658 0.744 -0.497 -0.393 -0.335 -0.242 -0.807 0.145 -0.045 0.439 -0.223 -0.202 -0.226 + 12.190 0.659 -0.546 -0.432 -0.326 -0.284 -0.694 0.123 -0.157 0.568 -0.339 -0.156 -0.265 + 12.435 0.518 -0.544 -0.430 -0.354 -0.240 -0.601 -0.011 -0.076 0.535 -0.298 -0.234 -0.244 + 12.406 0.583 -0.643 -0.388 -0.369 -0.294 -0.467 -0.060 -0.131 0.571 -0.298 -0.232 -0.264 + 12.076 0.609 -0.592 -0.459 -0.341 -0.328 -0.404 -0.069 -0.151 0.592 -0.258 -0.231 -0.323 + 11.958 0.571 -0.522 -0.496 -0.345 -0.331 -0.371 -0.092 -0.162 0.566 -0.202 -0.212 -0.342 + 12.006 0.626 -0.529 -0.480 -0.401 -0.303 -0.324 -0.171 -0.136 0.538 -0.146 -0.227 -0.340 + 11.934 0.766 -0.617 -0.383 -0.464 -0.206 -0.408 -0.103 -0.220 0.525 -0.133 -0.180 -0.384 + 11.927 0.738 -0.532 -0.336 -0.511 -0.213 -0.321 -0.130 -0.258 0.513 -0.138 -0.118 -0.386 + 11.636 0.845 -0.545 -0.328 -0.572 -0.268 -0.105 -0.153 -0.313 0.452 -0.117 0.011 -0.392 + 11.351 0.791 -0.385 -0.425 -0.624 -0.302 0.061 -0.238 -0.279 0.366 -0.080 0.041 -0.286 + 11.093 0.742 -0.313 -0.480 -0.613 -0.441 0.224 -0.188 -0.243 0.148 -0.090 0.125 -0.121 + 10.210 0.824 -0.094 -0.400 -0.649 -0.629 0.461 -0.007 0.069 -0.318 -0.155 0.126 0.019 + 8.990 0.529 0.454 -0.345 -0.431 -0.502 0.393 -0.093 0.154 -0.221 -0.366 0.036 -0.034 + 7.876 -0.294 0.071 -0.013 -0.135 -0.411 0.153 -0.120 0.020 0.101 -0.268 0.027 -0.155 + 7.286 -0.329 0.018 -0.156 -0.120 -0.063 0.138 0.035 0.103 0.014 -0.302 0.004 -0.116 + 7.239 -0.291 0.102 -0.148 -0.106 0.093 -0.004 0.178 0.118 0.147 -0.232 0.027 -0.081 + 7.239 -0.361 0.334 0.077 0.051 -0.114 -0.166 -0.024 -0.107 0.143 -0.125 0.142 0.078 + 7.602 -0.617 0.446 0.086 -0.035 -0.262 -0.014 -0.046 -0.131 0.106 -0.056 0.141 -0.146 + 7.652 -0.707 0.399 0.003 0.162 -0.219 0.193 -0.034 -0.220 0.028 -0.167 -0.121 -0.203 + 7.569 -0.554 0.298 -0.001 0.043 -0.253 0.087 0.006 -0.156 0.172 -0.205 -0.111 -0.086 + 7.299 -0.679 0.324 0.169 -0.071 -0.149 0.027 -0.073 -0.141 0.171 -0.177 0.125 0.011 + 7.719 -0.365 0.419 0.017 -0.089 -0.216 0.001 0.038 -0.137 0.130 -0.249 -0.178 -0.067 + 7.997 -0.028 0.173 -0.320 -0.239 -0.152 0.104 0.027 0.063 0.211 -0.184 -0.182 -0.104 + 7.943 0.167 -0.020 -0.498 -0.211 -0.212 0.104 -0.092 -0.006 0.238 -0.010 -0.169 -0.107 + 8.011 0.479 -0.488 -0.733 -0.435 -0.047 -0.060 -0.123 0.012 0.319 -0.069 -0.151 -0.068 + 8.137 0.659 -0.514 -0.611 -0.387 -0.178 -0.226 -0.136 0.146 0.414 -0.073 -0.124 -0.152 + 7.969 0.675 -0.534 -0.722 -0.423 -0.205 -0.212 -0.205 0.170 0.315 -0.205 -0.130 -0.113 + 7.717 0.686 -0.443 -0.628 -0.472 -0.099 -0.131 -0.082 0.216 0.340 -0.272 0.066 -0.019 + 7.528 0.675 -0.503 -0.490 -0.481 -0.139 -0.095 -0.149 0.138 0.340 -0.194 0.024 -0.005 + 7.578 0.672 -0.413 -0.410 -0.462 -0.123 -0.237 -0.232 0.079 0.406 -0.133 -0.003 -0.001 + 7.444 0.710 -0.424 -0.377 -0.482 -0.269 -0.416 -0.187 0.054 0.465 -0.142 -0.211 -0.056 + 7.070 0.569 -0.356 -0.420 -0.516 -0.191 -0.269 -0.218 0.175 0.413 -0.170 -0.132 -0.080 + 6.607 0.358 -0.411 -0.465 -0.416 -0.172 -0.349 -0.298 0.189 0.362 -0.161 -0.305 -0.076 + 6.221 0.349 -0.384 -0.506 -0.341 -0.038 0.014 -0.120 0.120 0.315 -0.197 -0.199 -0.089 + 6.330 0.450 -0.389 -0.521 -0.328 -0.088 -0.124 -0.238 0.102 0.437 -0.083 -0.156 0.042 + 6.493 0.553 -0.294 -0.540 -0.295 -0.060 -0.085 -0.155 0.040 0.291 0.031 -0.145 -0.085 + 6.162 0.282 -0.388 -0.521 -0.215 -0.161 -0.112 -0.143 0.022 0.285 0.003 0.091 -0.135 + 6.167 0.400 -0.266 -0.392 -0.119 -0.051 -0.105 -0.225 -0.092 0.153 -0.116 -0.004 -0.250 + 6.307 0.453 -0.173 -0.272 -0.254 -0.144 -0.174 -0.193 -0.168 0.221 -0.007 -0.085 -0.179 + 6.799 0.156 0.060 -0.191 -0.263 -0.175 -0.323 -0.235 -0.284 0.315 -0.169 -0.047 -0.059 + 7.391 -0.657 0.249 0.341 -0.433 -0.160 -0.403 -0.403 -0.430 0.383 -0.313 0.084 0.021 + 7.760 -0.570 0.277 0.215 -0.842 -0.338 -0.464 -0.469 -0.386 0.480 -0.196 0.265 0.131 + 8.196 -0.541 0.437 0.237 -0.790 -0.246 -0.373 -0.487 -0.592 0.315 -0.216 0.325 0.173 + 8.656 -0.416 0.361 0.377 -0.885 -0.329 -0.409 -0.433 -0.530 0.336 -0.180 0.221 -0.013 + 9.123 -0.552 0.373 0.531 -0.861 -0.296 -0.484 -0.410 -0.560 0.423 -0.168 0.226 0.064 + 9.108 -0.659 0.406 0.376 -0.827 -0.457 -0.536 -0.315 -0.510 0.456 -0.154 0.208 0.074 + 9.149 -0.450 0.530 0.294 -0.817 -0.508 -0.499 -0.337 -0.553 0.391 -0.259 0.120 -0.029 diff --git a/test/regression/chan3-logspec.cepview b/test/regression/chan3-logspec.cepview new file mode 100644 index 000000000..503dec57a --- /dev/null +++ b/test/regression/chan3-logspec.cepview @@ -0,0 +1,2178 @@ + 5.389 4.810 5.125 4.165 3.566 3.932 3.529 4.031 3.448 2.431 5.657 5.540 4.806 5.420 5.056 4.680 4.944 5.669 6.161 5.786 6.441 7.007 7.950 8.784 8.374 7.769 9.344 9.315 9.740 9.657 10.222 9.850 8.788 10.339 9.979 7.982 + 4.629 3.124 3.561 5.456 5.490 4.303 4.407 3.801 3.722 3.877 4.070 4.785 5.405 4.903 5.303 4.862 5.343 5.014 5.953 5.966 6.774 6.947 7.934 7.903 7.103 7.853 10.083 10.235 9.747 10.154 10.467 10.033 9.853 10.023 10.003 8.046 + 4.210 4.083 3.981 5.656 5.662 4.151 5.915 5.171 4.703 4.731 5.825 6.092 4.736 4.585 5.498 4.980 5.532 5.654 5.362 5.721 7.011 7.298 8.233 7.266 6.777 7.853 10.034 9.380 9.298 10.411 9.983 9.865 10.016 10.360 9.645 7.216 + 4.346 3.959 4.195 4.672 5.132 5.597 5.139 5.006 3.870 4.447 6.045 5.108 5.056 6.081 5.626 5.746 6.457 6.671 5.883 6.331 4.831 6.802 8.386 8.448 7.866 9.915 9.605 10.048 10.248 9.989 9.930 9.642 8.986 9.554 9.315 7.037 + 4.688 3.590 4.146 4.361 4.724 5.040 5.558 3.926 4.857 5.482 4.340 5.198 4.924 4.752 4.390 5.545 6.233 6.505 5.984 6.435 5.875 6.785 7.662 8.555 9.455 10.009 7.431 9.247 9.574 9.010 9.013 9.143 9.411 9.079 8.648 7.272 + 2.193 4.558 4.155 5.176 5.156 5.311 4.683 4.231 4.062 5.684 4.990 4.288 4.746 4.326 4.050 6.148 5.951 6.081 6.324 6.449 6.486 7.982 8.861 8.900 9.820 10.296 7.435 8.752 9.227 8.640 10.053 9.391 8.755 9.929 9.690 7.525 + 2.979 4.149 3.978 5.114 4.680 3.806 4.672 4.478 3.464 4.933 5.082 5.314 5.471 5.070 4.637 5.226 5.241 5.261 5.821 6.648 6.645 7.989 8.787 7.079 10.003 9.974 7.731 7.446 7.384 8.648 9.619 9.103 8.871 9.514 9.644 6.964 + 2.761 4.491 5.456 4.913 4.653 5.106 3.900 3.184 3.204 4.609 3.683 2.693 3.776 4.197 5.397 5.598 4.693 6.256 7.283 6.335 6.121 6.610 8.422 7.739 8.930 7.577 7.074 8.081 8.044 8.216 8.396 7.783 7.887 9.454 9.845 6.690 + 3.593 3.991 4.594 4.964 4.881 5.153 5.231 4.091 5.041 4.556 3.479 4.433 2.551 4.561 5.123 6.011 5.923 6.460 6.838 6.676 6.275 6.550 7.757 8.165 7.723 7.129 7.406 8.216 7.999 8.625 8.598 8.521 7.939 8.443 8.252 6.517 + 3.773 3.696 3.852 3.460 4.364 4.005 4.615 4.868 4.112 3.523 3.510 4.283 3.635 5.081 5.401 5.917 7.041 7.996 7.184 6.857 6.897 6.739 7.949 7.371 7.500 6.872 7.322 6.834 6.828 7.322 8.296 7.759 7.619 8.351 8.577 6.534 + 2.162 1.746 3.938 5.254 4.685 4.121 3.940 4.349 3.350 3.067 4.414 5.364 4.497 5.071 5.823 6.553 5.166 6.358 5.794 6.100 6.231 6.237 6.711 7.314 7.740 6.745 5.893 6.790 7.587 7.137 7.380 7.053 7.752 8.009 8.641 6.604 + 5.713 4.351 4.127 3.772 3.693 5.441 5.117 4.609 5.141 4.838 4.155 4.605 3.974 3.331 4.880 5.151 5.350 5.834 6.075 5.800 5.449 5.880 7.669 6.843 5.893 5.384 6.239 7.263 6.259 7.309 7.030 6.299 7.510 8.038 8.022 6.037 + 8.639 8.587 7.690 7.100 5.972 5.349 5.113 5.152 4.688 4.016 3.875 4.215 4.156 5.382 4.734 3.497 3.959 4.723 4.473 4.306 4.382 5.536 6.379 6.016 5.906 7.044 7.401 6.962 6.142 6.908 6.946 6.358 6.577 7.683 8.410 6.175 + 7.683 7.662 6.692 6.305 4.112 4.879 4.603 5.479 5.287 4.827 5.168 3.422 4.302 4.507 3.717 4.480 4.036 4.332 3.459 3.639 4.541 5.122 4.360 5.595 4.928 5.171 5.077 6.252 6.024 5.335 5.173 5.875 4.970 6.198 6.049 4.656 + 5.958 6.560 6.228 4.710 4.065 4.628 4.690 5.296 5.107 5.656 4.684 3.052 4.269 4.714 4.552 3.986 4.838 4.422 4.015 3.832 4.042 4.318 4.238 4.135 5.151 6.214 5.450 5.207 5.771 5.637 5.530 6.237 5.461 6.466 6.632 4.483 + 4.562 4.152 3.670 3.765 5.057 4.952 4.765 3.140 3.092 4.261 4.018 4.462 3.924 4.366 4.388 3.567 3.947 3.754 4.407 3.962 3.240 4.107 4.875 4.880 5.500 5.578 5.324 4.438 5.096 5.318 4.943 5.704 5.328 5.824 6.599 4.278 + 5.047 5.852 5.993 4.169 3.880 4.574 4.410 3.895 4.760 4.032 3.518 2.917 3.795 4.603 4.393 4.846 5.211 4.395 4.010 3.683 3.352 4.124 5.521 5.006 4.397 4.241 3.497 3.939 3.508 3.642 4.625 4.759 4.305 4.651 5.043 3.209 + 3.086 4.834 4.464 4.872 5.053 4.557 4.751 5.155 4.083 2.625 2.963 3.112 1.924 2.029 3.280 4.666 3.955 3.580 4.308 4.315 2.945 3.913 5.088 3.795 4.329 2.935 3.134 4.199 3.050 3.999 4.334 4.342 3.470 3.496 3.347 2.705 + 3.733 3.854 2.862 2.227 3.327 5.077 5.348 3.018 3.551 4.072 2.685 3.165 3.057 3.125 4.357 5.090 4.756 3.279 3.727 3.771 3.707 2.650 4.571 3.201 3.331 3.232 2.770 2.890 3.096 3.292 3.611 2.683 3.064 2.006 2.747 1.738 + 2.745 2.220 2.940 3.731 3.694 5.188 4.711 3.862 2.182 2.186 2.659 3.295 4.128 3.736 3.533 4.918 4.782 3.271 2.590 3.549 4.944 2.985 3.031 3.298 3.624 3.220 3.280 3.460 3.870 2.971 3.599 2.898 2.184 2.052 2.678 1.874 + 3.581 3.086 4.523 5.729 4.243 4.929 4.641 4.905 4.309 4.312 4.014 4.347 3.688 4.477 3.340 4.768 4.071 3.783 2.933 2.394 3.619 3.248 3.499 3.584 3.884 4.180 3.676 3.718 3.977 3.911 3.494 2.737 3.327 2.909 2.803 1.726 + 4.860 4.678 5.475 6.113 5.297 4.935 3.243 3.725 4.619 4.783 4.528 4.317 3.394 3.997 3.764 4.890 4.052 2.723 3.360 3.547 4.064 2.916 3.790 4.009 2.916 4.030 3.723 3.734 3.872 3.241 3.085 3.237 3.102 4.124 4.347 3.008 + 4.668 4.644 5.931 6.140 5.316 6.248 5.703 3.829 3.513 2.220 3.629 4.070 1.415 3.035 3.558 4.154 4.435 4.148 2.908 3.348 2.439 2.770 3.798 4.618 3.113 3.339 3.480 3.643 4.002 4.147 3.353 2.661 3.223 2.526 2.711 2.410 + 4.723 5.778 5.108 5.060 6.203 6.394 6.213 4.665 3.635 1.726 3.474 2.594 2.410 4.449 4.714 2.821 3.680 4.021 3.062 2.456 2.919 3.138 4.102 3.361 4.024 3.693 4.450 2.907 3.282 3.794 3.742 3.225 3.421 3.325 4.150 4.272 + 7.991 7.335 7.256 7.639 7.232 7.424 7.121 7.291 6.736 6.293 6.316 5.990 6.272 5.490 5.623 5.458 4.866 4.805 4.151 3.381 5.268 5.051 4.797 5.928 7.613 9.052 9.720 8.811 8.889 8.733 8.379 8.452 8.341 8.475 8.370 7.526 + 11.920 10.660 10.062 12.050 11.971 9.869 10.993 10.382 8.618 9.713 8.532 7.882 8.053 7.546 7.304 7.425 6.971 7.240 7.661 8.869 9.438 9.317 7.856 8.217 9.603 11.612 12.311 10.689 11.082 10.551 10.215 10.383 10.063 10.340 10.275 9.239 + 12.444 12.817 12.636 13.609 14.162 13.708 12.116 11.380 11.113 10.771 9.923 8.689 8.011 7.992 8.191 8.533 8.649 9.192 9.935 11.689 13.147 12.150 10.641 9.784 10.078 11.386 12.006 10.834 9.999 10.087 11.785 11.967 10.590 8.213 9.304 9.486 + 12.146 13.526 12.921 14.630 15.013 15.678 13.753 12.574 12.058 11.498 10.917 9.790 9.564 9.428 9.469 9.623 10.113 10.639 11.640 13.552 14.984 13.978 12.433 11.887 12.450 13.762 14.012 12.825 12.046 12.340 14.056 14.469 13.312 10.802 11.090 11.581 + 12.715 14.187 13.427 15.045 15.821 16.926 14.886 13.200 13.516 12.853 12.584 11.219 11.381 11.091 11.025 11.042 11.182 11.700 12.753 15.005 16.738 15.162 13.644 13.275 13.902 15.282 15.179 13.638 12.752 13.493 15.576 15.773 15.119 12.948 11.357 12.258 + 13.199 14.493 13.831 15.207 16.841 17.844 15.760 14.184 14.539 13.641 12.969 12.225 11.967 11.914 11.820 11.875 12.129 12.653 13.989 16.130 17.119 15.440 14.283 13.849 14.384 15.371 14.330 13.171 12.923 13.550 15.212 15.355 15.225 13.044 10.293 10.867 + 13.451 14.597 14.030 15.041 17.342 18.286 16.762 15.667 15.107 14.076 13.188 13.119 12.320 12.442 12.363 12.530 12.792 13.358 14.686 16.640 17.325 16.279 14.799 14.779 15.508 15.926 14.288 13.037 13.198 13.687 14.870 15.472 15.805 13.682 9.892 10.621 + 13.604 14.468 14.092 14.732 17.294 18.061 17.661 16.620 15.089 14.467 13.623 13.464 12.508 12.538 12.525 12.728 13.079 13.785 14.832 17.127 17.894 16.486 15.363 15.502 16.310 15.597 13.976 12.835 13.100 13.464 14.564 15.777 16.114 14.005 10.067 10.560 + 13.692 14.367 14.100 14.853 16.845 17.269 18.055 17.165 14.761 14.667 13.981 13.649 12.765 12.537 12.718 12.894 13.381 14.069 15.269 17.316 17.483 16.223 15.630 15.932 15.457 13.790 12.357 11.687 12.397 13.431 14.487 13.873 14.018 11.451 9.200 8.381 + 13.765 14.299 14.249 14.834 16.581 16.995 18.459 17.421 15.442 14.906 14.215 13.733 13.200 13.019 13.166 13.536 14.272 15.363 16.464 17.682 16.465 15.906 16.115 16.161 14.718 12.998 11.906 11.807 12.154 13.053 13.377 12.192 12.588 11.114 8.870 8.202 + 13.946 14.312 14.413 14.939 16.604 17.522 18.851 17.468 15.694 15.528 14.274 13.876 13.430 13.567 13.942 14.837 14.890 17.255 16.789 16.162 15.317 15.292 16.369 15.900 13.800 12.479 11.841 11.967 12.706 14.430 13.877 12.602 13.277 12.228 9.871 6.313 + 14.111 14.144 14.538 14.869 16.764 17.992 18.659 16.557 15.362 15.431 14.501 13.983 13.778 14.189 14.578 16.663 15.944 15.807 14.703 13.556 13.754 14.549 15.869 15.266 12.933 12.048 10.858 11.162 12.168 14.355 13.648 12.378 13.540 12.514 10.062 6.904 + 13.961 13.927 14.373 15.296 17.046 18.022 18.101 15.452 14.949 14.838 14.447 14.226 14.295 15.637 16.443 15.948 13.728 12.803 12.226 11.929 12.189 13.083 15.153 14.500 12.165 11.486 10.284 9.767 10.896 13.499 12.665 11.308 12.342 11.705 9.376 6.041 + 13.678 13.753 14.091 15.440 16.964 17.219 17.273 15.374 14.289 14.165 14.114 14.223 14.711 16.088 15.475 13.855 12.188 11.171 11.045 11.316 11.271 12.333 14.172 13.825 11.222 10.539 9.803 8.201 9.302 12.252 12.039 10.303 11.336 11.000 9.138 6.906 + 13.488 13.514 13.979 15.514 17.150 16.647 16.355 15.142 14.407 13.901 13.703 14.063 14.799 16.655 15.423 13.291 12.108 11.060 10.886 11.243 11.213 12.431 14.023 13.076 10.565 10.032 9.813 7.271 8.681 11.532 11.789 10.080 11.002 10.540 8.431 4.189 + 13.264 13.777 14.186 15.782 17.263 16.539 16.270 15.082 14.398 13.973 13.352 13.680 13.926 16.299 15.796 13.850 12.528 11.425 11.181 11.189 11.468 12.906 14.420 13.403 10.848 10.068 10.566 7.798 8.730 11.738 12.444 10.726 11.690 11.492 9.385 4.701 + 13.766 13.961 14.329 15.534 17.349 16.526 16.119 14.842 14.253 13.802 12.957 13.595 13.541 14.859 15.622 16.024 13.931 12.342 11.906 11.694 12.071 13.490 14.890 13.566 11.351 10.546 10.833 8.791 9.121 12.131 13.279 11.424 11.970 12.001 11.252 5.862 + 13.686 14.098 14.374 15.446 17.406 16.575 16.106 14.817 14.257 13.677 12.858 13.116 13.149 13.278 14.847 15.346 16.136 14.699 13.335 12.925 13.189 14.473 15.770 13.826 11.783 10.819 11.220 9.503 9.362 12.037 13.788 11.833 11.965 11.735 10.728 7.062 + 13.999 14.095 14.194 15.310 17.327 16.369 15.955 14.604 13.886 13.248 12.494 12.443 12.341 12.454 12.943 13.843 15.234 15.870 16.074 14.876 14.497 15.641 16.925 14.598 12.636 11.572 11.763 10.320 9.795 12.095 13.851 13.004 12.903 13.087 11.401 8.327 + 13.841 14.020 14.210 14.930 17.251 16.439 15.902 14.674 13.851 13.193 12.354 12.121 12.036 12.041 12.119 12.723 13.083 14.836 16.088 16.688 16.577 16.592 17.691 16.642 13.609 12.479 12.479 11.372 10.571 12.874 14.783 13.821 13.486 12.988 11.911 8.741 + 13.702 13.997 14.117 14.689 17.157 16.518 16.059 14.869 14.070 13.298 12.325 12.408 11.903 11.767 11.830 11.940 12.496 13.266 14.976 16.616 17.734 17.364 17.953 17.832 15.813 13.811 13.323 12.434 11.790 13.781 15.764 14.903 14.423 14.125 12.887 9.733 + 13.609 13.783 13.778 14.519 16.822 16.269 16.436 14.869 13.857 13.120 12.381 12.290 11.749 11.544 11.421 11.505 11.768 12.802 13.802 15.716 17.687 17.247 16.972 17.218 16.593 14.934 13.868 12.877 11.995 13.653 15.850 14.941 14.023 13.824 12.343 9.673 + 13.530 13.719 13.677 14.387 16.598 16.361 16.933 15.144 14.022 13.388 12.874 12.374 11.832 11.457 11.197 11.464 11.371 12.624 13.128 14.785 17.151 16.902 15.792 15.977 16.433 15.853 14.609 13.666 12.273 13.392 15.581 14.794 13.597 14.311 12.787 10.808 + 13.535 13.807 13.609 14.104 16.422 16.374 17.315 15.807 14.567 13.692 13.336 13.030 12.515 11.914 11.454 11.693 11.980 12.754 13.372 15.109 17.128 16.537 15.316 15.166 15.550 15.805 14.564 12.966 12.754 13.277 14.754 14.282 12.754 13.601 12.612 10.186 + 13.200 13.486 13.382 13.719 15.775 16.179 17.413 15.890 15.166 14.208 13.785 13.240 12.747 12.402 11.821 11.907 12.335 12.654 13.611 15.446 17.007 16.087 14.586 14.278 14.279 15.101 14.076 12.929 13.212 13.357 14.465 13.754 12.641 13.235 12.479 7.725 + 12.829 13.129 13.150 13.515 15.095 15.892 17.120 16.046 15.571 14.419 14.233 13.384 12.936 12.668 12.153 12.041 12.477 12.797 14.270 15.971 16.412 15.353 14.165 13.573 14.395 14.773 13.166 12.899 13.088 13.145 14.145 13.953 13.196 13.547 11.986 7.167 + 12.693 13.155 12.940 13.604 15.066 15.639 17.070 16.061 15.955 14.686 14.236 13.640 13.126 13.027 12.581 12.705 12.943 13.615 15.122 16.390 15.957 14.571 14.005 13.401 14.374 14.240 12.632 13.518 13.561 13.359 13.640 13.245 12.294 12.434 11.017 7.594 + 12.508 13.028 12.733 13.549 15.140 15.703 17.146 16.181 16.024 14.762 14.158 13.750 13.258 13.192 12.988 13.097 13.438 14.477 16.025 16.362 14.945 14.040 13.425 13.391 13.988 13.121 12.053 13.162 12.936 12.545 12.612 12.239 12.329 11.939 9.731 7.185 + 12.346 12.734 12.637 13.338 15.151 15.863 17.064 16.009 15.567 14.531 13.911 13.442 13.023 12.915 12.956 13.268 13.805 15.122 16.491 15.304 13.742 13.170 12.502 13.277 13.196 11.815 11.584 12.636 11.324 11.281 12.449 12.761 12.994 11.998 10.554 8.741 + 11.912 12.291 12.141 12.942 14.926 15.822 16.443 15.199 14.560 14.083 13.304 12.890 12.517 12.432 12.698 13.348 14.326 15.610 15.025 13.190 11.895 11.364 12.042 12.475 12.699 13.072 12.493 11.333 9.560 10.423 11.801 12.292 12.996 12.475 11.982 11.869 + 11.384 12.329 12.076 12.752 14.397 15.171 15.569 14.780 14.050 13.528 12.338 12.321 12.220 12.589 13.139 14.261 15.103 14.164 12.371 12.059 11.018 9.648 11.066 11.824 13.106 13.980 13.500 12.848 12.997 12.743 12.167 12.924 13.758 13.006 11.614 11.857 + 12.931 12.934 13.163 13.441 14.965 16.124 16.645 15.114 14.731 14.223 13.143 12.667 13.129 13.283 14.344 15.528 14.713 13.027 11.845 11.516 10.641 9.790 9.352 10.115 11.502 13.086 14.861 14.336 13.619 13.496 13.190 14.273 14.204 13.019 9.869 8.658 + 13.265 13.098 13.608 13.705 14.720 16.778 17.314 16.484 15.464 14.998 13.826 13.707 14.151 14.441 16.158 15.454 13.610 12.430 11.807 11.085 10.608 9.630 9.949 10.682 11.572 12.745 14.917 14.746 12.455 12.643 14.627 16.072 15.074 12.687 9.629 7.316 + 13.032 12.835 13.478 13.684 14.456 16.935 17.313 17.088 16.001 15.076 13.972 14.218 14.683 16.025 15.814 13.578 12.592 11.288 11.400 10.829 10.593 9.971 9.662 10.177 11.224 12.237 14.473 14.467 12.383 12.165 15.406 16.710 15.993 14.568 9.019 7.986 + 12.659 12.761 13.211 13.612 14.824 16.848 17.096 17.185 15.718 14.861 14.611 14.858 16.059 15.894 14.823 12.079 10.955 10.848 10.239 10.359 10.366 10.163 9.958 9.117 9.864 10.806 13.240 13.574 12.042 11.107 14.634 16.038 15.330 14.231 8.639 7.772 + 12.644 12.637 13.024 13.614 15.058 16.700 16.665 16.927 15.560 14.089 14.835 15.906 15.999 15.098 12.271 11.456 10.828 9.999 9.777 9.807 9.384 9.659 9.973 9.769 9.229 10.381 12.201 13.266 11.730 11.489 14.644 15.850 15.456 14.668 9.379 7.352 + 12.439 12.622 12.978 13.647 15.121 16.742 16.088 16.309 15.677 14.584 15.104 15.796 15.168 13.990 12.344 10.427 9.992 9.490 9.382 9.297 9.355 9.298 9.085 9.432 10.277 11.959 13.320 11.995 11.011 11.081 12.184 13.670 13.971 13.562 8.656 6.561 + 12.430 12.201 12.552 13.725 15.045 16.317 15.446 15.324 15.034 14.155 15.238 15.236 13.924 11.798 10.120 9.478 9.142 9.033 9.043 8.728 8.205 8.027 8.555 8.989 9.651 11.468 13.272 11.862 9.865 9.782 11.030 12.521 13.379 12.637 7.456 6.059 + 12.315 11.859 12.231 13.857 14.810 15.951 14.438 14.162 14.398 13.648 15.206 14.352 12.703 10.472 9.014 8.379 8.856 8.555 8.299 8.298 7.983 7.318 8.074 8.522 9.201 10.994 13.028 11.340 9.286 9.712 10.900 12.229 13.308 12.502 7.205 5.726 + 12.263 11.528 12.104 14.314 15.136 15.734 13.960 13.488 13.861 14.364 15.040 13.725 11.838 10.192 8.980 8.131 8.205 8.346 8.173 8.392 7.921 7.760 8.128 8.143 8.922 10.741 12.874 11.141 9.044 9.485 10.856 11.891 13.251 12.188 7.758 6.075 + 11.906 11.598 12.201 14.458 15.026 15.375 13.981 13.226 13.665 14.552 14.511 12.887 10.869 9.883 9.000 8.265 8.192 8.048 7.901 8.284 8.173 8.167 8.197 8.133 8.834 10.708 12.975 11.337 9.231 9.349 11.003 12.087 13.717 11.870 8.243 6.449 + 11.542 11.315 11.883 14.266 14.719 15.146 14.119 13.291 14.114 14.885 14.390 12.614 10.275 9.393 9.520 8.894 8.835 8.499 7.949 7.831 8.302 8.313 8.578 8.295 9.075 11.004 13.177 11.781 10.088 9.599 11.441 12.680 13.664 11.287 9.055 7.353 + 11.538 11.330 11.825 14.020 14.512 15.446 14.875 13.807 14.392 15.226 14.868 13.387 10.731 10.122 9.412 9.102 9.654 9.431 9.605 8.894 8.397 9.154 9.188 9.384 9.919 11.735 13.630 12.266 10.628 9.752 11.935 12.595 12.942 11.769 9.013 7.474 + 11.578 11.522 11.799 13.487 13.946 15.712 15.891 15.604 15.028 15.341 15.712 15.449 12.833 12.383 11.244 10.028 10.744 10.908 10.178 9.308 9.250 9.842 11.470 11.333 10.774 12.783 14.382 12.999 11.665 11.995 14.917 14.673 13.988 13.411 10.276 9.560 + 11.554 11.310 11.599 12.940 13.666 15.389 16.448 17.228 15.715 15.754 16.834 16.490 16.313 14.619 12.120 11.904 11.791 11.353 11.586 11.406 11.383 11.424 11.246 11.262 11.965 13.707 15.160 13.532 12.292 13.805 16.072 15.516 14.436 13.763 11.376 10.591 + 11.292 10.842 11.368 12.621 13.246 14.088 16.772 17.064 16.756 16.102 15.562 16.460 16.508 15.792 12.789 12.185 12.042 11.750 11.898 11.509 11.182 10.914 10.823 10.978 11.980 14.107 15.235 13.818 12.450 14.465 16.570 15.933 14.541 13.569 10.867 10.550 + 11.334 10.725 11.526 12.143 12.803 13.493 16.280 17.046 17.592 16.158 15.858 16.113 16.691 16.327 12.957 12.558 12.394 11.781 11.867 11.679 11.196 11.058 10.885 11.216 11.586 13.296 15.261 14.373 12.758 15.051 16.926 16.160 14.925 13.504 10.969 9.974 + 11.450 10.890 11.570 11.662 12.807 13.393 15.805 16.954 17.788 16.807 15.844 15.968 16.605 16.874 13.648 13.138 12.510 11.929 12.078 11.726 11.537 11.119 11.042 11.190 11.244 12.420 14.833 14.596 12.807 15.312 17.089 16.313 15.346 13.786 10.803 9.084 + 11.635 11.057 11.605 11.827 12.609 13.285 15.524 16.731 17.882 17.303 16.176 16.018 16.746 17.290 15.160 13.628 12.730 12.129 12.013 11.881 11.550 11.242 11.181 11.098 11.059 12.989 14.566 13.826 12.861 14.753 16.922 16.134 14.846 13.290 10.916 9.329 + 11.622 11.378 11.529 11.711 12.364 13.128 15.084 16.390 17.651 17.215 16.465 15.853 16.160 17.215 16.059 14.286 12.891 12.287 11.864 11.670 11.329 11.347 11.585 11.410 10.854 12.413 14.628 14.248 13.562 14.580 16.777 16.070 14.922 13.097 11.448 10.304 + 11.712 11.555 11.629 11.620 12.350 13.177 15.099 16.265 17.450 16.892 16.099 15.497 15.978 16.957 16.446 14.829 13.057 12.164 11.694 11.367 11.305 11.195 11.426 11.023 9.978 11.793 14.159 13.734 13.016 13.069 15.519 14.880 13.011 11.111 10.410 9.966 + 11.728 11.743 11.869 11.650 12.082 13.005 14.994 15.931 16.975 16.186 15.815 14.978 15.395 16.531 16.852 14.769 13.196 12.139 11.698 11.515 11.353 11.108 11.367 11.065 10.224 10.672 13.083 13.057 12.989 12.177 13.617 13.462 11.903 10.002 9.457 9.518 + 11.748 11.353 11.655 11.277 11.651 12.656 14.753 15.400 15.871 15.062 14.491 13.866 14.355 15.255 16.165 13.698 12.238 11.562 11.075 11.059 10.930 10.652 10.840 10.719 9.854 9.370 12.321 12.572 12.994 11.511 11.648 12.507 11.848 10.315 8.931 8.025 + 11.699 11.457 11.248 11.168 11.469 12.367 13.845 14.962 14.120 13.828 13.772 12.925 13.274 13.959 15.507 14.403 12.503 11.399 11.177 11.043 10.654 10.490 10.848 10.857 10.208 10.487 13.571 13.585 12.713 10.317 10.035 12.037 12.133 10.898 8.987 8.214 + 11.668 11.501 11.174 11.261 11.467 12.603 13.611 15.109 13.567 13.134 13.602 12.192 11.936 12.658 14.824 14.421 13.671 12.061 11.176 11.186 10.845 10.619 11.032 11.546 11.306 11.724 13.561 13.658 12.787 10.327 9.341 11.565 12.220 11.382 8.311 6.681 + 11.593 11.406 11.127 11.130 11.424 12.705 13.417 14.844 13.236 12.377 12.850 11.300 10.824 11.174 12.161 12.533 13.758 13.270 13.031 12.577 12.557 12.794 12.351 12.014 12.047 12.714 13.354 13.196 12.076 9.785 8.765 10.566 11.792 10.906 7.925 5.680 + 11.539 11.218 11.202 10.627 11.022 12.528 12.901 13.669 11.903 11.675 11.931 10.439 9.128 9.627 10.550 10.597 12.078 13.264 13.331 13.538 13.743 13.336 12.154 11.114 11.376 11.557 13.450 13.151 10.399 9.326 7.676 9.830 11.342 10.628 6.586 4.291 + 11.725 11.415 11.238 10.388 10.956 12.331 12.348 12.455 11.034 11.250 11.348 10.076 7.806 7.465 8.881 8.674 9.427 10.141 12.040 13.580 13.745 12.977 10.592 9.637 10.123 11.527 13.426 13.237 10.337 9.120 8.085 9.108 10.913 10.223 6.325 5.872 + 11.554 11.266 11.076 10.427 11.152 11.662 10.904 10.791 10.724 10.962 10.954 10.068 7.090 7.710 8.432 8.237 8.778 9.691 10.813 11.460 11.622 11.839 10.918 8.560 8.236 8.494 10.016 11.063 10.223 9.840 8.404 8.481 11.019 10.686 8.322 9.077 + 11.329 11.304 11.371 10.694 11.273 11.394 10.330 10.156 10.336 9.837 9.917 9.156 7.684 7.858 7.808 8.006 7.839 8.441 8.250 8.839 9.827 11.222 10.433 8.312 6.368 5.700 5.965 7.916 10.422 10.841 7.912 7.786 10.500 10.323 7.842 7.877 + 10.885 10.844 11.246 10.771 10.735 10.746 9.382 9.293 9.627 9.316 9.529 8.394 7.178 7.316 6.871 7.647 7.964 8.118 7.494 8.073 8.431 9.526 8.856 6.813 5.743 4.997 4.921 5.051 8.195 9.857 7.468 7.090 9.569 8.835 6.513 4.777 + 9.974 10.168 10.990 10.169 9.980 10.538 9.237 8.751 8.111 8.773 9.036 7.282 6.187 5.160 5.515 5.847 5.215 6.080 6.946 6.953 5.577 6.143 6.083 5.284 5.326 5.519 5.152 5.306 5.901 7.285 6.002 6.918 7.934 7.667 6.277 5.277 + 9.074 9.785 10.375 8.901 9.173 9.848 7.923 7.930 8.300 8.817 8.595 8.546 5.880 5.352 6.267 5.189 6.389 5.638 6.079 6.419 4.584 5.076 4.340 5.828 6.295 5.346 5.488 5.111 4.348 4.972 6.084 6.501 7.621 8.302 9.002 8.841 + 8.192 9.865 9.904 8.187 7.872 8.764 8.716 6.944 8.279 8.909 9.210 8.859 8.021 7.796 7.938 7.099 7.313 6.447 7.716 8.120 7.865 7.081 6.806 6.748 7.547 7.986 8.114 8.115 7.846 7.892 8.583 9.140 9.807 10.694 11.551 11.414 + 8.553 9.369 10.264 8.696 8.589 9.094 9.773 9.223 9.841 9.847 9.584 9.834 9.788 9.469 8.970 9.153 8.490 8.177 10.161 10.627 9.329 8.821 8.588 8.603 10.076 10.427 10.326 9.969 9.852 9.770 10.412 10.653 11.063 11.090 10.839 10.024 + 9.105 8.994 9.740 10.186 10.476 9.482 10.259 10.258 10.067 9.910 9.102 8.504 8.768 8.216 8.789 8.154 8.865 9.789 11.471 10.846 9.680 8.694 8.035 8.933 10.758 11.052 10.106 9.743 9.860 10.070 9.728 10.509 10.968 11.746 11.388 11.410 + 10.525 9.993 10.690 12.271 12.604 12.167 12.136 12.265 11.878 11.563 10.127 9.549 9.512 10.044 10.321 9.571 10.234 11.730 11.654 11.484 10.495 8.215 8.900 9.907 11.833 12.097 10.340 9.821 10.290 11.425 10.377 10.665 12.366 12.631 11.458 10.655 + 10.562 10.266 10.749 13.040 13.644 14.031 13.388 12.119 11.931 11.567 9.894 10.775 10.476 10.026 10.788 11.264 12.345 13.825 13.218 11.698 10.679 9.946 9.196 10.241 11.923 12.190 10.302 9.971 11.357 12.249 9.988 10.797 13.563 13.084 11.933 11.001 + 10.681 10.555 10.485 12.991 13.421 14.234 12.959 12.655 11.733 11.742 11.163 11.087 10.417 10.570 11.111 11.572 12.326 13.325 12.311 9.582 9.314 9.750 9.380 8.157 11.395 11.687 10.939 9.390 10.462 12.464 10.187 10.260 12.577 12.714 11.556 10.476 + 11.087 9.997 10.082 12.111 13.492 13.913 12.325 11.550 10.739 11.225 10.602 10.087 9.206 9.698 10.173 10.579 11.845 12.572 11.080 8.806 9.013 9.095 9.562 7.709 10.100 11.522 10.910 9.631 11.814 12.199 10.993 10.535 11.869 12.309 12.298 12.374 + 11.253 10.152 9.818 9.048 10.074 10.858 9.066 9.094 10.102 10.560 10.854 10.192 9.740 9.095 9.373 10.204 10.060 11.155 10.868 9.068 9.524 9.132 9.150 9.627 10.295 11.759 10.777 10.662 11.921 12.822 12.512 13.258 13.448 14.043 14.066 14.334 + 8.745 9.354 9.350 9.719 9.765 8.118 9.640 9.373 10.053 9.886 11.007 10.422 8.497 8.804 9.439 8.918 10.033 10.551 9.643 8.612 9.588 9.372 9.348 10.173 10.065 12.048 11.023 10.447 11.387 12.471 12.404 14.052 14.181 14.187 14.820 15.025 + 10.338 10.775 10.379 9.728 8.996 7.902 9.194 9.326 8.480 10.031 10.460 9.605 9.371 10.201 10.827 9.743 9.234 10.875 10.934 9.813 9.084 9.546 10.601 9.254 10.028 11.924 11.145 10.945 11.649 12.002 12.402 14.237 15.126 15.493 15.179 15.025 + 10.579 9.206 9.321 10.405 10.780 9.470 9.988 9.467 9.646 9.458 9.118 9.854 9.684 10.359 10.084 9.809 10.793 11.262 12.303 10.759 10.177 9.836 10.583 9.048 8.921 10.676 10.548 10.990 11.803 12.692 12.059 13.630 14.982 15.751 15.236 15.696 + 10.022 10.395 9.323 9.787 11.079 10.722 9.101 10.179 10.603 10.108 11.095 10.591 9.874 11.031 10.086 10.145 10.943 11.062 11.761 11.037 10.957 11.065 10.682 9.715 9.842 11.453 10.899 10.746 11.173 13.208 13.692 13.493 14.838 16.036 16.066 15.944 + 12.242 12.163 11.261 10.952 11.340 10.029 11.342 11.371 10.224 10.211 10.881 11.111 11.125 11.041 10.125 9.866 10.192 11.318 12.026 12.094 11.637 11.521 10.190 10.220 11.804 11.920 11.849 11.414 11.588 12.460 13.226 13.438 14.801 15.756 15.935 16.584 + 8.658 9.589 8.871 9.967 10.320 10.150 9.467 8.814 9.045 10.234 10.552 10.490 11.236 10.590 9.872 9.751 9.925 10.834 11.636 12.069 11.453 11.783 11.420 10.115 12.226 11.827 12.104 12.139 12.822 13.265 13.304 14.131 15.215 15.727 17.084 16.380 + 10.329 9.864 9.384 8.866 10.169 10.256 9.722 10.206 8.557 9.357 10.204 10.352 10.001 10.303 10.349 11.132 10.608 10.763 11.756 12.631 11.656 11.280 11.549 13.074 12.709 12.261 12.330 12.501 13.212 13.717 14.270 14.873 15.562 16.408 16.324 16.002 + 9.873 8.091 8.274 8.566 9.563 9.858 10.151 10.257 8.478 9.072 10.379 9.909 9.077 10.031 9.364 9.678 9.123 9.542 11.742 12.396 14.039 13.154 12.776 13.094 12.450 11.577 10.982 11.868 12.178 12.179 12.357 12.936 13.221 14.431 15.816 15.194 + 7.343 5.957 6.732 6.840 6.096 6.939 7.124 6.514 6.077 5.965 6.326 6.528 6.491 6.518 6.930 6.490 6.698 7.173 8.760 9.188 11.219 10.434 8.482 6.626 6.537 6.432 6.317 6.241 5.983 5.764 6.815 7.336 7.841 8.282 8.939 10.257 + 4.473 3.927 4.806 3.879 4.452 5.176 5.493 5.146 4.718 5.751 6.052 6.000 5.670 5.328 5.425 6.617 6.248 3.332 5.072 4.397 4.485 4.698 3.931 4.242 2.836 2.890 3.204 2.889 2.927 3.700 3.688 4.450 5.259 6.588 7.066 5.691 + 2.181 2.452 4.004 4.560 6.352 6.490 7.188 6.651 5.458 4.809 6.598 6.583 6.789 5.264 4.820 5.782 4.516 4.312 5.264 4.482 4.330 4.107 3.742 4.015 3.819 2.348 2.990 2.921 3.379 2.948 3.857 4.171 5.075 6.559 7.479 6.019 + 6.664 7.119 7.185 8.698 9.778 10.101 11.261 11.174 11.111 10.661 9.955 9.440 9.402 8.324 6.636 7.791 8.830 9.418 7.921 7.123 8.882 9.553 9.820 9.777 10.201 10.089 9.923 9.419 8.564 8.249 8.923 8.249 8.110 8.409 8.412 7.197 + 8.897 7.592 7.912 9.916 11.620 11.167 11.787 12.526 12.787 11.779 11.265 11.595 11.739 11.611 10.486 8.963 10.872 11.594 10.111 11.305 12.103 12.792 13.502 14.126 14.826 14.541 13.655 13.101 12.349 11.837 12.283 12.096 12.068 12.325 12.347 11.119 + 11.076 11.041 11.464 12.297 13.420 13.779 14.225 12.952 11.993 11.773 10.964 10.418 9.909 10.565 10.401 10.165 10.673 11.359 12.000 13.423 15.091 14.745 13.773 14.721 14.239 15.082 13.313 12.677 13.514 13.088 11.789 11.576 12.521 13.117 12.166 11.696 + 11.996 12.660 11.943 13.050 14.857 16.266 15.634 16.176 15.022 13.248 13.015 12.859 11.835 12.041 12.255 12.605 12.965 14.009 15.775 16.323 16.199 15.630 15.727 14.974 14.142 15.084 14.511 14.471 14.822 12.773 11.029 13.106 15.120 13.835 10.685 9.417 + 12.181 11.796 12.471 12.656 13.842 15.803 16.636 17.439 15.514 14.742 13.843 13.542 12.903 12.619 12.905 13.238 13.979 15.324 16.710 16.776 15.471 15.378 16.113 15.488 13.843 15.094 14.340 14.521 15.189 12.757 12.051 13.825 16.503 15.015 11.077 8.806 + 12.058 11.370 12.180 12.745 13.443 14.461 16.372 17.820 17.768 15.135 14.759 14.313 12.873 13.186 13.247 13.522 14.154 16.384 17.153 15.577 14.798 15.074 16.102 15.799 13.519 14.665 14.284 13.974 15.012 13.177 13.410 13.958 15.455 14.333 11.195 9.856 + 11.988 11.648 12.174 12.597 13.499 14.499 15.534 17.445 17.938 15.593 14.815 14.345 13.109 13.310 13.441 13.839 15.014 17.142 17.020 15.299 14.663 15.016 15.981 15.529 13.452 14.169 14.618 14.120 15.212 13.721 14.713 14.548 15.896 15.071 11.219 9.982 + 12.075 12.158 12.492 13.065 13.792 14.658 15.192 17.707 17.493 16.519 15.892 14.872 13.513 13.659 13.931 14.507 15.776 17.328 16.686 15.134 14.952 15.269 16.153 15.461 13.279 14.356 14.599 13.893 14.778 13.887 15.834 15.686 15.301 13.877 10.810 9.913 + 11.964 11.947 12.235 13.187 14.033 14.344 15.457 17.690 17.035 16.624 15.371 13.717 13.920 13.815 13.831 14.260 16.047 16.903 16.581 14.945 14.631 15.022 15.765 15.005 12.932 15.019 15.230 14.273 14.686 14.032 16.236 16.323 16.129 14.643 9.320 9.458 + 12.078 11.813 11.993 13.065 13.949 14.516 15.711 17.796 16.968 16.256 15.493 13.773 13.643 13.486 13.387 13.992 15.572 17.056 16.884 14.650 14.412 14.808 15.275 14.353 12.534 14.726 14.965 14.082 14.640 13.583 15.543 15.634 15.615 15.031 8.907 8.836 + 11.912 10.850 11.743 12.395 13.329 14.380 16.357 17.649 16.970 15.667 14.548 13.727 12.771 12.703 12.568 13.296 14.587 17.070 16.709 14.237 13.908 14.117 14.415 12.913 11.690 14.316 14.175 12.955 13.906 13.063 14.361 14.816 14.792 14.534 9.469 8.673 + 11.716 11.806 10.759 11.947 13.193 14.659 15.934 16.032 15.394 14.942 12.296 11.340 11.752 11.468 11.243 10.948 11.805 14.248 15.204 13.540 13.561 12.206 11.109 9.421 11.577 11.771 11.259 10.827 11.369 10.689 10.352 11.241 11.330 11.105 9.529 9.269 + 10.472 9.224 9.906 9.390 9.912 10.165 10.715 11.379 10.839 10.478 10.328 9.671 8.883 7.734 6.921 7.460 8.053 9.921 11.303 11.481 10.403 9.307 9.199 10.945 12.008 11.905 11.149 9.956 12.468 11.830 9.871 10.928 11.923 10.963 10.019 10.315 + 12.935 12.315 11.091 11.039 10.022 10.625 10.040 8.922 9.431 8.708 7.790 6.769 6.902 7.400 7.409 7.950 8.325 9.073 10.362 11.962 11.237 9.468 10.457 12.735 14.825 14.777 14.561 13.556 15.097 14.988 12.922 12.391 12.850 12.967 12.600 11.647 + 13.552 13.590 12.830 10.875 10.685 9.958 9.596 8.033 8.397 9.322 8.923 7.723 7.889 7.473 8.152 8.008 8.097 9.395 9.740 11.193 11.140 10.648 12.226 13.869 15.939 16.701 15.481 14.750 15.417 14.825 13.819 14.147 14.317 14.584 13.609 12.902 + 13.153 12.887 11.839 10.807 10.822 9.914 8.738 8.834 9.595 9.662 8.204 8.120 8.470 8.040 8.822 8.162 9.122 8.186 9.816 11.381 11.230 11.320 13.046 14.499 16.142 16.877 15.915 15.585 16.181 15.753 15.861 15.517 15.751 15.083 15.173 14.292 + 9.727 9.179 9.286 9.181 8.205 7.459 8.038 9.542 9.958 10.200 9.202 8.833 7.929 8.722 8.309 8.401 9.699 10.006 9.872 12.469 12.113 11.773 13.690 15.228 17.108 17.618 16.692 15.503 16.854 16.320 16.311 15.052 15.915 16.379 15.934 14.372 + 9.624 9.440 9.667 8.721 8.102 8.603 9.217 8.137 9.148 10.024 7.975 7.141 6.674 8.884 8.404 8.111 7.810 10.705 11.641 14.366 13.502 11.362 14.972 16.125 17.344 17.128 16.304 17.433 17.913 17.089 16.368 16.073 16.024 15.984 15.490 14.890 + 9.941 8.943 8.418 6.995 7.639 8.705 7.635 10.215 10.534 9.499 8.516 9.235 8.373 7.170 8.115 9.089 9.830 9.741 10.864 12.919 12.744 12.565 14.037 16.026 16.767 16.021 15.760 17.050 17.337 17.416 15.967 15.486 15.435 15.208 15.501 14.641 + 12.882 13.197 12.349 10.862 9.418 10.265 9.443 10.036 8.704 8.500 8.393 9.183 8.849 8.683 8.264 9.201 10.627 11.951 11.797 12.838 12.445 12.736 14.975 16.365 16.236 16.726 15.560 16.311 16.426 15.744 16.075 14.867 15.145 14.967 15.127 14.727 + 13.061 13.934 13.035 9.613 10.800 10.173 10.888 10.577 9.557 9.279 9.691 9.645 8.798 7.891 7.527 7.981 9.740 11.728 11.323 13.106 11.782 11.925 14.291 15.829 14.969 13.911 13.565 14.515 13.912 12.732 13.288 13.502 13.698 13.897 13.492 13.124 + 14.521 12.779 12.074 9.525 10.683 10.297 8.912 8.951 9.946 9.023 7.989 8.961 8.237 8.865 8.751 7.272 9.768 10.249 12.153 12.529 10.733 11.008 11.335 12.835 12.541 11.424 11.258 13.216 11.984 11.614 10.791 11.799 11.727 11.172 11.464 11.068 + 14.429 12.495 12.229 10.864 12.048 12.783 13.404 13.659 13.262 12.919 12.507 11.403 10.820 10.670 11.284 11.274 11.589 12.338 12.540 12.621 11.807 11.577 11.235 12.068 12.747 11.636 10.558 11.205 9.910 10.539 9.718 9.719 9.782 8.428 8.334 8.145 + 13.385 13.814 12.252 12.818 13.165 13.469 14.651 14.121 13.990 13.705 12.589 11.957 11.618 11.299 11.348 11.585 12.392 13.225 13.443 12.952 11.447 11.200 10.685 11.018 11.595 10.880 11.509 11.864 9.167 8.220 8.323 10.302 11.386 9.519 7.435 6.366 + 12.933 13.008 12.278 11.808 12.211 13.648 14.158 14.775 13.236 13.028 12.512 11.906 10.395 11.012 11.218 11.999 12.647 13.106 13.343 11.875 11.125 10.615 10.883 11.304 12.016 12.367 12.148 11.771 10.398 9.310 8.561 10.508 11.579 9.744 8.021 6.741 + 13.019 12.140 12.249 11.149 12.000 13.188 13.553 12.971 12.383 11.392 11.988 10.678 8.933 9.624 10.549 11.854 12.631 12.295 11.275 10.740 10.165 10.024 10.782 11.328 12.204 12.586 12.171 10.766 9.947 8.977 7.101 8.989 10.975 10.049 8.170 6.613 + 12.544 12.224 12.149 10.724 11.276 12.498 12.396 11.143 10.126 9.499 10.421 9.947 8.267 6.282 8.192 10.336 10.283 9.535 9.265 9.446 9.688 9.511 10.773 11.176 12.518 13.067 11.569 10.247 10.354 9.787 8.361 10.416 12.595 11.768 9.249 8.453 + 12.329 12.304 12.178 10.892 11.224 11.984 11.726 11.076 10.180 10.180 10.095 9.423 7.684 6.975 8.786 10.417 10.042 9.754 9.872 10.249 9.541 10.573 11.155 11.672 12.353 13.222 11.854 9.739 9.772 10.093 9.118 11.600 13.736 13.453 10.698 8.102 + 11.575 11.349 11.094 9.455 10.618 11.708 12.485 11.536 9.907 9.793 9.768 8.726 8.730 9.901 11.027 12.687 13.684 12.413 11.570 11.468 11.373 10.696 9.974 10.823 11.583 12.351 10.303 9.193 10.897 10.912 9.994 10.458 12.785 12.052 8.812 7.309 + 11.802 11.689 11.825 10.753 11.809 12.863 14.021 13.282 12.890 12.429 10.623 10.778 10.360 10.963 11.277 12.775 14.514 14.232 12.628 12.151 12.166 12.432 12.126 11.497 11.600 11.745 10.916 11.155 11.654 10.760 11.219 11.772 12.445 12.635 9.864 7.642 + 11.446 11.133 11.303 11.133 11.141 12.698 14.011 14.749 13.621 12.685 10.835 11.065 10.076 11.023 11.377 12.574 14.698 15.134 13.007 11.778 11.925 12.651 12.563 11.656 11.349 12.101 11.834 11.800 11.866 10.600 10.993 12.547 12.802 12.970 9.999 5.904 + 11.378 11.186 11.065 11.150 11.326 13.257 15.002 15.744 15.035 13.451 12.727 11.711 11.141 11.695 12.048 13.024 15.169 15.361 13.396 12.213 12.175 12.906 13.060 12.331 11.611 13.295 12.817 12.894 12.504 10.862 11.095 12.963 12.795 11.385 9.352 7.148 + 11.500 11.403 11.532 11.813 12.213 14.254 15.488 15.115 14.837 13.351 13.073 12.338 11.905 12.178 12.631 14.041 14.989 14.121 13.044 12.355 12.203 12.370 12.720 12.757 13.119 12.766 12.278 12.260 10.724 9.350 10.640 12.452 12.315 11.559 9.766 8.495 + 9.875 10.267 11.502 11.891 12.352 12.832 14.060 13.469 12.490 11.992 11.253 10.710 10.506 11.490 12.489 13.221 13.786 11.273 10.048 9.606 9.527 9.848 11.214 11.240 10.516 9.780 9.756 10.570 9.205 7.651 8.662 11.033 10.525 9.724 8.868 9.279 + 9.521 9.843 10.518 10.748 12.088 12.799 12.446 11.365 10.624 9.960 9.579 8.636 9.100 9.918 11.995 12.434 11.136 9.306 8.510 8.199 8.238 8.890 10.913 11.253 9.168 7.937 8.633 9.638 8.274 6.589 7.445 9.409 8.997 8.616 6.898 7.605 + 6.977 8.256 8.187 6.767 6.243 6.569 6.796 6.567 7.228 6.028 5.506 4.750 4.367 4.490 6.242 6.315 7.348 4.774 4.606 4.759 4.019 5.593 6.216 6.364 5.345 6.151 5.150 5.912 6.064 5.718 5.790 5.868 6.417 6.028 5.594 4.174 + 6.605 7.888 7.766 6.215 5.917 5.713 6.280 6.671 7.268 6.233 5.104 4.392 4.112 3.989 5.989 6.441 6.337 4.282 4.354 4.199 3.847 4.683 5.406 5.813 5.454 6.677 6.098 6.305 6.053 5.666 5.941 4.784 4.938 5.089 4.638 4.321 + 7.116 7.059 6.852 7.373 7.828 7.675 7.934 7.547 7.114 5.135 4.362 4.388 3.959 2.240 3.460 5.238 5.721 4.561 3.493 3.245 4.298 4.627 4.479 5.702 5.282 6.354 5.894 5.655 6.006 5.024 5.603 4.533 5.103 5.248 4.890 4.216 + 6.520 6.777 7.087 7.010 7.226 6.872 7.047 7.229 7.157 5.168 5.037 3.378 2.694 2.796 4.192 3.817 4.250 4.529 4.159 3.799 4.164 3.957 5.446 6.515 6.511 6.268 5.889 5.504 5.597 5.947 5.866 6.237 6.703 6.586 5.799 4.661 + 4.928 7.610 9.312 9.489 8.112 8.796 9.040 8.316 8.370 8.170 7.458 6.756 6.990 6.299 5.320 6.436 7.841 7.086 7.050 7.732 7.142 8.281 7.234 8.638 8.861 8.432 9.085 8.948 8.847 9.267 10.038 10.593 11.139 10.968 10.055 8.821 + 10.265 8.831 8.291 7.323 8.335 8.043 8.669 9.210 10.007 9.255 7.816 7.506 7.701 7.658 7.734 8.230 9.337 10.098 8.129 8.333 8.937 8.790 9.448 10.089 10.309 9.368 9.482 9.324 9.613 9.846 9.459 9.517 10.079 9.661 9.583 9.528 + 10.215 9.043 8.933 10.412 10.242 11.371 12.243 12.589 12.913 11.811 10.902 10.818 10.827 10.383 10.940 11.675 12.583 13.666 12.705 12.442 11.956 12.077 12.814 13.637 13.410 12.173 12.033 12.391 12.689 12.012 10.798 12.366 12.174 10.490 10.236 10.119 + 10.550 9.951 10.468 11.298 11.712 13.356 15.252 16.537 15.998 14.266 12.992 12.880 11.831 11.971 12.033 12.595 13.947 15.517 14.803 13.437 13.088 13.126 13.720 15.243 14.855 12.525 12.177 12.773 13.487 12.249 10.862 13.704 13.203 11.783 10.140 10.375 + 10.911 10.568 11.101 11.943 12.143 13.281 15.095 16.175 16.541 15.358 13.293 13.197 12.556 12.588 12.402 12.789 13.859 15.535 16.173 14.726 13.687 13.541 14.070 15.268 15.827 14.227 12.885 12.798 13.333 12.670 10.889 13.060 13.287 10.451 9.781 10.707 + 10.919 10.579 11.065 12.116 12.236 13.189 14.823 16.008 16.765 16.061 13.223 13.712 12.591 12.948 12.705 13.349 14.179 15.594 16.418 15.499 14.483 14.082 14.196 15.393 16.272 15.221 13.755 13.644 13.984 13.142 11.889 14.038 13.587 11.361 9.706 10.632 + 10.542 10.138 10.736 12.046 11.530 13.203 14.585 15.772 16.905 15.269 14.038 13.805 12.544 12.997 12.577 13.234 13.891 15.551 16.842 14.774 14.135 13.807 13.823 15.082 16.128 14.486 13.394 13.448 13.752 12.550 13.163 14.656 14.219 12.268 8.811 8.068 + 10.067 9.901 10.856 11.825 11.931 12.927 14.057 15.729 17.002 16.582 14.205 13.904 12.889 12.836 12.707 13.432 14.171 16.475 16.889 14.870 14.164 13.900 13.952 15.500 16.299 14.644 13.328 13.562 14.084 12.390 14.411 15.686 15.398 13.696 8.607 8.112 + 10.761 10.610 11.540 12.196 12.478 13.099 14.179 15.602 17.036 17.078 14.666 14.234 13.514 13.256 13.277 13.861 15.030 16.761 16.706 14.997 14.289 14.185 14.466 15.989 16.115 14.292 13.115 13.042 13.033 12.355 14.428 15.233 14.898 12.602 9.307 8.529 + 10.700 10.524 11.444 12.285 12.508 12.864 14.102 15.348 16.586 17.073 14.893 15.273 13.743 13.881 13.738 14.450 15.795 16.502 16.064 14.600 14.258 14.449 14.571 15.715 15.627 14.029 12.869 12.601 12.093 12.454 15.078 15.203 14.783 12.030 8.988 8.987 + 9.591 9.266 10.946 11.496 11.604 12.089 13.840 14.201 16.768 16.909 15.776 15.289 13.584 13.733 13.772 14.273 15.905 16.605 15.509 14.208 13.663 13.717 13.988 15.241 15.248 13.473 12.072 11.865 11.148 11.593 14.722 14.562 14.270 11.956 8.576 8.556 + 9.850 9.471 10.892 10.910 11.807 12.177 13.659 14.484 16.908 17.041 15.603 14.838 13.599 13.374 13.657 14.444 16.151 16.322 14.858 13.778 13.442 13.601 13.786 15.293 15.421 13.389 12.195 12.113 11.261 12.469 15.388 14.947 14.468 12.271 9.214 7.575 + 10.288 10.314 11.179 11.690 12.059 12.745 14.021 14.639 16.957 17.011 16.351 15.151 13.673 13.849 14.237 15.294 16.663 15.952 14.680 14.064 13.701 13.647 13.763 15.348 15.596 13.880 12.572 12.222 11.232 13.966 15.912 15.172 14.207 11.965 9.634 7.495 + 10.008 9.904 11.149 11.646 11.601 12.677 13.934 14.262 16.842 16.753 16.487 15.230 13.862 13.931 14.406 15.478 16.290 15.294 14.362 13.877 13.523 13.765 13.840 15.212 15.408 13.691 12.351 11.863 11.630 14.429 16.034 15.409 14.172 12.622 10.297 8.603 + 9.359 9.251 10.785 11.024 11.463 11.999 13.448 14.390 16.974 17.262 15.641 14.958 13.496 13.505 13.570 15.252 16.608 14.460 12.985 12.566 12.422 12.775 12.877 14.495 14.914 13.028 11.601 11.118 10.900 14.473 16.015 15.049 14.170 11.730 9.386 7.766 + 9.904 10.305 11.187 11.633 12.388 12.604 14.031 15.138 17.224 17.088 15.572 15.114 14.169 13.825 14.188 15.966 16.520 14.353 12.922 12.636 12.653 13.017 13.042 14.456 15.291 13.707 12.017 11.563 11.312 15.169 16.552 15.620 14.721 12.327 9.745 8.567 + 10.177 10.573 11.390 12.285 12.895 13.022 14.553 16.036 16.875 17.221 14.667 14.755 14.697 13.941 14.921 16.445 16.112 13.697 12.760 12.580 12.333 12.791 12.991 13.450 14.480 13.008 11.984 11.460 11.259 14.914 16.498 15.740 14.831 12.662 10.038 9.271 + 9.763 10.148 10.756 12.066 12.658 12.914 14.347 15.989 16.559 16.624 14.461 13.579 13.770 13.218 14.333 15.738 15.349 12.408 11.314 10.964 10.770 10.625 10.733 11.564 12.129 11.692 10.987 10.506 10.548 13.887 15.489 15.011 14.101 11.868 9.628 10.477 + 8.961 9.946 10.608 11.222 12.550 13.132 13.996 16.602 17.046 15.384 14.565 13.810 12.732 13.378 14.529 15.780 14.107 12.168 10.769 10.577 10.311 10.321 10.480 11.127 11.377 12.534 10.960 9.903 9.589 13.451 15.157 14.805 13.934 11.618 9.659 10.556 + 9.452 10.223 10.608 11.953 12.966 13.790 15.730 17.168 16.369 14.336 14.540 13.905 12.778 13.480 14.857 15.879 13.617 11.877 10.595 10.545 9.684 9.765 9.987 9.579 12.432 13.268 10.382 8.945 8.444 10.511 12.732 13.349 11.733 11.060 8.558 9.192 + 9.416 10.117 10.585 11.859 13.263 14.492 15.359 16.009 14.297 13.361 12.853 13.062 12.361 13.047 14.286 14.717 13.630 11.689 10.985 9.874 9.312 9.433 9.889 10.435 12.403 12.961 11.415 10.032 9.334 9.311 12.989 14.203 13.098 12.979 10.883 8.888 + 8.201 8.235 8.684 9.928 11.138 13.735 15.327 14.288 12.600 11.151 10.890 10.562 10.350 10.624 13.278 14.231 11.846 9.673 9.021 8.236 7.389 7.624 7.906 8.525 11.417 12.577 9.575 7.838 7.135 7.089 11.712 13.385 11.416 11.915 10.077 8.859 + 8.501 9.545 10.333 11.586 13.334 14.338 14.230 12.718 11.536 11.010 10.729 10.776 10.785 11.286 12.928 13.351 12.035 10.264 8.871 8.526 8.480 8.391 8.510 8.988 10.774 11.941 10.244 8.541 7.519 7.702 10.081 12.402 11.947 11.347 10.648 9.552 + 5.717 6.016 5.858 8.459 10.527 11.109 10.073 9.348 9.486 7.964 7.765 7.321 5.975 6.455 9.060 10.385 8.526 5.893 5.952 4.508 4.866 3.922 4.271 5.279 7.648 9.348 6.621 4.487 3.498 3.599 6.438 8.849 8.398 7.193 6.588 3.822 + 5.366 7.316 7.227 6.153 5.343 6.625 7.951 9.564 10.257 7.882 5.957 6.107 5.920 4.382 5.815 6.175 6.907 6.050 4.983 4.971 5.418 4.577 3.817 5.359 6.099 5.471 4.879 4.090 4.007 3.915 5.667 5.408 4.692 3.674 3.192 3.659 + 6.209 7.598 7.601 6.054 5.365 7.644 9.047 9.138 9.165 8.692 5.743 5.311 5.739 4.971 5.530 6.268 6.169 6.089 5.239 5.217 4.822 3.579 5.094 5.559 6.022 4.961 4.972 4.003 3.928 4.226 6.337 5.749 5.091 2.415 3.131 2.834 + 4.542 3.829 4.134 5.176 4.584 6.404 8.787 8.345 9.362 9.343 5.859 5.617 4.773 5.618 6.262 6.447 6.744 5.266 4.734 4.915 4.353 3.759 5.218 5.161 5.719 4.782 4.400 4.011 3.532 3.738 5.885 5.250 3.959 3.489 3.130 2.308 + 2.763 4.259 4.928 4.791 4.433 6.612 7.445 6.397 8.471 9.071 5.735 5.687 5.163 4.606 4.953 6.279 7.076 5.898 3.947 5.016 4.884 5.171 5.027 4.498 4.095 4.375 4.182 4.152 4.353 4.726 5.707 4.332 3.662 3.432 3.066 1.846 + 4.767 5.190 4.157 3.778 4.153 3.956 7.615 8.170 8.254 8.443 5.360 5.173 5.351 5.203 5.127 5.784 5.319 4.584 3.949 4.124 4.725 4.695 4.439 5.129 5.809 5.356 4.602 4.277 3.579 4.315 6.061 4.816 3.988 2.708 3.006 2.854 + 3.662 5.191 5.399 4.519 6.758 7.668 8.114 8.036 7.226 7.615 8.461 8.228 7.039 5.782 6.079 5.835 5.348 6.764 7.242 7.627 8.000 8.092 8.583 8.781 8.776 7.445 8.022 7.913 6.645 5.485 5.594 5.849 6.275 6.634 5.074 4.332 + 3.428 3.664 4.672 3.940 7.001 8.242 7.858 6.467 7.234 7.425 8.831 8.281 6.593 6.386 6.222 6.386 6.012 5.513 6.203 6.736 6.684 7.049 7.539 7.845 8.115 6.864 8.120 7.563 5.439 5.372 4.913 5.028 5.893 6.128 4.562 4.007 + 4.141 3.949 3.751 3.812 4.985 5.283 7.821 8.110 6.889 6.029 5.200 4.953 5.521 5.809 5.062 5.471 5.465 3.934 4.494 4.941 4.810 5.052 5.758 5.532 5.572 5.496 5.642 5.305 4.469 3.729 4.778 4.734 3.991 4.044 3.238 1.958 + 4.705 4.339 3.747 3.239 2.996 5.739 7.133 6.870 6.428 5.647 5.347 5.421 5.443 4.395 5.225 6.888 6.395 6.516 5.600 4.476 5.279 6.115 6.041 5.270 5.936 6.052 5.558 4.394 4.123 3.117 4.462 4.649 3.365 3.140 2.943 2.632 + 3.870 4.844 3.193 3.994 4.745 6.376 7.519 7.813 6.612 5.708 5.711 5.090 5.621 5.886 7.503 7.095 4.829 5.103 5.369 5.677 6.284 5.616 4.179 5.261 5.968 6.235 5.651 5.204 4.131 3.949 4.474 4.453 3.882 3.760 3.934 3.476 + 4.661 3.701 0.936 3.804 4.886 6.058 5.713 5.901 6.216 5.384 5.439 5.829 5.538 6.837 6.563 6.389 6.234 5.082 4.789 4.900 5.569 6.059 6.012 5.941 6.017 5.967 4.365 5.139 4.995 4.827 4.911 4.037 4.686 4.356 4.137 3.429 + 5.369 3.812 3.860 4.266 4.625 4.820 5.822 7.515 6.656 5.165 5.618 6.027 5.829 7.163 6.823 5.649 6.460 5.984 6.430 5.744 6.480 5.869 5.158 5.679 5.666 5.181 4.570 5.118 4.988 4.441 4.522 4.440 4.631 4.393 3.543 2.811 + 5.352 5.497 4.073 3.892 5.175 6.434 7.001 7.104 6.622 4.010 3.682 4.924 4.663 5.526 6.578 6.320 6.920 6.250 5.768 5.855 6.146 6.211 6.751 6.275 5.476 5.431 5.574 5.331 4.816 4.745 4.959 4.316 5.150 4.106 3.618 2.736 + 2.974 4.342 4.165 3.453 5.344 6.941 7.016 6.106 6.728 4.871 5.386 4.582 5.411 5.908 7.362 6.751 6.317 6.414 5.846 5.005 6.172 6.259 6.265 5.583 6.245 6.605 4.635 4.663 5.325 5.159 4.420 4.816 5.185 4.325 4.238 2.963 + 4.410 3.563 4.213 4.883 5.572 7.437 7.201 5.697 5.177 5.872 6.531 6.406 6.503 6.438 6.188 6.606 5.888 5.527 6.285 6.391 6.448 6.125 6.089 5.863 6.383 6.812 6.627 5.544 4.388 5.077 5.208 4.774 4.278 4.398 4.321 2.981 + 4.809 4.552 6.215 6.270 4.799 6.543 7.374 5.892 6.541 5.761 4.579 5.708 5.512 7.142 7.352 7.797 6.440 6.962 6.906 5.696 6.129 6.178 5.406 5.918 5.538 5.817 6.972 6.799 4.642 5.221 5.252 5.320 4.660 5.256 4.134 2.569 + 5.316 5.896 5.297 6.070 5.431 7.380 8.166 6.596 6.680 6.896 6.296 5.481 4.829 7.756 7.511 7.066 5.730 5.905 6.717 6.478 6.323 7.075 5.611 6.491 6.192 6.011 5.404 5.345 4.865 5.475 4.767 5.204 5.022 4.715 4.171 3.393 + 3.820 6.029 6.681 5.849 6.149 7.385 6.619 7.448 7.937 5.294 5.737 4.449 5.496 6.548 6.260 6.862 6.832 6.975 6.137 6.356 5.904 6.776 6.196 6.686 6.805 6.689 5.180 5.435 5.451 5.901 5.178 4.892 4.618 4.108 4.992 4.050 + 6.679 7.963 7.305 6.543 6.078 7.937 8.503 7.139 7.828 5.292 5.863 7.048 7.639 6.717 6.338 5.327 6.744 6.099 6.165 5.731 6.503 6.132 6.277 6.596 6.526 6.642 6.144 6.432 5.630 5.796 5.070 5.417 5.272 4.925 5.092 4.233 + 6.073 6.838 7.669 7.019 6.043 8.297 8.879 6.745 7.057 6.891 6.577 6.262 7.857 8.599 8.251 7.096 6.261 6.712 5.728 5.143 5.917 6.293 5.623 5.377 5.203 5.963 5.984 6.421 6.410 5.586 5.192 4.868 5.608 5.195 4.762 3.869 + 4.877 6.359 7.905 7.788 8.216 8.565 7.485 8.140 7.772 7.796 8.027 8.171 7.512 7.438 7.321 7.425 7.237 7.545 7.088 6.391 6.106 5.597 6.864 7.135 7.362 7.587 6.431 5.587 6.339 6.414 5.676 5.344 6.293 7.216 7.155 7.190 + 6.853 9.245 10.553 10.942 10.743 9.965 9.059 9.528 9.607 9.709 10.658 10.472 8.540 6.880 7.990 8.672 8.522 8.868 9.054 7.830 6.745 6.255 7.798 8.832 9.756 8.839 7.723 5.766 6.648 8.638 6.866 5.494 8.453 10.266 9.163 9.498 + 7.592 8.601 8.459 9.576 8.528 8.392 6.768 7.553 9.100 8.166 8.692 8.201 7.320 6.838 6.428 7.286 7.693 6.290 7.364 7.991 8.079 8.641 8.451 7.791 7.386 7.615 7.197 7.705 6.806 7.379 6.726 7.415 8.497 8.592 7.372 6.304 + 7.010 6.265 8.047 9.198 8.234 8.569 7.883 7.539 8.027 8.429 8.676 8.122 7.139 7.289 7.345 7.664 7.028 7.503 6.845 7.393 8.049 8.615 8.650 6.782 6.356 8.537 8.193 7.933 7.223 6.677 6.087 7.338 8.524 8.693 7.441 6.504 + 2.544 3.306 5.486 7.175 5.840 8.198 7.922 6.854 9.372 10.018 8.351 8.223 7.934 8.702 8.025 7.665 7.359 7.183 6.450 6.780 5.836 6.551 8.152 7.299 7.675 8.053 6.518 6.653 6.331 6.484 5.912 6.580 7.492 8.321 8.056 5.479 + 4.168 5.315 6.335 7.352 7.877 8.528 8.489 7.243 7.936 9.097 10.998 10.172 7.927 7.541 8.271 8.033 6.768 7.133 8.417 7.503 6.595 6.915 7.822 7.399 8.318 7.246 6.295 6.573 5.965 5.998 5.366 6.606 7.667 7.064 6.265 4.865 + 3.804 4.556 5.504 5.909 8.860 9.713 7.761 6.446 7.071 9.287 12.085 11.978 7.605 5.889 7.895 9.119 7.995 6.508 7.578 8.348 7.048 7.458 8.561 6.988 7.565 6.645 7.045 7.412 6.379 6.832 6.113 5.837 7.170 7.065 6.743 5.306 + 3.802 3.497 5.283 7.439 8.893 10.072 8.033 7.197 5.988 8.683 11.475 11.566 8.513 5.803 6.917 9.721 9.517 7.891 8.195 9.725 7.710 6.636 7.629 7.687 7.569 7.055 7.570 6.756 6.420 7.411 5.659 6.334 7.586 7.619 6.461 5.324 + 3.627 3.197 5.014 5.569 7.259 8.963 8.835 5.171 6.470 8.074 8.528 8.066 8.889 7.824 6.187 6.648 9.449 10.334 6.844 6.695 8.611 8.329 5.558 8.019 8.338 5.746 8.952 8.219 7.171 7.737 5.578 6.917 7.839 8.091 6.861 5.692 + 4.728 4.470 5.424 5.837 6.876 8.875 8.779 5.107 4.858 5.570 5.464 7.476 8.813 6.326 5.594 5.753 9.963 10.464 5.783 5.011 9.388 8.793 5.767 9.211 9.164 6.010 10.109 9.006 9.029 9.073 6.996 7.369 9.536 9.484 8.678 6.764 + 1.240 3.497 5.110 5.625 8.544 9.653 7.576 5.522 5.326 6.469 9.401 10.013 8.363 5.147 5.689 7.500 9.611 8.736 6.693 8.685 8.676 6.522 7.960 8.268 6.922 7.687 9.026 7.418 8.234 7.279 6.695 6.569 8.772 8.006 7.523 5.506 + 3.571 5.131 6.485 7.112 8.157 8.720 7.624 7.583 8.822 10.238 10.807 10.460 5.834 4.511 6.436 6.732 6.741 6.559 7.382 7.506 5.219 5.155 6.121 4.799 5.371 5.458 5.746 5.904 5.249 6.071 5.736 5.207 5.834 5.928 5.087 4.466 + 2.940 3.472 6.866 7.349 5.604 7.052 7.660 6.983 9.475 9.700 9.981 9.114 7.680 5.611 5.245 6.572 6.532 6.219 6.231 5.068 4.548 4.125 4.969 4.478 5.113 5.458 6.062 6.570 5.120 4.440 5.296 5.957 6.378 6.764 6.898 4.242 + 3.666 3.341 5.964 6.491 4.731 6.013 5.380 5.842 7.947 8.180 9.067 8.143 5.318 6.412 6.163 5.157 5.433 5.468 4.261 5.672 5.484 4.373 4.645 4.195 4.167 5.329 5.622 5.514 5.075 4.362 4.963 5.753 6.766 6.716 6.760 4.553 + 4.328 4.211 5.559 6.673 6.594 6.376 6.295 4.462 6.580 7.494 6.479 4.361 3.707 7.285 6.904 5.278 5.124 6.144 6.217 5.786 5.722 5.285 4.646 4.369 4.172 4.344 5.431 5.742 5.502 4.982 5.203 6.089 6.993 7.225 7.091 5.291 + 3.965 4.432 5.854 5.637 6.353 8.038 7.577 6.010 5.993 6.288 6.139 5.109 6.380 6.828 5.835 5.098 4.922 5.649 5.283 5.236 4.843 5.273 5.805 5.195 4.552 5.487 6.419 6.874 6.400 5.056 5.263 6.337 7.036 7.689 8.023 5.127 + 3.622 4.181 5.954 7.022 6.696 7.607 7.344 6.301 5.926 5.567 6.462 6.201 5.725 6.010 6.373 5.379 5.504 5.970 5.807 5.326 4.570 5.391 5.538 4.523 4.636 5.387 6.058 6.357 6.953 5.423 5.147 6.015 7.024 7.934 8.292 5.916 + 4.796 4.860 5.193 6.453 6.777 6.044 7.061 6.573 5.584 5.996 6.976 6.466 4.726 6.849 6.485 4.852 5.085 5.498 5.958 5.348 5.213 5.728 5.212 5.357 4.970 4.470 5.644 5.743 5.875 5.626 4.484 5.749 7.411 7.327 7.296 5.160 + 2.202 3.825 4.757 4.854 5.774 7.662 7.833 7.218 6.721 6.325 6.645 6.993 4.159 6.535 6.077 5.197 5.804 5.964 5.162 5.096 6.204 5.455 5.156 5.164 4.585 4.279 6.208 5.731 5.578 5.341 5.011 5.830 6.589 7.193 7.098 4.448 + 4.159 5.109 4.462 5.531 6.554 7.911 6.895 7.007 6.397 6.354 6.161 6.455 5.858 6.034 6.177 5.769 6.073 4.719 5.157 5.194 5.164 4.894 4.217 4.538 4.596 4.315 5.946 5.801 4.880 4.811 5.547 5.326 5.915 6.688 6.501 4.947 + 3.636 4.522 5.206 5.198 6.055 7.009 6.893 7.234 7.968 6.576 5.702 5.990 4.581 5.727 5.912 4.874 6.538 5.928 5.093 4.697 4.670 5.535 6.211 4.432 4.046 4.127 4.894 5.500 5.360 5.277 5.055 5.601 6.505 7.398 6.530 3.656 + 3.841 3.105 3.494 3.789 5.773 7.965 7.168 6.647 7.850 6.963 5.871 6.640 5.499 6.212 5.592 5.530 5.878 5.899 4.988 5.473 5.042 4.886 6.125 4.778 4.285 3.959 4.619 4.840 4.896 4.454 4.388 4.473 5.491 6.270 5.679 3.665 + 4.326 5.876 6.287 4.913 4.658 7.557 7.704 6.800 6.521 8.307 7.857 6.183 6.046 6.545 5.853 4.138 5.839 4.964 4.684 6.074 5.097 5.495 5.092 4.796 4.364 4.555 5.890 5.467 5.411 4.964 4.401 4.193 4.761 5.579 5.144 3.791 + 3.603 5.830 6.646 5.927 4.744 5.856 7.901 6.370 5.093 8.559 9.851 8.229 5.724 6.926 5.942 4.995 5.481 4.506 4.951 4.975 4.398 4.703 4.550 4.138 3.483 4.746 5.272 5.219 4.757 5.102 4.369 4.206 4.394 5.070 3.091 2.161 + 4.022 4.620 5.273 4.030 3.655 5.777 7.735 6.896 5.833 8.700 9.898 7.941 5.842 4.701 4.674 6.246 6.154 6.453 4.710 4.843 4.854 5.268 4.596 4.671 4.518 4.589 5.278 4.957 5.149 5.217 4.267 4.555 4.475 4.434 4.176 2.696 + 3.315 4.099 3.782 2.061 3.621 5.618 6.089 4.179 6.681 8.849 8.365 5.988 6.059 3.154 4.561 4.740 6.220 7.014 5.021 4.080 5.041 4.500 4.331 4.780 4.351 4.112 5.918 4.580 4.496 4.362 4.542 4.669 4.799 4.654 4.398 2.449 + 2.748 3.933 3.358 3.625 5.312 5.506 4.993 3.524 3.802 6.177 6.197 5.634 6.044 4.567 4.927 4.082 4.847 4.729 4.331 4.006 4.100 3.184 4.545 3.482 3.468 2.993 5.005 4.422 4.409 4.340 4.248 3.667 4.000 4.053 3.557 2.281 + 3.438 4.042 4.954 5.390 4.448 5.869 6.935 5.970 4.921 4.766 4.006 4.089 5.431 5.773 5.313 5.280 5.317 6.936 5.896 4.594 4.291 5.086 4.285 3.412 4.979 4.122 4.423 4.085 3.638 4.453 4.063 3.436 3.895 4.621 4.462 3.161 + 2.949 2.048 3.396 3.377 3.706 3.167 6.454 6.478 5.051 4.405 3.871 3.666 4.966 5.170 4.425 3.613 3.921 6.100 6.618 4.386 2.314 4.952 6.023 3.938 4.067 5.491 4.569 5.237 4.869 4.234 4.323 4.306 5.277 4.597 3.844 1.925 + 3.735 3.535 2.535 1.593 2.655 3.939 4.764 3.830 2.528 2.927 3.094 4.030 3.050 4.129 3.554 3.540 2.835 3.143 2.505 0.137 1.845 3.430 2.350 1.232 2.044 2.057 1.671 0.995 1.707 2.951 3.291 2.191 2.327 1.926 1.612 0.975 + 4.540 3.482 2.907 1.893 2.432 3.769 4.829 2.789 3.590 2.366 2.275 2.600 2.742 2.639 3.543 3.407 2.003 2.093 1.934 1.684 2.323 3.344 2.866 2.581 2.328 2.061 2.686 2.377 1.978 2.237 2.766 2.566 2.165 0.904 1.364 0.812 + 3.560 2.598 3.165 3.610 3.947 3.475 3.925 3.931 3.489 2.388 1.480 1.106 2.045 2.073 1.407 3.111 3.188 2.564 1.193 1.628 2.432 1.991 1.899 1.742 2.501 1.809 2.306 2.466 2.813 2.435 2.542 2.375 2.332 1.270 1.574 1.359 + 3.995 3.990 2.810 4.045 4.076 5.044 3.957 3.514 3.915 2.824 2.387 1.147 2.576 4.219 3.560 3.098 3.025 2.884 1.374 1.911 2.573 2.462 2.867 1.863 2.374 1.821 2.309 2.617 1.069 2.578 2.582 1.829 0.876 1.856 1.929 0.328 + 2.469 1.587 1.926 2.630 2.799 4.367 5.425 3.726 4.385 3.926 1.046 1.146 2.032 4.382 4.134 3.573 3.542 2.821 1.704 1.988 2.401 2.327 2.960 1.474 1.183 0.991 2.053 1.836 1.044 2.111 1.902 1.818 1.079 1.932 1.844 0.662 + 2.792 1.645 2.003 2.604 2.790 2.537 3.845 3.414 2.689 3.282 1.026 1.679 2.362 3.747 3.688 2.797 2.455 2.362 2.555 1.656 0.552 1.383 2.038 1.720 1.729 1.640 2.128 2.664 2.034 2.264 1.518 1.004 0.968 1.200 1.294 0.693 + 2.505 2.453 1.866 3.060 2.652 3.632 3.417 2.628 2.317 3.690 3.410 1.959 2.502 3.414 3.187 3.712 2.599 1.922 2.915 1.978 0.441 1.098 2.681 2.190 1.339 0.602 1.469 1.259 1.027 1.281 1.566 1.070 1.545 1.637 1.023 0.688 + 0.726 1.201 1.549 1.990 3.272 3.336 4.232 3.027 3.044 3.746 2.687 2.811 3.273 4.153 3.293 3.052 2.415 2.058 3.371 2.842 1.636 1.670 2.828 1.283 1.860 1.223 0.279 0.815 1.025 1.266 2.032 1.163 1.364 1.975 0.609 0.151 + 2.839 0.978 0.752 1.988 1.899 2.535 4.014 3.360 3.767 2.666 2.435 2.164 1.919 2.251 1.988 1.373 2.815 2.347 1.679 1.744 2.015 1.748 1.405 1.820 1.586 1.279 1.146 2.014 1.757 1.852 1.441 1.892 0.393 1.040 1.324 0.177 + 4.666 3.656 1.879 2.993 2.256 2.418 3.050 3.064 2.916 1.823 1.863 2.033 3.065 3.325 3.234 1.221 1.623 2.862 2.354 1.800 1.012 0.987 2.189 1.407 0.935 0.872 1.207 0.950 1.824 1.678 0.741 1.458 0.332 1.284 1.471 0.016 + 5.328 5.399 4.239 4.887 5.131 5.449 5.796 5.719 3.609 0.292 1.502 3.431 3.759 3.442 3.400 1.880 2.500 2.410 2.581 2.227 1.932 1.537 2.243 1.057 1.812 0.934 1.527 1.347 1.111 1.501 0.823 1.880 0.936 1.495 1.480 0.196 + 9.409 9.512 9.702 9.864 10.414 9.543 9.838 8.966 8.435 7.119 7.041 6.634 5.991 6.088 5.934 5.919 5.690 5.288 4.653 4.705 4.960 4.385 4.496 3.967 4.181 3.489 2.981 3.769 3.833 3.995 3.977 4.209 4.430 4.368 4.062 2.911 + 11.060 11.271 11.549 11.773 11.761 11.293 11.301 10.800 9.479 8.349 7.538 7.772 7.402 6.596 7.639 7.446 6.835 6.729 6.205 6.082 6.923 6.674 6.383 6.149 5.664 5.544 4.810 5.609 5.535 5.742 5.367 5.794 6.212 5.888 5.510 4.159 + 9.785 10.258 10.564 11.014 11.080 10.769 10.594 10.498 9.184 8.194 7.415 6.141 5.869 6.230 6.740 6.708 5.996 5.705 6.407 6.258 7.435 7.930 8.195 8.144 7.638 6.305 4.001 3.729 3.629 3.808 3.442 3.584 4.010 3.659 3.102 2.269 + 9.414 10.001 9.033 9.149 10.104 10.264 9.091 8.983 7.410 6.482 5.598 4.659 4.278 4.804 5.214 4.976 4.716 3.910 4.416 4.025 5.967 5.889 6.234 6.272 5.905 4.362 3.932 3.728 3.906 3.115 3.238 3.163 2.915 2.821 2.457 2.013 + 7.532 6.616 6.228 6.417 7.753 8.097 6.504 4.114 3.871 4.335 3.217 1.284 0.976 4.040 3.824 2.971 2.271 2.217 1.802 1.732 2.550 3.147 3.734 3.754 4.476 4.162 4.639 4.896 5.546 4.590 4.780 4.497 4.144 3.498 2.872 1.968 + 2.850 3.584 2.803 3.216 5.228 5.718 5.630 3.371 2.823 2.929 2.956 1.806 1.976 2.501 2.465 2.024 2.329 2.055 1.071 0.987 1.212 1.093 1.915 2.813 2.601 2.354 3.327 3.085 3.704 2.983 2.649 2.451 2.260 1.775 2.451 1.240 + 4.657 3.237 4.183 6.162 5.845 5.589 5.486 6.358 4.449 5.636 4.957 4.816 3.906 3.340 3.753 3.397 3.293 3.123 3.612 3.646 4.004 4.509 5.263 5.783 5.836 5.445 5.115 4.933 4.994 4.729 4.012 4.214 4.447 4.434 3.785 3.731 + 7.193 7.509 7.420 7.463 7.168 7.151 8.053 8.909 9.392 10.169 10.215 9.361 7.898 6.834 7.700 8.061 7.776 7.582 7.436 7.899 8.286 8.621 9.376 9.927 9.897 9.150 8.715 8.096 8.067 8.192 6.574 7.208 7.921 7.699 6.556 6.087 + 5.252 6.269 6.129 4.987 4.018 5.295 4.374 5.344 6.298 7.738 7.940 6.291 3.822 3.671 4.844 4.467 3.556 4.186 4.000 4.220 4.529 4.852 5.780 6.600 6.578 6.297 6.538 5.035 5.174 5.466 4.074 4.737 5.598 5.766 6.165 5.450 + 2.435 2.291 3.689 3.542 3.594 3.309 2.718 3.618 1.423 3.795 4.138 2.809 1.787 2.403 2.700 2.195 2.052 2.740 2.481 3.831 4.343 3.671 4.946 5.278 5.099 5.137 6.262 5.229 5.011 4.492 4.988 5.284 6.075 6.691 6.789 6.899 + 3.330 3.855 3.592 3.418 4.051 4.031 5.418 4.521 3.464 4.113 4.979 2.976 2.240 2.383 2.860 3.322 5.067 4.944 4.742 5.549 5.840 4.363 5.806 5.607 6.041 6.012 6.215 6.275 6.261 6.645 5.549 6.787 7.439 7.245 6.988 7.027 + 3.031 2.355 2.522 3.587 2.065 4.143 5.527 6.172 5.684 4.485 5.982 4.785 3.307 2.890 2.970 4.154 6.083 7.088 7.000 6.569 6.716 6.253 5.399 6.452 5.280 6.229 8.097 6.191 6.378 6.135 6.208 6.069 7.088 8.244 7.983 6.221 + 4.308 3.751 4.011 4.429 4.599 3.897 5.344 5.739 5.526 7.228 7.507 5.882 2.722 2.910 4.222 3.931 5.259 7.310 7.514 6.885 7.450 6.496 5.481 6.866 6.396 5.750 7.329 6.424 5.981 5.818 6.108 6.666 7.477 7.299 7.263 6.855 + 2.398 3.241 4.622 4.713 4.080 3.865 4.867 5.484 5.732 6.279 5.423 3.956 2.872 3.349 4.151 4.377 4.688 5.804 5.517 5.667 5.872 5.452 4.987 6.269 6.716 4.375 6.454 5.597 4.283 3.799 4.385 5.465 5.736 5.999 5.814 5.387 + 4.618 5.224 4.893 3.252 3.936 4.898 4.996 4.671 5.442 5.545 5.271 5.277 3.925 4.273 3.785 2.150 1.938 2.628 3.481 2.743 3.618 3.569 4.231 3.848 3.236 3.437 3.878 3.540 3.342 3.898 3.422 3.775 3.538 4.158 3.538 3.372 + 4.963 6.653 7.241 6.278 5.068 5.927 5.785 4.525 4.562 3.661 5.134 4.005 1.745 3.500 3.410 3.094 2.972 2.252 2.859 2.669 2.951 2.972 4.000 3.243 3.402 2.689 2.581 2.793 3.173 2.866 3.230 3.098 2.436 2.853 2.587 1.864 + 5.496 6.171 5.426 5.802 5.704 4.460 5.314 4.315 4.341 3.870 3.515 4.053 2.747 3.637 3.297 3.175 3.028 3.053 2.790 3.189 3.032 3.807 3.917 2.616 2.293 2.003 2.259 3.174 2.685 2.065 2.604 2.550 2.515 2.215 1.888 1.442 + 5.219 4.958 4.788 3.903 5.029 5.009 4.273 4.155 3.687 4.402 4.586 3.815 2.232 3.935 3.260 3.284 1.916 2.108 3.220 2.282 3.308 2.873 2.516 2.954 2.455 1.489 2.371 2.682 2.778 2.356 1.841 2.282 3.198 2.687 1.903 0.693 + 4.717 4.834 5.668 5.121 5.776 5.584 5.200 3.389 4.135 3.414 4.026 3.144 2.741 3.162 3.131 3.909 3.575 2.581 2.175 2.556 3.389 3.346 3.763 4.103 3.383 3.710 2.851 2.404 2.679 2.680 2.268 1.562 2.489 1.901 1.891 1.419 + 5.194 4.716 5.458 5.348 5.368 5.621 5.626 3.589 4.233 3.656 4.782 4.587 3.719 3.640 3.097 2.212 2.808 2.827 1.826 2.827 3.626 3.601 3.813 3.862 3.538 2.854 2.458 3.802 3.040 2.622 1.994 2.212 2.062 2.079 1.832 1.649 + 6.020 5.588 5.517 4.653 3.797 5.463 4.924 4.938 4.496 3.873 4.457 3.883 2.746 2.787 2.783 1.520 2.051 2.560 2.546 3.167 3.146 2.875 3.796 4.188 4.175 3.446 3.230 4.481 4.419 3.375 2.914 3.310 3.606 4.047 3.185 2.918 + 6.539 6.269 6.289 5.723 6.230 6.200 6.142 6.147 5.194 5.771 5.715 5.016 4.121 2.612 3.803 4.453 3.733 3.823 4.036 4.453 4.765 5.225 5.603 6.272 6.687 7.090 7.375 8.444 7.526 6.405 3.932 4.948 5.599 7.597 7.328 7.187 + 5.005 5.260 5.031 5.055 5.060 6.192 5.426 5.018 3.617 3.868 4.351 4.975 3.103 2.820 3.362 2.754 2.037 2.736 2.250 2.758 3.105 3.688 3.877 4.697 4.999 5.264 5.715 7.723 6.340 4.949 2.963 3.630 5.320 7.043 5.673 5.869 + 5.630 6.566 6.849 5.999 5.817 6.314 6.066 5.650 5.621 5.791 6.122 5.726 4.047 2.570 3.092 4.072 3.156 3.265 3.843 3.931 3.582 3.261 4.719 4.878 4.902 4.844 5.206 6.377 5.724 4.134 3.329 3.017 3.080 3.809 2.693 2.781 + 4.861 5.737 5.996 4.794 3.363 5.486 4.314 4.339 2.881 3.747 4.830 4.984 2.922 2.150 2.255 2.377 3.046 3.759 2.601 2.888 3.248 2.921 3.720 3.655 3.342 2.615 3.326 4.713 4.696 3.566 1.560 1.920 2.172 3.523 3.643 2.805 + 3.139 4.131 5.123 4.973 5.340 4.997 4.640 2.965 3.042 4.722 4.885 4.198 1.875 3.253 3.454 2.098 2.390 3.424 2.636 2.876 2.819 3.848 3.540 2.865 3.991 4.555 3.729 3.837 4.526 4.205 2.368 1.596 2.496 3.093 3.330 2.803 + 6.653 5.885 6.235 5.899 5.323 6.233 6.020 4.658 5.652 7.313 7.550 6.850 4.182 3.601 3.584 3.979 3.332 3.980 4.458 3.420 3.524 3.608 3.147 3.160 3.650 4.048 3.968 3.445 5.534 4.884 2.470 2.953 3.465 3.783 2.550 2.753 + 6.014 6.067 6.359 6.105 5.632 5.071 3.887 3.475 4.546 5.831 5.286 5.680 2.966 2.979 3.646 3.753 3.618 3.432 4.076 3.971 3.387 3.738 3.201 3.727 3.922 4.224 4.129 3.976 4.986 4.161 3.315 3.303 4.135 4.212 3.055 2.674 + 6.007 4.817 5.107 4.287 3.192 4.546 4.963 5.677 6.253 5.386 5.504 4.272 4.692 4.232 4.482 3.739 3.675 4.366 3.912 4.068 4.114 4.982 5.106 4.910 4.499 3.955 4.314 4.560 4.980 5.050 4.018 5.558 6.379 5.469 3.981 3.533 + 4.946 2.927 4.588 4.600 4.020 4.934 3.749 4.267 4.775 5.350 5.686 5.888 5.458 4.251 4.218 3.934 3.921 4.606 4.472 3.394 4.437 5.032 4.819 5.771 5.347 4.741 4.178 5.764 5.878 5.158 4.912 5.739 7.259 6.808 6.062 5.343 + 4.353 5.297 5.308 3.323 3.994 4.796 4.270 4.342 3.571 5.132 5.574 6.069 5.592 4.958 4.026 5.390 5.452 5.755 5.588 5.384 4.428 4.783 5.192 5.763 5.690 6.245 5.404 5.628 5.979 5.911 5.319 5.631 7.216 7.067 6.457 5.757 + 4.330 3.452 4.799 4.553 4.070 3.225 4.126 5.602 5.337 5.199 5.739 7.420 6.402 5.319 4.934 6.221 6.107 5.293 4.411 5.336 5.389 5.722 6.072 6.457 6.156 6.503 5.470 5.793 6.114 6.095 5.383 6.078 6.676 6.635 7.299 6.237 + 2.518 0.844 1.805 1.416 1.628 3.230 5.097 6.083 6.097 6.735 6.319 5.521 6.298 5.291 4.627 5.003 6.282 5.967 4.918 5.451 5.754 4.974 6.229 7.088 6.672 6.149 5.026 5.048 6.427 6.307 4.708 6.179 6.909 6.839 7.183 6.313 + 0.665 2.134 2.537 1.395 1.932 2.977 3.821 2.755 4.429 3.212 4.035 3.862 3.716 4.074 4.011 3.839 4.577 5.094 4.711 4.086 3.983 5.350 5.614 6.519 6.092 6.090 4.929 5.541 5.646 5.530 4.722 5.707 6.306 5.957 6.362 5.924 + 2.167 1.249 2.181 1.840 3.921 4.872 3.810 1.147 3.651 3.441 4.355 3.623 4.210 3.464 3.896 3.127 4.523 5.156 4.817 3.869 2.467 4.553 5.326 5.569 5.143 5.878 4.732 5.111 4.986 4.990 4.023 5.023 5.696 5.472 6.045 5.225 + 3.610 2.001 1.643 2.971 2.519 3.587 3.444 3.880 3.145 2.870 5.419 5.065 3.492 3.409 2.955 2.561 2.558 3.178 3.636 3.579 2.979 2.002 3.894 3.383 2.954 2.940 2.255 3.199 3.871 3.148 2.569 3.695 3.722 3.459 3.576 3.304 + 1.488 2.982 2.912 3.812 3.627 4.006 3.772 3.078 3.905 4.211 5.205 4.254 1.376 4.077 4.075 3.854 3.605 3.315 2.762 1.549 2.603 2.057 2.339 2.458 2.547 2.375 1.882 1.806 2.592 2.697 1.600 2.071 2.757 2.764 2.319 1.492 + 3.779 3.038 1.367 0.786 1.427 3.381 2.652 0.889 0.193 1.884 2.835 1.511 -0.604 2.586 3.161 3.145 2.816 2.035 2.741 2.429 2.562 2.225 2.410 2.996 2.541 2.339 2.293 1.173 1.593 2.174 1.576 1.668 1.950 2.271 1.244 0.740 + 2.606 2.212 2.060 2.488 2.190 2.613 3.321 2.425 1.246 2.282 2.674 0.610 0.349 2.289 2.312 1.431 1.611 1.099 2.182 2.067 2.648 2.432 2.386 2.751 1.602 1.515 2.095 1.752 1.880 2.528 2.480 2.234 2.110 1.278 1.788 0.921 + 2.419 3.105 3.210 2.415 1.889 2.710 3.117 1.047 2.180 2.343 3.404 2.317 0.929 2.741 3.153 3.217 2.040 0.807 1.991 2.031 2.662 1.379 2.463 2.791 2.536 2.976 2.659 1.830 1.909 1.541 2.158 2.350 2.173 1.910 2.413 1.783 + 2.300 3.125 1.843 2.556 3.315 2.809 2.344 0.559 1.399 2.657 3.023 1.647 2.305 3.697 2.860 2.414 3.699 2.522 1.661 2.110 3.277 3.322 1.521 2.269 2.399 3.035 4.056 3.694 4.305 4.255 4.593 4.884 4.778 4.673 5.232 4.778 + 3.106 2.947 0.955 0.531 2.866 3.542 3.431 2.006 3.218 2.965 1.981 2.304 1.515 2.349 2.528 2.335 2.594 2.212 2.523 2.756 2.747 3.336 3.311 2.645 2.635 2.601 3.758 3.351 3.992 3.955 4.544 4.794 4.471 4.332 5.160 4.810 + -0.486 1.877 1.066 1.182 2.123 1.340 2.187 1.969 1.671 1.055 2.244 2.615 2.281 2.656 2.974 3.815 3.132 2.031 2.249 2.710 2.791 3.137 3.062 2.091 1.973 1.788 1.686 0.939 2.059 1.969 2.353 2.128 1.502 1.535 1.271 0.081 + 2.555 1.801 1.348 1.731 2.379 2.277 1.802 1.472 2.030 1.718 1.909 3.617 2.288 3.521 3.185 3.706 3.650 3.009 1.675 1.950 1.505 3.008 3.178 1.621 1.546 1.980 2.250 1.575 2.405 1.959 1.962 2.192 1.508 1.389 1.569 1.016 + 3.198 3.232 2.629 1.197 1.360 3.255 3.340 1.958 -0.401 1.265 1.789 2.326 1.070 3.901 3.183 3.460 2.899 2.174 1.048 1.966 2.404 2.357 2.347 1.383 2.815 2.213 2.456 2.544 1.857 1.549 1.705 1.752 1.678 1.118 0.868 1.279 + 2.457 1.168 0.273 2.621 2.964 2.197 2.385 1.884 3.193 3.539 2.021 1.926 1.884 3.161 2.621 0.942 2.070 2.294 1.639 2.624 1.709 0.925 1.528 2.261 2.847 2.174 2.070 2.425 2.540 2.690 1.800 0.889 1.728 1.476 1.833 1.051 + 4.007 3.538 3.237 3.032 2.697 2.268 3.745 3.709 2.428 1.382 0.766 1.775 2.540 2.443 3.020 1.802 1.849 1.573 1.332 0.889 0.986 0.355 2.312 2.543 1.307 1.358 2.797 2.477 2.200 2.696 2.541 1.732 1.779 1.877 1.653 0.893 + 5.141 4.202 2.861 2.788 3.639 3.589 2.139 2.434 3.233 1.610 0.330 1.915 2.037 2.545 2.702 2.064 1.926 1.251 1.857 1.675 1.472 2.292 2.005 1.352 2.142 1.537 1.954 1.580 1.784 1.292 2.617 2.681 1.876 1.085 1.253 1.183 + 4.354 3.301 3.559 3.166 3.268 3.709 3.884 2.386 2.358 2.027 1.755 2.116 2.107 4.770 4.183 2.658 2.332 1.641 1.814 1.629 2.132 2.517 1.401 1.464 2.155 1.808 1.726 0.750 1.610 2.437 1.665 2.307 1.917 1.832 1.075 1.059 + 2.512 2.444 2.638 1.039 2.487 4.829 4.810 3.363 3.615 3.492 3.659 2.941 2.011 4.005 4.321 2.160 2.188 1.814 1.056 2.024 2.569 1.194 1.751 1.975 2.113 1.696 2.010 1.324 1.638 1.239 1.790 1.739 1.174 1.810 1.442 0.834 + 1.289 0.830 1.172 1.089 0.834 2.019 3.629 3.449 1.593 1.217 2.475 2.282 0.297 1.693 3.181 2.879 2.700 2.340 1.737 1.703 0.873 0.599 0.704 1.460 1.341 1.543 1.662 1.426 1.017 1.264 0.930 1.116 2.254 2.551 1.884 1.432 + 2.050 2.717 2.153 3.361 3.194 3.384 4.629 3.415 2.048 2.687 2.173 1.533 1.593 1.109 3.139 2.515 1.314 1.161 1.355 1.280 0.997 0.721 1.237 0.685 0.793 1.297 1.924 1.997 1.907 2.112 1.819 1.099 1.218 1.544 2.008 0.656 + 0.441 2.878 3.009 2.986 4.008 4.200 4.271 2.440 3.467 2.144 -0.481 0.276 1.124 3.113 2.735 1.523 2.123 2.121 1.533 1.076 1.163 2.564 2.234 1.834 1.628 1.343 1.421 0.746 0.973 2.272 1.722 0.600 1.199 1.966 1.668 0.843 + 1.367 1.705 1.303 3.198 3.372 2.982 3.007 2.943 2.416 1.473 2.166 1.631 0.829 2.946 4.039 2.721 3.186 3.465 3.503 1.405 2.121 2.698 1.786 1.180 1.587 2.244 2.876 2.254 0.969 1.289 0.860 0.460 0.913 1.942 1.110 -0.659 + 2.670 2.028 1.873 1.365 1.426 0.615 0.327 1.355 1.418 1.812 1.106 0.718 0.297 2.274 3.346 3.242 2.877 3.055 2.270 2.187 1.945 1.678 1.190 1.240 1.989 2.454 2.175 1.832 2.198 1.927 1.121 0.649 1.203 1.380 0.641 -0.262 + 4.454 5.535 5.033 3.215 3.166 5.286 4.948 2.057 2.418 2.795 1.902 -0.207 0.522 2.767 2.452 2.071 1.680 2.359 1.590 2.150 2.882 2.815 1.927 1.487 2.292 2.005 1.208 1.591 2.062 1.974 0.634 0.947 1.181 1.156 1.314 1.042 + 2.359 5.333 5.169 4.388 4.051 5.537 5.676 3.937 2.181 2.385 1.256 0.687 0.369 2.660 3.023 3.405 3.009 2.768 2.037 1.734 1.764 1.926 0.608 1.080 1.033 0.399 1.305 1.119 1.017 1.397 -0.002 1.001 1.348 1.423 1.344 0.886 + 3.456 4.839 5.749 4.160 4.505 4.500 4.586 4.815 3.757 4.239 3.944 4.424 3.794 4.316 4.766 5.049 4.985 6.164 6.956 7.266 6.310 5.727 5.064 4.766 4.487 4.357 4.154 6.011 6.393 6.318 6.147 5.819 5.642 5.308 5.173 4.409 + 5.698 5.095 6.147 6.661 6.051 5.981 6.946 7.001 6.802 6.722 6.165 6.899 6.379 5.579 5.615 5.726 6.251 8.624 9.951 10.668 8.877 8.032 7.401 7.209 6.760 6.193 6.444 9.039 9.209 8.878 8.516 7.991 7.813 7.529 7.358 6.568 + 1.643 1.872 1.672 2.482 2.185 3.061 2.980 1.956 1.875 2.601 2.185 3.630 2.265 4.199 4.994 4.333 4.259 5.048 7.152 8.720 6.567 5.004 4.971 5.071 3.589 3.861 4.190 6.081 6.454 5.982 5.975 3.529 3.651 3.324 2.958 1.552 + 0.172 0.848 -0.039 0.453 2.414 2.278 1.345 0.763 0.456 1.621 1.366 0.473 1.929 3.701 3.564 2.208 2.043 2.229 2.083 5.030 4.595 2.623 2.446 3.058 1.611 1.525 1.659 2.828 2.788 1.719 2.034 1.441 2.537 2.741 1.589 1.046 + 1.122 2.589 2.384 1.362 1.411 1.770 2.242 1.278 1.890 1.914 2.599 2.606 2.703 4.307 3.794 3.546 2.790 3.450 3.190 2.659 3.160 3.103 3.436 3.490 2.313 2.205 2.612 3.001 2.522 2.567 3.404 3.530 2.741 2.668 2.827 1.710 + 2.263 3.260 2.798 1.922 2.929 3.116 4.592 5.689 4.458 4.631 5.439 5.894 5.817 6.135 7.236 6.341 3.709 5.462 5.227 6.874 8.334 7.568 6.234 6.950 6.427 5.696 7.078 7.313 5.917 6.067 6.674 6.594 5.384 5.524 5.802 4.915 + 1.467 1.633 1.588 3.504 3.811 4.121 4.268 6.583 7.913 7.284 6.883 7.478 8.101 7.961 8.083 7.496 6.931 8.426 9.180 10.933 11.977 10.926 8.460 8.125 8.057 8.223 8.539 8.729 8.283 6.679 7.610 7.889 7.568 5.638 5.824 5.594 + 5.573 5.148 4.060 4.903 6.351 7.667 7.152 6.625 8.838 9.040 8.278 8.430 8.935 10.817 10.759 10.086 9.606 10.298 11.015 11.183 12.498 12.710 11.013 9.676 9.413 9.615 9.700 10.868 8.831 8.171 8.856 9.191 9.102 9.892 8.886 7.212 + 7.928 8.051 7.934 7.254 7.539 9.013 7.838 8.690 9.786 10.910 11.561 11.308 11.227 11.700 12.111 10.747 11.634 12.164 12.232 13.296 13.510 12.606 12.476 12.185 11.829 10.437 9.818 11.122 10.183 8.616 9.082 9.010 10.957 11.654 10.307 9.404 + 10.751 9.979 11.728 11.209 12.120 11.973 12.785 12.910 13.600 13.537 14.287 14.015 14.281 13.942 13.603 13.552 13.517 12.931 13.933 14.789 13.246 13.042 12.670 13.365 12.885 11.668 10.647 10.179 9.126 8.375 9.813 9.446 11.870 12.821 10.172 9.319 + 11.477 12.981 13.035 12.379 12.909 13.825 14.191 14.965 15.787 16.510 16.037 15.790 15.597 15.214 15.358 15.091 15.167 15.928 16.491 16.426 15.004 13.980 14.139 14.262 13.223 12.017 11.477 10.473 10.105 10.636 11.057 9.821 10.781 11.198 9.074 7.442 + 11.641 13.427 13.121 12.126 11.740 13.700 13.678 14.685 16.156 17.515 17.521 16.936 16.434 15.763 15.862 16.043 16.714 17.755 18.314 17.553 16.449 16.093 16.655 16.745 15.352 13.771 13.335 12.175 12.100 12.972 12.762 10.850 11.661 10.892 9.318 8.308 + 10.699 13.264 12.640 11.224 11.687 13.778 13.338 14.061 16.479 17.373 17.442 17.168 16.786 15.694 16.092 15.983 16.861 18.022 18.479 17.227 16.144 16.071 16.505 16.533 14.931 13.164 12.963 12.652 11.661 12.480 12.541 11.147 10.317 10.091 9.297 8.828 + 11.504 13.538 12.781 11.949 11.728 14.012 13.424 14.682 16.532 17.392 17.659 17.281 16.965 15.996 15.822 16.231 17.289 18.497 18.069 17.123 16.286 16.170 16.810 16.948 15.539 13.664 13.636 13.696 12.571 13.187 13.854 12.380 11.430 9.511 8.841 8.749 + 11.599 13.672 13.115 12.131 12.594 14.002 14.057 15.277 16.849 17.581 18.061 17.383 16.918 16.417 16.234 16.902 17.913 18.353 17.232 16.199 15.849 15.806 16.613 16.961 15.628 13.770 13.621 14.138 13.702 13.090 14.355 13.780 12.214 10.321 8.470 8.329 + 12.536 14.175 13.121 13.200 13.087 14.333 14.839 15.856 17.558 17.829 18.658 17.319 16.831 16.809 17.812 17.924 17.849 16.925 15.829 15.132 15.217 15.143 16.079 16.728 15.395 13.381 13.101 13.689 13.969 12.257 13.832 14.233 12.680 10.770 7.493 7.364 + 13.197 14.408 13.535 13.702 14.003 15.540 16.354 16.537 17.399 17.794 17.891 16.628 16.677 16.643 17.463 17.142 15.534 14.166 13.729 13.824 13.718 13.761 14.738 15.914 14.625 11.877 11.005 11.868 12.768 11.038 10.658 12.287 10.948 9.818 6.544 6.280 + 13.620 14.236 13.510 12.926 12.249 14.422 15.344 15.557 15.087 14.580 14.713 14.747 15.406 14.821 13.544 12.571 11.895 12.110 11.501 11.875 11.809 12.383 13.458 14.345 14.065 12.344 10.639 9.894 9.417 7.994 8.260 10.266 9.697 8.396 6.575 5.773 + 13.847 14.663 12.878 12.684 12.113 12.149 10.322 9.415 10.752 10.702 12.407 13.486 13.844 11.434 10.718 10.964 10.683 11.595 10.465 10.705 11.055 11.393 12.599 13.860 13.894 12.444 10.157 8.948 7.744 6.205 8.059 10.307 11.095 10.104 8.201 5.403 + 13.926 14.240 12.658 12.524 12.054 11.436 10.601 10.207 10.328 10.149 12.652 13.481 13.321 10.938 10.501 10.350 11.029 11.044 10.648 10.999 11.205 11.175 12.200 13.741 13.967 12.854 10.262 8.849 7.206 6.871 8.697 9.651 9.800 10.177 8.500 6.074 + 13.881 14.004 12.701 12.514 12.185 11.540 10.570 8.680 9.341 10.311 12.502 13.956 13.317 11.310 9.948 10.531 11.252 10.871 11.273 11.055 11.027 11.207 12.200 13.781 13.959 12.540 10.293 8.810 7.430 8.929 9.626 9.808 10.990 10.510 8.705 6.222 + 13.814 13.889 12.810 12.631 12.314 11.451 10.392 8.346 8.687 9.627 12.334 14.035 13.387 11.498 9.623 9.918 10.760 10.774 10.939 10.831 10.854 11.245 12.487 13.950 13.849 11.899 9.641 8.274 6.720 8.935 9.145 9.436 11.123 10.293 8.404 5.067 + 13.729 13.796 12.910 12.743 12.359 11.424 10.029 9.127 10.001 10.969 12.327 13.667 13.043 11.670 9.111 10.361 10.055 10.340 10.647 10.945 10.951 11.038 12.277 13.645 13.176 10.740 8.685 7.020 7.067 9.350 8.926 9.014 9.856 9.016 5.968 4.277 + 13.503 13.815 12.797 13.603 13.186 14.419 15.097 14.926 13.593 12.455 12.459 13.585 14.323 14.612 13.718 10.874 11.082 11.887 11.762 11.769 11.298 11.235 12.260 13.225 12.076 9.544 8.083 8.556 8.849 10.722 10.778 9.824 10.068 9.286 7.819 6.752 + 13.323 13.171 12.812 13.059 14.063 15.173 16.548 16.638 17.033 15.780 14.561 15.084 15.619 16.454 16.689 16.286 15.322 13.339 13.350 12.846 13.045 12.769 13.572 14.226 12.972 10.991 10.854 9.924 9.649 12.064 12.436 11.400 10.812 9.721 7.417 6.688 + 11.889 12.055 13.356 13.206 13.727 14.911 15.852 17.637 17.899 17.460 14.987 15.306 15.133 15.456 17.200 17.963 17.335 14.967 14.480 13.778 13.888 13.598 14.800 15.442 13.942 12.462 12.632 11.678 10.747 12.915 13.235 11.828 11.194 9.305 7.634 6.500 + 12.813 12.540 12.712 12.985 13.866 14.657 16.170 17.451 17.772 17.047 14.816 14.760 14.230 14.514 15.487 17.211 18.396 16.793 15.412 14.164 13.750 13.779 15.207 16.077 13.951 13.052 13.279 11.997 10.569 12.326 12.452 11.472 10.827 10.141 10.213 8.491 + 13.574 13.270 11.813 13.162 13.930 14.750 16.698 17.240 16.744 15.355 14.124 13.345 13.176 13.377 13.890 14.661 16.386 17.304 16.420 14.250 13.000 12.877 13.915 15.550 14.013 12.511 12.559 11.042 8.901 8.762 10.694 12.037 11.387 11.502 12.520 9.147 + 12.902 12.714 11.758 12.962 13.219 13.389 14.734 13.954 13.158 13.181 11.661 10.081 9.971 8.899 9.614 9.722 11.353 13.492 13.838 13.489 13.060 12.165 13.014 12.766 12.113 13.472 11.529 10.421 11.122 10.676 9.846 10.756 9.907 11.216 11.089 9.142 + 9.883 9.826 8.031 8.701 7.743 8.923 11.023 11.045 10.400 9.659 7.704 8.552 6.943 7.364 7.747 8.878 9.412 9.144 10.252 9.577 9.322 7.625 8.389 9.213 9.406 10.894 9.075 9.033 9.881 9.347 8.357 9.211 8.549 7.975 7.886 6.045 + 7.774 6.131 7.510 7.310 7.224 7.488 8.917 9.258 10.927 9.851 9.304 9.145 7.536 5.470 7.900 8.859 9.628 9.665 8.096 6.322 7.755 8.160 8.068 8.362 8.621 9.054 7.631 5.555 5.959 6.545 4.482 4.707 5.546 5.417 6.123 4.962 + 6.490 6.150 6.652 5.814 5.339 6.187 7.683 8.950 10.383 11.734 10.393 7.367 6.956 7.418 7.351 8.521 10.195 10.405 7.351 8.026 7.693 8.132 9.177 9.097 9.882 9.462 9.123 8.682 7.861 7.857 6.452 6.823 7.548 7.707 7.516 6.888 + 6.142 6.297 6.164 5.522 5.335 6.305 8.839 8.937 9.377 10.329 9.773 7.579 6.370 6.298 7.152 7.765 8.665 8.114 6.813 7.288 6.792 5.275 6.805 7.661 9.180 8.599 6.232 6.233 6.612 6.149 5.276 5.887 6.878 6.514 6.365 6.411 + 6.863 6.709 7.049 7.339 8.678 9.218 9.081 8.879 9.986 10.535 10.724 10.842 10.165 8.654 9.765 10.480 10.461 9.710 9.861 9.827 10.758 11.366 10.836 11.738 13.099 13.468 15.151 15.287 14.884 14.879 12.712 12.143 11.752 11.874 11.091 10.476 + 5.939 5.749 7.218 8.166 8.350 9.063 9.622 9.513 9.517 10.033 10.524 10.606 9.833 9.004 9.932 9.890 9.604 9.002 9.415 10.175 10.998 11.257 12.270 13.539 13.913 14.498 15.920 15.493 15.835 15.310 13.889 13.789 12.884 13.472 12.731 12.751 + 6.875 6.885 7.185 6.843 7.656 6.810 7.232 8.184 8.312 7.989 7.871 8.387 7.257 7.835 8.577 8.631 9.397 10.131 11.560 11.225 11.808 12.088 14.156 15.701 15.077 15.377 15.488 14.771 15.262 15.888 15.319 15.063 15.084 15.118 15.410 14.776 + 8.798 6.799 7.643 8.249 10.612 11.353 10.834 10.325 10.216 10.658 11.488 10.969 10.568 11.204 11.528 11.315 12.539 12.472 13.468 14.417 14.761 13.553 14.219 14.915 15.093 15.475 14.456 14.379 14.956 15.518 15.188 14.774 15.137 15.024 15.741 14.302 + 10.455 11.104 10.805 10.794 10.905 11.642 10.102 8.973 9.694 8.497 10.105 9.470 9.733 10.352 10.695 11.331 12.181 13.896 13.783 14.167 13.890 13.898 14.481 13.369 14.290 13.565 12.996 13.355 14.291 15.247 13.368 13.577 13.621 13.622 12.908 12.532 + 15.225 13.805 13.977 14.689 13.651 12.036 9.866 8.194 9.522 10.371 10.228 10.703 11.292 10.909 12.846 13.200 13.108 13.837 14.188 12.960 11.671 12.371 11.603 10.211 10.266 10.910 10.706 10.829 10.292 11.212 9.936 10.661 11.195 11.786 11.449 11.414 + 14.736 13.963 13.905 13.373 13.322 13.305 13.041 12.668 12.532 12.401 10.716 11.006 11.132 11.497 13.717 13.907 12.836 13.198 12.428 11.837 12.203 11.533 11.065 10.441 9.415 9.347 9.937 10.070 9.890 9.646 8.953 9.893 9.919 11.380 10.252 9.447 + 17.073 16.506 15.609 14.885 14.350 12.990 13.263 13.544 12.396 12.035 11.956 11.098 11.959 11.181 13.246 13.596 12.009 12.107 12.189 10.918 10.762 10.249 11.309 11.278 9.112 9.315 8.781 9.815 9.116 9.105 9.006 8.623 8.418 9.931 9.615 7.906 + 16.623 17.042 15.511 14.802 14.453 13.494 13.410 13.129 12.071 11.256 11.503 11.127 11.270 11.475 13.011 12.445 12.003 11.361 11.443 11.357 10.279 10.103 9.414 10.012 9.991 10.189 10.089 9.617 8.704 8.871 8.834 8.817 8.230 8.792 8.276 6.738 + 17.805 17.007 14.341 15.164 14.407 13.854 14.089 13.715 11.435 12.241 12.900 12.144 11.381 10.845 11.421 11.964 11.596 11.936 11.827 10.169 10.386 9.981 9.225 9.439 9.580 9.775 10.305 10.270 8.805 9.172 9.031 8.879 8.656 7.516 7.918 6.988 + 15.768 15.300 14.920 15.237 14.551 12.449 12.653 12.133 10.962 11.174 11.194 11.248 11.432 10.957 11.478 10.919 10.703 9.913 9.314 9.661 9.835 9.420 8.764 8.754 8.084 9.083 9.574 8.943 7.880 8.562 8.819 8.612 7.843 7.478 7.447 6.017 + 13.712 13.012 12.353 12.453 10.913 11.484 10.589 8.741 8.876 9.004 10.236 11.631 13.128 11.538 10.303 10.977 9.613 9.424 9.191 10.513 10.796 10.166 8.553 8.618 8.455 9.141 8.959 9.088 8.962 8.481 8.700 8.152 7.284 8.217 7.931 6.822 + 13.432 11.879 10.105 11.624 11.761 9.724 9.948 9.508 9.448 8.466 9.706 11.804 14.094 13.551 11.927 10.765 10.562 9.697 10.302 10.838 10.935 10.614 10.120 9.600 8.670 9.342 8.658 9.479 9.322 8.076 8.668 8.185 7.723 8.031 7.862 7.271 + 10.717 7.976 9.021 9.941 10.489 9.120 8.910 8.008 7.459 7.756 8.645 10.898 12.367 14.779 14.122 11.036 9.973 10.754 9.512 8.840 8.722 8.868 9.346 9.968 8.841 7.908 8.844 9.342 8.381 8.213 8.940 8.149 6.707 6.775 7.649 6.839 + 10.287 8.503 9.174 10.648 11.500 11.444 10.598 9.102 8.196 7.997 8.537 7.464 9.772 11.769 11.132 9.710 8.882 8.582 8.364 9.029 8.264 7.226 7.414 8.821 8.551 7.974 8.522 7.819 7.793 7.159 7.074 6.198 6.461 6.812 7.013 5.491 + 6.841 6.381 6.707 6.556 9.405 10.151 8.051 6.634 7.372 6.354 5.609 5.691 7.334 8.214 8.982 9.905 8.643 5.635 7.039 6.478 6.559 5.557 6.793 6.850 5.532 6.103 5.972 5.795 6.051 6.438 5.786 5.460 5.646 6.558 6.429 5.237 + 5.920 5.370 6.210 6.897 6.932 7.203 6.485 6.353 6.337 4.753 5.602 6.721 6.578 6.827 7.362 7.777 7.637 7.225 6.099 5.379 6.707 6.496 8.367 6.912 5.651 4.858 5.419 5.374 5.157 5.928 5.628 5.530 5.326 5.765 6.877 5.361 + 5.217 3.321 5.045 5.724 6.612 7.016 5.667 5.689 4.763 5.357 5.280 5.647 6.375 6.925 5.765 7.499 7.476 8.191 8.730 6.501 7.630 7.007 7.994 8.310 7.605 6.785 7.989 7.178 7.059 7.547 6.313 4.623 5.191 5.337 5.576 4.498 + 5.470 4.927 5.317 4.496 6.706 8.203 8.148 7.918 6.414 6.354 5.553 6.694 6.789 6.688 6.484 7.662 7.909 9.217 10.206 8.675 9.216 8.849 8.960 9.348 8.308 7.363 8.926 8.539 8.231 9.153 7.051 5.765 5.276 4.774 6.634 6.241 + 5.570 5.283 5.179 3.713 6.596 8.281 8.506 9.151 8.498 7.878 7.741 7.515 7.480 8.431 8.496 7.951 8.654 8.584 10.167 9.970 9.519 10.117 9.825 9.765 10.368 9.047 10.255 10.567 9.756 9.382 9.752 7.903 5.958 6.204 7.696 8.342 + 5.725 6.945 6.000 5.120 7.137 7.154 9.085 9.539 9.078 9.755 10.150 10.298 10.048 10.347 8.550 8.961 10.121 11.178 11.882 11.940 11.771 10.809 10.563 9.871 10.202 9.301 10.726 10.966 10.432 9.578 10.420 8.394 6.991 7.747 8.850 9.100 + 8.742 9.243 9.214 9.059 8.802 10.066 11.034 11.551 11.547 10.804 10.250 10.927 11.299 9.204 9.751 10.608 11.626 12.251 11.420 13.541 13.696 10.521 10.541 10.318 10.493 10.557 10.463 10.429 9.786 10.325 11.850 11.485 9.385 8.649 9.748 8.576 + 7.622 7.945 8.043 8.613 7.776 8.684 9.320 8.784 11.337 10.809 11.350 12.604 12.643 10.620 11.041 10.872 11.227 12.154 12.766 13.825 13.559 12.767 10.383 11.191 11.493 10.177 11.544 11.551 10.593 10.162 12.045 12.514 10.958 9.555 10.456 9.544 + 9.047 8.958 8.174 8.129 7.561 9.715 9.838 9.555 11.469 12.048 13.338 14.127 13.295 11.924 11.830 10.992 12.301 12.817 14.075 15.770 15.484 13.994 12.217 11.455 11.083 10.705 12.059 12.009 10.787 9.175 10.296 11.777 10.885 10.307 11.280 10.106 + 9.370 9.733 8.409 8.133 9.479 11.065 11.387 10.802 10.703 11.806 12.490 12.924 13.632 12.891 12.904 12.136 12.367 13.465 13.741 16.461 16.621 14.282 13.638 12.751 13.080 12.368 11.161 12.409 11.977 9.295 9.784 10.628 11.046 12.438 12.579 9.813 + 9.597 9.863 9.534 10.279 10.069 10.210 10.568 9.389 10.962 11.986 13.634 13.645 13.877 12.883 12.878 13.091 14.415 14.443 13.860 15.275 16.067 15.610 14.325 13.363 13.705 13.180 11.632 11.933 11.917 10.770 10.304 11.508 11.569 12.664 12.255 9.745 + 11.179 10.068 9.611 11.126 11.323 9.264 8.948 11.148 10.742 9.794 13.593 14.749 14.216 13.253 13.308 13.367 14.694 14.622 14.151 15.724 15.965 13.769 12.966 12.700 13.552 13.856 11.864 11.713 11.995 11.592 10.763 11.471 12.929 12.778 11.841 10.110 + 11.344 12.225 12.654 11.684 13.082 12.533 12.904 12.934 14.341 14.243 14.547 15.460 15.058 13.661 14.268 13.756 14.720 15.222 16.069 16.282 14.552 13.708 13.706 13.071 13.371 13.548 11.191 10.558 12.174 12.435 11.118 11.169 13.358 14.016 10.381 9.085 + 11.579 12.993 13.597 11.619 13.439 13.477 14.949 14.562 16.289 16.599 17.496 17.203 16.573 16.229 16.035 15.836 16.157 16.788 17.358 17.613 16.149 15.494 15.215 14.283 12.884 13.313 11.989 11.134 11.617 12.397 11.450 10.376 13.444 13.235 10.805 8.467 + 11.349 13.023 13.603 11.723 13.012 13.106 14.933 14.592 16.815 17.745 18.359 17.175 16.515 16.858 16.613 16.760 17.346 18.244 18.819 18.357 17.138 16.831 17.040 15.940 13.333 14.196 13.213 12.048 13.472 13.701 13.055 11.893 13.779 13.061 9.618 8.538 + 10.694 13.125 13.381 11.950 13.084 13.631 14.730 15.374 16.512 18.489 18.246 17.792 16.567 16.357 16.302 16.341 17.305 18.380 19.073 17.694 16.265 16.585 17.078 16.303 13.543 13.874 13.395 12.114 12.690 13.629 13.777 12.375 12.507 11.930 9.814 9.300 + 11.610 13.715 13.401 13.030 13.411 14.460 14.853 16.120 16.947 18.662 17.757 17.763 16.171 15.829 15.926 16.450 17.592 18.500 18.597 17.091 16.205 16.831 17.760 16.516 13.676 13.553 13.648 12.800 12.757 13.975 14.948 14.146 14.266 13.379 9.073 9.573 + 11.508 13.930 13.703 13.326 13.647 14.807 15.135 17.055 17.794 19.006 17.353 17.252 16.286 16.149 16.509 17.457 18.727 18.729 17.034 16.419 15.709 16.586 17.463 16.261 13.322 12.783 13.086 12.536 12.492 13.166 14.286 14.423 14.526 13.898 10.377 9.459 + 11.414 14.256 14.055 13.905 14.400 15.016 15.983 18.215 18.301 19.131 16.942 16.406 15.212 16.570 17.412 18.218 18.136 17.860 15.506 15.326 14.988 15.457 16.520 15.900 13.735 12.504 11.955 11.506 11.289 11.661 12.306 13.838 14.204 13.075 10.328 7.597 + 11.752 14.648 14.282 14.700 14.926 15.812 17.117 19.086 18.264 18.262 17.692 17.363 16.923 16.078 18.345 17.509 16.275 15.271 14.088 13.481 13.694 13.766 15.121 15.003 13.301 11.534 10.921 10.205 10.304 11.164 12.900 14.070 14.713 13.497 11.613 8.282 + 11.960 14.753 14.649 15.052 15.567 17.371 18.005 18.976 17.655 15.531 16.737 17.063 17.504 17.215 17.704 16.366 13.554 13.029 12.896 12.151 11.942 12.034 13.528 14.044 12.495 11.572 11.303 10.263 9.847 10.704 12.924 13.185 13.948 14.149 12.816 8.252 + 11.641 14.815 14.780 15.537 16.320 18.145 17.774 17.040 16.767 15.400 14.452 15.786 17.285 16.873 15.189 13.565 12.125 12.118 12.037 11.008 10.876 10.627 11.728 11.543 12.154 12.358 11.408 10.340 10.184 10.984 13.579 13.195 14.057 15.035 14.118 6.339 + 11.437 14.822 14.721 16.235 16.696 17.776 17.403 14.758 15.242 13.919 14.569 15.620 17.315 15.616 12.675 12.338 12.228 10.583 10.053 9.928 9.961 10.392 10.323 10.254 11.969 12.200 10.499 9.689 9.805 10.529 13.012 12.708 13.913 15.694 14.751 7.186 + 11.378 14.569 14.595 16.600 16.918 16.255 16.176 15.010 14.935 14.669 13.602 14.965 16.082 14.690 12.641 11.568 10.947 11.319 10.150 9.203 9.208 9.742 9.634 10.345 11.562 11.544 9.428 8.681 8.671 9.521 12.062 12.362 13.393 15.175 14.061 7.477 + 11.599 14.191 14.210 16.589 16.764 14.440 14.499 14.063 14.040 14.257 13.157 13.422 14.655 14.796 13.032 11.331 10.160 10.648 9.867 9.600 8.220 8.721 9.319 9.961 10.451 10.486 7.708 6.797 6.705 7.536 10.716 11.212 11.663 13.196 12.259 7.278 + 11.444 13.829 13.984 16.676 16.492 13.371 13.115 12.868 12.659 13.183 12.085 11.917 14.266 14.888 14.222 11.917 10.870 10.422 9.521 9.265 8.974 8.875 9.629 10.627 9.554 8.199 6.544 4.768 4.669 5.062 7.163 9.227 9.653 10.801 10.507 6.382 + 11.490 13.301 13.937 16.519 15.898 13.372 12.114 12.127 12.011 11.597 11.074 10.771 11.060 13.487 13.572 13.298 13.107 12.034 11.577 10.443 10.466 10.375 11.253 12.501 11.478 7.364 6.418 5.497 5.687 5.551 6.477 8.837 7.752 9.852 10.202 7.737 + 11.733 12.343 14.421 15.703 15.035 13.213 12.366 12.014 12.151 12.116 10.245 9.787 9.458 10.304 11.512 12.429 12.524 13.822 14.030 12.682 11.868 12.496 13.016 14.425 12.654 9.076 7.616 7.313 7.071 6.957 8.117 9.981 8.459 9.223 9.250 7.260 + 10.889 12.454 13.883 14.190 13.734 13.040 12.078 11.383 10.880 11.006 10.315 9.609 9.771 10.126 10.196 10.730 10.982 11.056 11.879 13.169 13.657 14.529 14.483 15.453 13.920 10.503 9.362 9.070 8.149 8.434 9.546 10.229 8.534 11.250 10.697 7.827 + 10.468 12.419 13.716 14.332 12.851 11.904 10.717 9.342 9.517 10.253 9.671 8.849 8.166 9.532 9.774 9.956 9.838 9.823 10.612 10.869 11.049 13.012 14.727 14.598 14.235 13.609 12.869 11.668 10.605 10.220 11.454 11.458 9.679 13.134 12.250 7.918 + 10.755 12.628 12.744 13.879 12.848 11.963 10.916 9.292 10.296 10.584 9.539 8.089 9.081 8.401 8.596 8.911 9.034 9.993 9.332 9.262 10.378 11.210 13.931 13.768 11.848 11.742 11.698 11.168 11.763 11.102 11.698 12.871 11.385 13.218 13.127 8.795 + 12.147 12.982 14.038 14.694 12.840 11.633 10.528 9.646 9.793 10.894 8.684 8.299 8.385 8.723 8.987 9.182 9.602 9.428 9.573 9.663 10.143 11.487 13.373 13.248 11.021 10.567 11.029 11.063 11.916 12.073 12.605 13.718 12.710 14.370 13.662 10.393 + 11.906 14.588 14.261 14.156 13.838 11.962 11.225 11.177 10.861 10.994 9.619 9.357 9.791 9.276 8.795 9.630 9.920 9.954 10.234 10.159 10.912 11.659 14.300 13.908 12.130 12.043 12.337 12.543 14.238 14.564 14.841 15.849 15.238 15.488 14.202 10.258 + 12.090 15.003 14.849 13.410 13.789 12.403 12.258 11.822 11.388 10.450 9.247 9.215 9.187 8.889 9.814 10.294 10.650 11.197 11.613 11.844 12.177 12.970 15.014 15.204 13.400 13.205 13.537 13.572 15.101 15.990 16.064 17.196 16.865 16.392 15.382 11.353 + 12.114 15.230 15.119 13.761 13.702 12.688 12.430 11.575 11.093 10.224 10.263 10.184 9.243 9.741 10.056 9.940 10.329 10.517 10.499 11.375 11.841 13.405 15.706 16.055 13.242 13.067 13.451 13.789 15.576 16.388 16.488 17.808 17.551 16.614 15.679 11.497 + 12.693 15.504 15.239 14.102 13.791 13.240 12.765 11.339 10.683 11.049 10.720 10.466 9.512 11.001 10.229 10.368 10.425 10.555 11.177 11.373 12.070 13.340 15.820 16.070 13.754 13.024 13.286 13.796 15.647 16.524 16.669 18.015 17.602 15.955 14.860 11.118 + 12.796 15.494 15.106 14.215 13.789 13.736 13.082 11.550 11.380 11.937 11.154 10.715 9.908 10.977 9.996 10.580 10.382 11.272 11.401 11.932 12.411 13.154 15.019 15.703 13.891 12.977 13.126 13.913 15.636 16.183 16.331 17.966 17.449 14.792 13.613 11.283 + 12.670 15.368 14.928 14.321 14.022 14.139 13.626 11.833 11.632 12.206 10.847 10.611 9.757 10.513 10.448 10.822 10.953 11.585 11.322 12.160 12.151 13.457 15.525 15.650 13.715 12.726 12.970 13.903 15.439 15.215 15.430 17.001 16.289 13.218 11.927 10.676 + 12.283 15.163 14.866 14.533 14.641 14.243 14.189 12.026 11.492 12.167 10.094 10.468 11.152 10.986 11.255 10.964 11.592 11.843 11.643 11.842 12.180 13.569 15.818 16.108 14.178 12.435 13.175 14.355 15.293 14.813 15.499 17.380 16.454 13.421 11.603 10.031 + 11.706 14.855 14.671 14.785 15.233 14.099 14.252 11.994 11.280 11.676 9.941 10.365 11.573 11.449 11.146 11.031 11.488 11.764 11.808 12.171 12.533 13.660 15.931 15.661 13.767 12.371 13.881 14.636 13.486 13.174 14.624 16.982 15.832 12.955 10.941 10.350 + 11.669 14.667 14.454 15.031 15.861 14.173 14.406 12.023 10.813 11.151 9.998 10.207 11.366 10.918 11.119 11.118 11.421 11.752 12.239 12.308 12.729 14.267 16.282 15.770 13.310 13.915 14.985 14.612 12.761 12.423 13.856 16.239 14.582 12.521 11.891 12.099 + 11.530 14.316 14.172 15.239 16.141 13.988 13.798 12.230 10.410 11.144 10.748 11.947 12.964 12.805 12.199 11.526 11.339 11.077 11.755 12.237 12.872 15.319 16.409 14.984 12.479 13.611 16.029 15.643 13.934 12.120 13.794 16.355 14.567 13.616 12.842 11.677 + 11.916 13.908 13.692 15.287 16.032 14.271 13.328 12.674 12.078 11.944 11.613 11.612 11.749 12.152 11.928 12.380 12.399 12.302 12.226 12.267 14.118 16.078 15.788 13.907 12.515 13.806 15.045 14.024 12.647 12.181 13.312 16.049 14.062 14.111 14.650 13.336 + 10.171 12.724 12.313 14.193 14.930 13.560 14.342 12.133 11.925 12.413 11.810 11.728 10.860 12.002 11.583 11.320 11.673 12.461 13.235 13.505 14.920 16.198 13.809 12.932 11.792 14.907 15.934 13.761 11.895 11.026 12.312 14.096 13.077 13.476 14.349 13.738 + 9.540 12.581 12.454 14.397 14.952 13.978 14.045 11.330 12.202 12.408 12.185 11.726 11.092 11.945 11.940 11.823 11.827 11.756 12.765 13.278 15.082 15.663 13.514 12.203 11.448 13.626 14.711 12.669 11.645 11.248 12.725 14.332 13.299 14.047 14.527 14.954 + 9.269 12.420 12.243 14.383 14.995 14.106 14.284 11.215 9.932 12.415 12.458 12.874 11.308 11.456 11.923 11.486 11.320 12.120 12.688 12.636 14.820 15.034 13.209 11.765 11.697 13.056 14.239 13.010 12.319 12.032 14.244 16.123 14.223 15.127 15.612 15.809 + 9.989 12.967 12.821 14.539 15.123 13.920 13.645 11.295 12.699 12.921 11.770 11.952 12.335 11.932 11.206 11.166 11.579 11.959 12.887 13.454 14.536 15.020 14.073 12.374 11.512 13.290 14.597 13.629 12.247 11.659 13.332 15.191 13.963 14.191 16.228 16.192 + 10.083 13.318 13.338 15.147 15.404 13.097 13.257 12.459 11.924 11.434 11.598 12.183 11.714 11.718 12.004 11.751 11.618 12.339 12.479 13.556 14.592 15.129 14.164 12.798 11.978 12.793 14.074 13.742 12.504 12.801 13.664 15.957 14.450 14.863 14.955 14.570 + 11.718 13.962 13.525 15.421 15.433 12.255 12.724 12.486 11.520 11.440 11.354 10.494 11.625 11.940 11.534 10.943 11.027 11.773 12.282 13.072 14.514 15.831 15.308 14.046 13.145 14.165 15.198 14.276 13.247 13.281 14.160 16.235 14.002 14.310 15.473 14.424 + 11.727 14.440 14.022 15.479 15.511 13.640 12.725 11.249 12.025 12.290 10.951 11.283 11.243 11.450 11.490 11.236 11.080 11.825 12.542 13.035 13.753 15.947 15.853 13.931 13.023 13.152 14.608 13.737 13.908 14.354 15.179 14.791 13.052 14.679 13.960 12.667 + 12.716 14.895 14.215 15.508 15.296 13.649 12.580 11.507 11.635 11.923 11.646 10.571 9.820 11.011 9.902 10.780 10.618 10.997 11.396 11.917 13.557 15.852 16.665 15.263 13.963 14.380 14.859 13.701 13.643 14.461 16.009 15.720 13.551 14.142 13.486 12.263 + 13.248 15.048 14.192 15.507 14.849 13.331 11.897 11.415 11.109 11.099 11.552 10.153 10.157 10.719 9.936 10.264 10.580 10.931 11.629 12.184 13.217 15.405 16.505 16.019 14.826 15.226 15.623 13.922 13.893 14.973 16.472 15.494 13.958 13.982 12.737 8.230 + 13.461 14.881 13.996 15.367 14.264 13.218 11.559 11.125 10.540 10.587 11.039 9.406 10.005 10.175 10.165 10.406 10.567 11.286 11.501 12.340 13.302 15.078 16.146 15.995 15.131 15.371 14.658 13.492 13.435 14.760 16.552 15.533 14.227 14.420 13.615 8.711 + 13.535 14.552 13.733 14.885 13.453 12.799 11.639 11.167 10.438 10.850 10.793 9.243 10.128 10.120 9.863 10.728 10.149 11.494 11.588 12.587 13.419 14.900 15.593 15.739 15.125 14.007 13.099 12.169 12.183 13.520 15.589 14.935 14.037 14.469 13.870 8.910 + 13.681 14.397 13.752 14.556 12.948 12.365 11.740 10.957 10.409 11.008 10.286 9.276 10.015 10.065 9.749 10.656 10.101 11.814 11.827 13.577 13.889 14.771 14.985 15.255 14.441 13.122 11.622 10.897 11.106 12.490 14.612 14.120 13.446 13.893 13.573 8.257 + 13.620 14.185 13.556 14.110 12.693 12.169 11.730 10.533 10.287 10.873 9.610 9.104 9.789 9.848 9.859 10.597 10.714 11.981 12.345 13.984 13.509 13.352 13.996 14.679 13.171 11.214 10.215 9.776 10.190 11.763 14.571 14.145 13.254 13.241 13.420 8.615 + 13.384 13.630 13.290 13.501 12.524 11.955 11.386 9.871 9.683 10.331 8.223 9.706 9.757 9.621 10.188 10.283 11.316 11.484 12.672 12.827 11.540 11.424 12.474 13.869 11.730 9.410 8.457 8.165 8.758 10.606 13.609 13.238 12.480 12.302 12.402 7.792 + 13.269 13.355 12.981 12.868 12.603 11.851 11.291 9.267 9.052 9.468 8.146 10.209 9.794 9.477 9.912 10.132 11.893 11.147 11.954 10.481 9.958 10.010 11.410 13.682 11.630 9.086 7.951 7.639 7.872 9.536 12.762 12.755 12.143 11.898 11.687 7.489 + 12.950 13.043 12.606 12.614 12.427 11.615 11.163 8.909 9.216 9.524 8.109 9.944 9.376 9.723 10.169 10.605 13.016 11.863 11.176 9.568 9.508 9.365 11.110 12.973 10.695 8.584 7.977 7.246 7.773 8.923 12.350 12.644 12.282 11.509 10.669 7.619 + 12.861 12.899 12.671 12.824 12.410 11.419 11.191 9.074 9.605 9.962 7.377 9.667 9.389 9.376 10.469 10.655 13.018 11.434 10.370 9.529 9.313 9.249 10.850 11.939 10.409 8.493 8.033 7.177 7.991 9.201 12.548 12.974 12.652 11.745 10.649 8.264 + 12.776 12.883 12.815 13.190 12.603 11.459 11.189 9.261 9.732 10.006 7.765 9.618 9.532 9.594 10.480 10.572 13.070 12.133 10.966 10.042 10.089 10.011 11.618 12.771 10.836 9.157 8.485 7.013 8.056 9.645 12.990 13.433 13.332 12.791 9.932 7.736 + 12.829 12.888 13.155 13.489 12.698 11.498 11.491 9.507 9.944 10.099 8.379 9.018 9.417 9.382 10.473 10.252 12.328 12.885 12.077 10.997 10.594 10.363 11.856 13.019 11.495 9.342 9.308 7.252 7.989 9.720 12.830 13.212 13.718 13.227 9.594 7.760 + 12.882 12.905 13.500 13.640 12.709 11.598 11.655 9.575 9.968 9.925 9.096 8.584 9.353 8.968 10.283 10.295 11.486 13.032 12.873 12.483 11.225 11.053 12.348 13.798 12.646 10.092 10.078 8.009 8.360 9.866 12.707 12.856 13.186 12.713 8.426 7.906 + 12.738 12.848 13.844 13.765 12.715 11.700 11.537 9.144 9.993 9.878 9.350 8.191 9.097 8.486 9.665 9.977 10.878 12.083 13.567 13.645 11.999 11.677 12.770 13.753 12.534 10.012 10.062 9.023 7.927 9.301 11.285 11.365 12.383 11.828 8.520 8.090 + 12.708 12.876 13.822 13.255 12.424 11.718 11.215 8.782 9.789 9.571 9.044 7.570 8.745 8.022 9.240 9.598 10.625 11.495 13.174 14.255 12.519 11.715 13.379 14.897 12.642 9.904 9.875 8.883 8.485 9.076 11.920 11.950 12.774 12.535 9.604 8.778 + 12.622 12.884 13.661 12.792 12.235 11.675 10.964 8.644 9.699 9.465 8.888 8.038 8.648 7.919 8.743 9.066 9.929 10.525 11.957 13.500 12.552 12.089 13.719 15.077 12.486 10.045 9.188 7.820 8.726 10.303 12.739 12.251 13.172 12.713 9.019 8.600 + 12.484 12.533 13.175 12.102 11.881 11.263 10.462 8.006 9.300 9.182 8.620 7.661 7.859 7.453 8.524 8.538 9.452 9.449 10.744 12.030 12.516 12.206 13.507 13.979 11.893 9.891 9.536 6.847 7.160 9.368 11.688 12.202 14.033 13.207 8.707 7.534 + 12.101 11.959 12.636 11.628 11.630 10.785 9.813 6.815 8.642 8.866 8.498 8.056 7.499 7.368 8.294 8.130 9.058 9.081 10.774 12.202 11.970 11.773 13.256 13.682 11.395 9.725 9.088 7.579 8.143 9.899 11.474 11.239 12.938 11.976 8.982 8.675 + 12.411 11.466 12.420 12.080 12.043 10.485 8.635 7.349 8.815 8.551 8.604 8.686 6.909 7.313 7.090 8.630 8.745 9.743 10.788 11.341 10.416 10.429 11.885 13.605 11.872 9.549 9.313 8.053 8.766 11.032 12.681 11.307 11.861 11.295 9.994 10.000 + 11.511 13.268 13.680 12.797 12.910 10.310 9.053 8.908 9.936 9.493 9.563 8.081 7.456 8.398 8.668 9.207 11.024 12.046 10.894 10.356 8.948 9.927 11.802 13.189 10.340 9.232 8.444 8.288 8.387 10.720 12.553 10.661 11.557 11.105 9.416 9.507 + 13.550 12.707 13.080 12.631 12.091 10.296 9.759 9.327 10.369 9.490 8.291 8.504 8.516 9.104 9.692 10.810 11.564 12.304 10.265 9.609 8.704 9.409 11.454 13.287 11.043 7.764 6.946 7.104 7.888 10.368 11.139 9.895 11.313 11.194 9.618 9.816 + 14.321 13.970 11.692 11.819 12.520 12.313 11.669 10.191 11.349 10.501 9.116 9.536 9.878 10.428 10.798 11.947 10.879 9.740 9.168 8.595 7.986 8.556 9.882 11.848 10.571 6.663 6.746 7.056 8.639 10.551 11.519 10.014 11.527 12.065 9.684 9.871 + 12.995 12.738 13.909 13.951 14.263 13.447 13.185 11.308 11.915 11.753 11.143 11.114 11.085 12.083 13.223 11.307 10.743 9.666 9.025 8.225 8.052 8.512 10.005 10.889 9.735 6.770 5.553 6.494 7.888 11.095 11.429 9.098 10.309 10.736 9.990 10.172 + 13.668 13.488 13.565 13.059 13.367 14.111 14.296 11.943 12.796 12.705 12.288 11.923 12.939 13.690 14.048 11.523 10.317 10.068 9.122 8.531 8.707 8.562 10.351 11.823 10.425 7.714 6.661 7.505 8.173 9.944 9.263 8.275 8.570 9.086 9.042 9.521 + 13.102 13.723 13.555 13.071 13.355 15.057 15.575 12.989 13.564 13.618 13.202 12.619 14.253 12.957 12.396 11.194 10.368 10.343 9.034 8.787 9.067 8.956 10.337 12.219 11.393 9.081 7.232 8.489 9.702 9.696 7.549 6.011 8.576 9.224 10.814 10.926 + 13.137 13.327 13.291 13.133 13.035 15.542 16.352 14.222 14.333 14.418 14.140 13.811 15.607 13.282 11.946 11.227 10.559 10.781 9.224 9.124 8.572 8.660 10.225 11.507 11.789 9.828 7.832 9.162 11.117 11.159 7.373 7.508 9.059 8.210 10.569 10.398 + 12.909 13.172 13.237 12.937 12.251 15.618 16.368 14.588 14.994 14.962 14.614 15.005 15.755 12.824 11.125 10.324 10.183 10.351 9.233 9.277 8.879 8.712 9.877 10.844 12.257 11.059 9.429 11.026 12.386 10.826 7.386 9.064 9.804 7.663 9.212 9.526 + 12.562 12.722 12.811 12.061 11.840 15.141 15.280 15.304 15.634 15.201 14.818 15.175 14.692 12.085 10.488 9.768 9.783 9.816 9.358 8.883 9.447 8.772 9.828 10.352 11.739 10.689 10.566 11.979 12.454 10.409 8.034 8.691 9.031 8.672 11.156 10.855 + 12.296 12.311 12.527 11.640 11.895 14.429 14.751 15.837 15.696 15.112 15.133 15.667 13.391 11.183 11.035 10.137 9.751 9.160 9.334 8.774 9.414 8.747 9.028 9.552 9.629 9.745 10.758 12.591 11.601 9.490 6.836 6.737 7.539 7.983 9.726 9.536 + 12.292 12.325 12.381 11.914 11.923 14.249 14.712 16.214 16.123 15.555 15.061 16.531 15.708 12.858 12.158 11.039 10.645 10.006 9.241 8.923 9.034 8.792 9.321 9.391 9.829 9.680 10.665 12.770 12.263 10.681 7.578 8.480 9.565 8.502 8.064 7.893 + 12.221 12.238 12.430 11.920 11.516 13.756 14.503 16.288 16.272 16.066 15.020 15.656 16.924 15.754 13.695 12.486 11.868 11.060 9.663 9.184 8.945 9.561 9.811 10.826 10.168 10.326 11.961 13.096 12.507 10.255 8.758 9.239 10.191 9.180 8.293 7.628 + 12.041 11.742 12.348 11.982 11.268 13.251 14.107 15.861 16.722 16.518 15.126 14.824 16.824 15.997 14.911 13.594 12.025 11.743 10.211 10.352 8.946 9.389 9.899 9.870 9.508 10.218 11.318 12.448 11.214 8.875 8.854 9.144 10.273 9.294 7.903 6.954 + 11.950 11.568 12.101 11.627 10.855 12.947 13.738 15.245 16.831 16.147 14.540 14.526 15.232 15.450 16.534 14.820 12.836 12.012 10.887 10.309 10.010 9.613 10.385 10.690 11.223 12.181 13.162 12.763 10.981 8.354 9.063 9.132 10.095 10.562 9.041 6.812 + 11.778 11.447 12.153 11.269 10.978 12.920 13.678 14.592 16.336 15.322 13.715 14.019 14.285 14.280 16.030 15.723 13.829 12.433 11.786 10.654 10.319 10.497 10.364 10.597 10.947 11.875 13.222 12.289 10.306 7.853 8.188 8.078 9.013 9.773 7.336 5.246 + 11.499 11.299 12.236 11.308 11.201 12.740 14.211 15.379 15.832 14.525 13.553 13.525 13.527 13.593 15.151 15.896 14.598 12.865 11.837 11.250 10.970 10.567 9.361 9.638 10.218 11.822 12.741 11.334 10.114 8.828 8.155 8.600 10.225 9.183 6.637 5.376 + 11.555 11.373 11.220 9.884 10.127 11.332 10.505 10.825 11.594 9.956 10.382 10.123 9.731 10.155 11.231 12.164 10.697 10.756 10.200 9.522 8.385 7.464 8.117 7.875 9.406 11.296 11.187 9.886 9.386 9.182 6.672 8.161 9.326 8.936 6.574 5.088 + 11.993 11.806 11.594 10.871 11.026 12.049 11.308 10.749 11.416 10.006 10.353 9.939 8.806 8.597 9.751 10.381 9.513 9.220 8.623 9.484 7.973 7.035 7.972 8.649 10.270 11.126 10.934 9.332 8.722 8.304 6.791 8.666 9.223 8.565 6.764 4.997 + 12.018 11.557 11.422 10.668 11.233 12.242 11.303 10.782 11.244 10.307 10.243 10.411 8.793 9.304 9.929 10.423 9.964 9.637 9.626 9.294 9.109 8.922 8.920 10.080 11.560 11.833 10.908 9.322 8.992 8.319 7.335 8.794 9.042 8.583 7.311 5.695 + 11.943 12.003 11.943 11.351 11.070 13.232 14.451 14.795 14.417 13.284 12.673 12.576 11.923 12.008 13.065 15.328 16.289 15.433 14.505 14.631 14.848 15.453 14.977 12.674 12.831 13.249 12.561 10.647 8.931 11.036 11.554 13.349 13.404 11.422 9.270 6.309 + 11.865 11.850 12.007 11.954 11.726 13.402 14.072 15.832 15.259 14.298 13.036 13.165 12.495 12.525 13.446 14.885 16.027 15.854 14.664 13.414 13.625 14.414 14.372 12.252 12.034 12.943 13.132 10.688 9.433 11.525 11.138 12.677 12.464 10.855 8.615 5.228 + 11.704 11.636 12.343 11.505 11.760 13.477 14.835 15.623 16.732 15.105 13.479 13.564 13.053 12.451 12.986 13.160 14.954 15.605 14.783 12.875 12.387 12.633 13.555 12.677 11.429 12.837 13.236 11.664 10.760 11.861 10.393 11.378 11.574 10.702 8.072 4.747 + 11.938 11.618 12.458 11.389 11.878 13.677 14.924 15.774 16.740 14.809 13.668 13.292 12.834 12.218 12.811 12.626 14.067 15.344 15.640 13.480 12.558 12.720 12.732 11.809 12.565 12.572 12.748 12.581 11.567 11.124 9.864 10.794 10.626 9.375 6.834 4.038 + 12.184 11.861 12.612 11.576 12.292 13.872 15.606 16.000 15.925 13.963 12.494 12.434 12.002 11.483 11.987 12.391 13.329 14.279 14.473 11.699 11.263 11.962 11.585 11.205 12.427 11.929 11.788 12.757 11.956 9.883 9.640 10.633 9.682 8.176 6.294 5.066 + 12.309 12.260 12.831 12.004 12.940 14.380 15.265 14.712 13.987 13.051 12.373 11.453 10.775 10.991 11.533 12.444 13.896 13.471 12.434 10.926 10.804 11.153 11.376 11.636 11.148 9.842 10.033 10.870 10.333 8.115 8.296 9.911 9.858 7.994 5.450 5.101 + 12.618 12.536 12.062 11.457 11.917 10.539 11.059 10.336 10.398 8.685 10.273 9.835 6.537 7.475 9.197 10.993 10.747 10.132 8.067 7.814 7.379 8.374 9.742 8.522 6.983 5.238 5.925 7.700 7.767 6.707 5.063 7.633 8.543 8.167 6.128 5.100 + 12.768 12.301 11.768 11.607 11.805 10.882 9.995 8.370 9.996 8.875 10.360 10.166 7.549 6.259 8.682 10.946 10.319 10.426 9.222 8.483 7.596 8.551 9.843 9.227 7.897 6.071 5.151 6.185 8.935 8.863 5.979 6.868 8.041 7.433 5.727 5.661 + 12.732 12.094 11.491 11.381 11.679 10.923 10.293 9.688 10.120 8.634 10.579 10.269 7.466 6.127 7.908 10.945 10.174 10.724 8.805 8.441 8.665 9.435 10.225 10.513 8.575 6.463 3.865 5.022 8.109 9.309 6.869 7.711 8.908 7.975 6.551 6.186 + 12.607 11.874 11.282 11.162 11.605 10.848 9.761 9.881 9.999 8.791 10.768 10.091 7.085 6.569 8.238 10.893 10.247 10.530 8.914 8.965 9.152 9.226 10.123 11.245 9.112 7.461 4.427 5.181 8.031 9.081 7.802 7.518 9.083 8.336 6.661 6.028 + 12.510 11.780 11.138 10.976 11.547 10.820 9.861 9.586 9.851 8.762 10.742 10.196 7.215 6.364 7.822 10.915 10.388 10.774 8.773 8.476 8.619 8.763 10.110 11.698 10.069 8.147 3.936 5.051 7.707 9.391 7.919 7.422 8.813 8.261 7.412 7.054 + 12.614 12.014 11.352 10.926 11.635 10.862 9.957 9.338 10.021 8.723 10.591 10.347 7.884 7.759 9.110 11.532 10.587 10.746 9.446 8.673 8.816 9.230 10.415 11.797 10.255 8.238 5.526 5.029 7.123 8.988 7.963 8.894 9.572 8.380 7.310 7.429 + 12.842 12.926 11.655 11.709 12.318 12.243 13.047 12.812 13.109 12.381 10.726 11.808 10.651 10.681 11.256 12.197 13.027 13.070 13.799 13.758 13.326 11.086 11.218 13.158 12.636 10.761 9.884 9.782 9.854 11.394 12.446 11.609 11.060 9.949 9.090 8.951 + 12.212 11.778 12.382 11.796 12.067 14.224 15.223 15.344 13.940 12.719 11.905 11.429 10.932 10.874 11.215 11.383 11.956 11.721 12.582 13.472 14.523 14.150 12.995 13.372 14.053 13.393 11.182 11.298 11.370 12.780 14.732 13.585 12.102 10.612 10.212 10.320 + 12.125 12.102 12.643 12.054 12.177 14.178 15.297 15.865 14.588 13.062 12.194 11.282 11.035 10.796 10.938 10.966 11.629 11.359 11.868 12.291 13.097 14.880 14.078 14.218 15.406 15.346 13.197 12.360 12.310 13.151 15.088 15.035 13.323 11.682 9.692 9.393 + 12.086 12.106 12.724 12.195 12.555 14.430 15.831 16.205 14.792 13.685 12.162 11.337 11.222 10.674 10.965 10.910 11.803 11.542 11.990 12.130 13.368 15.840 15.328 14.475 15.047 15.799 13.498 12.741 12.680 13.922 14.917 15.246 14.515 12.956 9.876 9.440 + 12.086 12.270 12.816 12.321 12.948 14.778 16.266 16.245 14.625 13.820 12.400 11.499 11.183 10.762 10.827 11.060 11.801 11.706 12.125 12.295 13.003 14.989 14.699 14.557 14.729 15.339 14.533 13.354 13.296 14.357 16.199 16.771 15.942 14.463 10.933 7.652 + 12.237 12.213 12.712 12.297 13.356 15.095 16.188 16.031 14.172 13.435 11.868 11.386 11.362 10.328 10.823 10.267 11.272 10.816 11.222 11.054 11.838 13.822 14.633 14.658 14.118 15.079 14.201 13.547 13.705 14.425 15.840 16.313 15.581 14.397 11.726 7.975 + 12.336 12.357 12.688 12.165 13.623 15.545 15.643 15.606 13.871 12.785 11.235 11.060 10.935 9.658 10.454 9.897 10.763 10.345 11.054 10.663 11.591 13.325 14.860 14.393 14.177 14.463 14.671 14.359 14.191 14.498 15.917 16.621 15.872 14.589 11.941 8.508 + 12.481 12.448 12.765 12.546 13.819 15.818 15.158 14.372 13.449 12.518 10.847 10.352 10.356 9.238 10.075 9.477 10.194 9.704 10.405 10.007 10.882 12.341 14.163 14.664 14.255 14.626 15.132 14.444 14.149 14.623 15.852 16.570 15.577 14.723 12.838 9.466 + 12.484 12.495 12.719 12.832 13.895 15.191 14.491 12.680 12.023 11.299 9.542 9.851 9.306 8.860 9.664 8.909 9.970 9.389 9.767 9.654 10.004 11.299 13.368 13.952 13.829 14.010 14.525 13.950 13.485 13.646 15.156 16.307 14.856 14.053 11.771 9.613 + 11.827 11.849 11.365 13.407 14.056 13.509 12.412 12.013 10.610 10.855 8.852 8.867 8.088 8.663 8.146 8.104 8.917 8.028 8.649 8.584 9.304 10.611 13.307 14.329 13.553 13.365 13.722 13.281 12.842 12.554 14.072 15.833 14.383 13.209 10.584 9.764 + 9.762 9.343 8.379 10.378 9.645 8.960 10.316 9.675 7.069 7.702 7.357 7.030 6.229 6.512 5.445 6.195 7.067 7.225 7.380 7.216 7.423 8.010 10.517 11.335 10.794 10.167 10.587 10.319 9.851 9.800 11.171 12.932 11.376 9.467 9.028 8.366 + 7.935 8.545 9.317 7.712 7.129 5.500 7.154 7.536 5.528 6.953 7.462 6.325 3.561 4.362 5.580 5.637 5.800 5.449 5.020 5.596 5.753 6.322 6.983 7.295 7.290 7.819 8.502 8.163 7.078 5.991 6.896 8.641 7.664 7.046 8.616 8.977 + 5.848 8.234 8.711 7.503 7.561 6.836 6.856 7.456 4.571 4.292 3.865 2.797 3.556 4.620 5.355 4.555 4.677 4.686 4.370 4.427 4.624 5.515 4.619 5.319 4.859 6.129 7.771 7.949 6.042 4.321 6.235 7.476 6.609 6.294 8.388 8.834 + 3.980 5.652 6.252 7.085 6.912 8.033 7.400 7.785 5.974 4.661 4.529 3.612 3.316 3.510 5.049 4.950 6.262 4.244 4.455 4.494 2.982 4.147 4.632 4.941 4.525 4.182 3.998 4.678 3.501 4.217 6.101 6.443 4.836 4.832 3.615 2.498 + 4.767 4.831 6.598 6.878 6.674 7.512 7.517 7.795 6.002 4.760 2.870 4.303 4.307 4.494 5.003 5.269 5.037 4.370 4.514 4.414 5.040 4.975 4.898 5.133 3.544 4.657 4.811 4.185 4.580 4.340 5.458 6.380 5.306 5.141 3.096 1.999 + 4.515 4.666 5.899 6.177 6.749 7.915 7.039 7.011 6.778 5.755 5.427 5.632 6.002 6.240 6.208 5.714 5.802 6.020 6.336 6.307 6.166 6.433 6.195 6.036 6.856 7.559 7.762 7.660 7.227 6.547 6.435 6.181 6.047 6.048 5.084 3.692 + 7.495 7.334 6.775 7.845 7.288 7.325 8.480 9.136 10.441 10.107 9.099 8.927 8.998 9.073 9.842 10.556 11.221 10.266 10.427 10.541 10.396 11.306 11.187 12.206 12.389 12.667 13.907 14.588 13.390 11.167 12.635 12.088 11.337 11.526 11.645 10.449 + 6.158 6.704 7.122 9.353 10.243 10.103 10.370 9.276 10.772 11.973 10.983 11.544 9.853 10.610 11.061 12.186 11.864 11.915 12.153 12.042 11.335 13.014 13.330 14.084 13.989 15.045 15.191 16.377 15.905 14.122 13.770 14.223 13.368 12.859 12.958 12.141 + 10.088 10.719 10.470 12.375 13.099 12.509 11.636 11.400 9.887 10.444 10.153 10.353 9.591 9.463 9.839 9.797 8.951 9.069 8.896 8.073 8.195 9.651 11.345 11.852 11.451 11.764 13.346 14.332 14.243 13.944 15.259 16.177 15.133 13.125 12.771 13.188 + 12.069 13.046 12.848 14.046 14.064 15.574 14.706 12.697 10.713 10.684 10.604 9.924 8.724 8.522 8.306 7.564 8.145 8.202 8.632 8.800 9.629 11.198 10.408 9.828 9.511 10.147 10.934 11.836 11.846 12.147 14.412 15.536 13.942 11.989 10.977 11.832 + 12.622 12.851 13.641 13.387 14.852 15.670 15.955 14.140 11.786 10.798 11.272 10.849 9.609 9.060 9.577 8.805 9.027 9.550 9.709 11.326 13.198 13.619 11.473 10.849 9.963 9.819 11.290 12.015 11.225 11.077 12.552 13.125 12.305 11.522 9.668 8.274 + 12.251 12.110 13.061 12.854 14.213 15.938 15.073 13.770 12.312 11.980 11.224 10.563 10.396 10.102 10.159 10.594 10.196 10.834 10.995 12.840 14.132 13.698 11.325 10.748 10.168 10.855 12.260 11.663 10.503 9.950 11.490 12.292 11.341 11.125 9.423 6.560 + 11.042 11.881 12.078 12.501 14.638 15.895 15.264 13.291 12.106 11.803 10.940 10.472 10.470 10.588 10.457 10.582 10.890 11.011 12.074 13.631 14.262 12.853 11.511 10.806 11.052 11.646 12.700 12.533 11.343 11.116 11.968 12.528 11.382 10.814 9.374 5.670 + 10.929 11.419 12.211 12.857 12.998 13.068 13.719 12.320 10.856 10.707 10.389 9.772 10.195 10.748 10.434 10.656 11.192 11.398 13.263 14.255 13.762 12.137 11.424 11.164 11.637 11.796 12.416 12.502 11.006 10.669 11.495 12.394 10.953 9.918 8.970 5.055 + 7.817 7.617 6.743 7.872 8.913 8.236 8.946 8.063 6.740 5.023 3.352 4.568 4.511 4.752 4.865 4.863 5.415 6.208 8.789 9.878 7.950 6.621 6.160 6.447 7.026 7.516 9.189 8.732 8.561 8.771 8.685 9.117 8.283 7.188 6.285 5.474 + 8.578 9.181 8.350 6.293 6.302 7.306 8.272 7.422 5.520 4.906 4.569 3.284 3.880 4.242 4.939 4.192 4.963 5.813 8.547 7.620 6.182 6.962 6.353 6.509 6.599 6.628 7.931 8.048 8.313 8.856 8.456 8.154 6.802 5.971 5.015 4.093 + 6.731 6.414 6.591 6.005 5.563 5.433 8.193 7.371 4.789 5.308 4.872 4.696 5.241 5.568 6.094 6.193 6.284 6.417 7.259 7.030 6.903 6.418 5.952 6.202 6.224 5.445 5.778 6.259 5.509 4.884 5.041 5.896 4.972 4.517 4.101 2.246 + 4.016 4.048 5.550 7.629 8.419 8.126 8.727 8.298 6.616 8.580 9.358 10.074 10.365 9.318 10.196 11.583 11.950 10.877 9.998 11.180 10.759 8.703 9.768 8.649 8.428 8.286 7.211 8.281 7.844 7.529 6.412 6.672 5.929 6.480 5.748 5.061 + 4.257 5.350 5.972 7.010 7.883 7.161 6.891 7.149 6.942 7.245 6.854 7.944 8.518 6.575 7.779 9.514 10.112 9.415 8.934 9.480 9.611 9.005 9.150 8.354 9.021 8.482 7.786 9.539 10.284 10.435 9.961 8.872 8.949 8.737 9.377 8.889 + 4.879 6.720 7.636 6.965 6.623 7.660 8.501 8.093 8.340 7.722 7.009 7.485 7.462 6.739 6.440 6.322 7.078 8.097 7.959 7.382 7.271 8.173 8.644 8.458 8.853 8.431 8.011 9.140 9.456 9.824 10.080 10.201 9.840 9.571 9.098 8.210 + 8.154 7.677 7.078 8.349 7.366 6.672 8.684 8.516 8.551 7.877 8.205 8.196 8.432 7.643 7.421 8.042 7.880 9.103 10.247 10.253 9.886 9.787 9.917 10.404 10.376 10.371 10.657 11.548 10.419 10.366 10.866 10.792 10.781 9.962 10.052 8.909 + 8.639 9.802 9.414 9.546 9.249 8.278 9.498 9.691 10.856 10.599 10.694 11.560 10.859 10.415 9.676 10.622 12.372 12.502 12.909 12.608 11.722 12.219 12.754 12.254 11.096 11.498 11.945 12.605 11.626 10.781 11.197 11.968 11.617 10.685 10.824 9.787 + 12.550 11.789 10.331 10.865 10.810 9.433 10.881 10.261 10.645 11.323 11.532 11.663 10.835 10.430 11.182 12.411 13.426 12.657 12.955 11.988 11.150 12.428 12.888 12.108 10.882 11.478 11.961 11.575 11.161 10.966 11.032 11.987 11.294 11.056 10.870 10.538 + 13.843 13.699 14.061 13.872 13.506 12.207 12.169 12.473 11.363 10.846 11.538 12.400 10.928 9.470 11.520 13.302 13.701 13.151 13.582 12.879 12.547 12.225 11.661 11.644 12.563 11.707 11.662 11.501 11.063 10.977 11.766 11.043 10.753 10.917 11.441 11.363 + 14.638 15.833 16.690 16.445 15.665 14.433 13.669 13.003 12.598 12.314 11.836 12.043 9.784 9.982 13.212 13.813 14.842 13.907 12.380 13.444 14.012 12.910 12.485 12.602 13.264 13.557 13.132 12.895 12.922 12.941 12.012 11.849 11.678 11.506 11.912 11.110 + 14.959 14.697 15.455 13.620 13.931 12.892 11.685 10.559 11.395 10.663 11.420 11.289 10.065 10.860 12.336 12.541 14.561 14.400 13.325 11.915 12.855 13.237 12.827 11.734 12.392 13.039 13.279 12.805 12.851 12.541 12.960 12.952 11.439 11.221 11.145 10.253 + 13.236 13.664 14.634 14.141 13.435 13.002 12.437 9.785 9.659 9.918 10.635 9.705 10.296 10.474 12.372 13.305 14.036 13.430 13.204 12.850 11.904 12.254 12.990 10.904 10.266 10.544 10.661 10.662 11.117 11.728 11.253 10.380 8.758 9.350 10.089 9.193 + 12.332 11.221 12.179 13.546 14.326 15.203 14.718 13.881 13.895 13.562 13.104 13.469 13.301 13.913 14.862 15.681 15.302 14.254 13.833 13.484 12.117 10.793 11.230 9.200 8.793 8.298 9.294 9.083 9.350 9.459 8.590 8.385 7.947 7.596 6.622 7.035 + 13.785 13.816 13.265 13.768 15.248 15.661 14.906 14.369 13.685 12.778 12.641 13.402 13.070 14.093 14.918 15.892 14.576 13.572 13.349 12.704 10.218 8.565 8.086 8.535 8.016 7.554 8.245 8.108 8.050 7.232 6.550 6.737 5.945 5.533 5.221 4.523 + 13.815 15.200 14.338 13.479 14.146 14.625 13.121 12.633 12.330 12.786 11.580 12.536 11.686 12.918 13.674 14.011 11.906 11.530 11.411 9.996 8.425 7.003 6.086 5.894 6.081 5.623 6.337 6.406 7.004 6.910 5.656 5.429 4.706 4.317 5.411 4.725 + 13.948 12.472 12.241 11.006 9.304 10.238 10.224 9.655 9.803 9.009 6.952 8.011 7.873 8.243 7.579 7.563 6.986 6.906 6.738 6.287 5.655 4.819 4.064 4.274 4.176 4.093 3.975 4.597 4.246 4.813 3.856 4.331 4.519 3.851 4.310 3.385 + 9.000 9.155 8.468 6.765 6.359 6.409 7.040 6.418 5.353 3.605 3.941 4.101 6.101 6.032 5.728 6.293 5.566 5.221 4.998 3.913 3.383 2.986 3.771 4.007 3.156 2.656 4.253 4.149 3.531 3.498 3.282 3.554 2.443 3.757 3.423 1.817 + 6.861 7.214 7.313 5.079 5.134 6.271 7.197 5.859 4.486 4.450 4.628 4.415 5.273 5.278 5.247 6.598 4.611 4.908 4.123 3.796 4.378 2.935 4.266 3.263 3.236 3.561 4.102 4.164 3.627 2.640 3.090 3.687 2.621 2.967 3.265 2.629 + 5.917 5.231 4.605 3.626 5.436 7.198 7.562 6.709 4.338 4.221 4.243 4.388 3.238 4.379 5.309 6.752 5.126 4.225 5.059 4.365 3.979 3.430 4.076 4.737 4.162 4.113 2.893 3.911 4.305 3.898 3.610 3.965 3.105 3.283 3.183 2.679 + 5.672 5.469 3.518 5.441 6.129 6.057 5.178 5.735 4.203 4.336 3.638 3.525 3.831 4.158 5.075 5.648 5.441 5.091 3.878 4.655 4.831 4.131 3.049 3.127 3.739 4.330 3.880 2.720 4.017 4.923 4.347 3.474 3.490 3.800 4.143 3.675 + 5.163 5.967 6.101 5.158 5.591 7.103 6.551 4.821 3.837 5.285 4.357 4.153 3.876 5.819 5.411 5.763 5.969 5.353 4.766 3.448 4.056 4.617 4.209 4.394 4.844 4.694 4.173 3.745 3.406 3.428 4.112 4.684 4.842 4.288 3.568 3.120 + 7.387 6.957 5.808 6.402 7.102 7.667 7.128 5.848 4.666 5.353 5.553 5.353 5.567 5.653 5.945 6.310 7.434 7.885 7.769 8.047 8.424 8.353 8.714 8.610 7.628 7.063 8.214 8.948 9.527 9.695 9.598 8.828 8.105 7.900 8.480 8.603 + 14.138 14.408 14.940 14.813 14.748 14.450 13.455 13.502 13.291 12.279 12.689 12.927 12.714 11.916 11.080 10.024 9.997 10.978 10.543 10.630 11.710 11.626 11.378 12.132 11.676 10.951 11.311 11.591 11.974 12.126 12.297 11.463 10.556 10.389 11.241 11.288 + 18.706 18.566 17.886 17.057 17.769 17.210 16.069 15.888 14.361 14.466 15.242 15.132 14.196 13.537 12.371 11.939 10.975 11.556 11.192 11.722 13.688 13.842 13.760 14.617 14.744 13.601 12.870 12.457 11.220 10.496 11.012 10.335 9.423 10.303 10.727 10.066 + 16.564 16.140 15.380 14.708 15.398 15.189 14.391 13.930 12.933 12.918 12.737 11.696 10.092 10.091 9.457 8.537 8.914 8.823 9.507 9.834 10.846 11.907 11.615 11.312 14.212 13.411 11.021 9.764 10.352 9.375 10.049 9.393 8.896 9.254 9.064 9.340 + 12.158 10.906 11.151 12.312 12.126 10.444 9.724 8.543 6.426 7.763 8.446 7.984 7.670 7.531 8.375 7.391 6.813 7.263 8.285 8.121 9.504 11.610 12.480 11.038 12.041 13.094 10.861 9.804 9.312 9.055 10.337 10.681 10.445 10.701 11.054 10.939 + 10.578 10.692 11.122 13.149 12.981 12.333 10.473 10.472 9.464 9.687 9.640 9.054 9.492 9.068 9.421 8.921 8.934 8.719 9.384 9.819 10.111 10.826 11.858 11.601 11.276 13.536 13.040 11.431 11.131 11.355 12.355 12.501 9.317 10.191 11.358 10.310 + 12.421 12.369 12.872 13.360 13.868 13.124 11.787 10.060 10.159 9.954 8.596 9.741 9.392 9.353 9.284 8.914 9.691 9.844 10.685 11.419 12.080 13.806 14.845 13.564 12.718 13.078 12.670 11.498 11.101 12.084 14.059 13.912 11.401 10.726 11.233 10.085 + 12.431 12.676 13.311 13.219 14.335 13.183 11.861 8.710 10.356 9.900 8.627 9.676 9.982 9.672 10.239 9.277 10.043 9.819 10.558 10.743 11.834 13.732 14.994 13.996 14.101 14.669 13.423 11.967 11.852 12.111 14.704 15.038 13.781 11.452 11.165 10.368 + 12.529 12.542 13.103 13.308 14.190 12.725 11.418 8.057 10.293 9.761 8.613 9.316 9.816 9.551 9.657 8.978 8.667 9.452 9.675 10.716 11.734 14.292 16.081 14.870 14.740 13.707 12.248 11.109 11.096 11.725 14.298 14.682 13.089 11.528 11.961 10.621 + 11.759 11.511 12.408 13.349 13.716 11.991 10.581 7.020 9.514 8.628 8.642 9.252 9.578 9.685 9.266 8.983 9.260 9.868 11.602 12.639 12.765 14.888 14.977 14.032 12.291 10.817 9.339 8.543 8.943 10.019 13.325 13.512 11.815 11.185 10.161 8.727 + 13.207 12.945 13.076 12.494 11.976 10.169 9.755 8.893 9.314 8.438 7.671 7.706 8.860 8.421 8.732 8.551 8.449 9.404 11.281 12.014 11.442 12.079 12.744 12.341 7.927 6.867 5.958 5.484 6.310 7.845 10.934 10.753 9.771 8.854 7.602 5.826 + 12.410 10.988 10.060 9.370 8.278 7.721 8.147 7.271 7.411 7.677 6.743 6.339 7.267 7.421 7.891 7.169 6.760 6.385 7.030 6.618 5.899 6.285 6.335 6.437 5.481 5.196 4.019 4.196 4.639 6.611 7.283 7.068 6.303 6.469 6.312 5.515 + 10.297 10.350 10.103 8.587 8.825 7.173 7.012 6.632 7.076 7.186 6.889 7.991 7.217 6.331 6.204 6.315 7.827 9.775 11.106 11.278 9.405 7.970 9.390 8.649 9.129 9.937 8.793 9.007 8.586 7.952 9.083 11.555 12.055 11.848 12.045 12.793 + 9.580 9.805 8.078 8.535 9.037 7.109 5.961 5.935 7.330 7.172 6.386 8.360 8.413 7.406 6.942 6.234 8.591 9.681 11.442 11.803 9.751 9.237 10.442 9.350 10.220 11.557 11.060 10.705 9.762 8.666 9.242 11.556 11.662 11.568 12.261 12.553 + 8.416 8.512 7.315 7.585 7.962 6.329 5.899 6.131 5.632 6.773 7.527 8.810 8.530 7.207 6.961 7.357 7.975 9.327 9.661 9.950 9.199 8.478 7.699 8.314 9.800 9.829 9.476 9.859 8.472 7.785 8.411 9.502 8.848 8.707 10.266 9.787 + 14.068 13.244 11.642 11.270 12.059 11.641 10.881 10.735 10.401 9.678 10.375 11.117 10.509 10.677 10.661 10.571 10.190 10.758 10.796 11.462 11.243 11.427 11.183 11.728 12.326 12.403 12.244 12.248 12.427 12.190 12.906 12.596 12.349 12.634 12.134 12.033 + 16.952 16.251 14.097 14.804 15.030 15.596 16.124 15.515 14.026 14.118 14.931 15.076 14.397 13.757 11.785 10.520 11.624 12.362 11.418 11.157 11.407 10.947 10.339 10.771 10.910 10.781 10.582 10.687 10.987 11.002 11.268 11.233 10.492 10.623 10.429 10.631 + 15.768 17.142 15.868 16.679 15.355 16.296 16.011 15.411 13.312 13.268 14.430 13.748 13.839 12.982 10.835 11.290 12.071 11.513 10.643 10.545 11.093 10.678 9.840 10.453 10.954 11.226 11.684 10.541 10.971 12.270 11.609 10.762 9.530 9.662 10.050 9.362 + 16.924 17.208 16.280 15.833 15.072 14.587 15.167 14.974 13.578 13.738 14.107 14.413 13.910 12.466 10.796 11.085 10.471 9.810 9.790 9.718 8.910 8.644 9.407 8.688 9.745 11.225 11.906 10.242 11.299 12.704 10.943 9.510 8.198 9.590 9.234 8.944 + 14.202 14.958 15.326 14.877 14.771 15.735 15.753 14.622 14.302 13.189 14.881 15.189 14.416 12.045 10.269 9.147 9.174 8.270 7.525 6.922 7.494 8.648 9.249 8.688 9.031 11.712 13.068 10.969 11.263 12.661 11.448 9.726 8.288 9.652 10.792 11.264 + 14.908 13.895 12.864 12.919 14.553 15.713 15.071 14.072 14.011 12.816 14.209 14.745 14.261 11.832 9.831 9.354 8.540 8.634 7.114 6.161 6.676 7.357 7.007 7.304 7.697 9.380 11.266 10.563 8.907 11.368 10.903 9.284 8.143 10.803 11.295 11.164 + 11.334 11.807 11.325 12.607 12.477 13.747 12.675 12.915 12.704 11.765 12.876 13.134 12.323 11.595 10.405 8.476 7.418 7.461 7.546 7.192 7.784 7.911 7.093 6.588 8.680 9.339 11.375 10.521 8.560 11.261 11.554 10.895 11.355 12.730 12.153 10.181 + 11.492 10.715 9.756 9.099 9.073 9.891 8.296 7.572 8.487 8.117 8.083 9.507 8.468 6.035 5.877 5.526 4.646 4.777 6.052 5.570 5.672 6.269 6.515 5.867 7.008 8.464 8.219 7.260 6.460 7.710 8.140 8.101 8.969 8.164 7.360 6.121 + 9.238 8.971 8.845 8.071 6.854 8.084 7.114 6.490 6.592 5.680 4.657 4.488 4.619 4.105 3.016 3.834 4.126 4.649 4.501 4.565 4.964 5.419 5.388 5.473 6.997 7.712 6.180 5.987 5.782 4.864 5.454 6.115 5.745 6.047 6.199 5.116 + 7.939 8.436 8.363 6.328 6.966 6.995 5.960 6.879 4.834 4.189 3.750 4.717 5.553 4.900 4.018 4.296 3.829 3.968 5.063 5.560 4.947 4.934 4.623 5.051 6.263 6.929 6.261 6.179 5.264 4.888 3.777 4.663 5.154 5.534 6.178 5.398 + 8.659 8.426 7.135 7.414 6.972 7.062 7.972 8.097 7.994 8.008 7.791 7.391 5.807 5.269 7.076 8.237 8.501 8.838 9.077 8.968 9.327 9.847 9.929 9.734 10.313 11.234 11.644 11.651 11.327 11.075 11.250 11.026 9.767 8.448 9.092 8.349 + 10.090 9.992 9.171 7.848 9.078 9.488 9.239 10.129 10.067 10.553 10.073 9.172 8.281 7.005 9.878 10.748 10.588 10.465 10.370 9.876 10.205 11.012 11.359 10.785 11.592 12.909 13.582 14.001 13.918 14.130 14.351 14.351 13.647 12.415 12.781 11.899 + 8.865 9.596 11.235 11.969 11.920 11.591 10.899 10.052 10.159 8.807 8.213 8.089 8.920 8.207 8.506 9.204 7.385 6.813 7.744 7.267 8.277 8.616 8.615 8.891 9.466 10.982 12.892 11.160 11.096 13.590 13.687 12.995 12.732 13.664 11.824 10.848 + 13.631 12.867 13.066 13.126 12.752 12.967 11.861 11.381 10.397 8.255 9.547 11.139 11.890 12.570 12.331 11.113 9.768 7.777 7.759 8.623 8.804 8.938 9.288 9.916 9.838 11.577 12.091 10.622 12.073 11.427 11.520 10.709 11.406 11.864 11.385 8.329 + 13.093 12.391 11.665 12.086 11.290 11.591 10.925 10.426 9.525 7.708 6.697 9.349 9.838 11.733 11.713 9.461 7.640 5.661 6.833 6.230 4.853 5.299 5.224 5.527 6.525 6.787 7.033 7.975 9.300 7.643 7.097 7.022 7.853 7.665 7.975 6.275 + 9.446 10.015 10.257 9.537 8.945 7.140 6.611 5.802 6.270 6.864 5.360 5.744 6.826 8.098 6.573 5.454 4.988 3.798 3.626 3.124 4.496 4.655 5.084 5.601 6.034 4.747 3.960 4.227 5.460 4.656 4.237 4.308 3.572 3.771 4.240 4.578 + 10.282 10.994 10.665 8.759 8.535 7.609 6.245 5.853 5.939 7.073 5.689 7.116 8.289 7.380 5.301 4.391 3.051 3.193 3.134 3.331 3.995 3.934 2.828 3.792 5.322 4.575 3.364 4.096 4.114 4.280 4.383 4.741 4.654 4.362 5.614 4.665 + 9.847 10.878 10.715 8.850 7.879 8.200 7.992 6.217 6.379 6.952 6.252 7.559 6.979 6.340 6.394 5.573 4.492 4.180 3.852 4.513 2.946 4.763 4.493 3.894 5.008 5.282 3.579 3.356 4.099 4.865 4.394 4.090 3.903 3.747 4.837 4.299 + 10.382 11.152 10.376 8.814 8.650 7.392 8.258 7.847 6.678 6.313 6.388 7.817 7.114 7.560 6.404 4.111 3.591 3.442 3.805 5.612 4.598 5.288 5.439 5.488 5.590 6.299 5.005 4.974 3.945 4.653 4.591 4.891 3.681 3.779 3.618 4.292 + 9.811 10.650 9.651 6.840 7.330 6.388 6.956 6.643 5.738 6.806 6.157 5.856 4.020 5.746 5.298 4.846 3.222 2.954 4.003 5.230 5.439 5.189 4.952 5.387 4.551 5.705 5.135 4.359 3.476 4.085 4.174 4.521 4.338 4.384 4.737 4.324 + 9.359 10.227 8.489 7.359 6.611 6.364 6.746 6.286 5.856 6.563 6.574 4.714 4.519 5.837 5.373 3.978 4.318 4.688 4.886 4.868 4.343 4.115 3.502 4.125 4.719 5.299 4.273 3.317 3.128 4.213 4.055 4.351 4.600 4.575 4.079 4.511 + 9.611 10.050 9.335 7.341 4.885 5.470 5.495 3.710 4.618 5.420 4.835 4.805 5.090 5.718 5.292 5.431 5.087 4.246 4.164 4.579 5.355 4.254 5.276 5.537 4.413 4.189 3.142 3.327 3.076 3.999 3.884 3.925 4.051 4.166 4.172 3.395 + 13.294 13.573 13.677 13.437 12.989 12.605 12.452 11.290 9.768 10.210 9.277 10.252 9.090 9.604 10.337 9.745 8.837 8.238 9.199 10.265 9.729 8.506 8.880 9.841 9.117 8.007 9.190 9.716 9.556 10.832 10.746 9.253 9.426 9.419 9.872 9.414 + 17.744 16.708 17.162 17.234 17.048 16.176 15.207 13.303 13.359 13.509 12.460 12.124 11.503 10.877 11.293 10.386 10.001 10.075 10.866 11.221 10.668 9.339 9.514 10.163 8.969 8.279 9.460 10.128 10.534 11.773 10.864 9.854 9.552 9.810 10.442 10.241 + 17.450 15.734 15.976 14.402 15.068 14.175 13.478 12.713 12.568 11.638 10.114 9.624 9.206 10.082 10.350 9.255 9.629 9.239 8.838 8.751 9.171 8.020 7.313 7.815 8.362 8.296 8.064 8.903 9.975 10.849 10.291 9.259 8.668 9.059 9.115 9.043 + 12.465 12.545 12.560 12.042 10.383 10.061 10.816 10.665 10.136 9.323 7.309 7.384 7.475 6.814 7.028 6.558 7.061 7.089 6.846 4.942 7.301 7.507 6.983 6.981 7.849 7.644 6.960 7.537 8.540 8.116 10.200 9.069 8.353 8.048 7.645 8.596 + 9.150 8.579 10.196 12.118 12.892 12.369 11.756 11.990 11.407 12.065 10.820 9.442 8.438 6.364 6.603 6.498 5.424 5.287 5.296 4.203 5.183 5.538 4.707 5.245 5.825 7.326 8.151 6.381 6.458 7.197 9.457 9.925 10.122 8.921 8.080 7.904 + 9.304 10.239 11.440 13.119 13.083 12.542 13.146 12.414 12.452 13.284 10.944 10.036 8.310 7.513 6.820 6.322 6.759 6.505 5.905 5.750 6.193 5.352 5.052 6.314 7.022 9.585 10.280 7.868 8.266 9.611 10.719 11.924 11.900 9.586 8.857 9.058 + 8.321 10.247 11.706 13.055 13.837 11.128 12.206 13.053 12.992 13.327 13.014 10.898 9.662 9.482 8.132 5.330 4.840 5.373 5.757 6.101 5.925 5.730 7.127 6.908 7.807 9.564 11.003 9.437 10.013 11.293 11.649 11.321 11.069 9.769 10.695 11.194 + 9.502 9.959 11.817 12.806 14.235 12.889 11.602 11.768 12.839 12.862 13.121 13.167 12.424 10.001 8.786 9.003 9.575 9.368 8.044 8.046 8.542 8.133 8.895 8.437 9.434 12.755 12.797 13.203 12.404 11.695 11.338 10.005 9.778 10.298 10.539 9.412 + 12.240 11.686 12.574 13.325 14.989 13.611 11.881 11.701 12.319 11.801 11.260 13.137 12.794 12.482 13.117 13.315 12.673 10.963 10.783 10.293 9.618 8.041 8.718 10.607 12.533 14.238 12.970 12.249 12.178 10.620 8.878 9.053 9.139 8.725 8.885 9.481 + 12.831 12.993 13.465 13.926 15.623 14.667 12.447 12.064 12.415 12.057 9.688 11.359 10.629 11.862 12.640 13.709 13.316 13.417 13.312 13.934 13.016 11.790 12.059 12.501 14.550 15.420 12.715 11.378 12.590 11.717 9.196 8.311 7.934 7.550 6.913 6.948 + 12.740 12.901 13.500 14.372 15.884 14.372 11.911 12.227 11.555 11.185 9.066 10.169 9.120 10.159 10.199 10.801 11.417 12.535 13.540 14.718 14.095 14.148 14.443 13.810 15.259 15.816 13.493 11.498 11.701 12.813 12.250 10.432 9.618 8.855 7.713 6.911 + 12.830 12.759 13.465 14.388 15.212 13.061 11.522 11.271 10.531 9.915 8.274 9.038 7.646 8.374 8.575 9.209 9.763 10.330 10.721 11.955 12.942 14.553 15.365 14.313 14.386 15.202 13.588 10.976 9.023 9.942 12.529 12.485 11.811 11.633 9.749 7.759 + 12.808 12.695 13.202 13.349 13.588 11.651 10.671 9.759 9.435 8.402 7.328 7.609 7.223 7.612 8.214 8.425 9.193 9.787 10.024 10.521 10.928 11.730 14.063 14.299 12.620 12.571 12.478 12.123 11.086 10.837 13.328 13.688 12.797 13.374 11.780 8.457 + 12.453 12.410 12.930 12.527 12.381 11.323 10.305 8.834 9.093 7.543 7.744 7.428 7.199 7.524 7.869 7.819 8.288 7.998 8.965 9.638 9.955 11.101 14.075 14.685 12.421 11.822 13.055 13.374 12.048 11.403 11.820 11.944 11.186 11.089 9.805 6.770 + 12.069 12.141 12.642 12.131 11.845 11.075 9.938 8.621 8.677 6.654 6.989 7.943 7.885 8.188 7.867 7.329 7.849 8.228 8.562 9.056 9.436 10.752 13.798 14.717 12.222 11.570 11.731 11.458 11.002 10.860 11.810 12.325 11.663 11.887 10.267 8.038 + 12.034 12.025 12.443 11.476 11.638 11.212 9.920 9.115 8.847 7.516 8.217 7.899 7.241 7.982 7.601 7.010 8.318 8.964 9.385 10.168 10.318 11.340 14.696 15.350 12.614 11.692 11.905 12.209 11.802 11.297 13.413 14.021 13.281 13.254 10.802 8.500 + 11.797 11.405 11.849 11.006 11.470 10.769 9.188 8.559 9.060 7.764 7.265 6.804 6.890 8.226 8.231 8.332 8.663 9.303 9.423 11.398 12.615 13.643 15.151 15.593 13.668 11.764 10.233 9.781 9.600 10.391 12.708 12.355 11.230 12.012 9.630 5.765 + 10.821 10.428 10.616 11.013 9.484 7.937 7.003 6.818 6.875 7.816 8.145 7.798 5.710 6.972 6.378 6.291 6.957 6.933 7.521 9.683 10.879 11.225 11.466 11.646 9.912 7.233 6.092 5.668 5.896 7.050 9.321 8.618 8.105 8.561 5.336 2.311 + 10.318 10.238 9.723 8.488 7.299 4.997 6.085 6.050 6.634 4.614 6.710 7.609 6.259 5.740 5.385 3.288 4.013 4.338 3.612 4.382 4.237 4.043 6.391 6.951 4.755 3.497 4.327 3.145 3.452 3.835 4.075 4.228 3.694 4.104 2.295 1.778 + 9.689 9.462 8.057 7.967 7.748 5.158 6.152 7.139 6.881 5.721 5.842 5.835 4.831 4.845 5.559 4.594 3.363 3.648 4.155 4.021 4.948 5.462 7.588 8.057 6.002 4.542 4.008 3.249 2.874 3.622 3.481 3.075 3.297 3.215 2.650 2.084 + 8.932 8.737 8.506 6.804 6.711 5.344 6.053 5.580 4.856 4.296 4.551 4.054 4.299 6.106 5.737 2.945 3.650 5.038 4.377 4.365 4.603 4.940 6.712 7.125 4.578 4.791 2.937 2.954 1.992 2.511 4.279 4.484 3.544 3.300 2.788 1.733 + 6.494 5.837 6.636 7.274 6.579 4.937 5.696 4.431 5.334 3.798 3.952 3.926 4.339 6.630 5.998 3.237 4.268 4.178 5.275 5.013 4.609 4.606 5.605 6.444 4.819 4.294 4.005 2.706 2.522 2.934 3.992 4.242 3.162 3.221 2.703 1.994 + 5.524 4.968 5.802 4.694 4.631 4.661 4.529 5.015 4.988 2.905 2.730 4.362 4.591 6.409 6.350 4.573 3.873 3.706 4.335 4.699 4.389 4.643 5.204 5.076 4.129 4.769 2.313 1.989 2.596 1.999 2.825 2.794 3.616 2.597 2.042 1.349 + 8.245 7.501 7.569 6.808 6.900 6.342 6.362 6.451 5.449 6.360 6.617 6.634 6.501 7.714 7.553 6.423 7.093 7.396 7.660 7.474 7.898 7.896 7.693 7.464 7.298 7.677 7.946 8.198 7.971 7.635 7.850 7.866 7.630 7.343 7.830 7.101 + 15.783 16.301 16.342 15.560 15.034 14.698 14.971 15.592 15.434 15.120 14.305 12.990 11.501 11.994 12.622 12.026 11.483 12.660 12.797 12.341 12.025 11.621 11.546 10.321 10.431 11.533 11.374 11.365 10.968 9.841 10.673 11.327 10.712 10.324 11.232 10.432 + 17.759 18.040 17.942 15.798 16.680 16.406 15.177 16.261 15.686 15.154 14.129 13.572 12.699 11.720 12.752 12.305 12.520 12.956 13.157 12.788 12.888 11.658 11.720 10.698 10.480 12.702 11.941 11.822 10.855 9.846 10.242 11.907 9.982 9.374 10.248 10.389 + 18.405 16.444 16.017 15.637 14.296 14.095 13.487 13.164 13.443 12.966 12.279 10.516 10.906 9.453 8.643 9.072 8.953 8.532 9.700 10.503 9.620 9.354 10.287 9.683 8.393 11.578 11.180 11.004 10.293 10.136 9.461 11.586 10.962 10.132 10.248 9.676 + 16.124 14.214 12.832 10.924 10.208 9.456 9.031 8.777 8.246 7.958 7.380 8.188 6.488 7.014 7.401 6.518 6.394 6.951 7.632 9.520 8.861 8.737 9.912 8.819 8.401 10.743 11.233 9.766 9.395 9.502 9.293 9.716 10.100 9.809 10.091 9.656 + 10.878 9.719 9.854 8.302 6.898 7.045 7.177 6.713 6.566 6.684 7.186 6.943 6.817 6.470 6.173 5.788 5.797 6.640 7.133 7.444 7.510 8.470 8.486 7.863 8.072 8.514 9.920 9.918 8.569 8.655 9.615 9.676 9.165 9.580 9.559 8.504 + 9.591 7.958 7.606 6.670 8.250 7.402 6.349 5.971 6.311 5.931 5.934 5.031 4.272 5.842 4.304 4.729 7.244 8.510 7.870 8.160 8.260 8.722 8.518 8.085 8.292 9.557 9.647 8.923 8.216 8.522 8.902 9.482 9.405 9.917 10.267 9.929 + 10.392 10.134 8.708 8.283 8.795 8.626 7.635 6.545 7.484 7.919 7.387 8.091 6.587 7.136 6.685 5.870 7.605 8.549 9.046 9.232 9.297 9.452 8.791 9.262 8.833 10.543 9.707 9.405 8.783 9.064 8.955 10.271 8.865 9.540 10.130 9.284 + 12.039 11.546 10.922 10.129 10.106 10.148 9.093 8.537 9.297 9.866 9.413 9.549 9.312 8.805 7.134 6.957 8.297 10.089 10.555 10.665 10.682 10.705 9.155 9.753 9.475 11.292 11.592 10.592 10.036 10.395 9.412 9.902 10.057 10.966 10.910 10.600 + 9.186 10.320 10.154 9.268 8.842 9.529 9.232 9.264 8.617 8.599 7.871 8.137 6.465 6.709 7.554 7.718 7.548 8.817 8.468 10.263 9.675 8.527 8.064 8.408 9.478 11.481 10.975 8.752 8.616 8.612 9.642 10.449 10.288 10.525 10.233 9.499 + 8.644 10.183 10.756 9.818 11.407 11.590 12.152 11.429 11.751 10.454 9.493 7.510 7.992 8.433 8.323 8.710 9.246 9.402 10.466 11.248 10.347 10.103 10.536 10.717 11.433 12.621 11.538 9.300 8.059 8.800 9.808 10.144 7.985 8.199 7.856 6.577 + 11.537 12.342 11.353 11.267 12.275 13.779 13.630 14.870 14.338 13.391 12.866 11.869 10.151 11.136 11.029 11.554 12.024 13.011 13.977 14.607 13.563 12.050 11.112 10.873 11.418 13.189 12.643 10.474 9.905 9.955 12.521 13.094 11.449 9.597 8.658 5.968 + 12.689 11.893 12.635 11.001 12.092 13.613 15.063 16.235 16.155 13.853 13.072 11.897 10.683 11.344 11.237 11.479 11.963 12.982 14.386 15.444 13.999 11.874 10.783 10.379 9.646 11.505 13.133 12.410 11.265 11.276 13.612 14.141 12.000 9.985 8.723 5.640 + 12.970 12.392 13.099 11.308 11.685 13.311 14.457 15.286 15.713 13.470 12.323 11.780 10.805 11.007 10.924 10.926 10.970 11.340 12.075 13.574 13.914 12.518 11.124 10.998 10.840 12.424 15.040 13.930 12.348 12.546 13.853 13.408 11.175 9.693 8.635 4.919 + 12.987 12.911 13.411 11.892 11.939 13.459 14.696 15.394 15.539 13.817 12.595 12.413 11.233 11.392 11.401 11.309 11.441 11.600 11.938 13.050 14.044 13.945 11.544 10.531 10.122 10.740 13.659 13.121 12.110 13.218 15.034 14.700 13.381 11.460 9.565 5.462 + 12.951 13.143 13.544 11.945 11.857 13.353 14.388 14.773 15.239 13.711 11.517 12.115 11.201 10.772 11.053 11.044 11.210 11.202 11.183 11.712 13.180 14.991 13.750 12.385 11.948 12.168 13.720 13.509 12.665 14.076 15.600 14.583 13.399 11.780 10.548 7.158 + 12.853 13.015 13.379 11.450 11.750 13.085 14.014 14.007 14.460 13.211 10.883 11.820 10.863 9.875 10.055 10.449 10.557 10.479 9.885 9.470 11.462 13.474 13.740 12.906 12.112 13.177 14.002 14.066 13.572 14.216 15.019 13.759 13.183 12.040 11.060 8.483 + 12.700 12.448 12.883 10.269 11.294 12.048 13.024 13.224 13.028 11.913 9.770 11.321 9.763 8.762 9.084 9.331 9.062 10.010 8.881 8.490 8.919 10.878 12.958 13.331 12.621 13.597 13.863 13.010 12.845 13.201 13.877 12.317 12.371 11.555 11.177 8.884 + 12.658 12.037 12.301 10.070 11.018 11.216 11.850 11.734 11.236 10.631 10.016 10.921 8.823 7.662 8.288 8.927 8.708 9.681 8.993 9.753 9.409 9.638 11.120 10.860 10.662 10.413 10.182 10.064 11.078 11.600 11.596 10.962 11.862 11.676 12.023 10.912 + 12.772 12.413 12.521 10.725 10.626 11.429 11.800 11.570 11.013 10.160 10.066 10.746 9.475 7.121 8.038 8.797 9.006 9.992 9.200 9.548 9.342 9.497 10.463 10.201 9.015 6.676 6.389 6.681 9.049 10.142 9.872 9.908 11.513 11.331 11.833 10.474 + 12.577 12.436 12.390 10.901 10.729 11.602 11.861 11.616 11.188 10.429 10.478 10.902 9.441 7.440 8.441 8.920 9.270 9.821 9.235 9.352 9.523 9.591 10.603 11.101 8.492 6.458 4.982 6.078 8.332 9.573 10.190 10.489 11.849 11.526 10.751 9.462 + 12.425 12.265 12.120 10.785 10.940 11.382 11.772 11.227 10.079 10.242 11.022 11.005 9.098 7.379 8.441 8.780 9.227 9.298 9.148 9.013 9.748 9.854 10.209 10.720 9.106 7.066 4.460 4.907 7.861 9.344 9.987 10.555 11.863 11.511 11.071 9.346 + 12.092 11.540 11.399 10.556 10.762 10.779 11.309 10.740 9.704 10.911 10.965 10.020 8.917 7.069 7.528 7.004 7.803 7.683 7.778 7.792 8.022 9.041 11.459 11.213 9.821 7.555 5.008 5.373 6.972 8.210 8.853 8.948 10.047 10.376 10.767 9.653 + 11.810 10.630 10.778 10.878 9.953 11.215 10.797 9.213 9.433 9.709 8.687 9.442 7.715 5.079 5.580 5.572 7.112 7.966 7.966 8.314 9.066 9.939 11.409 11.331 9.401 7.489 6.027 5.534 6.442 7.856 8.412 8.288 9.241 9.453 10.800 9.558 + 11.790 11.232 9.414 10.540 9.987 10.047 11.132 10.236 9.911 9.612 9.343 8.304 5.926 6.161 6.427 6.914 8.869 8.973 9.795 9.858 9.784 10.171 11.647 11.622 10.282 8.037 7.242 6.809 7.475 8.660 9.316 7.602 7.428 7.198 8.048 6.918 + 10.443 10.129 11.040 10.338 10.513 11.599 11.277 10.101 9.183 9.692 9.242 7.091 6.823 8.163 9.256 10.027 10.898 11.450 12.345 11.797 9.905 9.436 11.100 11.238 11.005 8.154 7.942 7.529 8.001 8.215 9.888 8.093 8.125 8.898 8.740 8.132 + 8.992 10.198 10.704 9.276 10.415 10.417 11.329 10.003 10.604 9.786 9.415 7.481 7.685 7.992 7.820 8.693 10.176 11.441 12.788 11.832 9.810 9.971 9.444 10.391 11.065 8.959 8.541 8.985 9.589 8.970 9.434 9.894 10.010 10.952 11.216 10.833 + 7.336 9.502 9.174 8.453 8.543 8.729 9.237 8.886 8.759 8.294 8.180 7.224 6.756 6.768 6.537 5.882 6.966 9.597 10.634 9.590 9.373 9.253 8.672 10.235 10.411 9.085 9.045 9.745 10.094 10.171 10.744 10.835 10.897 11.512 12.429 12.807 + 8.225 7.225 7.344 8.367 7.998 8.120 8.200 8.036 6.199 5.801 5.685 7.175 6.795 5.595 6.081 6.040 7.631 9.048 8.968 8.632 8.195 8.794 8.775 9.065 9.100 10.155 9.930 9.629 9.645 10.872 11.568 11.384 10.926 12.392 12.786 12.426 + 7.735 6.769 7.371 7.975 7.640 8.049 6.845 8.218 8.074 7.059 8.048 7.960 8.039 7.174 8.086 7.331 7.899 9.259 9.240 8.634 9.311 8.979 9.003 8.067 8.483 9.312 9.579 9.647 8.100 10.957 11.257 11.946 12.048 12.843 13.217 13.197 + 5.201 7.854 8.177 6.723 6.174 7.552 7.467 7.306 8.329 7.236 7.661 7.871 7.521 6.616 7.460 8.576 8.350 8.358 8.956 8.942 8.874 9.416 8.827 9.420 8.506 10.242 9.169 9.981 9.743 10.606 12.469 12.596 12.403 13.608 13.897 13.640 + 8.065 7.380 5.890 7.362 7.743 6.900 7.298 8.427 8.566 8.213 7.955 8.541 8.279 7.931 7.937 8.162 8.773 9.456 10.240 9.434 8.596 10.161 10.010 9.559 9.173 10.395 8.975 10.125 10.386 11.102 11.891 12.391 12.886 14.069 14.637 14.289 + 9.891 9.632 9.422 9.906 9.028 9.535 9.317 8.759 9.234 9.332 7.863 6.270 8.062 8.239 7.854 8.386 8.790 10.039 11.526 10.944 9.939 9.371 9.835 10.266 9.341 11.733 10.721 10.720 11.267 11.899 12.289 12.692 13.359 13.717 13.557 14.710 + 9.910 11.139 11.314 11.542 12.081 12.475 12.247 11.686 10.776 10.762 9.024 8.575 8.410 8.928 9.869 10.481 10.543 10.276 11.496 10.712 10.132 10.190 11.113 11.516 10.657 12.179 11.030 10.451 11.114 10.653 11.185 13.636 14.252 13.148 13.256 13.844 + 11.657 11.732 11.404 12.772 13.565 14.496 15.606 15.405 13.837 13.548 11.992 12.152 11.474 11.509 10.532 10.436 11.592 12.305 12.303 11.527 10.726 10.437 10.113 10.494 12.194 13.256 11.899 10.454 9.246 8.827 9.480 9.426 10.478 11.189 10.354 9.414 + 12.410 12.280 11.882 12.020 13.146 15.061 15.831 16.467 15.580 13.579 13.988 13.460 11.685 12.972 12.276 12.749 13.145 14.259 14.297 12.816 12.188 11.452 10.704 10.993 12.182 13.473 11.729 10.083 8.017 8.247 9.316 8.283 8.552 10.536 8.967 7.182 + 12.775 12.187 12.378 11.997 12.936 14.301 15.072 16.021 16.580 15.198 13.916 14.271 13.426 12.910 13.296 12.820 14.110 15.203 15.966 14.444 14.310 12.981 12.895 12.575 13.198 13.703 12.523 11.426 11.294 10.876 11.173 10.933 9.555 10.537 9.633 8.433 + 12.532 11.881 12.317 11.815 12.890 14.049 14.521 16.697 17.191 14.930 14.643 14.356 12.948 12.930 12.898 12.642 13.364 14.637 17.146 16.448 15.357 13.888 13.659 13.140 13.912 14.170 13.453 12.167 11.670 11.556 12.619 12.941 11.037 11.839 10.446 9.118 + 12.293 11.523 12.001 11.707 12.618 13.794 13.751 16.484 17.062 15.909 14.535 13.683 12.535 12.617 11.924 12.051 12.456 13.306 16.000 15.453 14.471 13.139 12.881 12.534 13.311 13.720 13.342 11.929 10.666 11.314 13.493 14.330 12.304 12.581 9.812 8.301 + 12.073 11.836 11.980 12.154 13.042 13.961 13.949 16.610 17.376 17.169 15.165 13.712 13.402 13.593 13.346 13.381 14.004 15.125 16.906 16.307 14.097 12.776 11.260 12.062 12.284 13.046 13.540 12.849 12.074 12.403 13.471 14.250 11.905 11.380 9.479 8.560 + 12.090 11.766 11.650 12.168 13.067 13.732 13.962 16.434 17.085 17.422 15.217 14.429 13.962 13.860 13.571 13.603 14.274 15.112 16.836 16.207 15.094 13.707 12.661 12.515 12.480 11.650 11.983 12.145 11.841 12.176 13.381 14.030 11.587 10.527 9.871 9.489 + 12.074 11.629 11.134 11.795 12.780 13.159 13.478 15.952 16.803 16.984 15.891 14.931 13.005 14.150 13.328 14.058 13.830 15.750 16.477 16.632 15.027 14.329 13.787 14.714 14.678 14.053 13.442 12.869 12.251 12.771 14.005 14.399 12.376 11.815 10.470 9.855 + 11.883 11.096 11.046 11.988 12.716 13.054 13.781 15.902 16.981 17.299 15.513 14.161 13.483 13.723 13.649 14.114 14.513 15.408 16.206 15.728 13.619 12.665 12.755 13.213 13.405 12.374 11.657 11.548 11.634 12.375 13.705 14.444 12.356 11.599 8.716 7.715 + 11.756 10.973 11.224 11.987 12.427 13.106 13.583 15.752 17.237 17.525 16.352 14.520 13.290 13.764 13.831 14.103 14.583 15.414 16.985 16.378 15.135 14.305 13.961 14.535 15.055 14.057 12.814 12.143 12.067 12.394 13.600 14.432 12.214 11.656 10.030 9.553 + 11.694 11.059 11.156 12.205 12.243 13.215 13.737 15.467 17.144 17.424 16.444 14.315 13.253 13.793 13.967 14.139 14.675 15.070 15.772 15.552 14.608 13.836 13.715 14.182 14.818 13.426 12.118 11.515 11.983 12.628 13.733 14.295 11.949 11.088 9.368 8.717 + 11.983 11.469 11.499 12.349 12.786 13.351 14.196 15.430 17.164 17.504 16.668 14.639 13.826 14.275 14.537 14.608 15.082 15.924 16.225 15.646 14.478 14.322 14.486 15.106 14.865 13.442 11.845 11.382 12.195 13.427 14.398 14.951 12.706 12.122 9.963 8.725 + 11.798 11.249 11.154 11.983 12.644 13.192 14.104 15.075 16.866 17.069 16.927 14.253 13.731 14.213 14.479 14.503 14.884 15.716 16.051 16.164 14.320 13.682 13.817 14.691 14.377 13.137 12.541 11.730 12.128 13.881 15.170 14.874 12.250 10.564 9.376 9.154 + 11.651 11.204 10.757 11.923 12.522 12.852 13.717 14.934 16.676 17.084 17.034 14.170 14.478 13.866 14.454 14.262 15.346 15.320 16.631 15.723 14.151 13.584 13.290 13.693 14.052 11.833 11.640 10.855 10.890 12.656 14.216 14.097 11.720 10.566 8.950 8.227 + 11.486 10.524 10.846 11.753 12.138 12.668 13.349 14.642 16.726 17.580 17.037 14.322 14.552 13.773 14.192 14.496 15.430 16.160 15.467 13.998 13.279 13.110 13.307 14.058 12.771 11.192 10.362 9.833 10.383 11.722 13.724 13.556 11.464 11.555 10.046 9.203 + 11.362 10.791 11.264 11.788 12.301 12.800 13.527 14.807 16.867 17.796 16.864 14.513 14.557 14.221 14.685 14.875 16.392 17.524 16.201 14.234 13.484 13.290 13.601 14.591 13.108 10.851 9.894 10.208 10.576 11.917 13.869 13.594 11.256 11.327 9.180 8.011 + 11.398 11.281 11.546 11.777 12.635 12.939 13.744 14.987 16.713 17.590 16.452 14.596 15.135 14.863 15.399 15.792 17.677 17.662 15.817 13.733 12.587 12.503 13.196 13.980 12.347 10.478 9.838 10.059 10.493 11.870 12.975 13.737 11.802 10.753 8.865 7.813 + 11.311 11.274 11.159 11.843 12.728 12.901 13.827 15.475 16.704 17.717 16.594 14.388 15.354 14.779 15.576 16.504 17.741 16.209 15.626 14.068 13.638 13.537 13.900 13.966 13.330 11.525 10.759 10.179 9.520 9.542 10.973 11.642 9.940 9.160 8.661 8.015 + 10.902 10.958 10.782 11.694 12.421 12.520 13.753 15.213 16.686 17.700 15.623 14.712 15.063 14.305 15.114 16.091 16.901 14.694 13.597 12.172 11.500 11.487 12.196 12.399 11.488 9.888 9.331 8.839 8.773 10.268 11.941 11.792 10.174 9.484 8.394 8.243 + 10.779 10.526 10.772 11.505 12.098 12.527 13.610 15.238 16.949 17.477 14.809 14.448 14.542 14.235 15.152 16.845 16.038 13.749 12.586 11.057 10.355 10.250 10.809 11.230 10.756 8.932 8.352 8.113 8.631 10.361 12.401 12.048 10.347 10.349 8.535 7.574 + 10.907 11.128 11.521 11.989 12.503 13.135 14.273 16.214 17.286 17.164 14.529 14.353 14.480 14.658 16.126 16.713 14.607 13.130 12.213 10.929 10.452 10.450 11.160 11.804 11.112 9.569 9.173 9.211 9.671 11.522 13.031 12.264 10.950 10.321 9.297 7.010 + 11.348 11.309 11.549 12.199 12.619 13.327 14.658 16.260 16.729 16.491 14.484 14.179 14.374 15.031 16.083 16.088 14.189 13.033 11.979 11.247 10.575 10.378 10.728 10.296 9.123 8.058 7.944 8.441 9.315 11.128 12.348 11.419 10.124 10.480 8.802 7.504 + 11.043 10.870 11.038 12.086 12.365 12.696 14.706 15.585 16.527 15.030 13.615 13.932 13.712 14.641 15.807 15.381 13.231 11.366 10.698 10.053 9.809 9.937 10.511 10.303 8.797 7.837 8.357 8.250 8.420 9.541 11.060 10.033 9.383 10.372 9.100 7.575 + 10.626 10.185 10.656 11.777 12.553 12.475 14.729 16.224 16.084 14.607 13.246 12.858 13.234 14.431 15.994 15.303 12.348 11.233 10.540 10.035 9.578 10.174 11.012 11.452 9.164 7.720 9.047 8.526 8.458 9.826 10.804 9.820 8.902 10.293 8.703 6.911 + 10.604 10.687 11.343 11.867 12.706 13.296 15.424 15.873 15.159 14.119 13.192 12.517 12.812 14.176 15.685 15.066 12.491 11.618 11.143 10.272 10.133 10.630 11.908 12.206 10.204 8.565 10.066 9.214 9.071 10.659 11.695 10.286 8.706 10.194 8.742 6.060 + 9.522 9.834 10.708 12.072 12.987 14.034 15.555 15.358 14.957 13.564 12.844 12.418 12.560 13.516 15.056 14.900 13.405 12.053 11.472 10.305 10.128 10.767 11.103 9.723 9.556 10.490 9.173 8.456 7.942 8.888 10.607 9.561 7.864 10.059 10.712 8.536 + 7.866 8.078 8.660 9.260 11.001 12.416 14.403 13.882 12.589 11.356 9.505 9.497 9.772 10.845 12.869 13.590 11.094 9.672 9.152 8.125 8.308 8.268 8.725 7.127 7.743 9.291 7.258 6.291 6.501 6.599 8.988 7.555 5.558 8.698 9.252 8.730 + 7.755 8.397 9.265 9.904 11.514 13.404 13.560 12.240 11.325 10.820 9.921 9.435 9.761 10.891 12.089 13.566 12.450 10.287 9.409 8.431 8.726 8.319 6.395 5.958 6.417 8.426 7.305 5.590 6.204 5.922 8.159 8.005 6.512 8.505 9.649 10.267 + 4.645 4.617 3.763 3.922 7.737 9.750 9.725 9.444 10.174 7.597 5.069 4.661 5.356 5.867 7.593 11.014 9.794 6.827 6.053 5.694 5.541 5.515 5.988 6.189 5.268 6.225 5.065 3.672 3.588 4.104 4.123 4.430 4.819 5.992 6.497 5.812 + 4.709 3.710 5.123 4.828 5.351 7.426 7.953 8.186 9.369 7.737 6.322 4.709 4.284 5.994 7.969 8.759 7.432 7.325 7.792 6.165 5.896 6.236 5.575 6.035 5.646 5.318 3.769 3.705 3.794 3.365 4.486 3.945 4.570 4.222 3.510 3.773 + 5.549 4.451 4.568 4.747 4.535 7.112 8.456 8.467 9.360 8.255 6.627 5.124 5.753 6.043 7.248 8.018 6.926 6.683 6.406 5.250 5.452 5.616 5.242 5.568 4.410 5.046 3.882 2.682 2.959 3.371 3.735 3.211 3.526 2.455 2.978 2.413 + 3.654 3.629 2.786 3.776 4.695 6.210 7.686 8.256 9.162 7.740 6.529 5.001 4.298 6.233 6.365 6.523 7.031 6.398 5.954 5.781 5.319 5.205 4.028 4.633 4.439 4.686 2.998 3.541 3.429 3.900 3.888 3.182 2.872 3.034 3.026 2.509 + 3.965 3.922 4.077 3.625 3.366 5.718 7.688 7.761 8.633 8.023 6.761 4.017 3.517 5.743 6.539 5.923 6.282 5.929 6.323 5.943 5.189 3.446 3.384 4.055 3.344 3.534 2.987 2.792 3.399 3.237 3.681 3.579 3.105 3.460 2.515 1.889 + 1.316 3.310 3.954 4.308 4.871 6.130 8.201 7.969 8.508 7.096 5.151 3.614 2.571 4.567 5.890 5.600 4.728 5.322 5.221 5.735 4.899 4.915 3.921 4.789 4.920 3.456 3.623 3.216 2.768 3.476 3.790 3.339 3.223 2.680 2.186 1.439 + 5.132 4.839 3.378 4.199 4.122 4.787 7.145 6.869 8.268 7.525 5.485 5.370 5.009 5.686 5.826 6.572 5.875 6.488 6.618 5.925 5.324 4.713 3.450 4.492 3.891 4.027 3.695 2.593 3.059 3.260 3.375 2.901 3.175 3.160 2.518 1.589 + 5.072 5.202 4.709 5.621 5.603 5.945 7.577 8.203 8.522 6.894 5.142 4.966 4.291 6.456 7.688 7.893 6.153 5.523 6.527 5.213 5.291 4.701 4.222 4.655 4.343 4.458 3.879 3.816 3.357 2.720 3.375 3.417 3.867 3.758 2.578 1.361 + 3.630 4.829 4.523 4.030 3.577 4.534 6.380 6.359 7.417 6.279 5.239 4.774 4.844 7.283 7.703 7.400 6.428 6.073 6.092 5.255 5.761 5.336 5.065 4.641 5.126 5.478 5.044 4.178 3.182 2.983 2.371 3.067 4.436 4.534 3.380 2.227 + 5.612 6.124 6.160 7.099 8.492 9.365 9.592 9.932 10.137 9.958 9.321 8.910 9.036 9.732 10.450 10.308 10.837 10.723 9.569 9.837 10.456 10.369 9.264 7.982 8.103 8.755 9.115 8.585 8.856 9.033 8.290 8.650 9.183 8.788 9.458 8.762 + 7.506 7.262 7.229 8.109 9.024 10.041 10.140 10.270 10.614 10.356 9.520 8.350 8.522 10.062 10.642 10.074 11.197 11.198 9.387 10.124 10.499 10.407 9.174 7.443 8.062 8.859 9.406 8.765 9.093 9.307 8.682 9.369 9.879 9.705 10.124 10.290 + 4.333 5.753 6.307 6.571 5.908 7.146 8.250 7.910 7.493 7.146 7.781 6.745 7.721 8.303 8.777 8.913 9.989 9.290 9.459 7.955 8.898 9.559 9.699 8.763 7.835 8.242 8.077 8.207 9.748 9.436 9.269 10.109 9.929 11.079 10.982 11.634 + 5.585 6.578 5.778 5.771 5.856 7.175 7.199 5.967 7.369 8.233 8.837 9.074 9.071 10.992 10.217 9.249 10.180 11.660 10.836 10.533 11.077 10.630 10.459 9.857 9.085 9.950 10.448 9.090 10.091 10.682 11.366 11.607 11.906 12.218 13.628 13.819 + 7.979 7.353 6.014 5.781 6.724 8.451 9.105 8.980 9.154 9.376 9.625 9.835 9.966 10.261 10.707 9.699 12.097 12.093 11.408 10.820 11.014 11.362 10.541 10.857 10.040 10.537 10.999 10.651 11.168 11.014 12.111 12.743 12.428 12.666 13.868 13.330 + 6.683 6.589 8.159 7.266 9.187 9.870 10.135 9.294 9.888 8.912 9.405 9.559 11.066 10.705 10.403 10.050 11.448 11.609 11.825 10.786 11.127 10.446 10.065 11.153 10.404 10.210 11.570 11.467 11.765 11.324 11.839 12.594 12.759 12.994 13.867 13.774 + 7.593 7.790 8.546 8.645 9.228 8.545 8.720 8.701 10.268 10.322 9.508 10.131 11.363 11.680 9.751 9.720 10.920 12.467 11.602 10.275 11.019 10.506 11.367 10.778 10.571 10.774 11.284 11.472 11.258 10.756 12.015 12.276 13.223 13.401 14.180 14.074 + 8.366 8.144 7.737 8.710 9.316 10.285 9.809 9.812 11.300 11.364 9.883 11.147 10.921 11.041 9.772 10.078 10.121 11.329 11.789 10.192 11.149 10.849 10.434 9.807 8.755 10.416 11.014 10.631 10.622 11.051 12.189 13.452 14.053 13.047 13.841 13.495 + 8.582 7.719 7.304 7.115 8.278 9.415 10.770 10.744 9.369 11.037 11.160 10.298 9.766 9.657 9.655 9.342 11.669 11.982 11.964 10.765 10.113 10.272 10.070 10.614 9.519 11.340 11.830 10.787 10.838 11.707 11.630 13.815 13.750 12.056 13.483 13.843 + 6.734 6.511 8.010 6.864 7.526 9.818 10.548 10.014 9.708 11.291 11.549 10.133 8.960 10.272 9.728 9.687 11.640 11.619 10.916 11.468 10.228 9.993 9.957 9.949 10.745 12.114 11.930 10.710 9.801 10.592 11.799 14.190 14.155 12.465 13.481 13.173 + 8.803 9.008 10.741 10.765 11.543 13.178 13.019 12.565 11.350 11.040 9.918 10.238 8.591 8.451 8.919 10.246 10.925 11.562 10.842 8.639 8.203 8.897 8.229 8.837 9.765 11.556 11.065 9.487 9.179 10.303 10.366 12.552 12.623 11.044 12.164 12.624 + 11.268 11.515 11.027 11.823 13.855 14.715 15.224 13.867 12.397 11.249 10.818 10.072 10.643 10.383 10.615 11.180 11.928 11.553 9.793 8.548 7.424 7.248 7.057 7.941 9.198 11.975 11.612 10.399 10.067 9.314 8.618 10.117 9.971 8.931 9.212 10.421 + 11.655 11.421 11.698 12.400 13.591 15.164 16.009 14.931 13.236 12.027 11.193 10.868 11.250 11.484 11.765 12.625 13.987 13.164 9.707 8.711 7.545 6.631 6.762 8.160 9.987 12.984 12.566 11.425 11.049 9.519 10.052 12.315 11.667 9.864 9.390 8.327 + 11.735 12.037 12.269 12.811 13.666 14.963 16.294 15.709 14.286 13.203 11.909 11.548 11.711 11.231 11.750 12.542 14.384 14.235 11.007 10.002 9.258 8.663 8.735 9.953 11.803 13.871 13.235 11.474 10.703 10.566 11.889 13.398 12.550 12.221 11.935 9.124 + 11.455 11.567 11.824 12.707 13.276 14.474 15.478 16.440 14.095 14.063 12.634 11.371 11.548 11.760 11.913 13.156 14.325 14.825 12.380 11.457 10.796 9.892 9.701 10.507 11.905 14.407 13.856 12.021 10.792 10.584 12.647 13.024 11.621 12.362 12.186 10.427 + 11.110 11.018 11.019 12.186 13.024 13.241 15.796 16.582 14.701 14.384 12.754 11.376 11.881 11.497 12.014 12.543 14.006 14.672 13.941 12.453 11.293 10.971 10.935 11.325 12.782 14.997 14.158 12.270 10.873 11.229 13.070 13.143 11.552 12.422 12.739 11.502 + 11.123 10.912 11.500 11.956 12.808 13.005 15.613 16.508 15.402 14.144 12.615 11.468 11.830 11.553 11.805 12.524 13.675 14.999 13.604 12.080 11.587 10.868 10.847 11.557 13.233 14.707 13.820 12.165 10.734 11.409 13.474 13.236 11.784 11.806 11.839 10.839 + 11.202 11.326 11.886 12.273 12.951 13.018 15.383 15.959 15.769 14.764 13.234 11.874 11.946 11.807 12.254 12.938 13.934 14.854 13.637 11.792 11.534 10.929 11.200 12.088 14.107 14.683 13.682 12.438 11.415 12.511 14.035 13.013 11.294 11.184 11.426 10.934 + 11.147 11.069 11.249 12.141 12.640 12.739 15.070 15.403 15.599 14.801 13.607 12.165 12.700 12.215 13.008 13.863 14.846 15.642 14.581 12.402 12.060 11.785 11.596 12.064 14.309 14.889 14.022 12.623 11.401 12.539 13.403 12.477 10.994 10.800 11.184 10.926 + 10.671 10.623 10.910 11.427 11.745 12.578 14.615 15.654 15.842 14.312 12.789 12.119 11.793 12.213 12.624 13.265 14.569 14.618 13.362 10.989 10.501 9.821 8.570 9.784 12.428 12.778 12.138 11.174 10.430 11.891 12.610 11.426 10.190 9.033 8.941 8.929 + 10.902 10.705 11.329 11.445 12.496 12.747 14.620 15.883 16.280 15.239 13.617 12.458 12.770 12.848 13.282 13.922 15.163 15.670 14.168 12.778 12.117 11.349 11.529 12.397 13.664 14.006 13.389 11.940 11.099 12.925 13.371 11.818 10.569 10.211 10.675 10.365 + 11.287 11.144 11.672 12.202 12.810 12.998 14.704 15.845 16.154 15.555 14.158 12.548 12.890 12.699 13.559 13.908 15.274 15.160 13.961 12.165 11.406 10.807 10.951 12.046 13.936 14.128 12.762 11.025 10.447 12.988 12.949 11.224 9.739 10.155 10.384 10.240 + 11.291 11.231 11.498 12.195 12.571 13.020 14.729 15.367 15.899 15.124 13.927 12.982 12.704 12.881 13.102 14.084 15.442 14.887 12.950 11.731 11.047 10.859 9.946 10.746 12.100 11.891 11.267 10.704 9.949 11.445 11.528 10.313 9.095 9.057 8.941 7.558 + 11.022 10.827 11.002 11.869 12.397 12.570 14.510 15.555 16.072 14.682 13.127 12.915 12.664 12.675 13.059 14.383 15.547 15.340 13.003 10.871 9.841 9.504 9.093 9.730 11.567 10.865 10.597 9.754 8.664 10.627 10.755 9.450 8.515 8.180 8.430 7.891 + 11.143 10.948 11.497 11.892 12.513 12.921 14.726 16.023 16.265 15.171 13.135 12.893 13.035 13.036 13.497 14.623 16.361 15.585 13.609 12.384 11.480 11.040 10.849 11.701 13.019 12.700 12.078 11.092 9.510 11.261 11.049 9.779 8.781 8.305 8.957 9.370 + 11.468 11.248 11.791 12.289 12.664 13.236 14.776 15.779 16.083 15.223 13.608 13.334 13.169 13.325 13.896 14.761 15.341 15.378 13.645 12.701 11.966 11.548 11.230 11.859 13.165 12.720 12.310 11.718 10.370 12.502 11.858 10.107 9.146 8.700 9.062 9.457 + 11.508 11.304 11.492 12.308 12.469 12.838 14.475 15.033 16.010 15.215 13.484 13.690 13.149 13.496 13.653 14.405 14.694 14.851 13.258 12.209 12.014 11.701 11.520 12.554 14.261 13.248 12.760 11.855 10.416 11.497 10.474 9.692 9.343 8.718 8.631 8.860 + 11.549 10.649 10.505 11.680 11.278 12.425 13.487 14.638 15.883 14.327 13.972 14.010 12.608 13.668 13.257 14.543 15.250 14.175 13.132 12.266 12.096 11.856 11.678 12.781 13.869 13.788 13.050 12.212 10.447 11.529 9.705 8.793 8.347 7.779 8.848 9.468 + 11.347 9.911 10.749 11.373 10.229 11.885 12.670 13.528 15.495 15.047 13.529 13.172 13.133 13.028 13.534 15.022 14.683 13.928 13.154 12.640 12.262 12.269 12.258 12.865 13.723 14.379 13.961 13.051 11.080 11.418 9.886 9.007 8.647 9.139 9.590 10.273 + 11.156 11.131 10.373 9.596 10.522 10.545 12.281 13.873 14.316 13.562 13.472 11.253 11.985 11.914 13.252 13.970 13.831 13.324 13.177 12.472 12.001 11.839 11.677 11.755 12.183 13.211 13.316 12.725 10.899 10.607 9.464 8.854 9.279 9.214 9.636 10.118 + 9.811 10.988 11.637 9.836 9.875 10.900 11.651 12.031 12.625 13.119 11.904 10.597 11.406 11.670 13.637 14.409 12.921 12.537 12.553 10.816 11.099 11.485 10.518 10.424 10.181 12.610 13.159 12.276 10.095 9.371 7.975 7.407 7.619 8.924 9.458 10.039 + 8.402 11.276 10.805 9.630 9.238 10.277 10.371 10.239 11.390 12.303 11.292 9.073 10.749 10.083 12.767 13.182 12.128 10.722 10.448 9.343 9.268 8.433 8.720 8.312 7.784 9.380 10.556 10.402 9.393 8.572 6.030 6.138 6.105 8.934 8.843 8.396 + 8.496 10.637 10.247 9.612 7.130 8.636 9.666 9.927 10.221 10.930 9.876 9.022 9.233 9.372 11.599 12.043 9.739 8.826 8.813 8.332 7.819 7.329 7.070 7.184 6.504 7.639 9.372 9.265 8.265 7.634 5.584 4.468 5.224 7.977 8.460 7.765 + 7.625 8.381 8.728 8.138 6.937 6.865 6.783 7.755 8.732 8.435 8.082 7.612 7.576 8.175 8.854 8.801 7.184 7.797 8.434 7.706 6.467 6.435 6.349 5.836 6.753 6.588 8.520 8.744 6.883 6.935 5.571 4.861 5.863 7.414 8.016 6.825 + 7.596 6.475 6.883 5.554 5.212 4.316 3.918 6.384 7.868 8.537 8.928 7.866 7.180 8.385 9.607 8.401 7.277 8.231 8.158 6.697 5.952 5.520 6.540 6.545 5.553 5.915 7.090 7.532 7.326 7.717 6.442 6.469 6.673 7.371 7.791 6.156 + 6.737 5.665 5.613 5.513 4.724 4.305 4.955 6.719 7.339 7.074 7.802 5.981 5.308 5.688 7.459 7.516 6.929 7.303 7.226 5.692 5.638 4.512 4.982 4.864 5.017 5.374 6.622 7.675 6.907 6.882 5.827 6.831 7.191 7.299 7.551 6.513 + 3.818 4.106 2.978 3.854 4.945 5.470 6.443 5.617 6.103 6.884 6.872 6.426 5.668 5.928 6.720 6.799 5.953 6.354 5.789 4.813 5.508 5.282 5.504 6.250 4.674 4.494 4.547 5.578 6.518 5.917 5.401 5.887 7.559 6.784 6.486 5.875 + 3.527 4.464 4.420 4.690 5.109 5.804 6.332 6.172 6.718 6.033 6.813 5.032 4.940 4.751 5.337 4.637 4.531 5.817 5.612 4.038 3.155 4.975 5.842 6.213 5.202 5.222 4.460 5.995 5.541 5.077 5.693 6.183 6.593 6.368 5.892 5.550 + 3.459 4.610 4.952 5.369 4.762 6.324 6.307 6.912 6.050 5.150 4.458 4.509 3.913 5.765 6.150 5.597 5.634 7.090 6.368 5.490 5.146 5.583 5.845 5.762 5.109 4.889 5.682 5.494 5.141 4.466 4.875 5.236 5.396 5.869 5.634 3.283 + 5.225 5.822 4.937 5.025 5.534 6.518 6.373 6.739 6.798 6.343 4.598 3.450 4.139 5.222 5.418 6.521 6.535 7.286 7.165 6.978 6.114 6.124 5.226 6.127 6.234 5.453 4.860 5.177 4.794 5.482 6.842 7.311 7.336 6.537 6.251 6.591 + 4.968 4.548 3.928 4.712 5.343 4.385 4.786 6.097 6.183 5.467 4.153 3.756 4.352 4.493 5.942 6.692 7.728 8.620 8.872 7.031 5.794 5.412 4.864 6.254 5.925 6.152 5.908 5.581 4.839 5.528 6.704 7.079 7.183 6.767 5.980 6.435 + 5.082 4.805 4.869 4.516 3.986 4.509 5.700 5.529 4.832 5.128 5.111 4.395 4.868 4.816 6.523 6.418 6.497 8.220 8.067 7.375 6.106 5.870 5.309 5.918 5.719 5.031 4.595 4.962 4.690 5.292 6.220 6.931 7.073 6.066 5.512 5.866 + 4.869 5.263 3.500 3.116 4.288 5.788 4.577 4.152 5.224 5.602 4.773 4.093 3.412 4.899 5.872 5.728 5.555 5.289 5.557 5.371 4.835 5.192 5.652 6.183 4.856 4.598 4.196 4.007 4.051 4.502 4.200 4.268 4.114 4.371 3.918 3.554 + 6.044 5.348 5.765 5.690 5.245 6.736 7.145 5.742 5.659 6.937 5.773 6.290 6.048 5.243 6.328 6.757 7.415 7.878 7.727 7.545 7.188 6.486 6.799 6.802 6.470 6.816 7.138 6.776 6.699 7.361 7.579 6.931 6.090 6.302 6.279 5.912 + 7.288 8.083 8.719 9.084 9.112 9.319 9.648 9.557 9.628 9.630 9.199 9.377 9.518 9.525 9.800 10.309 10.806 11.430 11.610 11.189 10.258 9.550 9.143 9.002 9.410 10.242 10.511 9.680 9.959 10.971 11.641 10.394 9.633 9.498 9.865 10.135 + 5.455 6.301 7.177 8.494 6.962 6.842 7.170 7.472 7.615 7.072 7.001 6.771 6.842 7.218 7.020 7.850 8.536 9.499 9.764 9.614 8.322 7.356 6.917 6.649 7.054 7.951 8.779 7.352 7.219 8.637 9.749 7.807 6.915 7.151 7.554 7.845 + 4.723 6.783 8.219 8.923 7.702 7.357 6.397 5.733 4.706 7.604 7.419 7.948 7.273 6.372 7.088 7.613 7.805 9.131 10.376 9.276 8.132 7.637 6.909 7.920 8.366 8.128 8.033 7.428 7.142 7.828 7.963 8.685 6.446 6.480 7.100 6.677 + 5.738 6.357 6.951 7.597 6.990 8.038 7.107 7.855 8.274 8.537 7.697 7.840 7.932 8.233 8.876 8.762 9.023 8.341 10.726 10.388 8.809 7.834 7.111 7.489 7.680 7.920 9.611 8.387 7.611 7.167 8.369 8.881 7.292 6.491 7.000 7.608 + 4.239 5.553 7.222 7.984 7.204 7.591 8.715 8.206 8.146 7.177 6.943 8.524 9.377 9.089 8.151 9.317 9.592 9.059 9.759 10.323 10.378 8.787 7.942 8.660 8.253 8.039 9.053 8.220 7.387 8.247 9.289 8.937 8.210 8.227 8.475 8.473 + 4.867 7.147 8.017 8.230 7.320 6.695 7.956 7.736 7.344 8.640 8.629 8.076 8.435 7.940 8.179 9.997 10.277 10.692 11.358 9.526 10.297 9.537 8.676 9.578 8.929 8.944 8.551 8.013 7.697 8.725 9.881 9.606 9.600 9.179 9.297 8.764 + 6.237 6.467 6.500 6.210 7.092 7.828 8.680 8.385 7.276 8.489 8.962 9.429 9.826 8.883 9.273 8.051 9.977 9.270 10.262 11.729 11.515 8.978 9.113 8.858 9.260 10.075 9.696 8.909 8.693 8.894 11.049 11.197 9.610 8.971 9.547 8.841 + 5.139 5.029 5.535 7.885 9.401 9.617 8.884 8.023 8.053 8.056 8.826 10.068 8.927 9.036 8.912 9.229 9.256 9.835 10.685 12.081 12.239 10.400 8.910 8.972 9.498 10.058 9.946 8.877 9.395 8.862 10.735 10.843 9.789 9.613 9.341 8.399 + 4.951 5.577 6.659 7.588 8.415 8.366 9.806 9.472 7.617 7.981 9.093 8.897 9.558 8.580 7.175 9.255 9.257 9.404 10.054 11.924 11.873 10.294 9.018 9.289 9.592 10.030 9.441 9.519 9.080 8.480 9.904 11.510 10.377 9.982 9.474 10.110 + 4.305 5.676 7.540 7.842 7.813 9.306 8.794 8.019 6.799 8.488 8.522 8.363 7.828 7.707 6.671 8.847 9.027 10.238 10.971 11.759 12.205 10.185 9.775 9.508 8.976 10.810 11.382 9.323 9.243 8.610 9.987 10.653 9.888 9.214 9.974 9.196 + 6.555 5.486 6.897 6.800 8.938 9.893 9.514 8.090 8.993 9.515 9.482 9.785 9.005 8.160 8.832 8.016 8.262 9.836 10.332 11.955 11.948 10.295 9.770 9.424 8.695 10.046 10.791 10.017 10.003 9.758 10.500 10.886 9.995 10.408 10.354 10.152 + 6.482 5.242 5.892 7.384 7.630 7.672 8.539 8.840 8.244 7.578 9.404 9.889 9.733 9.018 8.369 7.553 8.630 10.992 11.071 12.189 12.541 10.080 10.013 9.769 9.621 11.895 11.416 10.182 9.871 10.143 12.084 11.285 9.324 9.833 11.269 10.429 + 6.389 6.091 4.579 5.660 8.065 8.978 9.398 8.828 7.548 8.369 9.253 9.581 9.356 8.772 8.429 8.515 9.076 10.086 11.173 12.354 11.395 10.084 9.976 9.683 9.884 11.288 11.414 10.220 9.230 10.367 11.422 11.067 10.429 10.394 11.019 10.474 + 5.970 5.297 5.582 6.190 7.121 9.029 9.442 9.693 8.093 9.058 7.420 7.166 8.505 8.460 8.619 8.604 9.253 9.751 10.035 11.746 10.977 10.413 9.083 9.980 10.432 9.370 10.474 10.140 9.262 8.854 10.671 11.399 11.075 10.297 9.786 9.588 + 5.099 5.358 5.622 5.775 6.183 6.717 8.527 9.364 8.550 8.618 8.401 7.501 9.054 8.054 8.215 7.792 8.878 9.870 9.018 11.068 10.573 10.078 9.613 9.066 10.700 10.262 10.489 9.498 8.653 8.826 10.316 11.600 11.141 9.730 8.821 9.171 + 4.457 5.037 4.510 5.751 7.747 7.453 9.556 10.440 8.988 7.800 7.640 8.150 8.168 7.019 8.021 8.161 9.216 10.011 10.580 10.970 10.550 10.330 9.283 10.027 8.713 10.467 11.579 10.170 9.283 10.301 10.989 11.516 10.634 9.689 9.422 8.590 + 5.485 5.827 6.897 8.611 9.539 8.040 9.530 10.318 7.868 8.594 8.839 7.283 7.821 6.100 6.792 7.955 9.565 9.834 10.530 11.732 10.851 10.096 9.529 9.769 10.422 10.732 10.661 10.752 8.908 9.740 11.086 11.367 10.410 10.575 10.930 9.778 + 3.751 6.178 7.136 7.836 7.934 7.593 9.528 10.288 8.301 9.215 8.193 7.331 6.669 6.728 5.383 7.859 9.275 11.151 11.114 12.023 11.527 10.724 10.149 10.363 11.360 11.494 11.208 10.836 9.597 9.845 10.595 11.063 10.043 10.002 10.263 9.264 + 4.628 3.366 4.001 6.842 8.523 7.944 9.638 9.647 8.235 8.746 8.189 8.368 7.639 6.772 6.501 7.726 9.047 10.395 10.851 11.782 11.157 10.509 9.498 10.954 11.445 10.838 10.709 10.788 10.541 11.176 11.605 11.861 10.242 10.315 10.943 9.306 + 4.970 5.538 5.044 6.815 7.000 7.983 8.713 7.698 8.885 9.777 8.902 8.567 7.127 8.219 7.404 8.182 9.103 9.043 11.015 11.016 11.234 9.639 10.028 10.324 9.928 9.745 11.148 10.004 10.257 11.472 12.213 11.677 11.373 10.349 10.742 10.151 + 5.620 5.315 5.814 6.327 6.118 6.249 8.864 9.361 8.938 9.870 8.054 8.589 7.280 7.066 7.774 7.762 9.883 10.349 10.557 9.624 10.427 9.088 8.637 9.138 9.515 9.854 10.341 9.879 9.473 11.144 12.451 11.271 11.218 10.542 10.855 9.584 + 3.800 5.081 7.098 6.847 6.454 7.862 9.566 8.651 8.644 9.581 6.887 7.572 7.909 7.271 7.487 7.162 9.821 10.693 12.021 11.849 11.462 9.708 8.859 10.222 9.219 9.986 11.394 10.967 10.335 10.357 11.440 11.096 11.144 10.447 11.280 10.545 + 4.586 5.066 6.484 7.998 7.123 7.210 9.294 9.585 8.963 9.960 7.699 7.862 8.446 8.232 8.758 9.099 9.480 10.129 11.655 13.005 11.632 9.880 9.017 9.579 9.414 9.506 10.913 10.516 9.337 10.095 10.847 11.424 11.462 10.465 11.084 10.385 + 8.480 8.451 8.588 7.822 6.959 9.073 9.889 10.205 10.397 10.931 9.809 9.452 8.667 9.470 8.720 9.350 9.998 11.442 11.973 12.127 11.233 9.893 10.381 10.132 10.570 10.702 10.501 10.475 10.222 11.098 12.936 12.506 11.841 11.320 10.903 9.242 + 8.289 7.801 7.417 7.156 8.132 8.349 8.841 9.530 10.017 10.864 9.744 8.576 8.094 8.573 7.991 8.542 10.494 11.339 11.401 12.297 12.264 11.066 11.255 11.210 10.693 9.684 11.565 10.931 10.067 11.220 13.129 12.018 12.166 11.878 10.543 10.036 + 3.468 4.665 7.154 8.689 8.031 8.810 10.559 9.535 9.279 9.886 7.237 7.726 6.970 7.538 8.065 8.610 9.697 10.218 12.020 13.730 13.698 11.605 9.775 9.828 10.575 10.561 10.624 9.918 9.554 11.612 12.416 11.901 12.365 12.711 10.990 10.402 + 5.692 4.975 4.627 7.116 6.819 8.298 10.276 8.716 8.687 8.979 7.444 7.051 6.704 6.491 7.271 7.772 8.158 10.329 11.158 13.113 12.483 9.794 10.142 10.229 10.493 11.093 11.514 9.922 10.641 11.538 12.504 11.795 12.815 12.635 11.663 10.090 + 5.124 5.686 5.243 5.720 7.175 8.878 10.687 9.111 8.037 8.387 6.871 6.374 5.667 6.195 7.526 7.743 8.316 10.158 11.481 11.863 12.108 10.942 9.975 9.803 10.251 10.605 11.364 9.725 9.460 10.173 11.988 11.140 11.289 11.182 10.835 9.427 + 6.199 6.203 6.955 7.716 7.615 9.585 11.500 10.131 7.403 7.458 7.723 7.277 6.311 6.949 8.166 8.587 7.818 9.142 10.978 12.439 12.399 11.094 9.199 9.020 9.724 9.923 9.733 9.070 8.285 9.263 11.860 11.237 10.632 9.681 9.792 8.690 + 5.451 5.601 5.178 5.747 6.520 10.216 11.657 9.766 6.961 5.879 6.280 6.996 6.931 6.500 7.021 8.481 9.815 9.414 10.532 12.789 12.170 10.773 9.180 9.454 8.664 8.513 10.080 9.349 8.107 7.643 9.945 10.112 10.669 9.939 9.508 8.429 + 2.803 5.721 5.803 6.893 5.404 10.449 11.607 9.086 5.794 5.940 6.313 6.204 5.834 5.946 5.161 7.948 9.116 9.788 11.062 11.721 11.444 9.680 8.860 9.312 9.163 9.252 9.737 8.936 8.787 8.415 9.928 10.723 11.616 11.568 10.545 9.822 + 4.868 7.216 7.099 6.880 7.321 10.771 11.806 9.437 7.048 5.553 6.019 6.422 4.700 4.979 4.908 7.627 8.785 8.948 9.882 12.285 12.114 10.012 9.199 9.521 8.657 9.294 8.629 7.987 8.609 9.114 10.531 10.773 11.053 11.310 10.553 9.561 + 5.495 6.920 7.645 7.318 7.144 10.962 11.725 9.128 7.441 7.326 6.822 7.498 6.756 5.783 6.038 7.525 8.225 8.907 10.443 11.470 10.758 9.634 8.419 9.703 9.552 9.305 9.563 7.945 7.461 9.935 11.893 10.952 10.490 11.542 10.424 9.600 + 4.758 6.753 7.924 8.315 7.245 10.544 11.208 9.136 6.174 6.313 6.405 6.278 5.506 6.314 4.890 5.764 7.832 9.023 9.666 12.049 11.392 9.443 7.915 8.730 8.671 7.911 7.990 8.086 7.748 9.548 11.770 11.011 11.042 11.008 10.057 9.772 + 5.493 6.647 7.405 7.873 6.950 10.319 9.761 7.090 6.705 6.104 6.731 6.047 6.107 6.081 6.376 7.154 8.430 9.235 9.780 11.338 9.993 9.014 8.098 8.500 8.212 8.337 7.761 7.405 7.859 8.660 11.435 10.498 9.460 10.254 8.373 7.546 + 9.203 7.527 7.455 6.172 7.415 10.091 9.727 7.497 8.083 6.560 5.485 5.701 7.258 6.579 8.166 9.464 8.609 9.133 9.811 10.730 9.688 8.023 6.968 6.852 7.864 8.301 8.126 7.868 8.043 9.015 9.997 9.693 9.672 9.896 8.866 7.729 + 10.035 9.368 7.412 7.484 9.162 10.155 7.808 7.484 7.177 5.317 6.279 6.745 6.595 6.078 7.107 8.178 9.330 8.404 9.864 9.636 8.914 8.093 6.878 6.597 7.747 8.352 8.744 8.052 8.025 8.540 9.740 8.989 10.532 10.196 8.858 8.480 + 7.163 6.372 5.914 7.028 8.679 10.052 8.951 8.078 5.771 4.160 5.993 6.347 4.266 5.775 6.119 7.334 7.038 8.615 9.900 10.574 9.259 8.707 7.175 6.393 6.637 6.489 7.873 8.072 6.261 9.255 10.760 8.887 10.048 10.309 9.669 9.231 + 6.754 5.537 6.005 7.045 7.805 8.870 8.295 7.279 6.412 4.727 4.181 5.190 4.754 3.471 5.244 5.825 7.125 7.736 8.065 9.545 8.753 7.084 7.280 6.261 6.970 7.164 7.298 6.127 6.456 6.980 8.671 9.100 9.619 10.455 9.130 8.872 + 7.769 6.768 7.278 8.100 7.151 8.116 7.990 7.157 5.269 4.955 5.631 6.140 6.055 4.876 4.980 6.116 7.129 8.338 10.009 10.817 10.120 8.199 6.972 6.512 7.189 7.260 7.655 6.309 5.699 7.821 8.747 8.296 9.033 10.733 9.144 8.839 + 7.583 7.808 7.267 6.492 5.523 8.139 7.851 6.436 5.710 5.418 5.861 5.401 5.870 5.711 5.411 5.972 7.376 8.651 9.717 10.709 10.779 7.164 6.128 6.959 6.812 8.149 8.265 6.394 5.637 7.035 8.204 8.193 8.095 8.568 7.782 6.682 + 8.693 9.079 8.448 6.367 6.263 7.641 6.272 6.822 6.733 5.427 4.067 5.081 4.993 4.963 4.820 5.699 6.982 7.000 8.130 9.054 8.775 7.296 6.002 5.531 6.591 7.579 6.996 6.675 6.896 6.705 7.880 7.913 8.307 7.804 6.884 6.503 + 7.398 5.952 5.166 6.833 6.808 7.864 6.639 5.007 4.756 4.705 3.912 5.602 6.196 4.601 5.289 6.113 7.155 7.948 8.301 8.778 7.900 6.914 6.064 6.225 6.544 6.822 6.279 6.255 6.675 6.340 7.063 7.158 7.855 6.927 6.176 6.590 + 6.748 6.631 6.383 6.395 7.264 8.010 6.400 3.408 4.426 5.163 4.489 4.451 4.711 3.735 4.799 5.282 5.197 6.302 8.208 9.958 8.833 6.338 5.226 5.673 5.784 6.191 5.906 5.263 5.467 5.578 5.896 5.587 6.288 5.553 5.485 6.355 + 6.524 5.826 4.309 3.904 5.377 7.420 6.451 3.386 3.383 2.893 4.797 4.876 4.718 3.303 3.374 4.945 5.246 6.075 7.565 9.535 9.001 6.071 5.233 4.762 3.733 4.837 5.140 4.463 4.456 5.489 5.987 6.716 6.306 6.186 6.277 6.335 + 11.405 11.715 11.874 12.265 12.470 12.592 12.569 12.382 11.857 11.146 10.463 9.777 9.123 8.409 8.030 7.533 7.343 7.327 7.552 8.447 7.647 7.111 7.442 7.575 7.061 6.552 5.310 4.991 4.548 5.786 5.736 5.678 6.173 6.693 6.116 5.623 + 13.658 13.376 13.477 14.395 14.482 14.349 14.621 14.521 13.767 12.670 11.726 11.191 10.699 9.485 9.359 9.014 8.164 8.729 8.758 9.071 8.864 8.655 9.418 9.361 8.922 8.428 7.031 6.847 6.457 5.680 5.566 5.394 6.618 7.018 6.855 5.997 + 9.223 8.155 9.390 11.133 11.808 13.337 13.458 12.925 11.422 10.622 9.647 9.656 7.951 7.044 5.480 3.957 5.389 5.507 5.778 5.316 5.121 4.175 4.788 4.968 4.648 5.758 4.486 4.074 4.038 4.938 4.700 4.144 5.110 5.976 5.882 4.571 + 10.033 9.392 9.035 8.207 9.531 10.239 10.444 11.010 10.893 10.128 8.774 7.323 5.555 5.532 4.819 3.561 2.966 4.045 4.956 5.464 4.415 4.027 5.071 4.984 3.561 3.841 5.586 6.223 5.421 5.279 5.631 5.309 5.911 5.368 5.170 5.088 + 9.705 9.001 8.920 7.510 9.317 9.783 8.684 8.238 7.645 7.219 7.367 5.753 5.997 4.796 3.927 3.381 3.052 2.931 3.462 4.899 4.390 5.131 4.121 4.518 3.428 4.090 5.589 5.585 5.099 5.390 5.056 5.344 5.706 5.808 5.072 5.209 + 7.991 6.509 6.991 6.100 6.861 6.590 7.281 8.247 6.336 5.698 4.176 3.470 3.797 3.328 2.466 2.801 4.135 4.048 3.608 4.574 4.053 4.246 3.741 4.184 3.599 3.704 4.707 5.107 4.871 4.803 4.649 4.148 5.456 6.001 5.500 4.600 + 7.361 6.272 6.885 6.549 6.322 6.195 5.239 5.572 5.920 4.767 4.069 5.095 4.677 4.276 3.922 3.689 4.267 3.800 3.823 3.863 4.125 3.476 4.296 3.592 2.187 2.282 4.339 4.371 3.740 3.981 4.799 5.002 3.898 4.964 4.322 3.198 + 7.202 6.310 6.149 6.847 5.310 4.758 3.685 4.880 5.654 5.774 5.263 3.830 2.462 4.453 4.419 3.744 4.450 4.606 4.363 4.106 4.036 4.834 4.647 3.520 2.900 3.286 4.701 4.808 4.285 3.773 4.123 4.407 4.024 4.841 3.870 2.176 + 7.679 7.766 6.802 7.265 6.976 5.150 6.262 6.157 5.034 4.762 5.013 3.632 3.586 4.916 4.794 4.210 3.732 4.804 4.509 3.622 4.492 5.696 5.121 3.898 3.887 3.403 4.130 4.188 3.737 4.038 4.792 5.093 5.035 5.705 3.948 2.623 + 6.536 6.137 6.065 5.489 5.969 5.243 6.184 4.544 5.390 5.581 5.658 4.476 4.055 5.394 5.155 4.044 2.577 4.331 4.657 5.620 4.925 5.218 4.845 3.583 3.507 4.411 4.368 4.315 4.843 4.154 4.425 5.507 5.415 5.645 4.307 3.499 + 7.084 5.768 4.793 6.043 5.661 6.699 6.545 5.427 4.920 5.044 4.657 5.110 3.775 4.070 4.695 3.230 3.495 4.424 4.094 5.214 5.812 4.908 4.689 4.567 3.979 4.157 4.076 4.790 4.827 4.218 5.115 4.991 5.171 5.165 4.408 3.255 + 5.990 5.845 4.978 5.487 6.244 6.895 6.162 5.567 5.092 5.095 5.666 6.201 5.377 3.965 4.552 4.616 4.203 5.237 5.056 4.888 5.749 4.802 4.970 3.633 3.705 3.146 4.390 5.570 4.652 4.057 4.109 4.158 5.064 4.699 4.336 4.118 + 8.239 7.927 6.749 6.498 8.668 8.211 7.445 8.671 7.545 5.242 6.214 6.559 5.203 4.462 4.016 4.365 5.096 5.947 5.545 4.941 5.798 4.591 4.275 4.893 4.438 3.166 4.153 4.755 4.337 4.327 4.863 4.728 4.576 4.806 4.729 4.694 + 6.658 7.711 6.829 8.186 9.556 8.528 7.706 8.456 7.992 7.836 5.987 4.145 5.011 4.354 4.198 4.842 4.773 5.087 5.550 5.589 5.282 4.788 4.501 4.504 5.211 4.795 4.388 4.511 4.108 4.251 4.774 5.126 4.491 4.428 4.853 4.030 + 7.803 8.138 7.718 7.480 8.441 8.525 8.276 7.938 7.240 7.339 5.270 5.864 5.929 5.291 4.616 4.671 5.082 5.591 6.082 5.790 5.773 4.896 4.719 4.268 4.828 3.660 4.827 4.912 3.836 3.556 5.439 5.669 5.573 4.638 4.662 3.861 + 11.313 10.844 9.905 10.404 11.026 10.985 10.535 10.289 9.680 8.798 8.277 8.699 9.359 9.326 8.824 8.486 9.274 9.557 8.676 6.893 6.118 5.397 5.873 5.260 5.570 4.088 5.238 4.917 5.107 5.676 5.676 6.928 6.862 6.626 5.752 4.489 + 11.589 11.012 10.158 9.937 9.905 9.777 8.683 8.398 8.286 8.308 7.346 6.248 7.073 7.496 7.405 7.579 7.747 7.647 6.825 5.442 4.806 5.474 5.704 5.652 5.969 5.444 4.711 5.565 5.527 4.789 4.399 5.822 5.781 5.502 5.383 3.606 + 3.778 5.187 5.716 6.740 7.792 6.646 7.050 6.838 6.843 6.085 5.140 5.019 3.443 4.768 5.098 4.740 5.471 5.508 4.497 4.562 4.110 4.967 5.232 5.572 5.350 4.987 5.248 5.750 6.194 6.012 4.950 5.388 5.935 5.587 5.384 3.628 + 4.456 5.012 6.180 8.394 7.639 7.794 8.282 7.406 6.579 6.844 6.023 5.984 5.879 5.862 4.710 6.787 6.941 7.338 6.192 5.652 7.047 6.352 6.632 7.627 6.685 6.969 6.952 7.914 7.751 7.237 7.103 7.413 7.344 7.496 7.002 6.208 + 6.593 6.872 7.303 8.779 8.578 7.212 7.882 8.400 7.399 6.477 5.983 6.587 5.956 6.998 6.029 5.442 7.766 7.705 7.368 6.978 6.970 6.973 7.877 8.442 7.815 7.777 7.238 9.448 9.666 8.576 7.947 8.534 8.721 8.120 7.908 7.334 + 6.777 6.744 6.426 6.662 7.519 7.602 9.065 8.480 7.131 6.656 5.903 5.669 5.357 6.613 7.091 7.539 6.651 7.408 7.332 7.037 7.543 6.373 7.483 8.334 7.459 7.848 7.155 7.067 7.019 7.345 7.821 8.336 8.112 7.295 7.521 6.731 + 6.694 5.456 6.168 8.478 9.248 9.373 9.533 8.182 6.658 5.660 5.332 6.191 6.870 6.112 6.654 6.532 6.698 5.862 6.996 7.033 7.678 6.867 5.940 6.451 7.679 7.511 8.237 7.996 7.594 7.134 7.658 7.565 7.388 8.445 8.011 7.413 + 8.703 9.360 10.169 10.523 10.461 10.633 10.076 9.976 7.831 6.372 6.330 6.272 6.909 6.154 6.442 7.054 6.920 6.779 7.843 7.635 7.683 7.158 8.293 8.024 8.885 8.304 8.710 9.470 8.758 9.188 9.154 9.507 8.574 8.867 8.033 8.598 + 7.717 8.829 9.477 9.620 8.089 9.252 8.223 8.242 7.278 6.638 7.307 6.911 7.035 7.430 6.926 8.271 8.300 7.554 8.357 7.842 7.660 7.360 7.105 8.111 8.473 8.877 9.980 10.903 10.367 9.656 9.193 9.426 9.816 9.300 8.604 8.725 + 10.695 10.241 9.273 10.056 10.861 9.422 8.285 8.492 8.128 8.413 7.299 6.555 6.303 7.470 7.848 8.754 8.753 9.716 8.962 8.683 7.043 7.122 7.825 7.599 9.211 9.666 7.902 9.388 9.532 9.197 10.012 8.348 8.792 9.551 9.630 8.467 + 10.993 9.110 9.297 10.303 11.108 10.675 8.491 7.121 7.507 8.240 8.033 6.971 7.518 7.754 8.897 8.148 9.161 9.584 10.100 8.991 7.253 6.663 5.969 6.556 8.075 8.143 7.317 7.981 7.790 8.138 7.613 7.055 7.303 8.116 7.636 7.155 + 9.304 7.336 8.772 9.892 9.524 8.559 6.377 6.698 6.701 6.373 6.429 5.927 6.761 7.967 7.381 7.098 8.876 8.670 7.717 6.340 5.581 4.680 5.576 6.443 6.569 5.173 4.576 5.638 4.892 3.691 4.568 5.234 4.842 5.548 4.159 3.701 + 9.542 9.880 10.001 9.820 8.135 7.203 5.423 4.108 6.258 6.686 6.564 6.270 6.150 6.566 6.683 6.073 6.757 6.903 5.284 4.977 4.135 3.871 5.105 5.195 4.719 2.553 4.108 4.472 4.217 3.455 3.218 4.423 4.393 4.149 4.364 3.444 + 6.542 5.861 5.144 5.142 4.702 3.161 2.800 2.588 2.952 3.345 2.724 2.662 2.979 2.990 3.506 3.423 3.210 4.758 3.814 3.911 3.946 3.067 4.015 4.502 4.135 3.251 3.891 4.246 3.614 3.443 3.522 3.651 4.028 4.262 4.729 3.540 + 3.753 4.411 3.915 4.644 4.645 2.852 1.639 2.837 1.731 2.079 2.387 3.480 2.145 2.604 3.718 3.286 3.754 4.617 2.853 3.514 4.002 3.744 4.413 3.898 3.378 2.650 2.911 5.020 5.739 4.962 4.029 4.445 4.432 3.092 3.533 3.283 + 4.264 4.701 4.251 4.424 4.207 3.559 3.136 3.419 2.713 3.310 3.345 4.558 3.253 3.129 3.176 3.315 4.154 3.763 3.807 3.950 3.811 3.875 4.755 4.287 4.560 3.485 3.331 4.785 5.220 4.887 3.869 4.197 4.227 3.599 3.756 3.224 + 4.023 3.893 3.473 4.033 4.084 3.148 2.639 2.859 2.770 2.675 3.064 3.613 3.008 3.549 2.875 3.323 3.762 3.769 4.813 2.624 3.874 4.481 4.314 3.369 3.071 3.427 2.234 3.299 3.573 3.712 3.879 4.436 4.136 4.058 4.108 2.835 + 6.604 5.920 5.672 5.609 4.730 5.110 4.660 4.043 4.276 3.647 3.763 3.981 3.114 3.866 3.756 2.774 3.289 4.544 4.331 3.349 4.519 4.419 3.394 4.489 4.405 4.380 3.358 4.156 3.993 3.590 3.477 3.659 2.979 3.364 2.362 1.616 + 4.182 5.192 5.321 5.251 3.784 3.841 3.769 3.480 3.005 1.817 4.121 4.137 2.159 3.197 3.048 1.976 2.667 4.680 3.943 3.035 3.408 3.222 3.533 4.430 4.744 4.122 4.690 4.178 3.757 3.281 3.439 3.487 3.558 3.664 2.392 1.310 + 5.004 6.342 5.546 3.756 3.221 4.331 4.719 3.034 1.498 1.540 3.635 4.588 3.726 3.037 3.311 3.026 3.104 3.839 3.889 3.870 3.255 3.379 3.344 2.776 4.049 4.051 4.573 4.094 3.692 3.125 3.377 4.019 4.217 4.200 3.197 2.071 + 6.161 6.133 4.598 3.475 2.749 2.381 4.359 4.506 2.953 2.145 2.210 3.058 2.287 2.637 3.178 2.743 3.336 3.869 4.236 3.679 3.523 1.971 3.276 3.253 4.219 4.718 4.008 3.519 3.913 3.828 3.409 3.932 3.991 4.327 3.590 3.234 + 5.607 5.125 5.358 4.832 3.176 4.650 4.612 2.848 3.232 4.240 4.521 3.212 2.166 3.451 4.141 2.677 4.167 4.005 3.429 3.521 3.899 2.803 3.559 3.908 4.353 3.242 2.989 3.532 4.292 3.396 3.982 4.522 5.011 3.923 2.593 2.765 + 4.859 5.390 4.611 3.952 4.051 4.537 5.369 4.380 4.446 4.245 4.561 4.274 3.559 4.663 5.195 4.876 4.072 4.658 4.320 4.658 3.281 2.766 2.523 3.871 4.403 3.572 4.012 4.059 4.042 3.607 3.837 3.728 3.876 3.335 2.714 2.511 + 4.305 4.988 5.239 3.856 3.816 5.121 4.484 4.175 3.985 3.647 3.596 4.019 4.492 4.815 4.906 4.900 3.897 3.445 4.052 4.903 3.941 4.008 4.047 4.006 4.200 3.699 4.533 4.589 4.592 4.620 4.011 4.273 4.362 3.501 3.563 2.431 + 5.990 3.433 4.669 5.562 4.960 5.519 5.307 4.617 4.553 5.165 4.944 4.382 3.771 4.509 4.594 4.142 5.048 4.933 4.943 5.909 5.484 4.672 4.044 3.725 3.135 3.362 3.892 4.331 3.895 3.746 3.990 4.022 4.318 4.348 3.652 2.835 + 6.373 6.274 5.879 4.793 5.427 6.732 6.308 5.030 4.709 5.495 5.659 4.671 4.126 3.438 4.479 3.620 4.919 5.110 6.325 5.997 5.697 4.418 4.349 4.837 4.054 3.712 4.091 4.760 4.045 4.555 5.378 5.100 4.298 4.631 4.340 3.111 + 5.354 5.954 5.946 4.909 4.008 5.831 6.501 5.339 5.136 3.795 2.863 3.603 3.931 3.461 4.056 5.191 5.245 5.792 6.492 6.662 6.859 5.567 4.718 3.964 4.570 4.303 3.573 4.685 4.376 4.280 5.603 4.975 4.181 4.302 4.201 2.949 + 5.823 5.142 4.584 4.297 4.918 6.352 5.782 5.875 5.103 2.968 3.295 4.248 4.087 4.077 2.989 5.183 4.966 5.274 6.839 7.204 6.622 5.098 4.975 4.580 4.265 5.276 4.254 3.934 4.049 4.444 4.968 4.531 4.484 5.096 3.846 4.139 + 6.139 5.342 5.809 5.921 4.668 5.609 6.386 6.800 6.318 5.787 5.366 4.261 4.014 4.256 4.584 3.941 4.213 6.510 7.363 7.772 7.578 6.432 4.943 4.876 4.751 4.998 4.653 4.518 4.385 5.379 5.622 4.838 4.568 5.368 4.432 3.730 + 6.454 6.500 6.019 6.550 5.147 5.880 6.315 4.899 6.029 5.556 4.508 4.166 4.551 5.289 5.577 3.965 5.941 7.064 8.315 8.550 8.359 7.298 5.653 5.314 4.736 5.740 4.368 4.162 3.791 5.157 6.004 4.362 4.404 4.732 4.566 3.925 + 6.023 6.223 5.879 4.631 5.187 6.050 6.125 5.524 4.943 6.239 5.059 3.501 4.655 5.277 5.539 4.100 6.045 7.810 8.360 9.574 9.580 6.214 6.303 5.370 4.964 5.835 5.490 4.147 4.343 5.260 4.802 4.555 4.426 5.104 4.324 3.384 + 5.486 4.683 4.463 4.774 5.145 4.721 6.326 6.571 4.477 5.581 5.864 5.618 4.937 5.136 5.452 5.924 6.706 7.221 7.675 9.176 8.560 7.312 6.086 5.442 4.965 4.265 4.730 4.976 5.313 5.981 5.946 4.890 4.794 5.138 4.414 3.826 + 4.482 4.427 4.300 4.986 6.053 6.004 5.496 5.093 4.491 5.025 4.843 4.697 3.912 3.754 3.953 5.002 5.140 7.393 8.468 9.562 9.580 6.374 5.606 5.571 5.108 4.973 4.549 4.624 4.364 5.476 5.377 5.334 5.480 5.469 5.636 4.946 + 4.560 4.263 2.898 3.866 4.238 5.587 5.413 5.461 3.847 3.644 2.917 3.695 3.628 4.804 5.605 6.063 5.926 7.266 8.501 10.234 10.457 8.180 6.216 5.910 5.315 4.526 4.473 5.172 5.623 5.433 5.307 5.164 5.432 6.426 5.994 5.079 + 3.698 4.736 3.549 1.069 4.303 5.305 4.138 4.884 3.975 1.931 2.290 4.085 2.760 3.630 4.114 5.805 6.423 6.569 6.530 8.979 9.569 7.536 6.850 5.882 5.337 6.161 5.008 5.502 5.885 5.720 5.170 5.600 5.549 6.046 5.555 6.291 + 3.767 4.711 4.631 4.225 3.140 3.790 4.149 4.359 3.212 1.539 2.345 3.440 3.771 4.819 4.436 5.194 6.661 7.138 6.734 8.538 9.916 7.353 6.011 5.827 5.748 5.606 4.524 6.109 6.543 6.490 6.110 6.096 5.559 6.824 6.693 6.220 + 5.659 4.522 3.561 2.586 4.151 4.746 4.273 5.185 3.133 3.182 4.459 4.146 3.288 5.179 4.641 5.708 5.364 7.658 8.603 10.368 10.582 8.041 5.505 5.031 4.874 5.471 5.553 5.934 6.511 6.540 5.938 5.259 5.890 7.012 6.716 5.439 + 5.585 3.998 2.275 3.189 4.606 4.941 4.118 4.569 3.131 5.033 4.671 3.821 4.502 5.063 5.754 5.981 5.215 6.191 8.480 11.013 9.874 8.046 6.824 5.595 6.220 6.121 5.271 6.454 6.738 6.396 6.409 4.994 5.061 6.030 6.046 5.744 + 4.380 5.046 4.858 3.533 3.703 3.520 3.749 4.391 3.714 3.375 3.314 4.020 3.937 4.757 5.222 5.553 5.453 6.726 7.888 10.864 10.012 7.899 6.067 6.011 5.869 5.441 5.140 4.662 4.817 6.815 6.423 5.369 6.391 6.912 6.970 6.508 + 4.408 4.873 4.722 2.685 2.654 2.182 2.913 5.476 5.447 4.783 4.846 4.591 4.257 4.741 5.604 5.359 7.549 8.299 8.412 9.393 9.317 8.335 7.019 5.124 6.200 6.157 6.264 5.650 7.205 8.046 7.394 5.743 5.684 5.968 6.460 5.223 + 4.982 5.463 4.262 3.016 3.287 4.784 5.379 6.280 5.976 6.193 5.841 5.522 4.993 4.079 5.964 5.880 6.680 7.596 8.030 9.943 9.373 7.860 7.154 5.926 5.761 5.564 6.162 5.809 7.431 7.588 6.847 5.489 6.230 6.999 6.500 5.028 + 4.203 4.200 3.272 3.178 3.906 3.879 3.449 3.267 4.356 3.922 4.775 4.402 4.654 5.578 5.906 6.244 7.524 8.032 8.572 9.530 9.102 6.406 5.250 6.801 6.551 6.928 5.827 6.313 7.308 6.594 6.194 5.052 5.814 6.263 6.537 5.226 + 6.966 6.622 5.827 4.288 5.013 4.905 3.044 3.655 4.796 5.044 4.638 4.390 5.266 5.624 6.262 6.078 6.629 6.730 8.022 10.353 9.971 8.271 6.324 6.425 6.046 6.350 5.359 5.422 7.325 8.025 6.611 5.835 5.881 6.029 6.356 5.214 + 5.234 4.712 4.270 5.236 5.382 3.650 5.338 5.131 4.194 5.084 4.526 4.256 5.274 5.153 5.659 6.587 7.652 7.750 8.288 10.586 9.285 7.135 6.397 5.655 5.748 5.969 5.798 5.760 6.806 7.677 6.171 5.788 5.736 6.641 6.990 5.658 + 5.559 5.494 3.127 5.093 5.129 5.795 5.937 4.867 4.242 5.156 5.653 4.001 3.978 3.902 3.395 4.872 6.171 7.261 7.995 9.365 9.511 8.164 5.962 5.816 6.338 5.656 5.562 6.105 6.383 6.817 5.982 5.274 5.186 6.533 7.352 6.255 + 5.782 6.496 5.599 5.617 5.627 5.944 5.719 4.915 2.887 4.332 4.693 4.188 2.773 3.360 3.023 4.587 5.710 5.604 7.028 10.510 10.192 7.234 5.478 5.628 6.117 6.521 5.674 5.405 6.100 6.241 4.265 4.608 5.457 5.784 5.671 4.671 + 5.788 6.159 5.270 5.288 6.425 6.305 5.354 3.790 4.304 3.615 4.573 4.822 3.689 3.412 4.615 5.220 6.150 6.779 8.364 10.676 10.475 7.188 6.391 5.847 5.909 6.328 5.947 6.038 6.559 6.860 5.268 5.170 5.441 5.728 6.007 4.180 + 4.990 5.912 5.166 4.929 4.962 5.249 4.918 6.366 5.885 5.666 5.454 3.168 2.727 4.100 4.056 4.686 6.653 7.222 9.196 9.976 8.871 7.657 6.565 5.528 5.783 5.852 5.823 5.808 6.776 6.811 5.151 5.735 6.023 6.010 5.718 4.415 + 4.902 6.122 6.046 4.812 6.106 6.861 6.761 7.042 5.423 5.007 5.375 4.682 4.054 4.262 4.623 4.610 6.655 7.034 8.059 8.780 8.658 7.920 5.645 6.271 6.209 5.402 5.927 6.003 6.779 7.066 6.579 4.664 5.726 5.639 6.074 5.611 + 10.217 10.216 9.462 8.105 8.288 7.782 8.117 7.921 6.439 4.045 2.739 2.465 2.667 4.394 4.685 4.755 5.792 7.666 8.183 8.491 8.707 7.565 5.922 4.776 4.324 4.430 5.114 5.153 6.605 7.018 6.015 5.325 4.985 5.348 5.804 4.516 + 10.506 9.714 8.544 7.606 6.521 6.286 7.873 7.278 5.589 3.763 2.165 3.612 3.229 3.319 4.452 6.126 5.854 6.864 7.688 8.355 7.310 6.378 6.093 5.277 5.744 6.502 4.687 5.424 6.564 7.001 5.681 6.186 5.896 5.355 5.218 4.464 + 6.245 6.082 6.156 7.058 6.021 4.136 5.743 7.037 6.264 3.736 4.246 3.681 3.543 3.763 3.627 3.425 4.529 6.480 8.388 9.667 10.107 8.234 6.770 5.827 5.700 6.655 5.797 5.231 6.763 6.326 5.197 5.144 4.630 5.579 5.557 5.128 + 4.893 5.227 4.976 5.425 4.574 5.447 5.843 5.485 5.751 5.765 5.912 5.805 4.485 5.572 3.789 3.542 4.381 5.648 8.183 9.826 9.363 7.277 6.709 6.197 5.423 5.531 4.692 5.080 6.337 6.659 5.267 5.174 5.391 5.634 6.346 5.568 + 3.460 3.660 4.626 5.448 5.153 5.278 4.813 4.954 5.176 5.641 5.806 5.100 4.718 5.264 3.721 3.735 5.622 5.437 7.002 8.652 8.480 6.898 6.054 6.597 5.841 5.291 5.289 5.800 5.928 6.350 6.439 5.424 4.892 5.665 6.511 4.649 + 3.145 3.034 3.723 4.441 5.208 4.744 4.168 3.992 4.903 4.253 3.465 4.459 5.119 4.286 4.197 4.424 5.525 5.747 6.542 9.123 9.845 7.488 6.714 5.302 4.973 3.935 3.272 3.961 6.396 6.657 5.301 5.191 5.310 4.853 5.497 4.827 + 2.801 3.863 3.942 4.591 4.271 4.726 5.761 4.950 5.479 4.483 3.212 4.886 5.353 4.463 4.200 5.105 5.967 6.336 8.287 9.490 9.716 6.874 5.245 5.047 4.962 4.526 4.178 4.242 4.690 5.727 5.318 5.350 5.167 4.932 5.293 4.492 + 3.553 4.072 4.485 4.480 5.577 4.765 6.115 4.932 4.959 3.467 4.254 4.610 4.618 4.757 5.017 4.629 6.069 6.695 7.529 9.147 8.412 5.928 4.404 4.312 5.334 5.470 4.550 4.623 4.985 5.371 4.423 4.162 4.576 5.012 5.121 4.478 + 3.211 4.161 4.756 4.802 4.240 5.423 5.753 5.697 5.008 4.616 4.389 3.774 3.219 3.491 4.962 4.174 4.660 5.414 7.353 7.558 6.550 5.921 5.190 4.749 4.114 4.431 4.372 4.706 4.916 5.429 4.543 3.983 4.476 4.449 4.600 3.473 + 4.556 4.297 4.378 4.171 4.064 5.230 6.246 5.157 4.746 4.449 4.057 3.823 2.891 3.092 2.846 2.851 3.883 5.324 6.014 6.681 6.263 4.892 4.793 3.924 4.113 4.471 4.557 5.029 5.573 5.411 4.267 3.545 3.572 3.803 3.085 2.150 + 2.862 4.132 4.791 4.930 4.709 5.454 5.802 4.749 3.696 5.334 4.584 4.769 5.040 4.348 3.070 3.781 2.869 5.056 5.405 5.691 5.061 4.217 3.931 4.716 5.068 5.305 4.874 3.856 5.210 5.467 4.711 4.311 3.904 4.236 3.300 2.576 + 5.865 4.873 5.141 5.259 4.007 5.356 6.422 6.776 6.656 6.360 4.652 4.380 4.586 4.168 4.283 5.203 5.159 5.566 5.881 7.078 6.710 5.135 3.788 4.925 5.041 5.284 5.186 5.098 5.348 6.087 5.675 4.863 4.434 5.013 4.525 2.968 + 5.377 5.543 5.468 5.308 4.920 4.352 4.008 5.640 5.117 5.351 4.485 4.839 3.616 3.872 3.336 4.395 4.779 4.640 5.965 7.421 5.040 4.949 4.747 4.154 4.282 5.049 5.025 5.430 4.619 6.158 4.949 4.469 4.675 4.401 4.370 3.051 + 3.874 5.182 4.958 5.030 5.278 4.598 5.874 6.594 6.162 4.806 2.892 2.496 3.002 2.628 2.853 4.192 4.246 4.460 7.118 7.724 5.869 4.931 3.960 4.329 3.832 4.548 4.569 4.903 4.461 5.308 4.383 4.442 3.424 4.349 3.748 2.333 + 5.646 4.371 4.763 3.974 4.587 4.388 3.071 1.580 1.247 1.306 2.637 2.320 2.310 2.061 2.357 3.267 4.086 4.689 6.495 7.428 5.333 5.284 4.084 4.582 3.725 3.780 4.267 5.283 5.505 5.104 3.778 3.783 4.312 4.083 2.994 2.693 + 5.889 5.614 3.002 4.254 4.656 4.979 3.981 2.178 2.885 2.368 2.920 4.202 2.522 2.691 2.961 4.080 3.681 3.577 5.229 6.353 5.003 4.555 3.985 3.021 3.834 4.253 3.340 4.151 4.375 3.656 3.221 3.547 3.878 2.933 2.373 1.587 + 6.070 5.749 4.820 4.953 4.743 2.403 2.610 4.591 4.682 3.806 3.303 3.595 2.909 2.281 2.727 3.267 3.466 3.215 5.133 5.044 4.507 3.445 3.960 2.708 2.671 3.327 3.546 2.686 2.766 2.263 2.500 3.253 2.979 2.748 1.184 0.636 + 3.591 4.459 4.271 4.126 3.979 2.937 3.287 4.344 5.449 3.867 2.444 3.523 2.122 2.807 2.329 2.173 2.506 4.696 4.748 3.933 3.814 2.390 2.612 2.917 2.753 3.006 3.319 3.087 3.307 2.838 2.575 2.231 2.060 0.855 0.877 -0.005 + 4.140 5.686 5.875 5.331 4.666 4.531 5.783 6.524 6.036 4.021 2.623 2.260 1.812 2.495 1.354 1.912 3.341 5.439 5.153 5.220 4.126 3.161 3.379 4.345 3.789 2.380 2.467 2.892 3.251 2.269 1.471 3.003 3.185 1.622 1.585 1.171 + 4.574 3.239 2.326 3.195 4.785 5.011 5.204 4.138 3.210 2.609 2.709 2.497 2.768 1.561 1.169 2.027 4.310 4.895 4.620 5.000 3.942 3.837 3.682 3.325 3.210 2.732 2.169 3.128 3.753 2.395 3.427 3.744 3.624 2.768 2.672 1.983 + 5.448 5.658 5.431 6.130 6.357 4.997 4.781 4.962 4.154 3.506 3.185 4.131 3.780 1.879 3.107 3.386 4.089 4.294 3.647 3.441 3.183 3.186 4.395 4.776 3.996 3.566 4.201 4.462 4.585 4.819 5.219 5.190 4.879 4.897 4.713 3.722 + 3.740 3.306 2.296 4.500 4.969 5.308 6.293 5.224 4.799 4.708 3.465 4.531 4.046 1.371 3.961 3.690 3.214 3.972 4.658 4.847 4.806 4.340 3.970 3.753 5.014 5.222 5.963 5.831 6.579 5.267 6.351 7.146 6.424 5.660 6.681 6.602 + 5.132 4.452 4.679 4.865 4.828 6.117 6.492 5.103 4.614 4.275 2.636 2.970 3.761 3.940 3.894 3.513 3.768 3.274 3.512 3.795 4.579 3.976 5.268 4.414 5.104 5.251 6.322 6.013 6.262 6.964 6.981 6.666 5.906 5.479 5.905 5.182 + 7.425 6.051 5.791 5.917 5.301 5.673 6.622 5.633 5.382 5.241 4.416 3.662 6.119 6.185 5.435 4.883 5.379 5.198 5.736 6.400 7.065 6.424 5.432 5.221 5.839 6.377 7.463 6.942 6.431 7.271 7.608 8.634 7.109 7.756 7.496 5.860 + 9.123 7.983 8.113 7.677 7.538 7.389 7.135 7.620 7.642 7.616 7.512 6.944 6.474 7.517 7.137 7.123 7.731 6.617 6.381 7.553 6.761 6.819 6.547 5.851 6.744 7.225 6.845 7.268 7.209 7.800 8.045 9.056 8.138 8.568 7.921 7.103 + 6.710 6.995 6.548 7.734 7.272 6.545 8.028 7.799 5.793 5.016 5.736 6.417 5.988 5.941 5.830 5.656 6.231 5.794 5.738 6.501 6.025 5.311 5.241 5.406 6.964 7.213 6.270 6.044 6.146 5.897 7.240 8.776 7.949 7.414 7.600 6.315 + 5.519 6.603 5.859 6.146 7.306 6.446 5.440 6.484 5.754 3.285 2.580 3.417 3.339 3.653 3.529 2.750 2.801 4.397 4.757 4.950 4.367 5.829 5.334 4.890 5.879 5.998 6.140 7.494 6.758 7.281 7.206 7.509 7.395 6.741 6.688 5.515 + 5.350 5.940 5.426 5.534 6.106 5.134 5.049 3.614 4.083 4.015 3.761 2.302 3.236 2.574 3.677 2.698 1.352 3.578 4.556 4.604 4.514 4.463 4.613 4.542 4.623 5.146 4.977 6.027 5.956 6.619 6.896 6.948 6.718 6.933 6.812 5.863 + 5.366 3.754 4.055 5.827 6.762 6.234 6.638 6.068 5.174 4.999 4.582 4.591 3.899 3.766 3.238 3.545 3.745 5.245 5.124 4.206 4.436 5.580 4.968 4.640 5.479 5.670 5.927 6.025 6.187 5.699 6.542 7.210 7.225 7.489 6.765 5.514 + 4.227 4.994 4.568 5.457 5.802 5.970 7.150 6.478 6.313 5.065 4.687 4.978 4.338 3.846 3.794 4.665 4.306 4.807 4.515 4.690 4.861 4.955 5.175 5.560 4.926 5.222 5.857 6.592 5.944 5.712 6.003 6.040 7.234 7.241 6.591 5.432 + 6.306 7.218 7.565 6.583 6.142 7.097 6.249 5.799 5.152 5.715 5.535 6.016 4.050 5.309 4.762 3.421 3.823 3.965 3.452 4.088 4.875 4.003 4.619 4.182 3.536 4.974 5.809 6.935 6.355 6.605 6.972 7.621 8.938 9.048 8.137 5.755 + 6.421 6.725 6.276 5.023 7.241 7.013 3.757 4.795 5.762 6.133 5.059 5.709 6.487 5.606 5.759 4.850 5.915 4.622 5.259 5.725 5.780 5.456 6.860 6.517 6.556 6.436 6.444 6.937 6.081 6.587 7.150 7.888 8.278 8.722 8.040 7.004 + 7.540 6.537 5.999 7.044 7.687 7.917 7.778 6.248 8.273 8.262 6.921 7.246 7.027 7.337 7.651 7.119 7.554 6.814 7.166 6.764 6.384 6.143 7.174 7.638 7.872 7.734 7.155 7.178 7.600 7.220 6.807 7.027 7.141 7.435 8.570 8.175 + 5.730 4.106 4.323 4.587 8.235 9.213 7.407 8.814 9.752 9.468 8.438 8.252 7.178 7.258 7.411 6.523 7.763 7.186 5.583 5.203 4.869 5.441 4.446 5.249 6.638 6.526 5.792 5.629 5.611 6.341 5.390 5.851 5.783 5.593 5.338 4.714 + 5.177 5.389 6.087 6.868 8.805 9.677 6.829 10.307 11.240 8.976 8.592 8.956 6.689 6.863 6.721 8.518 8.239 9.877 8.646 6.252 5.357 5.139 3.764 4.502 6.563 7.118 5.388 5.000 5.495 6.584 6.055 5.209 5.380 5.881 5.127 4.077 + 5.834 2.747 5.669 7.604 9.527 10.875 8.905 11.059 12.109 10.006 8.126 8.270 7.081 7.283 5.723 9.306 9.739 10.712 9.784 7.436 6.832 6.405 6.340 6.967 8.784 9.373 7.520 6.192 6.155 6.404 6.630 5.735 6.018 5.442 5.543 4.354 + 5.294 4.629 4.552 5.481 10.311 11.882 10.113 10.353 12.143 10.715 7.158 6.871 6.161 8.563 8.672 9.369 10.802 9.296 8.826 8.257 8.753 8.827 7.984 8.405 10.367 9.251 8.264 7.464 7.190 8.155 8.151 5.996 6.441 6.495 6.648 5.924 + 4.544 5.291 6.565 5.965 10.738 12.093 9.837 8.410 10.618 9.486 7.068 7.618 6.409 8.144 8.199 9.229 9.853 9.429 9.026 8.565 7.603 8.027 7.934 8.723 9.602 9.506 8.283 6.962 5.560 7.145 8.100 7.208 6.054 7.144 5.947 5.003 + 6.006 6.733 6.106 6.962 10.540 11.666 9.644 8.173 9.276 7.085 6.806 6.753 5.525 6.112 5.718 7.999 8.545 10.268 9.963 7.637 7.044 7.205 5.993 8.434 8.654 9.304 6.889 6.185 4.808 6.147 7.722 7.219 7.277 8.115 6.935 4.934 + 6.116 6.565 6.660 5.798 9.254 10.262 8.293 8.249 9.359 7.125 6.456 6.880 5.020 5.137 4.328 5.943 6.824 8.986 7.788 7.332 6.847 6.873 6.933 7.471 7.901 7.573 5.580 5.352 4.611 5.220 6.184 6.315 6.380 6.860 6.085 4.241 + 6.226 7.012 6.515 4.719 7.960 8.180 5.783 5.645 8.140 7.275 5.613 6.436 4.241 4.479 4.858 5.042 5.656 7.199 6.441 6.190 5.865 6.189 4.472 5.735 6.528 5.940 4.412 4.271 4.266 5.219 5.702 5.695 5.393 5.524 5.368 4.677 + 6.635 6.374 3.984 3.257 5.272 5.657 4.489 4.995 7.573 6.321 3.695 3.844 3.274 4.183 3.878 5.005 5.540 6.768 6.873 4.109 4.942 5.203 4.010 5.201 6.163 5.098 4.286 2.955 3.276 5.012 4.817 3.892 4.291 5.293 4.799 3.243 + 5.899 6.538 4.397 4.849 6.650 6.381 3.628 5.733 7.942 6.651 4.692 4.525 3.218 4.036 4.511 4.266 5.294 5.693 5.681 4.338 3.755 4.762 5.311 5.063 5.987 4.796 3.384 3.896 3.551 3.840 4.277 4.007 3.993 4.712 3.665 3.255 + 4.716 6.006 5.564 4.566 6.362 6.977 4.941 6.738 7.798 6.274 4.957 4.325 4.009 4.174 4.015 4.258 5.131 5.079 5.238 3.748 4.225 4.924 5.135 5.939 5.292 5.628 4.491 4.506 4.343 3.938 4.981 3.838 4.220 4.415 3.999 3.768 + 4.874 5.388 5.495 5.232 4.450 6.920 6.034 5.704 5.606 4.457 4.346 4.966 4.782 4.730 4.104 3.763 4.376 6.203 5.791 3.816 4.084 5.387 4.831 5.147 6.097 6.520 5.549 4.370 3.450 3.659 5.105 4.523 4.358 5.369 4.407 3.957 + 0.453 3.992 4.860 4.865 6.576 6.713 5.958 5.803 6.913 5.378 4.292 5.685 4.168 3.456 3.666 3.514 4.294 6.308 5.781 4.828 4.863 5.300 5.011 6.824 6.757 7.932 7.546 6.493 4.483 3.978 4.429 5.030 4.489 4.698 4.802 3.415 + 4.651 5.227 4.539 3.558 5.199 4.066 3.893 4.575 6.571 5.481 4.111 4.039 4.112 4.383 3.954 4.075 5.039 5.124 4.748 4.706 3.879 3.888 5.397 6.864 6.533 7.321 7.548 6.539 4.987 5.633 5.500 4.433 4.169 5.634 5.589 4.215 + 3.738 4.272 4.823 3.536 4.992 6.919 7.667 7.098 5.845 4.606 4.009 4.311 4.137 4.646 4.558 3.828 3.434 4.031 4.534 5.016 5.277 5.340 6.418 6.947 7.194 7.673 6.820 5.565 4.853 5.829 5.118 4.732 5.268 6.185 6.260 5.390 + 4.859 5.925 6.292 5.036 6.215 9.144 10.061 7.751 6.198 6.451 4.911 3.987 4.782 4.616 4.422 3.783 3.954 5.040 5.024 5.892 4.845 5.446 7.892 8.542 8.405 8.289 9.053 8.082 6.694 5.621 5.379 5.771 5.539 6.817 6.261 4.848 + 3.582 5.296 6.514 5.716 8.010 10.714 10.514 7.175 7.168 8.006 5.754 5.183 5.923 5.159 4.687 3.941 3.804 4.833 5.856 6.096 6.239 6.199 7.316 9.604 9.414 9.242 9.415 8.922 7.254 6.406 6.869 7.275 7.033 8.012 7.163 5.506 + 2.589 3.734 4.252 1.647 9.764 11.644 9.824 6.399 7.431 7.827 4.561 5.547 5.476 5.230 6.076 4.048 5.452 5.158 6.423 6.775 7.312 8.423 9.464 9.996 9.495 10.026 10.943 10.530 8.221 7.757 7.464 8.079 7.723 8.318 7.599 5.641 + 4.292 5.374 4.505 4.176 10.638 12.559 10.956 5.311 6.900 6.946 5.374 5.183 4.716 6.323 6.715 4.128 5.095 5.897 6.133 6.962 7.352 9.539 10.456 10.876 10.783 9.683 11.661 11.128 8.594 7.542 7.683 8.211 7.332 9.254 7.545 5.826 + 5.610 6.944 5.652 4.325 11.440 13.009 11.037 4.534 5.573 5.085 4.614 5.165 3.696 5.690 6.337 4.734 5.576 5.862 6.061 7.574 7.412 9.315 11.323 11.266 10.723 10.746 11.732 11.189 8.931 7.165 8.107 7.976 7.208 10.096 8.082 5.518 + 4.724 6.511 5.686 4.586 11.825 13.183 10.842 4.438 6.283 5.872 4.791 4.389 2.893 6.229 6.395 5.938 6.798 7.384 7.096 7.268 7.133 8.995 11.318 10.799 10.096 11.768 11.322 10.948 8.921 7.019 8.077 8.896 8.343 10.266 8.791 5.699 + 4.784 6.086 4.895 6.342 12.049 13.144 10.560 4.527 6.485 6.140 4.351 4.593 3.933 5.579 5.720 5.124 5.781 6.170 6.193 6.611 6.991 8.509 9.780 9.593 9.722 10.990 11.136 10.726 8.830 8.240 7.416 8.532 8.839 10.104 7.752 5.070 + 5.753 6.060 5.215 5.665 11.512 12.709 10.367 5.715 6.734 6.723 5.091 5.163 3.654 5.276 5.282 4.168 4.442 4.391 5.035 5.357 5.827 8.705 10.339 9.195 9.006 9.462 10.509 10.296 7.982 7.049 5.837 7.223 7.776 8.225 8.118 5.029 + 9.727 9.617 9.575 9.143 11.062 12.171 9.725 5.625 6.715 6.482 4.582 5.036 4.121 4.824 4.645 3.520 3.738 4.619 5.096 4.249 5.555 7.901 8.672 8.068 8.586 7.863 9.115 8.554 6.945 4.910 5.750 6.175 7.511 6.946 7.102 5.047 + 12.202 10.694 10.920 11.396 10.250 10.770 9.530 7.724 6.797 6.028 4.517 4.626 3.955 3.781 4.198 3.791 3.515 5.406 4.751 4.340 5.653 6.868 5.394 6.369 6.714 6.475 7.321 6.568 4.979 4.829 5.012 5.502 6.887 6.577 6.363 3.808 + 10.504 9.996 8.930 8.672 8.871 9.397 7.130 4.392 4.522 3.835 4.077 3.554 2.344 3.617 3.792 3.251 2.403 3.574 3.674 3.971 5.023 6.770 6.825 6.752 5.935 6.849 6.471 6.110 5.101 5.236 5.647 5.733 6.755 6.654 5.549 4.226 + 6.414 7.175 8.409 8.077 7.994 8.534 6.400 3.765 4.232 3.779 4.875 4.969 4.478 4.294 3.426 3.608 2.230 2.946 3.544 5.215 5.639 5.647 6.957 6.505 5.743 6.011 7.003 6.614 4.553 5.046 5.295 5.602 6.046 6.563 5.609 4.022 + 8.016 8.164 7.977 7.032 7.007 7.332 5.677 4.150 4.523 5.487 5.739 4.851 5.193 5.351 3.938 3.446 3.747 4.483 3.868 4.115 4.065 5.319 7.424 5.960 5.478 5.006 7.310 6.880 4.654 3.611 4.640 4.899 5.292 5.795 4.497 4.299 + 6.859 7.495 8.405 7.976 8.379 7.548 7.286 7.207 6.820 6.164 5.692 5.616 5.798 6.076 4.994 4.779 5.887 5.070 4.399 4.872 5.373 5.205 6.800 5.790 6.108 6.761 7.158 6.445 5.992 6.023 6.608 5.712 6.209 6.056 5.924 5.952 + 12.483 13.060 13.590 13.646 13.235 12.258 11.452 11.541 11.235 10.255 9.431 9.803 9.576 8.812 8.162 7.700 7.534 7.246 6.799 6.035 6.469 6.620 6.797 6.722 6.964 6.546 6.482 5.778 6.221 6.617 7.017 6.885 6.980 6.597 6.486 5.683 + 11.805 11.320 11.869 12.265 11.301 9.542 8.375 9.216 9.102 8.004 6.486 8.507 8.239 6.396 6.085 5.991 5.942 4.955 4.606 5.454 5.747 5.892 6.595 5.749 5.709 5.334 7.201 6.285 5.933 6.031 5.707 5.836 6.241 6.584 6.191 5.255 + 6.452 7.914 8.427 8.455 8.380 7.967 8.626 8.959 8.892 7.864 8.847 8.319 6.794 5.933 6.421 5.333 4.375 4.936 4.691 4.880 4.868 4.962 4.618 5.872 6.114 5.189 7.688 7.168 5.666 6.236 6.408 6.249 7.126 7.538 6.685 6.040 + 7.440 5.924 7.278 6.342 6.536 5.888 6.059 6.792 6.669 5.844 7.285 7.149 6.944 5.396 5.150 6.411 6.537 6.048 6.496 5.786 6.025 6.170 5.977 6.688 6.558 5.266 8.073 7.405 6.295 6.754 6.594 7.301 7.584 7.522 7.101 6.478 + 8.266 8.751 7.452 7.664 8.307 9.445 8.248 7.231 7.042 5.370 5.092 6.691 6.130 4.946 6.203 5.233 6.400 7.228 7.564 6.946 6.722 6.965 6.352 5.652 6.204 6.034 8.947 8.315 5.073 5.179 5.146 6.402 6.506 6.569 5.455 4.340 + 8.108 8.809 8.920 8.670 10.828 11.858 10.130 7.316 6.793 6.618 7.310 6.766 6.488 5.820 5.108 6.095 6.310 8.005 7.588 7.797 6.629 6.744 6.225 6.320 7.124 7.595 9.481 8.594 5.660 4.980 5.363 6.895 6.232 6.572 5.023 4.534 + 9.633 9.570 9.246 9.069 10.754 12.423 10.688 8.365 8.605 6.980 6.662 7.955 7.404 6.644 6.810 8.162 7.437 10.280 9.725 7.672 6.540 6.646 6.592 5.790 6.189 8.139 7.883 6.925 6.064 6.509 6.098 6.942 6.831 7.034 4.740 4.352 + 8.931 8.954 8.650 9.533 11.700 12.248 9.687 7.571 8.043 7.422 7.997 8.977 7.310 7.003 7.672 7.104 7.666 10.825 9.658 6.339 6.001 6.059 6.628 6.380 6.027 6.663 7.476 7.915 7.066 5.797 6.260 7.150 7.645 7.665 5.607 5.233 + 9.269 10.366 10.633 9.892 11.391 11.700 9.375 8.485 7.733 8.146 7.233 8.749 7.483 7.474 7.893 8.345 7.341 10.048 8.688 7.061 6.031 5.639 5.344 5.753 5.696 5.927 7.355 6.730 6.692 4.944 4.632 6.535 6.918 5.973 5.585 4.835 + 7.840 8.302 7.940 9.231 9.120 9.149 8.020 8.471 7.519 6.259 6.531 7.130 6.897 5.443 6.025 6.394 6.337 8.297 8.212 7.664 5.924 6.054 5.453 5.475 5.264 5.386 6.714 5.706 4.754 5.012 3.376 4.212 4.811 5.046 4.067 3.136 + 7.215 8.251 7.731 7.961 7.613 7.803 8.103 6.639 6.721 6.125 4.672 5.946 5.440 5.103 5.153 6.115 5.706 6.420 6.274 6.316 5.187 4.958 5.440 6.026 4.955 5.481 6.468 4.762 4.605 5.047 4.697 4.535 5.343 5.277 4.274 2.712 + 5.886 8.582 9.339 8.224 7.319 8.049 7.177 5.987 6.936 5.912 6.225 6.443 5.002 5.437 6.603 6.411 5.176 5.272 5.721 5.436 4.252 3.774 4.917 5.185 5.417 4.432 4.669 4.401 3.939 3.988 4.137 4.429 3.926 4.087 3.578 3.171 + 8.739 9.623 8.639 7.831 7.117 8.180 6.593 5.363 5.796 6.664 7.692 6.847 6.286 6.864 6.487 6.401 5.490 6.463 5.761 5.558 4.869 4.379 5.615 4.540 5.354 5.178 4.506 4.179 3.989 3.977 3.293 3.566 3.761 3.666 3.671 2.591 + 7.772 10.695 10.703 9.545 9.772 9.167 7.095 6.513 6.383 7.428 7.352 5.469 5.580 4.410 3.465 4.883 5.088 4.773 5.614 5.510 5.905 4.096 3.784 5.249 5.212 4.105 4.892 4.422 4.484 3.063 2.837 3.592 3.730 4.212 3.904 3.068 + 10.503 11.258 11.184 10.472 9.000 8.318 8.585 6.788 6.648 7.132 7.358 5.186 5.828 5.297 4.037 3.499 4.345 4.781 4.516 4.476 4.483 4.492 4.585 5.540 5.038 3.887 4.450 4.037 3.999 3.234 2.004 2.833 3.474 3.857 3.650 2.397 + 8.267 7.209 7.261 7.316 7.588 8.905 8.733 7.015 6.464 5.673 6.145 5.386 4.888 4.929 5.897 5.118 5.637 5.655 5.119 6.351 7.246 5.352 5.243 5.530 5.444 5.438 6.405 5.637 4.494 3.932 3.782 3.165 4.005 4.028 3.137 2.469 + 8.986 7.888 7.778 7.427 9.363 11.545 11.466 8.318 7.121 6.938 7.368 6.726 6.636 7.732 7.065 5.992 6.477 6.551 6.857 7.325 8.955 8.157 6.518 6.633 6.790 8.009 9.217 8.452 5.919 5.499 5.445 5.906 6.114 4.750 4.569 3.307 + 6.853 7.625 7.861 4.964 6.881 11.915 12.931 10.230 7.754 9.521 8.841 6.385 8.238 7.175 5.400 5.222 6.429 7.937 7.012 9.208 9.509 9.200 8.152 8.118 8.429 9.481 11.332 11.185 7.132 6.630 7.062 7.660 8.676 6.693 6.180 2.951 + 6.085 6.774 8.066 7.702 7.577 12.214 13.589 11.347 6.582 9.074 8.205 4.777 8.117 8.312 5.799 6.334 5.455 9.366 8.476 10.311 9.978 11.074 9.396 9.402 8.526 10.351 11.136 11.082 8.245 6.432 6.910 7.932 8.863 8.192 7.074 4.260 + 6.495 7.240 6.661 7.407 7.987 12.310 13.983 12.017 6.170 8.398 8.360 4.812 7.545 8.108 5.544 5.617 5.025 9.597 9.101 11.184 11.360 11.985 10.382 9.595 8.686 9.429 11.007 10.230 8.830 7.550 7.244 8.683 8.918 8.492 7.862 4.554 + 5.395 6.630 7.153 7.611 9.016 11.852 13.887 12.514 6.307 7.945 8.398 5.133 7.428 7.620 6.121 6.514 6.711 7.709 8.332 10.932 12.177 10.262 9.218 9.571 8.796 10.541 12.068 11.571 9.480 8.480 7.117 8.480 9.000 9.373 7.955 5.438 + 6.480 6.920 6.578 7.270 7.780 10.846 13.080 12.346 8.671 7.728 9.189 7.586 7.248 7.585 5.799 6.073 7.346 6.561 8.645 9.871 11.181 9.994 8.393 9.295 9.068 9.650 11.760 11.618 8.572 8.333 7.747 8.552 8.878 9.131 8.160 5.847 + 6.213 6.217 7.967 7.948 6.181 10.050 11.751 11.643 9.638 7.803 9.316 7.412 6.471 7.651 7.942 6.330 6.564 6.752 8.155 9.492 10.614 10.190 8.342 8.750 7.783 8.690 10.294 9.774 7.716 7.379 7.444 7.902 8.746 9.213 8.638 6.349 + 5.977 7.704 8.304 7.005 5.681 9.692 11.934 11.738 8.494 5.916 7.854 6.476 5.764 6.302 5.685 4.546 5.598 6.314 8.233 9.461 8.650 8.821 7.790 8.532 6.748 7.773 8.586 8.759 7.629 6.908 6.625 7.414 8.494 9.030 8.322 6.109 + 8.062 8.072 7.984 8.734 8.513 9.564 11.039 11.140 9.491 8.056 7.730 8.016 8.110 8.176 7.882 7.113 7.012 6.856 7.231 8.322 8.245 8.248 6.353 7.138 6.697 6.922 7.725 8.574 7.478 5.577 6.254 6.726 8.103 7.132 6.802 5.645 + 7.304 7.701 8.081 9.413 9.145 9.930 11.153 10.468 7.742 6.520 7.418 7.113 7.124 6.904 6.113 6.132 5.778 6.227 7.067 7.913 7.916 6.780 5.259 5.737 5.656 5.936 7.675 6.703 6.281 5.121 5.542 6.097 7.258 6.677 6.188 5.186 + 8.557 8.530 9.082 9.428 8.828 8.390 8.498 7.017 6.449 6.563 7.170 7.518 6.804 6.052 5.277 5.664 5.183 4.879 6.230 6.658 6.900 6.302 5.325 6.416 5.930 5.244 6.556 6.748 5.090 5.187 6.237 5.934 7.520 7.202 6.312 5.184 + 8.298 7.878 8.764 9.450 8.746 8.747 10.003 8.214 6.917 6.071 5.930 5.784 4.567 4.222 4.884 3.581 3.978 4.760 5.299 5.653 6.500 6.188 6.259 6.453 5.999 5.874 6.268 6.614 5.830 5.554 5.574 5.782 5.851 5.767 6.075 4.818 + 6.516 7.976 7.145 6.776 8.180 8.542 9.105 8.747 6.385 5.250 4.803 5.508 4.467 5.446 4.283 2.829 3.206 5.651 6.385 6.410 6.669 6.709 4.971 4.292 4.737 6.207 7.324 6.477 5.643 5.440 5.742 6.013 6.707 6.144 6.379 5.444 + 9.419 9.437 8.931 7.782 7.291 8.396 8.424 7.569 6.308 6.429 6.218 5.635 5.373 5.363 4.786 3.290 4.066 4.752 5.214 7.017 6.350 6.488 5.176 4.911 5.515 6.182 6.865 7.005 6.176 5.864 6.866 6.897 7.320 6.526 6.631 6.752 + 10.534 11.349 11.408 9.883 9.523 8.822 9.249 7.545 7.452 7.744 7.096 8.598 8.355 8.204 8.243 7.596 8.051 7.890 8.047 8.843 8.470 7.792 7.552 7.891 6.854 7.417 7.900 7.463 5.423 5.207 6.483 6.594 7.141 6.874 7.139 6.705 + 11.777 11.817 11.421 10.896 10.523 8.848 9.342 8.195 7.839 9.201 9.684 9.906 9.705 9.938 9.012 8.140 8.581 8.758 8.945 9.593 9.380 8.048 7.888 7.914 7.432 7.855 8.741 8.010 6.051 5.633 5.778 7.054 7.575 7.540 7.857 7.299 + 9.595 9.240 9.689 9.523 9.270 8.483 9.942 9.692 8.443 7.123 7.089 7.387 7.971 7.118 5.082 5.023 4.282 4.827 5.519 5.287 5.467 5.358 6.384 6.939 6.970 5.909 5.271 5.772 6.173 6.094 6.653 7.619 7.447 7.784 7.930 6.797 + 9.929 10.023 10.179 9.624 9.175 8.022 8.431 7.606 7.376 7.659 7.493 8.189 7.340 5.999 5.414 5.255 4.114 4.363 4.427 4.839 5.467 6.107 6.105 6.241 6.221 5.843 6.320 6.783 6.672 5.438 6.847 7.381 7.932 8.663 8.808 7.284 + 7.533 8.157 8.272 8.584 6.718 6.880 7.934 8.168 6.174 5.203 5.799 5.634 5.459 5.933 4.624 4.433 4.893 4.624 6.413 6.688 5.361 5.816 5.638 6.423 6.508 6.646 7.649 5.926 5.727 6.153 7.056 7.577 8.100 7.686 7.996 6.967 + 7.513 7.671 7.456 7.862 7.209 6.037 6.960 6.943 5.889 6.161 6.344 5.521 5.001 6.318 5.379 5.070 4.585 5.308 5.443 6.068 4.438 5.781 5.867 5.100 4.995 5.017 6.238 6.179 6.218 6.899 7.522 7.843 7.844 7.469 8.602 8.465 + 7.006 6.883 7.687 8.341 8.546 7.890 6.547 5.723 5.851 6.287 4.325 5.620 5.355 5.520 4.900 6.214 5.653 6.136 5.851 7.011 5.057 5.409 6.534 5.976 5.801 5.987 6.564 5.707 5.762 6.225 7.157 7.538 7.784 7.541 8.698 9.707 + 6.220 6.253 7.281 7.263 6.826 6.836 5.726 5.911 6.782 6.127 5.862 4.770 4.907 3.488 4.343 4.331 4.279 5.935 6.298 6.971 7.362 7.060 6.593 6.074 6.334 6.337 6.285 5.973 6.142 6.289 6.841 7.392 7.828 7.429 7.459 8.030 + 10.463 10.856 11.480 9.862 10.632 10.023 10.254 9.578 10.388 9.423 9.953 9.041 8.944 6.610 7.129 7.346 8.204 9.737 9.214 10.249 11.565 11.827 11.461 9.366 9.756 9.854 10.705 10.830 8.970 7.918 7.122 7.500 7.168 9.238 10.421 9.503 + 12.385 13.382 12.595 11.582 11.592 11.276 10.527 9.633 11.205 11.473 11.228 11.408 10.987 8.620 9.021 9.566 9.842 10.926 10.584 11.171 11.790 11.304 11.223 10.213 9.647 9.779 10.235 10.529 9.551 6.980 6.769 6.926 7.605 8.896 9.858 9.699 + 13.285 14.140 12.515 12.171 12.776 12.504 10.514 9.719 10.623 12.489 12.597 11.946 11.286 9.160 9.170 10.055 10.026 10.848 10.392 10.830 11.836 11.892 11.018 9.130 7.567 6.866 6.905 6.146 6.293 5.897 5.508 6.113 7.226 8.337 8.768 6.066 + 13.802 14.476 12.983 12.764 13.210 12.497 11.198 9.585 11.179 13.261 12.958 12.222 11.729 9.041 9.151 10.072 10.332 10.929 10.895 11.966 12.922 12.608 11.061 9.065 7.400 5.690 6.323 6.614 7.173 7.465 6.398 7.832 8.398 8.844 7.718 6.283 + 14.182 14.720 13.203 13.792 13.284 13.714 13.695 13.194 13.536 13.608 13.383 13.044 12.419 11.586 10.548 11.167 12.031 11.628 11.526 12.954 13.735 12.685 11.079 9.692 9.239 9.039 8.410 8.299 9.036 8.970 8.870 9.156 8.918 8.361 8.696 8.000 + 15.069 15.527 14.281 14.535 15.941 16.193 16.579 15.534 15.404 16.266 15.406 14.787 13.626 13.686 13.057 13.160 13.553 13.120 12.781 14.530 14.329 12.766 10.877 9.730 9.634 9.317 8.773 8.590 9.276 9.221 9.235 9.622 9.055 8.874 9.524 8.672 + 14.878 15.532 13.901 14.024 16.570 17.769 18.859 17.658 16.191 16.981 17.584 17.678 16.605 15.031 13.332 13.185 12.930 13.084 14.173 15.188 12.819 11.065 9.493 9.082 8.510 7.294 6.475 7.191 8.170 7.563 7.115 8.673 8.155 6.579 6.418 5.695 + 15.707 16.215 15.530 16.059 16.849 18.116 19.745 18.598 16.834 17.680 18.169 18.639 18.130 15.788 13.519 13.830 13.787 14.634 15.726 15.652 13.277 11.411 9.855 8.463 7.343 6.901 6.629 7.315 8.610 9.555 9.588 10.722 9.846 7.075 6.174 5.656 + 16.094 16.343 15.788 16.106 16.560 18.568 19.794 18.347 17.863 18.300 18.177 18.682 18.496 16.170 14.026 14.384 14.447 15.785 15.932 14.272 12.249 10.641 8.759 7.879 7.262 6.249 6.099 6.288 8.143 9.849 9.317 9.887 8.880 6.172 5.812 5.184 + 16.168 16.368 16.019 16.120 16.437 18.615 19.447 18.351 18.242 18.200 17.357 18.526 18.318 17.083 15.132 15.031 15.373 16.665 15.771 13.804 11.587 9.776 8.460 8.149 7.712 6.819 6.846 7.122 8.765 10.717 10.767 10.491 8.175 6.889 6.634 6.384 + 16.274 16.387 16.193 16.210 16.656 18.768 19.354 18.514 18.339 18.025 16.917 17.974 18.898 18.226 15.805 15.761 16.055 17.254 15.684 14.257 12.436 11.012 9.618 8.743 8.565 7.817 7.858 7.783 8.502 10.334 10.615 11.405 9.935 7.533 7.408 7.062 + 16.160 16.350 16.302 16.217 16.769 18.913 19.346 18.605 18.341 17.875 16.859 16.424 19.092 18.899 16.934 16.636 16.706 17.982 16.525 14.751 12.804 11.221 9.986 8.848 8.557 6.547 6.635 6.700 7.515 9.094 9.432 10.979 9.670 6.280 5.938 4.854 + 16.076 16.223 16.264 16.139 16.672 18.920 19.203 18.183 17.892 17.537 16.526 15.112 18.143 17.959 18.068 16.627 16.311 17.742 16.737 14.715 12.836 11.156 9.877 8.789 8.510 7.767 7.498 7.327 7.861 8.957 9.029 10.975 10.553 7.458 7.132 6.223 + 15.902 16.085 16.111 16.096 16.874 18.774 18.701 17.436 17.173 16.880 15.630 14.803 16.576 17.112 18.099 18.045 16.781 17.836 17.286 15.424 13.175 11.762 10.161 8.958 8.640 8.117 8.325 8.064 8.475 9.769 9.661 10.020 9.671 8.423 7.218 6.873 + 15.756 15.831 15.632 15.903 16.654 17.792 17.411 15.155 15.280 15.053 13.497 13.161 14.505 14.546 17.753 17.628 17.361 17.766 17.838 15.702 12.855 11.357 9.294 8.773 7.838 7.937 9.172 9.017 8.598 10.790 9.512 8.264 8.560 7.549 5.999 5.307 + 14.900 14.802 13.735 15.384 16.354 15.719 14.822 13.581 13.296 12.833 11.569 12.446 12.193 13.415 15.206 16.688 17.048 17.104 17.659 16.467 12.780 11.147 8.971 7.824 7.301 7.999 8.933 8.859 8.967 11.255 9.269 8.413 8.179 7.979 8.417 6.533 + 13.302 12.726 13.044 13.651 14.198 12.186 12.550 12.597 11.906 11.736 10.658 10.374 10.755 11.115 12.076 13.547 16.231 16.235 16.319 15.466 12.030 9.912 8.349 8.001 6.938 7.600 8.532 8.637 8.786 10.713 8.316 7.828 7.959 8.592 7.815 5.439 + 12.065 11.772 12.233 11.839 11.908 10.603 9.727 9.644 8.970 8.564 9.169 9.061 8.822 8.483 9.054 10.242 12.790 14.525 14.892 15.130 13.306 9.495 7.350 7.643 7.077 7.963 8.387 7.830 8.010 9.325 7.522 6.782 7.320 8.556 6.579 4.937 + 12.017 11.829 12.329 11.817 11.796 11.602 11.143 10.245 8.878 8.801 8.282 8.390 7.786 8.175 7.510 9.757 11.020 11.946 15.001 16.119 13.953 10.012 7.880 8.004 7.166 7.287 7.566 6.883 8.660 9.432 7.757 7.326 7.777 8.366 6.242 4.912 + 12.824 12.161 12.942 12.947 13.845 12.709 11.678 11.246 10.107 9.556 9.479 10.385 11.284 10.999 10.422 11.397 11.301 13.059 15.485 16.816 16.323 14.830 12.073 11.300 9.559 9.311 9.602 9.890 11.981 12.717 11.469 11.077 11.221 10.393 9.222 8.280 + 14.256 14.204 14.232 15.170 16.382 16.182 14.715 13.754 13.191 12.758 10.116 12.037 12.386 12.110 11.424 12.627 13.670 15.060 17.169 18.245 18.041 17.494 13.644 11.956 10.281 10.237 10.708 11.492 13.917 14.902 13.298 13.489 13.781 12.549 9.546 8.673 + 14.690 14.761 14.154 13.622 15.624 16.409 16.861 16.292 14.928 14.489 12.403 12.950 12.641 12.339 12.757 12.895 14.365 15.686 17.861 18.304 17.855 17.239 15.248 11.806 10.815 11.101 12.080 11.908 13.817 14.670 12.831 12.775 13.485 12.666 8.824 7.770 + 14.913 15.001 14.278 14.129 14.702 16.486 17.256 15.576 15.242 14.857 13.244 12.439 12.847 12.377 12.942 13.133 14.543 16.452 18.181 17.931 17.234 16.066 13.376 10.650 9.590 10.702 11.541 10.151 11.783 12.934 11.307 10.787 11.812 11.173 7.753 6.031 + 13.603 13.149 11.835 11.740 12.723 14.362 14.768 14.587 13.092 12.611 12.001 11.857 9.529 9.541 10.771 11.132 12.363 14.471 15.535 14.781 13.914 12.673 10.215 9.509 11.135 11.788 9.821 8.090 8.566 9.929 9.771 8.372 8.435 9.419 7.488 5.080 + 13.312 13.076 12.211 11.909 12.364 13.262 13.444 11.838 11.651 11.005 11.022 11.693 10.048 9.024 9.999 11.121 13.323 15.067 13.460 11.198 9.657 8.562 9.808 10.274 11.225 12.593 11.414 8.067 6.040 6.742 7.466 7.676 8.871 8.538 7.408 5.934 + 13.394 12.919 12.351 11.837 12.042 13.597 13.385 11.625 11.889 10.756 11.660 12.135 9.882 9.344 10.590 12.755 13.730 15.207 12.925 9.865 8.704 8.943 9.895 10.104 10.775 12.153 11.556 8.127 6.364 6.239 7.169 7.318 8.971 9.523 7.773 5.792 + 13.480 12.863 12.481 11.597 11.553 13.609 12.978 12.460 12.237 11.163 12.182 12.410 10.367 10.939 11.501 13.089 13.317 13.935 11.486 9.965 9.981 9.684 10.060 10.215 10.730 11.998 12.262 7.734 6.219 6.143 6.111 6.374 8.638 9.279 7.405 6.027 + 13.535 12.827 12.555 11.346 11.557 13.783 13.323 12.711 12.499 10.884 12.477 12.389 11.423 11.933 11.858 12.219 12.559 12.092 10.166 10.447 10.144 10.128 10.709 10.767 11.042 12.439 12.358 8.439 6.829 6.860 5.925 7.278 9.143 8.663 6.368 5.656 + 13.623 13.015 12.869 12.028 11.870 13.871 13.651 12.938 13.280 13.033 12.439 12.564 13.055 13.368 12.873 12.721 12.557 12.522 11.893 11.374 10.589 10.508 10.915 11.026 11.164 12.705 12.512 9.111 8.025 7.163 8.150 8.998 11.193 10.124 8.795 8.041 + 14.030 13.651 12.919 12.301 12.017 14.526 14.409 13.364 14.136 13.466 13.143 13.448 14.194 14.049 13.490 13.111 13.211 13.672 13.709 12.475 11.716 10.618 10.675 10.790 10.787 11.924 11.434 8.749 8.272 6.268 8.670 9.486 9.511 9.036 8.084 7.174 + 14.113 13.686 13.454 12.418 12.699 14.310 14.099 14.044 14.437 13.722 13.586 14.364 13.374 12.589 12.754 12.339 12.651 12.445 12.744 13.096 13.345 11.860 10.585 11.030 11.425 12.310 11.275 8.646 8.847 8.080 8.010 8.018 7.789 8.040 7.574 8.331 + 13.225 12.955 12.951 11.555 11.555 13.003 13.556 14.007 13.789 12.518 12.814 13.754 12.711 10.968 11.048 11.612 12.218 12.014 12.189 12.573 12.547 12.374 13.035 12.928 13.249 13.804 12.107 9.274 9.491 9.446 9.832 9.734 8.558 9.013 8.284 8.171 + 12.992 12.722 12.755 11.329 11.402 12.759 13.975 14.434 14.430 12.256 12.228 13.631 12.161 10.589 10.791 11.709 12.135 12.671 12.297 12.853 13.066 12.465 12.826 12.443 12.583 13.106 10.906 8.581 10.061 9.455 8.658 9.404 8.255 8.470 8.583 8.370 + 12.905 12.423 12.656 10.821 11.794 12.934 14.043 14.991 15.904 14.599 12.998 13.897 12.077 11.336 10.984 11.864 12.155 12.475 11.996 12.417 12.453 12.277 12.687 11.980 11.530 11.852 9.654 7.764 8.085 7.395 5.647 6.016 5.837 5.671 6.559 7.010 + 12.822 12.071 12.577 10.975 12.316 13.341 14.434 15.721 16.396 15.748 14.523 14.935 13.077 12.013 11.605 12.164 12.269 12.491 12.230 12.745 12.693 12.415 12.572 11.816 10.862 10.480 9.258 6.572 4.761 4.365 4.322 5.542 4.975 4.986 4.839 5.810 + 12.572 11.868 12.181 10.297 11.926 13.023 14.497 16.121 16.250 16.405 15.889 15.068 13.321 11.907 11.540 11.963 12.262 12.482 12.160 12.692 12.714 12.345 12.751 11.843 10.823 10.261 9.653 6.239 4.822 3.741 4.601 5.735 5.717 5.480 4.454 5.706 + 12.312 12.195 12.083 10.351 11.268 12.528 13.968 15.521 15.033 14.627 15.990 15.846 13.241 11.883 11.591 12.186 12.431 12.571 12.454 12.862 13.040 12.754 13.179 12.117 11.402 10.904 9.965 6.843 5.091 5.124 4.786 5.693 5.644 5.465 4.937 6.213 + 12.312 12.345 12.189 10.798 11.395 12.548 13.921 15.624 15.151 14.629 15.839 16.631 14.156 11.882 11.323 12.135 12.525 12.795 12.615 13.086 13.344 13.021 13.271 12.380 11.732 11.426 9.994 8.067 5.433 5.486 4.957 5.308 4.965 4.942 4.402 4.435 + 12.271 12.112 12.002 10.796 11.490 12.425 13.487 15.318 14.556 13.994 15.539 16.274 13.332 12.349 11.418 12.025 12.263 12.743 12.656 13.143 13.608 13.326 13.221 11.735 10.535 9.961 8.932 7.218 6.020 5.660 5.283 5.194 5.831 5.434 4.589 5.275 + 12.288 11.702 11.675 10.214 11.370 12.597 13.918 15.747 15.527 15.189 15.788 15.716 15.082 15.027 13.614 11.537 11.605 11.553 11.732 12.370 13.585 13.908 14.052 13.197 11.319 9.453 8.139 8.031 10.072 11.103 10.625 9.566 9.101 9.181 9.704 8.755 + 11.854 11.780 11.144 11.263 10.928 12.442 13.773 16.171 16.240 15.652 15.556 14.581 15.718 15.245 14.534 12.910 12.603 11.645 11.990 12.101 13.001 13.324 13.977 13.068 11.271 9.364 9.136 9.278 10.518 11.626 11.023 10.462 10.147 10.092 10.014 8.847 + 9.227 9.328 10.850 11.220 11.275 13.714 15.185 15.331 14.459 14.802 14.302 13.855 14.666 15.065 13.867 12.735 12.444 12.287 11.678 10.803 10.431 10.499 11.355 10.916 10.108 8.409 8.536 8.749 9.225 10.779 11.595 10.360 9.668 9.749 9.289 7.651 + 9.863 9.566 9.891 8.471 9.366 10.527 11.165 10.760 9.897 8.745 9.213 8.821 9.969 10.335 10.447 9.998 9.517 10.266 9.554 9.296 9.527 8.921 8.716 8.850 8.183 5.950 5.059 4.948 5.830 6.793 8.108 6.863 7.029 7.790 7.915 5.695 + 8.231 9.481 8.720 8.768 8.018 8.591 8.803 9.472 9.425 8.149 8.340 8.495 7.987 9.109 9.389 9.728 9.748 10.968 10.924 10.331 9.888 10.048 9.665 9.125 8.536 7.821 6.575 6.711 7.231 7.330 6.915 8.155 8.775 9.888 10.374 9.167 + 7.170 6.560 8.046 8.473 8.114 9.667 10.119 10.502 10.347 8.838 8.766 9.915 10.470 10.971 10.985 10.497 11.055 12.598 12.804 12.188 10.778 11.254 11.756 10.591 9.447 8.730 8.585 8.143 8.297 9.307 9.554 10.918 11.068 11.082 11.260 11.532 + 6.674 5.632 5.878 7.383 7.099 7.374 8.299 7.908 8.420 7.746 6.991 7.505 6.860 7.485 8.127 8.510 9.281 9.827 9.243 9.325 8.108 8.755 9.313 9.463 9.705 9.306 9.730 8.755 10.386 10.566 11.214 11.204 11.344 12.471 13.121 13.599 + 4.810 6.971 7.561 7.462 6.988 6.707 7.581 7.707 6.511 6.627 6.292 6.374 6.745 6.699 7.867 8.360 9.226 10.108 9.668 10.298 10.447 9.461 9.681 9.644 10.190 10.005 10.879 10.724 11.689 13.177 13.794 13.070 14.110 15.149 15.409 15.022 + 7.765 7.575 7.869 7.409 6.237 5.862 8.470 9.039 7.982 7.487 6.549 6.943 7.631 8.434 8.883 8.711 8.936 9.784 10.320 10.222 10.655 9.250 9.543 9.651 10.282 10.887 9.894 10.273 10.368 12.773 13.897 13.398 14.976 15.870 15.836 15.824 + 6.886 6.285 6.308 5.743 6.176 5.157 6.220 7.407 7.700 7.489 7.877 9.038 8.051 7.650 7.160 7.466 9.237 9.605 9.684 10.808 10.170 8.747 10.417 10.257 9.856 11.201 10.706 10.213 10.130 11.426 13.474 13.471 13.462 15.098 15.668 14.810 + 3.330 3.828 4.485 5.986 5.570 5.433 6.366 7.920 7.730 7.379 8.085 7.292 5.419 6.573 5.725 6.678 6.973 8.534 8.606 9.033 8.775 8.335 8.295 6.874 6.530 7.008 8.195 8.098 8.287 9.129 10.843 12.079 12.702 13.755 13.493 12.854 + 6.077 6.714 6.104 5.959 6.169 5.397 5.394 7.651 7.345 6.487 5.923 5.745 3.824 5.524 5.107 5.336 5.412 6.324 6.155 5.615 6.451 7.361 7.819 6.935 6.926 6.345 5.672 5.684 5.956 6.837 6.718 8.000 7.852 9.422 9.160 8.676 + 7.489 5.973 6.377 5.294 5.900 6.109 6.171 8.290 7.428 6.288 5.364 5.828 4.962 5.868 5.838 6.537 6.276 6.032 6.707 6.768 6.357 5.940 6.840 6.650 6.234 4.822 4.982 4.916 5.335 4.932 4.819 4.941 5.620 6.407 7.162 6.231 + 6.606 6.540 6.243 6.394 5.755 6.779 7.234 7.556 4.834 5.435 5.834 6.144 5.166 6.266 6.779 7.295 7.614 7.512 8.138 7.950 7.102 6.641 7.028 6.453 6.653 5.919 5.456 4.665 4.784 5.222 5.999 6.276 7.572 7.687 7.619 6.884 + 5.527 7.433 7.403 8.332 8.725 8.464 8.118 8.791 8.782 8.947 9.403 9.690 9.512 9.301 9.930 9.802 8.917 9.709 11.569 11.183 10.990 11.037 10.291 9.998 9.500 8.556 9.179 8.930 8.606 9.355 10.207 10.596 13.055 13.037 11.382 9.997 + 6.810 8.072 8.003 8.702 10.756 11.464 10.666 10.189 10.021 10.163 10.931 11.019 9.909 10.034 11.102 10.796 9.047 10.930 12.216 11.170 11.305 11.833 10.571 10.566 9.972 11.111 11.186 10.549 10.969 12.623 13.934 13.007 14.832 14.580 13.477 13.376 + 10.217 7.990 7.169 8.246 9.255 11.317 10.888 11.148 10.934 10.296 10.995 9.414 9.472 8.103 9.509 9.697 10.220 10.840 11.877 10.838 10.645 10.256 8.211 9.612 10.260 12.550 12.074 10.403 11.145 14.172 14.101 12.186 11.207 11.936 13.493 13.280 + 13.215 12.990 13.133 12.856 13.901 14.205 14.033 14.220 12.705 12.753 11.993 11.922 11.945 11.603 11.856 12.489 13.196 13.754 13.268 12.656 12.161 11.436 11.024 10.699 11.905 12.383 11.046 8.853 10.494 12.528 11.382 9.148 8.423 8.822 9.246 8.499 + 13.275 13.574 12.539 12.642 14.333 14.688 15.204 13.510 12.639 12.081 12.519 11.674 11.545 11.787 12.271 12.734 13.864 13.935 13.520 13.012 12.480 11.847 11.869 11.825 12.189 11.713 10.671 9.071 8.144 6.638 6.939 6.879 6.324 6.221 6.474 5.508 + 13.157 12.333 11.416 12.186 12.882 13.392 13.362 12.473 11.412 11.300 11.004 10.688 10.349 10.832 11.898 12.703 12.595 12.012 11.917 11.829 11.604 11.078 11.952 11.850 10.211 9.973 10.173 9.052 6.469 6.085 6.473 6.246 6.247 6.126 6.685 6.127 + 12.756 12.389 11.642 11.150 11.735 11.237 10.026 9.754 8.178 8.703 8.691 8.869 7.174 7.795 10.346 10.022 9.308 9.295 9.639 9.809 9.635 10.010 11.557 11.398 7.851 8.458 9.637 9.354 5.832 5.821 5.621 6.111 7.987 7.304 6.642 6.186 + 12.892 12.279 11.690 11.207 11.320 11.253 10.978 10.289 8.135 7.915 8.335 7.890 6.252 7.959 10.526 10.156 9.537 9.783 9.859 10.024 10.078 10.180 11.512 11.327 7.939 8.539 9.652 9.205 6.119 6.169 4.706 6.930 8.437 7.762 6.538 5.242 + 12.621 12.027 11.668 11.491 11.458 11.633 11.095 10.064 8.223 8.104 8.775 7.801 6.652 8.165 10.761 10.481 9.912 10.280 10.043 10.263 10.359 10.481 11.624 11.275 7.626 7.621 9.335 9.526 6.119 5.810 4.684 6.714 7.161 6.415 5.735 6.583 + 12.710 11.829 11.673 11.481 11.757 11.746 10.631 9.705 8.680 8.773 9.303 8.106 7.305 8.585 10.388 11.057 10.021 9.773 9.853 10.335 10.694 10.949 11.700 10.689 7.283 6.892 8.235 8.905 6.364 5.907 5.167 5.862 6.256 6.463 6.273 6.035 + 12.970 12.374 12.279 11.671 12.520 13.655 13.450 12.399 11.327 11.271 10.982 10.400 9.810 10.895 11.983 13.210 14.221 14.863 13.893 12.817 12.175 12.153 12.323 11.670 8.993 7.899 7.569 8.169 8.311 7.918 8.023 7.956 8.118 7.219 8.459 8.149 + 13.267 12.613 12.742 11.891 13.639 14.196 15.186 14.580 12.874 11.795 12.175 11.164 10.582 10.905 11.435 12.295 13.688 15.117 16.547 16.045 14.869 13.285 12.763 12.667 12.610 11.046 9.507 8.867 9.586 9.450 8.490 9.014 8.241 6.417 7.320 6.595 + 13.280 12.394 12.760 12.183 13.393 14.475 15.926 15.474 14.032 11.918 12.280 11.455 10.632 10.888 11.100 11.585 12.318 13.067 15.696 16.798 16.347 14.056 12.868 12.890 13.607 12.044 10.273 8.924 10.197 10.239 9.120 10.808 10.213 7.646 8.441 8.525 + 13.259 12.579 12.835 12.567 13.397 15.002 16.037 15.658 14.054 12.502 12.100 11.559 10.827 10.675 10.997 11.204 11.722 12.276 13.658 15.789 17.269 15.387 13.363 13.045 13.885 13.110 10.910 9.070 11.114 11.092 9.251 12.598 11.991 8.491 9.370 9.853 + 13.248 12.910 12.962 12.830 13.932 15.578 16.008 15.354 13.868 12.592 12.448 11.603 11.111 10.964 11.168 11.225 11.619 11.951 12.715 14.438 16.176 15.993 13.757 12.861 13.272 13.612 11.669 8.811 10.906 10.926 8.573 12.152 12.218 9.083 9.349 9.901 + 13.392 12.945 12.681 13.317 14.214 15.278 15.093 13.511 12.237 11.941 11.519 10.039 10.238 9.808 10.009 9.437 9.527 10.280 11.574 12.923 14.594 15.135 13.097 12.225 13.272 13.901 12.351 10.337 11.805 11.628 9.804 13.044 13.068 9.936 10.204 9.999 + 12.519 10.293 11.786 12.154 12.770 14.885 14.027 11.658 11.491 9.344 9.670 8.001 8.361 7.659 7.552 7.661 7.588 7.812 9.224 10.457 12.163 13.452 12.420 10.221 11.593 12.598 11.677 10.068 11.587 11.252 8.846 12.265 12.111 9.098 9.783 9.418 + 10.622 10.556 10.888 11.634 12.335 13.143 11.990 10.154 9.712 8.583 8.144 8.481 8.636 8.176 8.455 8.628 8.679 9.152 9.461 10.366 10.109 11.209 11.943 10.838 11.600 11.845 11.126 9.123 9.982 9.593 9.242 9.427 8.848 8.367 9.342 9.217 + 7.126 6.706 7.043 7.936 7.721 8.521 7.804 7.764 7.518 7.237 6.326 6.748 6.795 6.669 6.843 7.173 7.347 7.570 7.952 8.411 8.860 8.567 9.248 8.835 8.788 9.381 8.505 5.985 6.022 7.226 7.208 6.809 6.481 7.015 7.640 7.764 + 5.625 4.410 4.575 5.763 7.801 7.726 6.200 6.313 6.064 6.184 4.817 2.094 2.931 3.044 3.670 5.412 5.818 4.741 5.674 6.466 6.803 6.157 5.494 5.006 4.786 5.571 4.939 4.629 5.622 5.667 5.660 6.564 6.403 7.073 6.890 5.467 + 5.880 5.378 5.672 6.213 5.080 7.554 8.306 7.006 6.226 5.507 5.756 4.796 4.736 5.243 5.772 5.702 6.612 6.728 7.370 7.909 7.853 7.802 7.706 7.974 8.077 7.868 7.221 6.106 5.634 6.712 7.720 8.042 8.213 8.202 8.240 7.918 + 7.739 7.479 7.464 9.000 8.715 9.516 9.682 9.206 8.896 7.879 7.770 8.797 9.127 9.032 9.837 10.025 10.730 11.851 11.476 11.401 12.965 12.463 12.488 13.262 12.879 13.249 13.162 10.428 10.616 11.120 10.801 11.622 11.437 11.361 11.329 11.271 + 8.720 8.709 7.789 10.790 11.308 11.555 11.660 10.638 9.056 8.095 9.429 9.504 9.063 9.718 10.419 11.452 10.664 11.626 11.915 11.785 12.246 10.813 12.378 12.481 12.496 13.413 13.498 11.144 10.851 11.111 10.984 12.685 11.933 11.829 11.219 11.422 + 11.915 12.341 11.725 13.488 14.351 14.815 13.356 11.678 11.202 10.043 8.881 8.324 8.152 7.285 7.876 8.266 8.625 9.172 9.975 10.753 12.492 13.558 12.701 11.426 11.122 12.142 11.668 9.279 10.011 9.653 11.603 12.062 10.179 9.221 8.436 8.470 + 13.244 13.415 13.782 14.043 15.532 17.042 16.290 14.795 13.295 12.839 11.892 11.330 10.865 10.473 10.601 10.617 10.695 10.981 11.742 12.735 14.055 13.459 11.395 10.356 10.645 11.761 10.484 9.025 10.360 12.425 14.290 14.219 13.297 10.629 7.989 7.314 + 12.908 13.119 13.427 13.421 14.998 16.980 16.259 16.189 14.455 13.450 12.520 12.072 12.052 11.769 11.735 11.937 12.241 13.094 14.495 15.936 15.742 14.108 12.124 10.605 10.586 10.909 8.942 6.986 8.295 10.042 12.311 12.240 11.046 9.236 8.136 6.912 + 12.243 12.560 12.638 12.786 14.226 16.038 17.004 15.418 13.964 13.502 12.294 11.157 11.583 10.960 11.108 11.288 11.734 12.709 14.142 16.096 14.888 12.424 11.323 10.906 10.837 9.604 8.373 8.508 7.585 7.998 9.910 11.110 9.892 8.834 8.518 6.416 + 10.586 11.337 11.564 11.708 14.193 15.948 15.848 13.823 12.600 12.143 11.210 10.347 10.496 9.972 10.106 10.297 10.875 12.340 14.208 13.512 9.868 9.089 9.812 10.149 9.578 8.351 7.186 7.920 7.225 6.977 9.520 11.423 10.204 9.092 8.469 6.351 + 10.703 10.742 10.381 10.752 10.747 10.479 10.206 8.991 8.648 7.407 7.546 7.362 7.024 6.805 6.948 6.256 7.222 8.810 7.819 7.342 6.845 7.420 8.169 7.532 6.315 6.124 6.345 5.841 5.552 6.141 6.263 6.629 7.043 6.683 6.620 6.218 + 9.849 9.376 7.615 9.564 9.360 8.984 8.798 8.200 7.441 7.365 6.179 6.162 6.753 6.171 5.285 5.563 6.347 6.437 6.480 8.208 8.139 8.397 8.559 7.916 6.938 6.524 6.277 7.216 8.026 7.828 8.579 8.878 8.282 6.349 7.479 6.668 + 8.703 7.230 6.860 8.245 10.237 10.273 9.915 10.382 10.580 9.847 10.624 9.752 9.581 10.407 9.517 9.909 8.282 9.608 12.444 13.389 13.829 13.431 12.903 11.793 10.374 9.345 9.199 9.623 9.515 10.694 10.258 10.806 9.755 9.234 9.086 8.184 + 10.402 10.640 10.233 11.355 11.322 11.730 11.312 12.370 11.201 11.011 10.986 11.130 10.673 10.539 9.971 9.510 11.639 11.715 13.849 14.107 14.648 14.405 13.706 11.714 10.654 10.328 11.161 9.951 10.062 10.751 11.482 12.346 11.447 10.497 9.854 9.223 + 13.731 13.197 11.590 10.242 10.809 10.599 10.593 10.801 10.444 10.513 12.132 12.947 11.593 11.809 11.368 12.207 13.860 14.352 14.389 13.564 13.051 12.582 11.737 9.788 9.124 9.394 8.845 9.332 9.601 10.682 10.649 10.230 9.834 10.292 9.045 7.023 + 11.356 12.125 11.473 9.011 8.253 8.449 9.899 10.324 9.715 10.919 12.440 13.364 14.266 13.547 13.295 12.837 13.715 14.646 13.784 12.759 12.345 13.222 12.407 11.202 11.873 12.132 10.855 11.400 13.218 12.964 11.707 11.312 11.846 12.938 12.926 10.561 + 11.561 10.719 9.274 9.782 9.087 8.715 10.461 10.239 9.144 8.982 12.447 13.984 13.626 12.732 13.363 12.603 12.313 12.476 11.813 11.247 11.305 13.097 13.462 11.215 10.001 10.546 9.630 9.062 12.033 12.310 12.069 11.424 10.812 11.003 11.516 11.241 + 14.747 14.348 14.124 13.644 12.683 11.531 11.154 10.927 10.026 10.447 13.758 14.174 13.042 11.833 12.834 12.215 10.704 12.065 11.632 11.738 10.869 11.823 12.403 10.865 10.139 9.767 10.083 9.023 9.188 9.678 10.833 11.970 9.852 7.958 9.503 9.739 + 14.699 14.124 12.935 12.542 10.890 10.076 10.215 10.256 11.202 10.738 11.194 12.102 13.058 12.925 13.077 13.180 12.571 13.852 12.211 11.380 10.975 13.395 14.359 13.007 11.327 9.009 10.366 10.613 12.565 14.404 13.479 12.124 10.254 9.929 9.711 9.503 + 10.413 10.756 9.529 8.381 9.362 10.204 9.528 10.974 11.071 11.814 11.885 12.540 13.739 13.635 13.340 13.507 12.275 13.270 12.423 10.863 11.751 14.850 15.140 13.945 12.306 10.015 10.411 12.776 15.093 15.170 14.121 13.332 10.056 9.507 10.032 9.993 + 10.693 11.229 10.732 10.886 9.323 9.405 8.915 9.726 11.011 11.611 12.098 11.653 12.042 13.248 13.278 12.480 11.543 11.974 11.067 9.996 11.360 12.994 14.100 12.843 10.489 10.634 9.320 11.179 13.531 13.654 13.521 12.297 10.640 10.032 9.175 8.380 + 11.739 11.972 13.270 13.048 10.931 10.909 10.218 9.684 11.899 13.068 13.997 13.569 13.409 13.088 13.301 12.235 11.022 11.056 10.179 9.690 10.136 11.475 12.291 9.388 8.739 8.864 8.431 8.802 9.176 10.254 12.814 11.568 9.918 9.062 7.282 7.370 + 13.869 13.543 13.674 13.408 12.367 12.673 13.530 13.743 13.930 13.676 14.472 13.552 12.637 13.521 12.698 12.308 10.712 10.889 9.854 8.346 9.628 10.866 11.407 9.067 8.445 8.143 8.176 7.034 6.999 8.368 9.883 9.656 7.633 7.664 6.228 5.799 + 13.510 12.741 12.429 13.430 13.661 14.503 15.517 16.303 16.735 16.233 16.673 16.639 16.703 16.392 14.903 12.951 11.788 11.356 10.906 10.073 9.361 9.893 9.182 7.909 7.151 7.241 6.302 6.244 7.636 9.118 8.114 7.255 7.867 6.743 5.576 4.836 + 13.112 12.581 12.471 13.396 14.148 14.621 15.793 17.050 17.265 17.226 16.570 15.586 17.214 17.276 15.962 14.171 13.352 12.849 13.019 13.299 13.977 13.225 10.259 7.905 5.062 5.279 4.622 5.453 7.504 9.803 9.001 7.192 7.025 6.520 5.042 2.405 + 12.817 12.195 11.999 13.266 13.971 14.144 15.571 17.280 17.590 16.805 15.255 15.599 17.023 17.687 16.856 14.392 13.791 13.021 12.938 13.444 14.423 13.139 9.873 8.105 6.902 5.052 5.127 5.357 7.711 9.940 9.445 7.676 6.898 6.059 4.971 3.197 + 12.572 11.717 12.124 13.085 13.651 14.153 15.784 17.429 17.884 16.639 14.975 15.740 16.494 17.922 17.191 14.714 14.086 13.510 13.257 14.073 14.560 11.377 9.324 8.009 7.171 5.910 5.758 6.009 7.795 10.683 10.194 8.202 7.627 6.499 5.226 4.902 + 12.414 12.062 12.576 13.162 13.840 14.481 16.165 17.419 17.707 16.411 15.114 15.862 16.232 17.475 17.649 15.982 15.025 14.476 14.907 15.414 13.782 11.420 9.760 8.486 7.337 6.229 6.177 6.307 7.839 10.909 11.269 8.775 6.618 5.883 5.324 5.936 + 12.560 12.216 12.521 13.268 13.903 14.501 16.414 17.176 17.523 16.107 15.160 15.837 16.020 17.177 17.846 16.574 15.698 15.564 16.367 15.509 12.841 10.232 8.948 8.180 7.368 6.270 5.332 4.777 6.627 9.494 10.952 9.153 6.562 5.094 4.705 5.998 + 12.199 11.627 11.717 13.014 13.536 14.003 16.248 16.744 17.156 15.159 14.124 15.520 15.307 16.702 17.317 16.959 15.195 14.965 15.565 14.789 11.279 9.478 8.374 7.325 6.585 5.977 5.325 5.589 5.727 8.371 10.636 9.034 6.086 5.807 5.114 4.321 + 11.770 10.619 11.564 12.532 13.059 13.480 16.154 17.014 16.658 14.721 13.623 14.814 14.541 16.017 16.960 16.662 15.210 15.916 15.723 13.738 11.048 9.410 8.244 6.922 6.709 6.306 5.689 6.909 6.898 8.647 10.950 9.720 7.277 7.248 6.824 6.189 + 11.475 11.235 12.021 12.647 13.395 14.349 16.530 17.253 16.634 14.973 13.630 14.645 14.659 15.761 16.985 17.031 15.770 16.724 16.447 13.634 11.001 9.212 7.556 6.895 7.053 7.062 6.730 6.404 7.297 9.477 11.847 10.309 6.641 6.112 6.085 6.318 + 11.726 11.281 11.792 12.748 13.534 14.540 16.623 16.783 16.428 15.102 13.588 14.765 14.715 15.724 17.014 17.606 16.564 16.811 16.263 13.876 11.304 9.346 8.148 7.651 7.416 7.342 6.954 6.986 8.162 9.849 11.576 8.945 6.811 6.538 6.277 6.354 + 11.729 10.734 11.224 12.515 13.285 14.171 16.341 16.475 16.013 14.836 12.997 14.322 14.015 15.015 16.025 17.358 16.463 16.437 16.220 13.742 11.483 9.515 8.443 7.603 7.682 6.737 6.404 6.561 7.133 9.167 11.329 8.672 6.456 6.421 5.441 5.631 + 11.286 10.282 11.231 12.054 12.955 13.984 16.276 16.630 15.406 14.301 12.587 13.625 13.414 14.280 15.831 17.360 16.619 16.826 16.608 13.879 11.810 9.458 8.135 7.076 7.593 7.076 5.933 6.048 6.688 8.910 10.487 7.233 5.984 5.478 5.047 5.579 + 11.255 10.757 11.642 12.260 13.356 14.658 16.434 16.272 14.890 14.096 12.980 13.256 13.396 14.161 15.560 17.233 17.781 17.616 17.430 14.941 12.544 10.361 9.071 8.433 8.188 8.107 7.691 7.302 7.075 8.724 10.248 7.834 6.871 6.393 6.313 6.508 + 11.258 10.887 11.570 12.553 13.532 14.899 16.476 15.779 14.956 14.358 12.717 13.124 12.790 13.797 14.870 16.274 17.648 17.591 17.549 15.346 12.725 10.371 9.197 8.642 8.378 7.960 7.957 7.670 7.697 10.068 11.043 8.842 7.102 6.695 6.730 6.649 + 11.153 10.285 11.049 12.400 13.015 14.314 16.034 15.503 14.149 13.943 12.049 12.369 12.048 13.248 13.589 14.925 17.086 16.721 17.436 15.838 13.401 10.242 8.984 7.965 7.109 6.706 7.706 8.401 9.244 9.612 10.374 8.366 6.617 6.981 6.476 5.641 + 10.953 9.806 11.267 11.976 13.011 14.859 15.809 15.410 13.076 13.271 11.796 11.759 11.802 12.505 13.168 14.722 16.881 16.992 17.314 16.326 13.579 10.874 8.881 7.643 7.641 7.182 7.205 8.011 9.759 9.693 9.806 8.367 7.174 7.411 6.305 5.392 + 11.261 10.636 11.878 12.480 13.920 15.448 15.927 15.249 13.230 13.275 12.345 12.096 12.152 12.729 13.455 14.771 16.370 17.432 17.717 16.640 14.303 11.334 9.032 8.044 8.033 7.454 7.303 7.604 10.501 11.173 9.930 7.713 6.904 6.748 6.164 6.003 + 11.502 10.970 11.731 12.972 13.983 15.313 15.101 14.619 12.967 13.158 12.029 11.884 12.129 12.506 13.192 14.320 15.557 17.358 17.756 17.095 14.483 11.587 9.683 8.670 7.604 8.326 8.596 9.014 12.122 12.621 10.696 8.164 7.073 7.112 5.840 5.220 + 11.512 10.771 10.997 12.767 13.744 14.913 14.478 13.097 12.257 12.555 10.740 11.387 11.156 11.627 11.934 13.284 14.442 16.689 17.783 17.069 15.115 12.617 9.773 8.656 8.386 9.205 9.510 8.870 11.799 11.753 9.533 8.145 7.280 6.835 6.690 5.898 + 11.132 9.974 11.304 12.272 14.211 15.036 14.167 12.563 11.891 12.225 10.231 11.083 10.575 11.277 11.575 12.737 13.802 16.314 17.743 16.642 15.799 12.864 10.314 8.246 8.408 7.998 9.126 9.555 11.715 11.278 9.091 7.365 7.179 7.623 6.973 6.155 + 11.174 10.549 11.953 13.402 13.714 13.684 13.428 11.861 11.328 11.438 10.383 10.581 10.307 10.864 11.087 12.011 12.873 15.047 17.031 16.274 15.724 12.996 9.653 8.645 8.600 8.563 8.529 10.031 11.640 10.779 10.033 8.042 8.598 8.201 6.506 5.568 + 8.344 9.336 10.088 8.658 9.088 9.954 8.643 8.089 8.307 7.187 7.447 7.501 8.009 8.406 8.625 9.069 9.769 11.531 14.404 14.811 13.465 11.655 8.615 7.201 6.008 5.436 6.187 6.548 7.622 6.652 7.558 7.718 7.142 6.669 4.965 3.703 + 8.098 9.001 8.357 8.307 7.858 8.139 6.865 6.965 6.989 7.723 8.238 7.864 7.472 8.565 8.953 8.300 9.463 10.793 12.620 12.476 11.333 12.373 11.828 10.605 9.804 9.038 8.418 9.335 9.895 9.191 8.372 9.137 9.596 9.314 8.591 7.058 + 9.075 9.528 8.564 7.919 7.134 8.205 8.366 6.063 6.426 6.394 6.956 8.274 7.264 7.419 7.253 7.247 8.502 9.439 10.900 11.433 10.263 10.455 9.543 7.641 7.098 6.285 6.485 6.604 7.440 7.429 7.791 8.025 7.857 8.679 9.399 8.256 + 8.324 9.637 8.934 6.698 7.905 8.520 8.358 6.745 7.254 6.571 5.975 6.692 6.132 7.690 7.627 7.350 6.408 8.779 10.154 10.210 9.491 6.915 7.433 5.591 5.783 4.950 4.971 6.522 6.921 8.308 9.238 8.880 6.747 8.282 9.136 7.949 + 8.001 8.856 8.951 9.224 8.509 8.294 9.842 9.773 8.132 8.753 9.716 8.906 9.512 9.749 9.225 9.923 10.505 10.499 11.267 11.647 11.463 11.130 11.506 10.906 10.351 10.409 10.254 10.331 10.139 9.720 10.156 10.607 9.845 9.453 9.648 8.980 + 7.293 8.865 9.688 10.827 10.334 11.072 11.830 11.607 12.359 12.357 12.727 12.964 12.753 12.482 10.625 11.681 11.672 12.302 12.962 12.904 13.791 12.912 13.150 12.312 12.152 12.805 12.871 12.229 10.952 11.260 12.603 12.885 11.593 12.022 13.339 12.378 + 8.655 9.260 9.469 11.348 11.297 10.594 11.662 11.678 11.920 11.850 10.680 11.105 10.017 10.278 9.291 9.469 10.320 11.029 12.300 13.176 13.274 12.196 11.444 12.022 11.966 11.989 12.576 11.939 10.834 10.906 11.965 11.372 8.870 11.263 13.032 13.109 + 10.077 10.444 11.053 11.306 9.273 7.594 9.905 9.590 9.873 11.038 11.041 12.608 11.909 10.572 10.445 11.340 10.634 12.345 13.144 15.684 15.628 13.294 11.155 11.734 12.030 12.301 11.585 11.904 11.042 10.557 10.986 10.850 8.649 9.547 12.491 13.049 + 10.211 9.096 9.513 9.898 9.001 8.818 10.590 9.802 10.500 11.859 10.795 11.885 11.819 11.192 10.389 11.534 11.379 12.875 14.058 15.703 16.470 14.710 12.235 12.557 12.758 12.230 10.140 9.806 10.021 9.359 9.094 9.012 8.229 8.051 9.721 10.402 + 10.321 11.332 9.395 8.607 9.226 10.253 10.198 10.647 10.758 11.180 11.462 10.906 12.437 11.963 10.945 11.423 12.841 12.890 13.369 14.792 15.172 14.291 12.463 12.775 12.896 12.323 11.181 9.976 9.545 10.513 10.217 8.721 8.695 8.102 8.716 8.745 + 11.556 11.445 9.860 8.823 8.737 9.002 11.079 11.922 11.513 12.274 11.801 10.897 11.494 11.884 11.982 12.113 11.480 12.433 13.589 16.288 16.048 13.859 12.054 10.729 10.980 11.549 11.018 10.517 9.960 10.584 10.696 8.619 9.629 9.296 8.771 9.056 + 9.248 8.957 8.134 9.950 9.429 8.647 9.942 11.612 10.987 10.198 10.059 11.379 11.843 11.140 10.802 10.991 11.301 12.638 13.093 15.477 14.371 11.670 10.660 10.010 10.846 12.467 12.595 11.951 9.970 10.066 10.055 10.282 10.644 9.900 9.841 9.199 + 9.664 9.637 10.217 9.093 9.307 9.093 8.723 7.783 8.697 10.317 10.620 9.987 8.641 9.742 9.489 9.668 11.419 12.524 13.201 14.518 13.090 11.870 9.971 10.426 10.775 11.154 10.887 10.711 10.285 10.047 9.476 9.303 10.193 9.958 9.641 8.903 + 12.238 12.237 12.156 10.851 10.134 8.877 6.817 6.905 9.258 10.144 10.849 9.953 8.312 8.393 8.867 10.759 11.482 11.542 12.138 13.270 13.335 10.130 9.002 9.238 8.940 9.372 9.929 9.050 9.191 10.015 9.436 9.137 9.355 8.878 8.898 8.206 + 9.134 8.180 9.080 8.288 8.574 8.211 8.445 8.876 8.839 8.246 9.694 10.904 9.785 9.568 9.447 12.126 11.301 10.187 12.464 13.897 13.190 11.279 10.075 9.821 10.073 9.261 9.060 9.444 9.688 10.046 9.488 10.552 9.893 9.370 8.095 7.993 + 9.884 9.034 8.367 8.853 8.947 7.781 6.183 8.489 9.505 9.267 9.709 10.073 9.514 10.190 10.159 12.167 11.627 11.287 13.510 14.600 12.259 11.000 9.955 8.780 10.397 9.750 9.657 10.262 9.778 10.137 9.060 10.319 9.665 9.065 9.487 9.119 + 9.864 9.516 9.203 8.000 7.993 8.637 7.910 9.229 8.346 7.556 8.306 8.998 9.331 9.130 8.549 9.312 10.561 10.983 13.411 13.649 11.423 10.324 9.234 8.604 8.306 8.894 8.645 7.477 7.723 8.966 9.298 10.127 10.101 9.573 9.804 9.142 + 10.209 9.231 7.548 7.186 7.789 9.559 9.131 8.411 8.434 7.939 9.373 8.713 8.669 9.371 8.796 8.560 8.561 9.716 11.965 11.851 11.194 10.280 8.393 7.593 8.015 7.948 8.169 7.787 7.516 8.583 8.938 9.667 9.533 8.972 8.657 8.454 + 10.653 9.915 8.761 8.173 8.314 7.461 6.245 6.972 7.709 8.720 10.366 9.595 8.919 8.547 8.291 8.701 9.228 10.895 13.003 13.175 11.415 9.360 7.995 7.995 7.780 8.221 7.824 6.001 6.973 7.830 8.266 8.166 8.427 9.803 8.027 8.008 + 9.056 9.924 9.994 10.300 9.295 9.703 9.646 9.193 9.280 9.048 9.998 9.041 8.674 8.150 7.903 8.733 10.107 12.647 13.023 12.151 11.545 9.175 8.983 8.344 8.181 8.701 8.851 7.417 4.878 8.001 8.493 8.127 8.943 9.929 8.811 8.669 + 9.244 10.659 11.232 10.521 9.850 10.680 11.568 11.534 10.398 9.332 9.289 9.134 8.136 7.332 7.744 7.213 9.701 10.982 12.098 10.098 9.953 9.034 7.844 6.477 7.845 9.620 9.801 7.762 5.705 7.572 7.548 7.995 9.875 9.647 7.964 7.276 + 4.442 7.498 8.758 7.891 6.493 5.930 9.265 9.900 6.999 5.587 6.061 5.612 5.132 4.915 5.729 5.658 6.205 6.944 7.832 7.438 6.211 4.573 3.843 4.374 5.079 6.130 6.617 4.689 3.416 4.490 3.951 4.129 6.681 5.665 4.204 4.143 + 8.359 8.493 8.067 7.255 7.729 8.631 8.350 6.511 6.808 7.717 8.347 7.261 6.106 6.361 5.941 5.787 6.076 6.993 5.696 6.936 6.703 4.864 5.403 4.349 4.463 3.810 4.398 4.058 3.673 4.407 4.153 4.602 4.592 3.744 3.870 2.739 + 7.530 7.731 6.075 4.781 6.977 8.268 8.169 7.037 6.873 7.113 7.530 7.658 6.272 6.687 5.690 5.773 7.077 7.180 6.225 5.971 4.758 3.960 4.682 4.300 4.388 4.254 4.397 4.498 4.689 5.094 4.541 4.795 5.881 4.865 4.956 3.979 + 5.888 5.502 5.786 5.922 4.209 3.894 5.530 5.434 5.575 5.292 5.976 6.305 6.829 6.072 5.296 6.318 7.709 6.723 5.559 4.556 5.324 4.964 5.079 5.182 4.186 4.070 3.765 3.900 5.004 4.688 4.843 4.978 5.022 4.122 4.808 3.773 + 5.152 5.124 5.985 4.942 4.479 5.685 6.446 6.788 5.736 5.215 6.105 6.052 5.114 6.552 5.735 6.449 7.346 7.654 6.822 5.347 6.507 5.922 5.196 4.924 4.429 4.360 4.258 4.151 4.295 4.414 4.733 4.334 4.199 4.196 4.589 3.855 + 4.463 5.568 5.264 5.465 5.284 4.290 6.679 6.860 4.940 4.410 4.755 5.275 5.408 7.067 6.361 6.472 7.451 6.949 7.173 6.173 5.818 5.311 4.573 4.677 4.317 4.127 4.363 4.235 5.505 4.607 4.798 4.405 4.586 4.580 4.063 3.580 + 6.079 6.690 8.043 7.871 8.270 9.313 10.062 10.417 10.342 10.008 9.957 9.862 9.669 10.039 10.368 10.650 11.042 11.624 11.933 11.384 10.509 9.981 9.836 9.634 9.543 9.303 8.216 7.131 7.390 6.678 6.192 5.923 5.961 5.172 6.545 7.064 + 10.908 10.196 9.303 10.479 11.072 10.799 13.436 14.376 13.563 12.535 13.107 12.040 11.974 11.251 11.863 12.256 12.948 14.516 14.956 13.464 12.612 12.506 12.696 12.402 12.425 13.619 12.256 11.589 11.570 9.967 8.998 8.288 8.822 8.910 10.432 10.105 + 11.845 12.058 10.419 10.552 10.498 11.067 12.044 12.416 12.520 12.504 13.426 13.106 12.168 12.614 13.271 12.962 12.633 15.265 15.483 14.994 12.994 12.539 12.130 11.832 12.245 13.537 13.484 11.463 11.441 11.182 10.563 10.474 12.263 12.179 12.466 13.016 + 12.490 13.289 13.439 13.659 12.771 12.319 12.144 12.336 12.160 11.784 13.009 14.026 12.836 13.171 12.561 12.793 12.323 13.137 15.236 14.916 14.496 14.284 12.710 13.962 13.199 12.605 14.157 12.361 11.858 13.574 14.275 12.841 13.779 13.943 14.101 14.063 + 14.946 14.348 15.454 15.152 14.256 13.098 13.422 14.379 14.413 13.568 13.255 14.583 13.721 12.413 13.115 12.858 14.082 14.494 14.660 15.014 16.008 16.120 14.256 13.358 12.858 13.166 13.136 12.249 12.293 12.658 13.677 13.783 14.559 14.832 14.119 14.282 + 15.759 14.367 13.198 12.898 12.941 12.017 10.725 12.647 12.138 10.905 11.013 11.936 13.186 12.963 13.376 13.336 13.225 13.003 14.200 14.257 14.574 13.336 13.065 13.459 13.756 12.522 12.840 11.433 10.781 11.775 12.764 13.849 13.888 14.420 13.953 12.718 + 11.379 12.614 12.292 10.377 9.327 8.822 10.623 10.365 9.624 8.696 9.254 11.273 11.980 13.162 14.526 14.400 14.565 13.240 13.205 14.936 14.986 14.015 11.813 13.666 13.984 13.617 13.406 10.780 10.297 12.138 12.910 12.690 12.379 12.714 12.674 12.419 + 9.595 11.140 10.614 8.585 6.734 8.562 10.328 10.674 10.266 10.326 9.063 10.971 11.716 13.334 14.030 14.813 15.796 14.693 14.807 15.094 15.564 14.540 13.320 13.244 13.326 13.380 12.907 10.178 9.617 11.288 13.312 13.045 11.588 11.314 12.357 12.055 + 7.797 7.438 7.083 6.737 6.760 7.422 11.310 13.317 12.239 10.278 10.218 11.383 9.585 10.969 12.723 13.984 15.858 14.322 14.537 14.555 15.932 14.716 13.172 12.609 13.143 13.555 13.491 11.272 10.415 11.517 12.348 12.368 11.350 11.502 12.228 12.548 + 8.307 8.113 7.902 6.766 6.843 6.734 11.333 13.467 12.157 9.339 10.511 11.179 9.039 10.199 11.660 12.571 15.531 14.276 14.281 15.868 16.351 14.727 12.471 11.941 11.955 13.645 13.391 11.618 11.463 11.934 12.189 11.379 10.980 12.356 12.981 13.002 + 9.060 7.149 5.786 6.062 6.186 7.206 10.539 12.873 11.440 7.250 10.167 10.005 9.289 9.694 11.169 12.725 15.489 13.696 13.549 16.562 15.446 12.737 12.497 11.812 12.472 13.504 13.318 12.108 11.604 11.208 12.437 11.275 11.442 12.844 13.153 12.799 + 9.085 6.797 7.736 8.425 7.315 7.277 10.400 12.654 10.997 6.356 9.742 10.185 8.352 8.121 10.933 12.948 15.366 13.273 12.862 14.321 13.026 12.157 11.376 11.030 10.291 13.460 13.384 10.986 10.585 11.632 11.756 10.637 11.268 12.899 13.499 11.533 + 9.168 9.227 9.382 8.790 7.494 7.766 10.493 12.794 11.420 6.757 9.302 9.402 8.261 8.491 10.253 12.469 14.767 13.043 12.388 13.312 12.619 12.393 12.276 11.339 9.970 13.182 12.919 10.020 10.149 11.062 12.014 11.904 10.037 12.235 13.820 12.436 + 8.122 9.273 8.632 7.006 7.195 7.081 10.633 12.731 11.223 7.374 9.594 10.582 8.311 8.197 11.254 13.530 14.723 12.817 12.132 12.378 12.676 12.564 12.429 11.510 10.721 12.531 12.169 9.812 10.919 11.744 12.458 12.209 10.207 11.838 12.513 12.773 + 8.109 6.977 6.453 5.958 7.388 7.487 10.167 12.417 10.987 8.154 10.386 9.852 8.025 7.146 10.881 13.512 13.587 11.436 12.735 13.177 14.252 13.338 12.467 11.830 11.249 12.912 12.214 10.535 10.268 11.393 11.424 11.889 10.662 13.410 13.821 12.516 + 9.619 8.699 6.989 6.629 6.999 7.323 9.776 11.985 10.243 6.953 9.467 10.421 8.001 7.840 10.562 13.558 12.629 11.203 11.511 12.581 13.932 13.531 12.746 11.537 11.838 12.254 11.363 10.323 10.301 11.406 11.986 11.179 9.507 11.700 13.408 12.640 + 6.997 6.868 5.764 5.858 6.139 4.713 10.546 12.136 10.360 7.406 9.009 10.376 8.748 9.144 11.323 12.198 11.886 12.805 13.091 13.813 12.842 12.496 13.312 11.655 11.395 10.942 10.313 9.611 10.090 11.566 11.970 11.096 10.116 13.555 14.095 12.516 + 7.524 7.811 7.334 6.605 5.406 6.846 10.485 12.025 9.895 7.732 9.507 9.986 7.007 9.171 11.648 11.843 12.503 11.869 12.121 13.350 13.675 12.733 11.980 10.768 11.944 11.283 10.705 8.495 9.469 11.144 12.133 11.438 9.953 12.469 13.636 12.268 + 8.120 6.394 7.042 5.720 5.443 6.446 10.459 11.747 9.405 8.669 9.114 10.249 8.269 8.993 11.842 11.935 13.173 11.391 11.029 11.977 11.932 13.035 12.943 11.485 10.735 11.095 10.950 8.759 9.653 11.635 12.372 11.941 9.735 12.482 13.371 11.696 + 6.227 6.462 6.375 7.311 8.085 8.989 10.600 11.674 9.326 8.478 8.100 8.523 7.158 9.770 11.840 11.689 13.370 11.282 10.952 13.048 12.621 14.247 12.773 10.891 11.289 11.373 10.451 9.261 10.757 11.484 11.623 10.902 10.380 13.018 13.771 12.189 + 5.779 6.964 7.340 8.391 6.871 8.226 10.311 11.680 9.562 8.372 8.390 9.153 7.686 10.146 11.452 11.767 13.579 11.416 12.083 14.781 16.013 15.262 12.648 10.647 11.211 11.284 10.713 9.587 10.647 11.113 11.028 10.615 10.767 13.126 12.849 11.274 + 6.459 5.630 6.788 8.201 7.754 8.278 10.214 11.476 9.363 8.007 8.879 9.243 6.807 9.083 9.918 11.566 13.379 13.199 12.293 15.405 15.555 13.474 12.398 11.201 11.362 10.773 10.394 9.722 9.992 10.481 11.036 10.611 11.077 13.150 12.785 11.164 + 7.268 8.020 6.235 8.312 8.717 7.826 9.536 10.823 8.511 9.495 9.928 9.465 7.078 9.754 10.817 11.679 11.140 13.676 14.146 13.823 13.602 12.123 12.090 10.809 10.875 10.195 10.812 10.316 9.200 9.870 10.575 9.576 10.706 12.012 12.140 10.802 + 8.288 8.080 6.953 8.192 8.888 9.243 9.557 9.776 8.416 10.735 11.970 10.941 7.025 8.929 10.715 11.693 10.753 13.742 14.112 14.282 14.678 13.020 12.304 12.246 11.599 10.538 10.465 9.650 9.260 10.327 9.723 9.461 10.034 11.541 12.254 10.761 + 7.510 6.355 5.493 5.823 9.387 9.607 10.348 9.847 7.193 10.918 11.572 10.383 6.919 9.550 10.597 11.342 11.357 11.219 11.345 12.287 13.206 12.811 11.965 11.663 10.455 11.672 11.403 10.796 9.642 10.182 10.773 8.878 10.369 11.115 11.557 11.141 + 7.488 7.600 7.294 6.897 8.961 9.121 9.014 9.610 7.211 10.731 11.668 9.636 6.458 8.456 10.906 12.391 12.030 11.912 12.208 11.979 12.616 11.330 10.768 11.566 11.049 10.917 11.265 10.364 8.994 9.327 10.420 9.622 10.976 11.561 12.045 10.667 + 7.268 7.294 6.810 7.941 10.300 10.780 9.753 8.304 7.595 10.268 12.015 10.399 7.205 8.932 9.690 11.782 10.765 10.347 11.414 12.082 12.550 12.318 11.730 9.335 10.835 11.502 10.462 9.765 9.623 10.383 10.776 9.103 10.413 11.269 11.384 9.658 + 6.702 8.063 7.749 7.527 11.110 11.648 9.817 8.885 7.297 9.850 11.457 9.317 6.559 8.875 10.436 11.600 9.544 10.673 12.214 13.072 13.640 12.203 11.316 10.027 11.845 10.716 10.183 9.865 9.004 9.180 10.668 9.231 9.794 10.790 11.582 10.855 + 7.637 7.793 7.316 8.089 11.461 12.174 9.766 8.598 8.350 9.918 10.906 8.661 6.744 9.309 10.579 10.915 9.370 11.673 12.824 13.004 12.632 11.982 10.210 10.032 10.829 10.669 9.848 9.678 9.064 9.446 10.258 9.134 9.370 10.340 10.667 9.444 + 7.314 7.578 6.917 7.912 11.850 12.037 8.950 8.150 8.849 9.772 10.847 8.933 7.540 9.128 11.047 11.370 9.294 12.420 12.555 12.399 12.359 10.595 10.531 11.232 10.164 10.004 10.271 10.307 8.333 9.060 9.290 8.332 9.667 9.866 9.414 9.958 + 7.976 9.060 7.942 6.197 11.592 11.905 8.784 7.941 9.078 9.400 10.192 8.897 7.189 9.634 11.355 11.046 9.101 10.591 11.944 12.194 11.940 11.945 11.210 11.515 9.880 10.141 10.073 9.729 7.714 8.464 8.603 8.906 9.713 10.589 10.375 9.846 + 7.686 9.128 8.277 7.359 11.444 11.692 8.579 8.712 9.592 9.939 9.863 9.493 7.160 8.844 11.033 10.215 9.333 10.251 11.633 13.132 11.769 10.429 10.573 11.382 9.502 10.251 10.378 8.750 7.614 8.479 8.476 9.044 9.316 10.289 9.572 10.713 + 7.674 7.892 8.361 7.553 10.919 11.184 9.048 8.394 9.834 9.956 9.623 9.046 7.789 9.928 11.420 9.225 8.387 11.000 11.689 12.553 12.360 10.365 10.262 10.687 9.514 9.358 9.174 8.801 7.593 8.728 9.016 8.460 8.586 9.877 9.692 11.928 + 6.359 8.135 7.845 7.332 11.202 11.082 8.547 9.533 10.321 9.599 9.269 8.568 8.217 9.981 11.314 9.488 9.394 10.784 11.835 12.458 11.271 10.145 11.052 11.426 9.678 8.965 9.677 9.013 7.503 7.646 8.284 8.351 9.179 8.847 9.689 11.909 + 8.142 8.073 7.480 6.986 10.671 11.033 9.364 9.678 10.756 10.118 9.267 7.878 7.103 10.086 10.825 8.625 10.086 10.980 11.633 12.301 10.681 11.040 11.081 10.154 9.147 9.382 8.554 8.468 7.726 8.050 8.346 8.514 9.084 9.291 9.053 10.622 + 7.046 5.933 6.336 5.964 9.978 10.236 7.897 9.348 10.522 9.089 9.095 8.957 7.329 9.438 9.628 8.513 8.141 11.097 11.462 12.121 11.216 9.831 9.452 9.423 8.619 9.651 9.610 8.257 7.998 8.305 8.588 8.470 8.728 9.715 8.349 9.224 + 7.908 7.870 7.173 7.138 9.627 10.326 8.146 8.972 10.680 9.193 8.372 8.780 7.616 8.306 8.009 7.906 8.827 10.422 11.502 12.076 11.269 10.339 9.248 8.566 8.790 8.618 9.057 9.237 7.528 7.948 8.305 7.673 9.034 9.373 9.427 10.991 + 9.493 9.929 10.007 9.747 9.156 10.425 9.818 9.838 10.327 9.284 9.363 9.328 9.235 8.967 9.775 8.146 8.599 10.397 10.387 10.745 10.999 9.756 8.639 8.704 8.661 9.726 8.832 8.950 7.289 7.862 8.403 8.632 8.921 9.941 9.350 10.286 + 12.115 12.265 11.863 11.157 11.228 10.710 11.078 10.788 9.736 9.876 10.786 10.520 9.942 9.118 9.792 8.326 9.420 10.621 11.469 11.888 11.806 8.770 9.217 8.197 8.058 9.542 9.559 7.585 6.793 8.644 8.002 8.458 8.982 9.566 8.587 9.852 + 7.482 7.647 7.168 5.628 8.683 9.569 7.026 8.932 11.331 9.712 9.334 10.481 8.271 9.075 9.931 8.494 8.930 10.143 11.017 11.598 11.502 9.580 8.511 8.109 8.229 9.004 8.929 8.707 6.917 8.061 7.994 7.683 7.995 8.421 8.840 10.205 + 3.783 5.296 5.124 4.657 8.023 9.332 7.381 8.813 11.116 9.667 7.670 8.433 7.213 8.429 8.913 8.002 8.435 10.120 10.410 10.559 9.925 9.357 8.580 8.840 8.272 8.846 9.457 8.968 6.462 8.511 8.424 7.716 7.901 8.424 8.173 9.591 + 5.231 6.105 5.035 4.640 7.894 8.614 6.489 8.671 10.965 9.380 8.278 8.589 5.792 8.169 9.135 7.814 6.730 9.614 10.280 10.726 10.435 7.944 7.723 7.823 7.687 8.224 7.608 7.281 6.231 6.847 6.853 7.145 7.728 8.556 8.510 8.587 + 5.587 5.605 4.237 2.697 7.139 7.715 5.518 8.097 10.932 9.536 7.908 7.727 6.262 8.032 9.225 8.597 7.937 9.581 10.327 10.589 9.157 8.202 8.330 8.176 8.090 7.574 7.885 7.645 5.493 8.174 7.917 8.190 8.115 8.610 8.015 9.753 + 5.704 5.678 3.827 4.526 7.150 6.396 6.329 11.129 12.339 10.176 9.157 8.365 7.221 8.134 8.897 7.852 7.729 8.335 10.040 9.555 9.013 7.398 7.297 9.234 8.284 7.906 9.324 8.206 5.884 9.171 8.282 8.209 7.496 7.418 7.842 9.536 + 6.135 5.996 4.040 5.134 7.709 7.339 7.901 12.294 12.821 9.895 9.629 8.631 6.899 7.409 9.054 7.221 7.530 8.774 10.331 9.381 9.481 7.594 7.724 8.378 7.368 7.796 9.062 8.852 6.084 7.140 7.806 7.974 7.733 7.036 8.563 9.455 + 4.828 5.691 4.098 5.011 7.355 6.791 8.208 12.200 11.749 8.152 8.494 7.012 5.464 6.718 9.452 7.951 6.716 8.447 10.708 10.565 9.795 8.028 7.171 9.063 7.169 7.289 8.171 7.706 6.741 7.205 6.929 7.295 7.485 6.869 8.107 9.451 + 5.246 5.874 5.515 6.165 5.305 6.396 8.823 12.377 11.995 8.592 9.516 8.239 6.133 7.336 9.861 7.870 6.254 9.358 11.449 10.409 9.489 7.914 6.571 8.108 7.327 6.814 7.409 7.183 5.673 7.967 7.140 6.875 7.078 7.690 7.763 8.533 + 9.045 9.124 8.746 7.565 7.297 6.938 8.570 12.362 12.039 8.640 9.028 7.561 7.475 7.475 9.813 8.116 7.335 9.444 11.495 10.139 9.914 7.120 7.350 7.120 6.613 7.561 8.446 7.809 5.792 7.535 7.385 7.037 6.913 7.136 6.666 8.336 + 9.864 8.801 8.168 6.794 7.393 7.886 9.165 11.732 11.248 7.864 7.963 7.045 7.581 6.494 9.299 7.785 7.420 9.820 11.152 9.574 9.640 7.373 7.636 7.147 6.771 7.738 8.493 8.289 5.691 7.452 6.939 7.317 6.401 6.823 6.927 7.694 + 5.521 6.409 5.189 4.508 6.609 7.133 6.777 9.411 9.503 9.871 10.204 9.100 7.553 8.226 9.999 8.162 8.119 9.990 10.941 8.840 8.908 7.978 7.123 7.375 6.311 7.410 8.171 8.185 5.977 7.926 7.441 7.352 6.232 6.739 6.795 8.100 + 6.409 5.368 4.639 5.598 5.156 6.025 6.781 8.372 10.074 10.984 9.646 8.415 7.369 7.580 9.172 7.745 8.050 9.388 10.428 9.006 8.805 7.172 5.972 8.272 7.119 8.138 8.296 8.452 6.201 7.937 6.948 6.610 6.396 6.457 6.406 7.529 + 6.080 5.830 5.856 6.305 7.344 7.406 7.056 7.972 9.504 10.632 9.028 7.650 5.746 6.304 8.983 7.333 7.146 9.072 10.068 10.253 9.249 6.751 6.775 8.927 7.973 6.967 7.787 8.478 6.482 8.770 7.968 6.509 6.603 7.229 6.267 7.489 + 4.256 4.930 4.513 5.990 6.826 7.098 5.196 5.864 9.136 10.256 9.267 7.230 5.512 6.383 9.127 8.053 7.136 9.190 9.986 10.063 9.002 7.273 6.973 9.041 8.496 7.430 7.561 6.563 6.957 8.428 7.833 7.355 8.113 6.530 6.458 8.171 + 5.569 7.943 7.843 7.888 6.806 5.221 5.594 7.057 8.801 9.087 8.655 7.620 6.316 6.499 8.960 8.220 7.139 9.143 9.971 8.771 8.472 7.881 6.966 7.675 7.532 7.202 7.575 6.305 6.613 7.546 7.860 6.773 7.751 7.246 7.043 7.437 + 12.440 12.441 11.737 11.239 10.669 9.824 9.995 9.549 8.119 7.697 8.554 7.234 6.425 7.143 8.688 8.227 6.823 8.338 10.073 8.866 8.246 7.491 8.529 8.892 7.978 8.261 7.769 7.591 7.708 8.727 8.503 6.850 8.100 8.287 8.200 7.345 + 11.796 11.351 10.248 9.283 9.761 9.395 8.821 8.604 9.458 8.610 8.256 7.534 6.498 6.641 8.220 8.534 7.363 8.619 9.325 8.583 7.851 8.155 7.466 7.834 7.628 8.318 8.238 7.079 7.651 8.858 9.276 7.086 8.584 8.990 8.578 8.447 + 6.983 8.247 8.286 6.948 8.302 8.804 8.820 9.028 8.274 8.605 8.873 6.739 8.695 8.765 9.686 10.081 9.585 9.258 10.290 10.647 10.540 8.229 7.531 8.986 9.011 8.022 9.642 9.020 8.291 9.699 9.643 8.463 9.216 9.166 9.134 7.803 + 6.962 6.852 7.064 7.527 7.812 9.704 10.219 8.384 8.957 9.162 9.456 8.582 8.546 8.660 9.123 9.998 9.050 9.058 9.597 9.465 10.130 8.049 8.578 8.908 10.307 9.022 9.524 8.960 8.564 9.409 8.948 9.001 8.685 9.678 9.765 8.788 + 8.591 9.625 8.354 8.400 9.989 9.760 9.985 8.395 8.891 9.609 9.208 8.904 9.382 9.584 8.711 10.231 9.661 8.304 9.425 9.694 9.893 8.923 9.008 9.210 10.254 9.827 9.494 10.021 9.966 10.501 10.091 9.915 10.505 11.144 10.686 10.102 + 7.708 9.679 10.174 10.518 10.603 11.797 10.551 9.431 9.400 9.891 10.181 9.176 9.175 10.552 9.723 11.021 10.575 10.174 10.564 9.281 10.044 9.481 9.873 9.088 9.865 10.487 10.739 11.384 11.250 10.280 10.893 10.774 10.861 10.337 10.931 10.061 + 8.093 8.088 9.439 10.141 9.798 10.260 10.498 10.577 8.872 10.608 10.840 8.912 10.279 10.294 9.963 10.627 10.373 11.368 11.330 10.625 9.988 9.761 10.116 9.899 10.353 10.756 10.496 11.258 10.816 10.002 10.476 10.421 10.674 10.435 11.161 10.580 + 8.900 9.084 9.028 8.455 9.117 9.684 9.350 10.357 10.137 10.049 10.919 9.533 9.287 8.308 9.348 10.459 11.279 10.459 10.825 9.523 7.942 8.457 9.737 9.408 9.958 10.330 11.214 10.796 10.402 10.068 9.769 10.326 11.217 9.666 11.003 9.831 + 7.787 8.478 7.543 9.243 9.029 8.303 8.367 9.928 9.267 10.236 10.155 9.039 10.304 9.981 9.494 9.958 12.028 11.573 10.204 8.949 9.278 8.648 8.831 8.988 9.011 9.250 10.579 10.424 10.403 9.470 8.502 9.983 10.849 11.036 10.959 9.756 + 7.473 7.509 7.979 8.306 9.343 10.221 9.449 9.034 9.782 9.029 10.619 10.336 8.367 9.663 10.280 10.055 9.739 11.568 11.302 11.214 11.341 9.981 8.952 8.232 9.790 9.391 9.136 10.112 9.126 10.184 9.751 9.798 11.472 11.394 10.574 10.400 + 9.037 8.824 8.172 7.419 9.957 9.877 9.028 7.800 7.672 9.400 10.846 10.993 8.761 10.372 10.588 10.993 11.187 12.596 10.990 10.005 10.951 10.544 9.885 9.277 10.647 11.149 11.586 10.964 10.419 11.025 10.006 9.381 10.171 10.785 10.467 10.262 + 5.596 6.647 7.722 9.262 10.181 9.736 9.111 10.122 9.323 9.747 12.524 12.004 9.833 10.958 10.446 10.513 11.152 12.006 11.075 10.315 10.241 10.638 9.644 9.932 9.755 11.214 11.171 10.930 11.081 10.930 10.702 9.937 10.841 11.415 11.292 10.704 + 4.509 6.094 6.772 6.401 6.246 7.162 8.814 9.784 10.268 8.734 11.379 11.390 9.031 10.421 9.991 10.077 10.497 11.228 11.132 10.542 10.154 10.345 9.265 9.587 9.816 10.556 11.229 11.134 10.125 10.478 10.472 10.572 11.115 11.409 11.770 10.739 + 6.803 6.310 7.935 8.132 8.529 8.872 9.219 9.895 9.747 8.923 10.599 10.247 8.369 8.896 9.786 9.291 10.251 10.737 11.101 11.968 9.332 8.426 9.427 9.223 9.118 9.778 10.997 10.007 9.147 9.762 9.710 9.090 9.926 10.578 10.536 10.098 + 7.758 7.383 7.102 6.424 9.002 9.025 8.954 10.314 10.181 9.090 9.658 8.026 7.725 8.491 9.442 9.483 9.804 10.530 10.463 10.866 8.608 8.044 8.540 9.515 9.549 9.861 10.740 9.870 8.624 10.141 10.351 9.826 9.932 10.786 11.526 10.663 + 8.591 7.612 7.915 7.638 9.803 10.193 8.949 11.144 11.273 10.059 10.975 9.674 7.648 7.195 7.562 8.453 8.196 8.903 9.068 8.481 7.979 8.599 9.092 10.369 9.488 9.222 10.379 9.261 8.919 9.347 9.957 9.372 10.187 11.131 11.429 11.095 + 9.798 9.910 10.172 9.442 8.929 9.673 9.952 11.085 10.864 9.829 9.592 8.833 8.511 7.510 9.612 9.844 9.783 10.157 9.030 8.674 7.922 8.158 8.151 8.996 8.068 8.369 10.396 9.853 8.806 9.356 8.775 8.652 10.095 10.468 10.773 10.486 + 5.217 6.492 6.959 6.168 7.152 8.455 9.572 10.486 10.681 10.241 9.881 6.556 7.127 7.673 7.558 8.480 8.346 9.972 9.539 9.460 7.991 6.081 7.230 8.858 7.885 8.077 10.260 9.652 8.017 8.732 8.801 8.939 10.256 10.376 11.254 10.127 + 5.115 4.543 5.432 6.745 7.455 8.970 8.753 10.156 10.445 10.151 9.644 7.218 6.508 7.487 7.475 8.303 9.352 10.468 9.650 9.788 9.056 7.279 7.713 8.209 8.174 8.292 10.263 9.162 7.511 8.860 7.998 8.208 9.806 10.451 10.879 9.528 + 5.312 6.422 6.420 6.810 7.986 9.149 7.876 10.275 10.368 10.028 9.644 7.389 7.202 8.581 7.718 8.315 9.713 9.810 9.761 9.623 8.914 7.740 7.585 8.030 9.226 8.298 10.290 9.408 8.307 8.637 8.110 8.091 9.888 10.245 10.124 10.057 + 7.547 5.794 4.743 6.228 7.503 8.547 6.800 10.215 10.290 10.152 10.139 9.453 6.784 7.627 7.389 8.715 9.413 10.306 9.312 10.706 10.302 8.202 8.415 8.274 9.567 9.862 10.382 10.325 9.413 9.601 9.806 8.682 9.962 10.330 10.278 8.757 + 9.085 8.799 6.706 5.647 6.795 5.767 6.623 9.501 10.047 9.977 10.566 9.909 7.365 7.779 7.406 7.907 9.104 10.189 8.348 8.796 8.926 7.610 8.549 7.965 8.628 10.327 11.264 10.357 8.813 8.976 8.832 8.678 9.428 9.290 9.267 8.880 + 8.187 8.441 6.366 6.298 7.564 7.607 6.364 9.788 10.264 10.324 10.301 9.474 6.767 7.792 7.164 7.145 8.946 9.865 9.122 9.271 9.172 8.085 8.527 8.793 9.469 10.047 10.482 9.350 7.914 8.211 7.806 7.786 8.289 8.255 8.370 7.875 + 7.066 7.400 5.724 5.415 7.784 7.711 7.195 10.240 10.439 10.216 9.880 8.859 6.084 6.955 6.755 5.723 6.984 8.475 9.340 9.677 9.983 9.928 9.583 9.902 10.248 9.962 9.980 9.552 8.969 8.176 8.577 8.509 8.383 7.802 8.618 8.102 + 7.164 7.392 5.739 5.818 6.024 6.533 7.085 10.352 10.287 9.676 8.381 6.893 6.577 6.288 6.143 6.780 6.866 7.070 7.758 7.809 7.591 7.591 7.509 7.990 8.465 8.011 9.801 9.319 8.305 7.460 8.554 8.787 7.245 7.523 7.198 7.324 + 12.700 13.733 13.796 13.110 12.545 12.297 12.600 12.954 13.550 12.676 12.375 12.738 11.887 11.082 11.402 11.790 12.257 12.374 12.764 13.370 13.001 12.384 11.871 11.552 10.648 10.496 11.354 10.011 8.931 9.785 10.026 11.341 10.716 9.184 8.558 7.987 + 15.013 15.682 14.879 13.493 13.707 14.327 15.049 15.359 15.163 13.840 14.037 14.045 13.286 12.473 12.859 12.625 13.016 13.626 13.806 15.377 14.509 13.581 13.238 12.919 11.812 11.697 12.799 11.368 10.414 11.084 11.434 13.552 13.074 11.094 10.036 8.742 + 14.684 13.776 11.908 12.438 11.962 14.117 15.822 15.558 13.532 12.920 12.614 13.037 12.039 11.592 11.635 11.884 12.926 13.424 13.173 14.964 15.169 12.872 12.547 12.811 11.372 11.095 12.416 11.191 9.858 10.291 11.017 13.379 12.954 10.954 9.799 8.686 + 11.081 10.050 9.790 8.962 9.378 11.166 11.886 11.026 10.693 10.135 10.791 8.213 7.257 6.306 8.181 8.543 9.267 9.791 10.148 10.011 10.734 8.182 7.977 7.178 6.766 7.071 7.266 7.276 6.815 7.851 8.169 10.983 10.294 7.542 7.641 7.593 + 6.589 7.001 7.152 6.556 7.353 7.013 9.430 11.176 10.488 7.658 9.918 8.312 5.516 4.817 7.184 7.284 7.756 8.600 9.406 9.290 9.068 7.778 7.168 7.850 8.152 8.324 7.939 7.041 6.514 6.982 7.167 7.717 8.380 7.931 7.823 6.872 + 4.307 5.630 6.214 5.309 7.534 7.552 8.756 10.883 10.528 7.006 9.582 9.168 5.516 5.948 7.619 7.746 8.990 8.870 10.170 10.241 8.910 7.892 6.783 6.827 8.423 8.806 7.255 7.355 5.906 7.359 7.031 7.592 8.960 8.075 8.145 7.923 + 7.323 6.909 5.957 5.838 8.165 7.665 8.316 11.074 10.309 6.309 9.956 9.879 7.506 6.875 6.801 7.386 8.983 8.583 10.452 10.166 8.623 8.620 7.563 6.851 8.664 8.649 7.194 7.949 7.555 8.175 7.128 7.101 8.871 8.379 8.692 8.633 + 6.486 6.905 5.373 5.562 8.303 7.813 7.905 10.754 10.152 6.798 10.477 11.278 8.365 6.469 6.093 6.881 7.802 8.302 10.634 11.771 10.087 7.685 7.815 7.840 7.636 8.627 8.352 8.105 6.270 7.835 8.055 7.219 8.790 9.390 9.881 9.813 + 6.428 6.677 4.977 6.490 8.294 7.444 8.169 10.467 9.863 7.464 9.723 11.206 8.651 7.085 6.628 6.984 7.718 8.566 8.881 11.469 9.887 8.655 8.139 8.216 7.318 7.685 8.060 8.429 6.523 9.076 9.318 7.622 9.650 9.802 9.884 9.403 + 4.720 5.772 6.600 6.247 7.838 6.969 8.058 9.878 9.250 6.976 10.796 11.409 7.742 6.485 7.331 7.880 8.349 8.367 10.762 11.608 9.648 7.161 7.297 7.610 8.202 7.639 8.343 8.192 6.945 9.497 8.858 8.686 9.721 10.147 10.419 10.172 + 3.111 4.938 5.406 4.414 7.432 7.171 6.765 8.432 8.541 7.384 10.992 11.111 5.955 5.489 5.352 6.937 8.191 8.426 10.841 11.420 9.978 6.758 6.821 7.782 8.970 8.884 8.457 7.580 6.977 8.072 8.137 7.679 9.699 9.551 10.323 10.208 + 6.025 5.207 5.466 5.210 7.519 7.203 5.341 6.121 7.346 7.833 11.412 10.797 5.798 6.652 6.933 7.849 7.899 8.089 11.287 10.616 9.539 8.056 6.816 7.927 7.959 8.151 8.027 8.966 7.659 9.231 9.213 7.310 8.434 9.215 10.057 8.916 + 5.578 6.341 5.549 6.409 7.473 6.420 5.968 7.190 7.245 8.890 11.599 10.194 5.202 6.013 6.645 7.235 8.326 9.225 11.814 11.062 8.845 9.046 8.605 8.818 9.117 7.945 7.292 8.300 7.346 8.170 7.815 6.782 8.355 9.306 10.017 9.983 + 6.455 6.983 5.179 5.563 6.927 6.351 6.928 6.330 6.474 9.730 11.630 9.393 5.471 7.562 7.356 7.167 8.336 10.263 11.028 10.204 10.475 8.396 7.704 9.261 8.563 7.293 8.357 8.534 7.158 9.001 8.945 6.996 9.274 9.217 10.008 10.474 + 6.043 7.299 6.943 6.686 7.813 6.660 6.682 7.504 7.113 11.111 11.511 8.394 5.863 6.715 7.027 6.828 7.895 9.859 9.814 10.332 9.452 7.666 7.744 9.770 7.990 7.532 8.369 8.527 7.032 8.643 8.152 7.832 9.261 9.440 9.426 9.822 + 4.686 5.032 5.753 6.715 7.991 6.980 5.656 4.928 6.153 11.022 11.365 8.084 5.338 6.868 7.032 7.043 8.162 9.870 9.816 9.928 9.018 7.561 7.654 9.225 6.666 6.598 7.299 8.878 7.642 7.316 7.323 6.320 9.651 8.741 9.133 9.813 + 5.218 3.511 4.922 6.110 6.540 5.661 5.973 6.041 6.576 10.727 10.763 6.912 4.885 6.407 6.891 7.370 7.839 10.269 9.868 9.106 8.492 7.430 7.924 8.520 6.514 7.477 6.484 8.673 7.315 6.436 7.269 5.877 8.469 8.922 9.168 10.388 + 4.964 5.354 6.443 5.725 5.912 5.875 7.283 7.462 7.513 10.889 10.432 5.018 4.786 6.776 6.479 7.501 8.456 10.471 10.629 9.570 7.428 7.296 7.579 7.554 7.085 7.779 7.293 8.204 7.556 7.009 7.138 6.054 8.630 9.045 9.825 9.884 + 5.844 5.071 4.899 6.471 7.131 6.741 5.324 5.487 9.025 11.550 10.601 5.697 5.914 5.172 5.845 6.559 7.570 10.965 10.417 9.220 8.678 7.478 7.810 7.860 7.018 6.986 7.071 7.878 7.642 6.986 6.262 6.179 8.147 9.489 10.350 8.967 + 6.224 6.407 6.090 6.939 6.702 7.838 9.079 8.674 8.218 11.410 10.653 7.302 5.958 5.528 6.278 7.829 9.132 11.922 10.213 9.598 8.327 6.246 7.224 7.662 7.068 6.134 6.068 7.948 7.009 6.630 6.231 6.054 8.853 10.388 10.204 9.898 + 6.675 6.186 6.576 6.820 5.575 6.216 9.095 8.894 8.185 10.848 9.965 7.447 5.981 5.159 5.567 6.539 9.245 11.752 10.333 9.483 7.114 6.105 7.183 8.042 7.599 6.756 6.009 7.006 6.676 7.329 6.771 5.917 9.041 9.675 9.768 9.050 + 7.136 7.116 6.353 5.089 6.672 7.032 8.953 8.235 8.978 10.393 8.736 8.032 6.135 5.882 6.940 6.906 11.130 11.322 9.647 8.760 8.044 7.435 7.134 6.769 5.579 6.246 5.879 7.302 7.144 7.224 6.988 6.071 8.595 8.784 9.185 7.806 + 4.999 4.880 3.160 4.696 5.384 5.376 6.559 6.412 9.370 9.895 7.674 6.074 5.050 7.083 7.053 6.822 10.894 10.095 8.298 9.691 8.020 6.686 6.250 6.314 5.839 4.662 6.435 8.124 7.504 6.951 6.755 5.808 8.166 8.516 8.936 8.703 + 5.162 5.644 5.352 6.785 6.847 7.395 7.086 7.296 8.724 8.930 6.044 6.557 4.888 5.739 7.226 7.150 9.336 8.590 9.467 9.250 8.286 7.216 6.068 6.399 5.791 5.535 5.363 7.489 6.290 6.801 6.359 5.404 8.113 8.599 8.916 9.093 + 6.764 6.969 6.981 6.571 6.664 6.189 5.730 6.750 7.215 8.059 6.814 6.940 5.484 5.811 6.254 6.361 8.419 8.127 8.894 9.249 8.360 6.800 6.192 6.315 5.043 4.655 5.730 7.969 6.820 6.865 6.413 4.583 7.988 8.872 9.709 9.035 + 7.453 9.077 8.227 5.957 7.840 8.601 8.846 8.865 8.760 6.931 6.372 6.427 6.685 5.349 6.127 7.067 7.989 8.240 8.957 8.570 6.191 6.567 6.892 6.332 6.148 4.671 5.881 7.151 6.916 6.309 5.312 5.280 8.144 8.767 9.770 8.972 + 8.586 8.458 9.052 8.026 9.159 9.291 9.170 7.964 6.866 5.476 7.163 8.722 7.817 6.179 6.271 7.146 7.352 7.145 8.464 8.664 5.838 7.460 7.912 7.043 6.692 6.879 5.383 8.095 7.649 7.069 5.895 5.465 8.576 9.558 8.932 8.303 + 7.498 7.968 8.269 7.311 9.408 9.590 9.688 8.370 6.486 4.901 6.733 7.671 7.278 6.963 6.387 7.752 7.829 7.400 7.914 7.936 7.725 6.908 5.377 6.978 7.123 7.837 5.982 9.086 8.474 8.147 6.481 6.278 7.782 8.366 8.653 7.388 + 7.921 6.681 8.041 8.349 8.736 7.821 8.383 7.331 6.126 4.622 7.402 7.848 6.853 7.869 8.850 8.457 8.297 8.296 8.931 8.134 6.571 6.635 6.871 7.195 7.211 6.424 7.028 8.308 7.979 7.007 5.766 5.788 6.534 6.873 7.096 7.587 + 7.835 7.179 7.029 7.871 8.316 8.989 7.498 7.281 6.200 5.107 7.338 8.068 6.832 8.125 8.020 6.980 6.023 7.543 7.745 7.504 7.299 6.138 5.810 5.924 5.350 4.169 4.915 6.172 7.014 6.390 6.188 5.356 6.398 7.126 6.735 6.261 + 8.334 7.546 7.412 6.926 6.939 8.561 8.921 8.225 5.870 5.736 5.372 6.424 6.638 5.166 4.523 5.561 4.980 6.706 7.218 7.727 6.928 6.127 4.357 4.093 4.612 3.928 3.305 4.536 4.877 4.966 5.908 5.220 5.624 6.725 6.915 5.879 + 8.772 8.059 7.612 7.467 6.669 6.563 6.526 6.821 6.781 7.393 6.229 5.849 5.666 4.826 4.675 4.851 5.350 6.196 8.261 7.305 4.668 4.165 4.352 4.563 3.953 3.838 3.220 4.036 5.092 4.793 5.181 4.739 6.853 7.231 6.846 5.200 + 8.157 7.057 5.334 5.291 6.397 7.244 6.749 7.080 5.944 5.969 5.035 6.326 5.096 5.818 5.714 4.788 6.575 6.822 7.289 7.254 3.596 4.258 4.399 5.842 5.738 5.108 5.193 4.967 5.091 5.352 5.658 4.225 5.525 5.776 6.201 4.489 + 7.692 6.630 7.375 7.749 8.288 7.797 6.737 7.146 6.876 5.926 5.538 5.122 5.490 5.680 6.827 6.074 6.522 6.545 7.410 7.360 5.324 4.947 4.334 5.415 5.120 4.749 5.269 4.973 5.528 5.933 5.699 4.694 4.476 5.013 5.116 3.770 + 9.527 8.135 7.915 6.781 7.713 7.923 8.191 7.963 6.087 5.533 6.618 6.356 5.126 5.155 5.884 5.991 6.660 5.559 6.222 6.990 6.148 4.749 5.037 5.343 6.129 5.257 5.000 5.930 5.984 6.056 5.380 5.093 5.037 6.332 5.882 5.060 + 8.750 7.615 8.119 7.530 6.900 7.136 8.266 7.686 5.346 5.731 6.573 6.276 4.983 5.999 6.201 5.846 6.939 7.245 6.860 5.674 5.616 4.584 4.662 4.941 5.558 4.808 4.887 4.999 4.789 4.995 4.902 5.485 5.169 4.757 4.577 3.949 + 8.980 7.773 6.417 7.065 7.461 7.710 7.297 7.806 6.858 6.390 6.375 5.523 6.130 6.050 4.804 5.327 6.586 6.448 6.257 5.822 4.891 4.642 4.227 4.152 4.762 4.999 4.945 5.521 5.417 4.923 5.082 4.265 4.585 4.560 4.268 3.653 + 10.145 10.142 9.261 8.334 9.443 8.975 8.121 5.186 5.182 5.940 4.716 5.282 5.911 6.287 5.718 6.369 7.505 6.862 5.441 4.985 5.452 5.267 4.998 4.977 5.078 4.823 5.330 5.520 6.460 6.317 6.001 5.384 6.074 5.923 4.830 4.148 + 8.303 8.479 7.237 7.285 9.228 8.963 7.855 6.890 5.265 5.337 6.207 6.709 7.080 6.900 7.105 7.439 6.897 6.214 5.253 4.677 5.432 5.528 5.182 4.469 4.508 4.128 4.411 5.699 4.891 5.147 5.692 5.719 5.112 5.004 3.699 3.912 + 6.017 6.008 6.681 5.736 7.589 8.909 8.556 6.060 4.240 4.759 6.617 6.114 6.262 6.012 5.880 5.920 6.469 5.914 5.850 4.643 5.341 4.695 4.541 5.030 4.557 3.660 4.933 5.431 5.231 4.527 6.556 6.547 5.393 4.974 4.195 3.397 + 5.915 3.947 4.748 4.571 3.836 4.661 5.854 5.039 5.049 4.411 3.601 3.833 2.975 3.969 4.068 5.067 5.593 5.085 4.563 3.899 3.329 4.558 4.307 4.025 3.903 2.727 2.474 3.307 3.213 3.806 3.698 3.164 3.352 3.932 2.790 2.423 + 4.154 2.754 3.453 5.217 4.860 4.449 5.373 4.931 3.896 2.931 3.516 3.695 3.899 4.536 4.084 3.658 4.598 4.772 4.840 5.105 4.945 4.917 4.804 3.934 4.211 3.260 3.085 3.699 3.001 2.900 2.573 2.935 2.592 3.082 3.045 1.182 + 2.994 3.416 2.627 4.517 5.771 6.444 6.775 5.514 3.495 3.413 4.409 4.738 3.930 3.533 3.116 4.997 5.391 5.952 5.883 4.953 4.306 5.014 5.610 5.153 4.095 3.018 2.474 2.208 2.072 2.517 1.929 2.178 1.954 1.740 1.916 1.557 + 4.137 3.977 3.809 1.695 3.812 4.711 5.123 3.902 4.415 4.095 3.367 3.402 3.716 4.686 4.026 4.751 4.805 4.030 3.901 2.681 3.485 5.346 6.504 6.282 4.573 3.271 2.496 2.334 2.394 2.151 1.692 2.167 1.762 2.253 2.054 2.080 + 4.810 4.931 2.927 3.657 4.329 5.146 5.431 5.607 4.066 3.968 3.472 4.052 3.764 5.350 4.917 4.279 4.694 4.731 4.561 4.715 4.098 5.100 5.612 6.618 5.894 5.330 6.036 6.935 5.788 3.220 3.024 3.972 3.602 4.543 3.681 2.541 + 4.687 5.383 4.107 1.981 4.795 6.474 6.660 6.177 4.699 5.350 4.902 3.557 2.088 4.518 4.338 3.537 3.368 5.147 4.745 5.773 5.155 5.438 5.193 5.881 7.576 7.208 7.686 8.142 7.040 6.185 5.612 6.082 5.537 6.130 4.638 3.459 + 4.018 5.236 4.910 4.449 3.794 4.259 6.189 6.257 6.045 4.445 3.032 3.788 2.416 2.562 3.482 3.701 2.409 4.607 4.939 4.992 4.608 6.254 6.129 4.693 7.808 7.530 7.303 7.812 8.067 7.118 6.032 6.686 6.053 6.046 5.843 4.537 + 6.454 5.719 4.645 3.655 3.836 5.247 4.879 4.949 5.434 4.412 2.290 2.032 3.002 3.615 3.874 3.977 4.439 3.918 4.076 4.343 4.311 4.282 5.964 5.735 8.409 7.940 6.668 6.756 8.088 5.892 5.338 6.293 6.242 5.679 5.781 6.304 + 5.420 4.176 2.851 3.425 4.526 5.752 5.246 5.143 5.108 4.629 3.689 3.189 4.037 3.724 3.849 3.240 4.408 4.486 4.182 4.919 5.537 5.425 6.288 7.675 8.856 7.260 7.329 7.179 7.488 5.832 5.679 6.101 6.208 6.586 6.441 6.129 + 4.342 5.180 5.316 4.330 3.633 5.145 6.086 4.507 4.730 6.480 5.005 5.308 7.050 5.660 4.201 4.043 4.367 4.935 4.496 6.283 7.444 8.165 7.953 8.682 8.053 7.462 8.660 8.112 6.706 6.314 6.343 6.871 6.349 6.261 7.049 6.054 + 3.595 5.699 5.695 4.036 4.896 5.105 5.722 3.405 6.054 7.851 6.158 5.825 8.114 6.450 4.355 3.601 4.638 5.757 4.884 6.937 7.750 7.385 7.877 8.325 7.850 7.522 7.845 8.363 6.965 6.046 6.900 6.570 5.623 6.661 7.133 6.262 + 5.339 6.211 5.945 3.566 4.157 5.292 5.658 4.665 5.849 6.834 6.550 5.876 7.684 6.309 4.464 4.135 5.718 7.890 6.791 7.764 8.176 7.768 6.664 7.970 8.449 7.743 8.452 7.460 6.346 6.032 6.662 6.231 4.650 5.324 5.585 4.565 + 4.013 5.510 6.110 3.962 4.948 5.740 6.997 6.270 7.297 9.136 8.326 4.743 7.620 7.510 6.205 6.512 6.630 9.024 8.104 10.203 9.358 8.517 7.780 8.138 7.910 8.126 8.712 7.874 6.711 6.622 6.672 5.494 5.078 5.460 5.607 3.607 + 4.123 6.070 5.996 3.121 2.735 6.696 7.414 4.601 6.779 9.404 8.704 5.685 9.407 8.627 7.119 8.201 7.531 10.219 9.329 10.984 9.600 9.441 7.648 7.046 7.681 8.535 8.648 8.385 7.472 6.375 5.385 5.132 4.621 4.320 4.036 3.146 + 3.070 5.626 5.413 1.846 2.914 7.352 8.499 6.189 5.039 8.021 8.014 6.600 9.973 9.325 8.356 9.617 8.578 11.747 10.195 11.432 9.553 8.374 7.958 7.598 7.500 7.901 8.281 8.575 8.086 6.192 5.003 6.441 5.093 4.895 3.885 2.695 + 4.167 5.562 6.142 3.907 2.909 7.532 8.924 6.532 5.906 8.783 8.804 5.690 8.728 9.537 8.435 10.806 9.176 12.649 11.667 11.284 10.083 8.563 7.045 7.828 8.815 9.349 9.978 9.494 8.275 7.255 5.864 5.184 4.977 5.029 3.783 2.434 + 3.758 5.570 6.407 4.273 3.812 7.539 9.269 7.409 4.842 8.084 9.119 5.963 9.919 10.825 7.553 11.174 10.329 12.879 12.400 10.363 10.328 8.228 7.156 7.030 9.045 9.626 10.805 10.238 9.017 8.074 6.681 5.179 5.278 4.877 3.628 2.569 + 4.133 6.312 6.709 3.776 3.729 7.200 9.513 8.082 4.513 9.105 9.960 6.688 10.004 11.493 8.631 11.927 11.129 12.494 12.341 10.714 10.771 7.812 6.822 7.348 8.508 9.484 11.216 9.534 9.476 9.013 6.599 4.652 5.204 5.975 4.951 3.015 + 2.206 6.107 6.745 4.834 4.618 7.555 9.613 8.058 4.684 9.877 10.647 7.315 10.282 11.869 9.165 12.428 11.613 11.395 11.689 10.546 10.734 6.982 6.603 7.381 8.481 9.110 11.070 9.787 9.547 9.446 8.515 6.092 6.166 6.786 6.969 4.589 + 3.821 5.740 6.400 3.644 2.957 7.208 9.569 8.075 5.430 10.240 10.940 7.642 10.625 11.975 8.910 12.591 11.846 11.480 11.552 10.028 10.394 7.270 6.603 6.947 8.573 9.230 10.988 9.704 10.096 10.123 9.481 6.803 6.133 7.768 7.894 5.846 + 4.051 5.892 6.467 4.606 2.697 7.314 9.710 8.477 4.144 9.625 10.724 7.734 10.156 11.872 9.079 12.545 12.004 10.466 10.578 9.394 9.712 7.146 6.853 6.782 7.447 8.298 11.333 10.603 10.419 10.408 10.707 6.960 6.075 7.407 8.218 5.546 + 4.688 5.252 6.432 4.856 2.693 6.678 9.294 8.507 4.542 8.724 10.272 7.633 9.508 11.731 9.377 11.520 11.520 8.367 8.884 8.607 8.528 6.590 7.228 5.946 6.614 8.150 12.105 11.014 10.059 10.112 10.150 7.677 6.016 7.087 7.816 5.410 + 4.547 5.952 6.558 4.347 4.149 5.365 8.792 8.543 4.674 8.955 10.056 7.178 8.780 11.284 9.285 9.999 10.616 8.070 9.280 7.555 8.522 6.064 6.544 5.842 6.969 7.799 11.646 10.487 8.711 9.356 10.320 7.506 6.611 6.231 7.536 6.187 + 6.064 6.108 7.664 6.663 3.981 6.070 9.551 9.188 4.411 8.706 9.643 6.057 8.370 9.801 7.672 8.402 9.217 7.653 7.858 7.080 6.795 5.814 5.102 6.037 7.540 7.790 10.098 9.411 7.834 8.174 8.757 7.538 6.707 6.322 7.270 5.759 + 3.982 6.936 8.212 6.414 2.481 6.126 9.581 9.273 5.126 8.697 9.765 6.948 7.576 8.772 6.899 7.551 7.821 6.861 8.724 8.284 8.789 7.899 7.154 7.775 9.503 7.614 7.891 6.821 7.403 6.814 7.506 6.809 5.751 5.196 5.807 5.251 + 5.409 7.425 8.562 6.379 5.583 8.337 9.557 8.360 6.754 8.873 9.678 6.464 6.466 7.809 7.105 7.593 8.698 7.760 9.016 8.673 8.443 7.545 7.517 7.521 9.130 6.998 7.548 6.744 6.142 6.220 6.754 6.351 4.664 4.457 5.728 5.022 + 5.078 7.699 9.086 7.744 5.222 8.010 9.831 9.413 7.249 8.570 8.671 6.923 6.365 8.150 6.825 7.358 8.561 7.596 8.709 8.283 7.569 7.233 6.389 6.889 8.252 6.388 6.124 5.832 5.646 5.587 6.210 5.876 4.064 4.180 4.724 3.260 + 5.913 7.642 8.879 7.245 4.329 5.110 7.679 8.335 5.917 7.433 9.106 7.637 6.297 7.663 6.608 6.238 7.623 6.004 7.146 7.423 7.647 6.219 6.629 6.306 7.277 5.949 6.346 5.663 4.816 4.746 4.808 3.884 3.515 3.983 4.381 2.691 + 11.430 11.663 11.396 10.078 9.959 10.290 10.916 10.456 9.860 9.389 9.033 7.384 8.152 8.112 7.203 8.148 8.310 6.771 7.690 7.832 7.258 6.481 6.558 6.231 6.725 5.541 5.705 6.006 5.336 5.568 5.066 4.549 4.301 3.032 3.909 2.872 + 12.166 11.694 10.735 10.177 9.015 9.908 10.565 10.437 9.740 8.950 7.472 6.850 7.570 7.506 6.578 7.153 8.143 7.598 8.453 7.085 7.043 6.551 7.005 6.216 5.490 5.684 5.435 5.285 5.241 5.793 5.996 5.391 5.384 3.982 3.841 3.839 + 7.025 8.480 9.302 7.389 5.388 5.745 5.580 5.030 4.592 4.497 6.177 5.379 4.908 5.862 4.990 7.530 7.516 8.196 8.468 9.335 9.816 7.338 8.096 7.779 7.544 6.808 6.185 5.795 5.314 5.363 5.806 5.576 4.860 3.476 3.702 2.730 + 5.533 7.083 8.498 7.177 4.974 7.001 8.229 6.500 5.085 3.558 6.325 5.556 5.492 5.831 5.218 7.005 7.054 7.127 8.283 9.240 10.411 8.148 8.384 8.303 7.688 7.353 7.638 6.723 5.021 4.560 5.506 4.300 4.201 3.638 3.975 2.211 + 7.034 7.151 7.502 7.185 5.453 8.126 9.918 8.339 5.734 5.042 5.899 5.632 4.238 6.199 5.238 6.117 5.790 8.244 8.715 9.792 10.396 8.838 8.911 7.948 7.407 7.568 8.073 6.225 5.063 5.663 5.740 5.184 4.723 4.187 3.182 2.396 + 8.277 7.997 7.669 7.080 6.750 8.939 10.948 9.786 6.657 5.716 6.640 5.849 6.070 7.066 5.250 5.163 5.077 9.413 9.064 11.445 11.044 9.355 8.054 8.333 7.521 7.131 6.960 5.609 6.456 6.245 5.271 3.563 4.098 5.056 3.778 1.794 + 3.858 6.076 7.043 5.086 4.943 9.514 11.028 9.012 4.404 6.343 5.807 3.157 5.627 5.809 4.963 5.224 6.020 10.855 10.296 12.651 12.026 10.573 8.797 8.234 7.078 5.761 6.268 6.267 6.139 6.129 6.052 4.498 3.476 4.623 3.770 2.678 + 5.904 6.461 7.273 5.555 5.974 10.193 11.105 8.228 5.576 7.893 7.241 4.066 6.168 5.623 4.650 5.883 7.626 11.066 9.879 11.526 10.112 10.686 8.344 7.192 6.962 5.494 5.822 5.058 5.927 6.658 5.606 4.947 4.382 4.290 3.619 1.958 + 6.042 5.385 6.353 5.334 6.655 11.193 11.768 9.200 6.584 8.658 7.253 5.507 7.080 5.756 4.468 5.494 8.332 10.309 9.320 10.667 8.938 8.129 7.502 5.803 4.959 4.783 5.600 5.293 6.020 6.636 5.777 4.818 4.954 4.813 4.179 2.512 + 1.702 4.436 5.830 5.969 7.966 11.234 10.688 7.142 7.130 8.820 7.139 5.771 7.565 5.531 5.468 5.731 7.018 8.017 8.638 9.656 8.864 8.338 7.096 6.074 4.850 5.065 5.519 4.953 5.533 5.828 5.242 3.904 3.398 3.862 4.032 1.888 + 5.330 6.105 5.465 4.362 8.784 11.018 9.609 6.648 7.402 8.270 5.539 6.623 7.479 6.000 5.383 5.673 6.792 7.270 8.911 9.369 8.957 7.823 7.337 6.155 5.889 5.300 4.693 4.500 5.672 6.628 6.254 3.966 3.570 3.624 2.995 1.960 + 6.497 6.822 6.690 6.384 9.607 11.136 9.349 4.473 6.946 7.578 5.004 3.900 4.938 6.128 6.163 4.791 6.754 8.238 8.834 10.077 9.560 9.718 8.112 7.329 7.337 6.368 6.350 6.765 5.948 6.473 6.732 5.450 5.152 6.033 5.636 4.791 + 7.064 8.181 8.081 6.698 9.846 11.067 8.728 5.165 5.269 6.048 6.333 5.211 4.017 6.462 6.696 5.373 6.782 9.160 9.016 11.418 10.287 10.173 8.840 7.545 6.925 7.435 7.996 7.404 7.284 7.628 7.870 6.284 6.403 6.903 6.920 6.342 + 6.967 8.076 8.057 6.734 10.413 11.326 9.504 6.699 6.856 6.522 6.029 6.021 4.924 6.147 5.394 6.307 6.408 9.563 9.404 10.562 9.552 9.101 8.868 8.335 8.096 8.589 7.709 7.404 6.812 7.581 6.574 5.636 6.386 6.780 6.400 6.169 + 7.268 7.000 6.855 6.151 9.565 9.600 8.906 7.377 7.929 6.046 5.592 6.719 5.391 5.701 5.411 7.287 6.892 8.348 7.467 9.138 10.493 9.846 7.530 10.019 9.070 8.776 8.189 7.785 7.706 7.048 6.578 5.351 6.292 6.459 6.425 5.546 + 5.273 6.539 5.498 5.306 9.558 10.108 8.381 7.776 8.456 5.876 4.215 4.490 4.831 5.924 5.503 6.729 6.645 7.497 7.612 9.032 9.863 8.990 8.334 10.417 9.765 8.305 6.699 6.822 7.112 6.994 6.634 5.189 5.313 5.971 5.806 4.895 + 7.437 6.412 4.910 5.492 8.724 8.795 6.613 8.575 9.020 6.113 5.351 5.359 4.320 4.724 4.870 4.289 5.501 6.034 6.481 7.521 7.676 8.020 8.274 8.738 9.511 8.965 8.456 7.242 7.476 7.006 6.733 4.561 5.785 6.142 6.582 4.882 + 6.081 6.748 5.696 6.365 8.464 8.612 8.027 8.592 8.460 4.840 5.466 5.708 5.121 5.061 5.137 5.784 5.469 4.926 5.898 7.964 8.000 9.100 8.026 7.324 8.296 8.504 9.855 8.540 7.724 6.895 6.303 4.471 5.423 7.494 6.545 5.413 + 5.040 5.919 5.063 5.742 7.513 7.908 6.631 9.355 8.994 5.209 6.468 6.037 5.171 5.200 5.000 4.349 4.377 5.045 5.168 8.347 8.835 9.617 8.030 7.617 8.001 9.080 9.463 9.203 8.204 6.983 7.236 7.215 6.559 8.062 7.321 5.466 + 5.256 6.241 5.125 6.325 9.446 9.628 7.877 9.732 9.159 5.445 6.358 5.337 4.468 4.840 4.715 4.563 5.676 6.453 6.531 8.518 8.608 8.617 7.455 6.236 7.534 8.226 8.074 7.940 6.461 6.453 7.520 8.327 7.665 8.282 8.141 6.158 + 6.412 5.796 3.166 7.702 9.725 8.336 7.161 8.992 8.367 4.192 5.215 4.784 4.834 3.538 3.981 4.927 5.241 5.560 5.448 8.587 7.924 7.520 5.543 5.120 6.366 6.734 6.625 6.745 6.800 6.873 6.878 7.084 7.241 7.645 7.965 5.503 + 6.389 7.056 5.913 7.620 9.512 8.189 6.081 7.100 6.799 4.358 5.754 5.065 4.925 4.855 4.081 3.881 4.207 5.634 6.379 7.683 7.428 6.538 4.933 4.989 4.281 5.090 7.229 7.060 6.557 6.075 6.052 5.082 6.578 6.515 6.325 3.949 + 6.209 6.240 4.724 7.415 8.488 7.081 6.751 7.572 5.949 4.414 4.781 4.480 4.725 4.955 4.828 3.598 3.629 5.447 4.704 6.209 4.677 4.775 5.062 4.525 3.528 3.859 6.279 6.901 5.043 4.756 5.093 4.666 4.409 5.713 5.095 3.108 + 5.146 5.428 3.827 6.926 7.453 6.594 5.224 6.505 4.176 4.423 4.582 4.665 4.387 3.812 4.329 3.992 3.695 4.673 5.160 6.716 5.451 4.321 3.143 4.517 4.253 4.229 4.340 5.469 3.593 4.631 3.748 3.325 3.930 4.304 4.471 2.374 + 5.533 5.397 3.708 7.799 9.398 8.292 5.472 5.925 3.233 3.731 4.574 3.786 3.129 2.622 4.045 4.378 3.638 4.405 5.712 5.055 5.838 5.258 4.097 4.840 4.859 3.936 4.751 5.177 4.256 3.748 2.811 2.860 4.144 4.057 4.069 3.685 + 5.612 4.925 4.859 6.722 8.310 7.912 4.033 4.853 4.513 3.024 3.771 2.417 3.000 3.718 3.880 4.076 3.815 5.365 4.390 5.042 6.204 5.898 4.855 3.777 3.666 4.774 5.160 5.352 4.261 3.675 4.070 3.707 4.072 4.575 4.805 3.554 + 5.629 4.400 6.066 7.528 8.544 7.336 6.090 5.061 4.380 3.800 4.274 3.300 4.542 3.581 4.284 4.504 4.743 4.929 4.644 5.775 5.908 5.260 3.424 4.113 4.686 5.259 4.502 4.635 3.677 4.171 4.307 3.767 3.757 4.449 4.225 3.820 + 5.819 3.762 4.775 7.254 8.808 7.561 6.417 6.985 6.403 5.942 5.127 3.516 2.464 3.431 4.318 4.264 5.494 4.983 4.234 5.491 6.182 5.149 3.728 3.939 5.073 5.970 5.685 5.259 5.482 4.609 4.972 5.123 4.734 4.128 5.171 4.596 + 4.988 5.308 5.355 5.340 6.184 7.319 6.702 7.420 6.520 5.601 5.318 4.547 1.582 4.665 4.386 4.626 5.794 4.935 3.897 5.968 6.240 6.122 5.761 6.102 6.408 7.291 6.749 6.833 6.633 5.662 5.693 5.189 5.156 4.764 4.964 5.083 + 4.926 6.065 4.892 7.132 7.333 7.000 6.966 7.813 5.899 4.262 4.894 2.787 3.089 5.101 5.252 4.659 4.845 5.143 5.389 5.854 5.930 6.319 6.001 6.629 6.346 7.776 7.705 7.378 7.900 6.802 5.346 6.073 6.022 6.246 6.209 5.682 + 4.663 5.639 5.217 6.659 6.830 6.496 7.111 7.032 6.009 5.192 4.869 4.554 5.786 5.221 5.768 7.223 7.357 6.454 5.081 5.305 4.815 5.136 4.188 4.828 5.847 6.027 6.554 6.906 6.865 6.103 6.971 6.376 6.620 7.604 6.854 6.755 + 3.926 4.670 4.727 6.935 7.713 7.595 8.118 7.362 6.799 5.596 5.426 4.499 3.855 5.363 5.005 6.269 7.004 6.606 6.317 6.086 4.601 4.388 4.406 5.631 6.411 6.042 7.350 7.368 7.018 7.175 7.407 7.626 7.194 7.436 6.643 7.256 + 4.952 5.170 4.631 7.653 8.537 6.368 7.499 7.795 5.747 3.260 5.270 5.767 5.366 6.324 6.584 7.039 6.780 6.339 6.502 6.959 4.835 4.718 5.368 6.907 7.214 7.636 7.394 7.300 6.872 7.847 7.687 7.256 6.509 6.758 6.849 6.549 + 5.342 5.095 5.751 7.746 9.147 7.864 7.173 8.313 7.122 4.687 4.945 5.735 6.940 6.701 7.644 6.512 7.058 6.417 5.625 7.111 4.550 4.797 5.661 6.358 7.192 7.090 6.572 7.397 7.499 7.046 6.386 6.448 6.797 6.414 6.678 6.165 + 5.183 4.822 4.014 7.157 8.452 6.563 4.822 5.833 3.868 4.183 4.791 4.923 4.803 4.370 6.403 5.958 5.118 5.200 4.840 5.251 3.123 4.351 4.635 4.290 5.661 5.947 5.362 4.854 5.947 4.667 3.936 4.527 4.666 4.667 4.360 3.995 + 4.883 5.475 3.545 6.551 8.187 6.404 5.799 6.792 4.697 2.964 3.757 2.093 2.008 2.569 3.477 3.065 3.984 5.873 5.377 5.707 4.497 3.966 3.119 3.977 3.680 3.935 3.840 4.537 3.813 3.771 2.585 2.583 2.801 3.554 2.426 1.097 + 4.786 4.340 3.386 6.744 8.218 6.453 5.618 7.434 5.929 4.815 4.873 2.861 3.266 3.489 3.959 4.097 4.606 7.795 7.126 7.412 5.203 4.438 3.853 4.265 3.923 4.576 5.161 5.563 3.815 3.798 4.244 4.151 4.353 4.454 2.856 1.670 + 2.905 3.371 4.067 6.092 7.993 6.643 5.842 8.500 7.533 7.323 7.486 4.600 5.476 4.439 4.946 5.173 5.995 8.938 8.767 9.642 6.348 4.778 4.202 4.209 4.313 5.008 6.266 7.218 4.870 3.749 3.692 5.365 5.236 4.472 2.923 1.108 + 3.503 3.060 1.796 6.202 7.943 6.564 6.191 8.470 7.777 8.552 8.720 5.902 7.250 5.063 4.803 6.262 6.295 9.499 9.528 10.134 6.813 5.096 4.828 4.369 4.185 5.668 7.018 8.365 5.922 4.648 5.355 6.328 6.345 5.615 4.780 2.558 + 1.316 2.476 2.478 5.694 7.323 6.093 5.094 5.590 5.751 8.786 9.060 6.645 8.043 6.367 6.597 7.098 7.796 10.466 10.167 10.624 6.651 6.064 5.440 5.073 4.510 4.595 6.334 7.826 5.465 4.898 5.623 6.920 6.636 5.518 4.893 2.007 + 1.943 2.755 2.711 6.345 7.158 4.886 5.778 7.413 6.124 8.880 9.224 7.335 8.882 6.721 7.183 8.151 8.500 10.974 10.472 10.605 6.787 5.651 5.316 5.181 5.021 4.962 6.923 8.443 6.034 4.892 5.518 7.230 7.448 6.069 5.046 2.102 + 3.293 3.888 2.951 6.203 7.019 5.062 5.829 7.296 5.195 8.588 9.134 7.483 9.117 6.875 7.478 7.787 8.623 11.464 10.857 10.345 6.919 6.058 5.627 5.327 5.349 5.373 7.299 8.366 6.323 5.455 6.120 7.167 7.262 5.859 4.375 2.510 + 3.805 3.258 1.833 4.763 6.539 5.688 4.927 6.686 5.337 8.511 9.209 7.599 9.490 7.800 8.704 7.776 8.617 11.396 10.971 8.920 7.376 6.138 5.396 5.214 6.588 6.219 8.473 9.066 7.809 6.053 5.290 6.872 6.297 4.371 3.600 3.258 + 3.489 3.209 2.345 4.489 6.114 5.030 3.950 5.701 4.498 8.615 9.312 7.486 9.603 7.772 9.016 7.536 8.250 11.033 10.937 9.348 7.379 6.612 4.648 5.004 6.007 6.383 8.545 9.090 8.201 5.694 4.582 5.716 5.758 4.893 3.221 2.275 + 4.319 3.391 0.853 3.893 5.766 4.759 2.478 4.268 3.874 8.599 9.293 7.485 9.865 8.404 9.452 7.414 7.999 10.934 10.887 10.184 7.983 6.398 3.423 5.356 5.675 5.747 8.166 8.110 7.036 5.535 5.530 5.833 7.535 6.585 4.329 1.839 + 4.504 4.373 2.048 4.185 5.875 4.693 4.914 6.090 5.177 7.955 8.872 7.547 10.100 8.577 9.644 7.959 8.755 10.817 10.771 10.161 8.010 6.672 4.235 5.780 5.602 6.048 7.340 7.733 7.126 5.849 5.732 5.989 7.730 6.911 3.937 2.104 + 1.081 2.497 2.366 4.262 5.923 4.687 4.579 6.500 4.640 7.180 8.549 7.949 10.366 8.719 9.699 8.504 9.519 10.235 10.314 10.287 8.363 6.482 4.150 6.009 5.888 6.050 8.079 7.847 6.347 5.176 6.203 6.405 7.294 6.813 4.361 2.524 + 2.887 2.529 0.317 4.372 5.980 4.528 4.294 6.612 5.384 6.984 8.517 7.545 10.361 9.039 10.053 8.966 10.176 9.792 9.687 9.880 8.642 7.188 5.367 5.260 6.146 6.758 7.352 7.480 6.596 5.191 4.867 6.304 6.485 5.994 3.872 2.159 + 2.388 1.250 1.283 4.153 6.492 5.666 4.644 7.685 6.933 8.290 9.423 7.648 10.400 9.079 9.277 9.175 10.795 8.658 8.600 9.908 8.774 6.459 4.961 4.982 6.712 7.219 7.735 8.112 7.646 6.114 5.838 7.417 6.817 5.039 3.994 1.967 + -0.299 0.104 0.308 3.983 6.484 5.723 5.750 8.428 7.508 8.224 9.364 6.855 9.776 9.006 8.796 8.936 9.732 8.552 9.432 9.138 8.888 7.233 6.082 5.842 6.582 7.832 8.555 8.455 6.232 5.636 5.049 7.353 7.231 4.719 3.305 2.363 + 1.753 1.448 1.049 3.391 6.347 5.898 5.599 8.637 8.070 7.572 8.573 5.852 8.262 7.966 8.901 8.500 7.073 7.925 9.411 9.858 9.461 7.987 5.948 5.852 6.714 7.382 7.159 7.101 4.942 5.167 5.220 7.633 7.084 4.509 3.013 2.041 + 0.870 1.570 1.208 4.157 6.296 5.280 5.724 8.477 7.857 7.036 6.762 6.360 8.893 7.607 9.141 8.626 8.567 8.821 9.552 10.355 9.682 7.479 5.497 4.957 6.512 6.555 5.990 6.137 5.527 5.145 5.461 7.631 6.896 4.510 3.662 1.497 + 2.507 2.134 1.305 3.918 5.590 4.663 5.320 7.432 7.535 8.682 7.502 7.821 9.910 8.166 8.757 8.811 9.105 9.769 9.224 9.053 8.489 5.946 3.791 5.240 6.327 6.621 6.972 6.255 5.702 5.384 5.237 6.219 6.424 5.588 3.603 1.624 + 4.518 4.305 2.395 3.806 5.085 5.335 5.113 6.634 7.615 8.961 8.273 7.744 9.166 8.444 8.056 7.682 8.786 9.183 8.505 7.981 7.495 6.315 4.146 3.786 4.164 4.684 6.800 6.672 5.478 4.761 4.279 4.706 5.608 5.586 3.499 1.876 + 4.482 4.677 3.528 3.807 4.874 4.897 5.677 5.877 6.363 6.614 6.724 6.855 6.267 6.419 5.799 5.715 6.976 7.252 6.474 5.863 4.973 3.061 3.084 3.085 2.328 3.001 4.347 4.977 3.758 3.752 3.195 4.439 4.548 4.898 3.811 1.446 + 4.064 4.123 3.515 4.112 5.308 5.313 5.061 6.620 6.793 6.436 6.445 5.941 6.559 6.441 6.328 5.513 5.328 6.462 7.072 6.324 3.861 2.653 2.440 3.629 3.318 3.152 4.336 4.443 3.724 3.196 2.409 3.746 3.446 3.395 3.477 2.011 + 3.135 4.204 3.614 3.806 3.986 4.501 4.967 6.790 7.367 7.784 6.591 5.938 6.093 4.536 6.405 5.388 6.066 6.696 6.310 5.384 4.364 4.354 3.998 3.501 3.214 3.844 4.593 4.739 3.889 3.296 3.289 4.093 4.008 3.649 3.110 1.380 + 5.462 4.211 3.023 3.867 4.406 3.933 3.081 6.815 7.855 7.181 6.147 5.834 5.397 4.087 6.271 4.902 6.073 7.293 6.998 5.032 3.242 3.781 2.736 2.867 2.959 3.824 4.614 4.419 3.048 3.375 2.645 2.664 3.501 2.612 2.641 1.611 + 5.060 5.228 3.665 2.834 4.089 4.434 4.494 6.284 6.758 5.573 3.805 2.564 5.591 4.597 5.288 3.605 5.806 5.401 5.567 5.445 3.525 3.949 3.198 2.390 3.372 2.902 2.898 4.144 3.429 3.044 2.353 2.635 2.995 2.297 1.180 0.775 + 5.264 5.305 3.899 3.538 2.998 4.272 3.735 3.000 3.523 4.937 4.573 5.218 5.954 6.864 6.835 7.147 6.606 6.278 4.905 4.859 5.632 5.248 5.012 4.962 5.584 6.825 6.520 5.717 6.040 5.260 5.287 4.319 4.389 5.157 5.163 5.327 + 7.306 6.097 5.770 5.128 5.015 7.256 7.532 5.813 6.347 6.732 7.086 7.818 8.960 9.712 10.392 10.799 10.108 8.609 7.321 7.229 8.129 7.675 8.703 9.278 10.127 11.169 10.332 10.311 9.535 8.804 8.357 7.737 7.956 8.535 8.764 8.690 + 6.330 6.528 7.407 6.950 7.105 9.207 8.529 7.002 6.332 7.944 9.038 8.810 8.012 9.173 11.306 10.307 10.531 10.035 10.211 8.698 8.469 8.745 9.606 10.412 11.305 11.983 10.801 11.529 9.682 9.039 8.439 8.539 9.074 8.701 9.203 8.899 + 7.384 7.414 7.737 5.620 6.004 8.387 8.806 9.085 7.865 7.930 9.178 8.714 9.140 10.428 10.861 10.782 10.439 10.537 10.471 9.278 8.852 9.077 9.909 10.602 11.100 11.878 11.161 11.092 9.773 10.026 9.319 8.599 8.724 8.720 9.541 9.309 + 8.978 8.537 7.579 7.328 8.736 8.250 7.914 9.833 9.279 7.394 8.116 8.411 8.399 10.950 11.601 10.756 9.229 10.440 9.357 7.808 7.649 8.353 9.037 10.026 10.808 11.300 10.442 10.073 9.572 9.809 9.071 9.162 8.454 10.085 9.898 9.172 + 9.075 7.877 7.669 8.278 10.335 10.330 8.821 9.823 9.173 9.355 8.784 9.675 9.522 10.547 10.820 11.434 9.866 10.377 9.674 9.039 8.271 8.942 9.520 9.120 10.538 11.790 11.323 10.986 9.353 10.020 9.927 9.225 9.728 9.566 9.753 8.796 + 8.554 9.149 9.008 7.607 8.720 10.072 9.966 9.986 9.471 8.912 7.753 9.117 8.930 8.901 11.153 11.297 11.158 10.944 11.643 9.984 8.994 9.083 9.418 10.601 11.184 11.208 11.028 10.877 9.883 10.200 10.768 10.284 9.861 9.327 10.116 9.388 + 8.520 10.132 8.969 6.989 6.528 9.730 9.782 8.823 9.085 9.712 9.425 8.814 9.751 9.980 10.796 10.776 11.146 10.909 11.557 10.297 8.643 9.781 9.884 10.453 10.664 11.653 11.375 11.048 10.527 10.162 9.945 8.882 8.884 9.764 10.674 9.886 + 10.421 10.125 9.038 9.193 8.770 10.297 11.020 9.982 10.592 11.125 9.666 9.137 9.873 10.149 9.903 10.606 10.874 10.999 10.529 9.408 9.263 9.000 9.093 9.938 10.251 10.128 10.501 9.446 10.025 9.798 9.197 7.931 8.525 9.337 9.700 8.908 + 10.385 9.669 8.472 8.922 10.117 10.101 9.863 8.542 8.309 9.010 8.178 8.774 8.200 10.098 9.868 9.624 9.289 9.306 8.740 7.552 7.007 7.299 7.408 8.769 8.709 8.508 8.441 7.690 7.484 8.939 8.487 7.956 8.346 8.858 8.819 7.319 + 8.491 6.968 7.043 6.919 6.397 8.248 8.942 8.409 7.999 7.762 7.275 7.507 7.413 8.354 8.943 9.448 9.393 7.544 8.339 7.728 5.864 7.031 6.893 6.127 7.524 8.096 7.111 7.984 7.684 7.959 8.597 7.675 7.549 7.825 7.837 5.765 + 8.419 7.497 6.473 6.713 5.793 7.293 8.129 8.139 8.228 8.315 6.128 6.203 6.124 6.909 6.388 6.491 6.525 6.659 7.308 6.598 6.025 5.613 7.032 6.716 6.976 6.678 6.255 7.106 7.402 7.891 7.291 6.937 7.251 8.102 7.083 6.313 + 7.215 6.982 6.220 5.759 4.692 5.377 5.738 5.343 6.228 6.876 5.508 6.159 4.515 5.068 5.439 5.968 5.907 6.002 6.294 5.522 4.770 5.610 5.953 5.235 5.698 5.768 5.249 6.101 6.007 7.222 7.131 5.575 5.567 5.840 5.372 4.953 + 6.485 5.020 4.243 3.629 4.801 6.412 5.666 3.927 5.092 4.442 3.638 3.958 4.478 4.006 4.189 4.561 4.550 4.594 4.391 3.057 3.702 4.854 4.072 4.708 5.055 5.193 4.917 5.552 4.838 5.031 4.998 4.552 4.848 4.487 4.325 4.566 + 3.991 3.727 3.028 3.131 4.490 5.256 5.315 3.844 4.401 3.863 2.931 3.448 3.214 3.129 2.790 3.699 4.586 5.172 4.660 3.781 3.108 2.608 3.169 3.710 4.908 5.068 5.141 4.660 5.605 6.187 5.322 5.480 5.393 4.061 3.899 3.535 + 4.929 3.479 3.394 1.671 2.796 4.741 4.547 3.647 2.757 3.730 3.202 4.337 2.781 3.372 3.538 4.849 3.726 3.541 4.053 5.073 5.109 4.719 4.428 5.250 5.072 5.119 4.536 4.831 5.315 5.782 5.271 5.380 4.735 4.519 3.557 3.229 + 5.559 4.577 4.634 5.270 4.862 4.336 4.272 4.008 4.231 4.305 3.256 3.861 3.311 3.816 4.782 3.398 4.969 4.928 3.970 4.464 4.515 3.766 4.866 4.339 5.361 4.921 4.239 5.368 5.464 4.651 4.791 5.509 4.820 3.706 3.313 3.753 + 5.884 5.311 5.378 4.676 5.297 5.215 4.957 5.002 4.208 4.810 3.275 2.799 3.823 3.937 4.331 4.530 5.570 6.175 5.101 4.932 4.367 3.521 3.271 4.181 5.007 5.173 5.044 5.122 5.724 5.907 4.959 5.223 4.790 5.135 4.903 4.572 + 5.562 5.450 4.816 4.498 4.019 3.163 3.047 3.994 5.870 5.076 4.398 4.836 3.751 5.230 5.288 5.632 5.668 5.755 5.397 5.756 4.986 3.994 3.576 5.187 5.301 5.743 6.098 5.643 6.129 6.677 6.088 5.305 5.523 6.016 5.111 4.156 + 6.245 5.560 5.302 4.567 5.349 4.091 4.345 4.655 5.697 5.203 3.952 4.936 4.497 4.449 5.116 3.722 4.438 4.948 4.836 5.756 5.543 4.777 4.935 5.205 5.254 5.066 4.585 5.430 6.281 5.791 6.107 5.844 5.688 5.248 5.125 4.532 + 5.173 3.748 3.986 4.915 6.522 5.451 6.278 5.587 7.044 6.592 3.969 3.814 4.227 4.934 4.604 3.768 3.830 5.872 5.521 5.402 5.369 4.504 5.450 5.218 5.984 5.636 4.696 5.467 6.314 5.997 6.036 6.214 5.855 5.486 4.937 4.353 + 4.778 5.956 6.486 6.724 6.571 5.157 5.641 6.035 5.643 6.581 5.841 5.432 5.351 6.387 5.548 4.456 4.842 5.214 4.301 5.790 5.115 4.387 5.192 4.546 5.287 5.988 5.517 5.899 5.831 6.047 5.821 5.640 5.330 5.468 4.744 4.718 + 10.576 10.371 10.032 8.533 5.532 6.719 7.004 6.878 5.930 6.891 6.862 7.238 7.877 7.404 5.649 5.999 5.537 5.537 5.983 5.949 5.965 5.899 5.281 6.517 6.341 6.447 6.465 5.578 6.129 6.562 5.903 6.688 5.936 6.353 5.218 5.233 + 9.359 8.057 7.625 7.727 6.651 5.468 6.494 6.717 6.670 5.688 5.022 4.924 5.556 5.073 4.782 5.124 5.586 5.403 3.856 4.875 5.844 5.420 4.991 4.180 5.087 5.923 5.907 5.975 6.306 5.675 6.334 6.308 6.159 6.223 5.020 3.555 + 3.273 4.221 4.982 4.185 4.336 5.139 7.128 6.947 5.703 6.472 6.355 5.798 5.393 4.747 5.729 4.629 4.780 4.072 3.690 5.115 6.111 5.860 6.354 5.537 5.003 5.535 5.692 5.586 6.407 6.249 6.554 6.096 5.350 4.805 4.709 4.282 + 5.784 4.410 5.946 5.631 5.075 4.924 5.878 6.893 6.016 5.489 4.627 6.201 6.029 4.902 4.019 4.944 6.159 5.559 5.561 5.119 5.549 5.133 5.769 5.897 5.941 6.333 5.560 5.431 6.118 6.429 6.370 6.686 5.488 5.268 4.518 4.467 + 7.013 5.560 5.383 6.193 5.036 5.287 5.115 5.710 4.895 5.815 5.147 5.505 5.374 5.601 5.322 5.267 5.090 4.269 5.162 5.201 4.672 4.581 4.945 5.339 4.577 5.339 5.370 5.560 6.201 5.840 5.270 5.988 5.307 5.161 4.494 4.436 + 7.113 6.955 7.046 6.176 6.143 5.015 6.118 5.454 4.503 5.879 5.405 5.467 4.723 4.851 4.644 5.345 5.561 5.426 5.050 4.685 6.031 5.736 5.464 5.182 4.577 5.305 6.592 6.163 6.195 5.599 4.944 5.507 5.662 5.145 4.225 3.759 + 10.338 9.696 8.324 7.984 7.956 8.246 7.163 7.608 6.653 5.441 5.316 4.495 4.314 2.289 4.105 5.782 6.476 6.563 5.304 3.664 4.494 5.043 5.162 5.218 5.189 5.562 5.407 5.701 6.222 5.326 5.177 5.073 4.759 5.267 4.469 3.780 + 6.890 8.073 7.977 7.806 7.720 8.116 7.399 6.523 5.066 4.265 3.992 5.054 5.572 3.865 5.755 6.115 6.780 6.324 4.602 2.737 3.979 4.660 5.678 5.512 4.897 5.059 4.810 4.162 5.076 4.974 4.426 4.724 4.564 4.187 4.347 3.096 + 5.706 7.629 8.556 7.317 7.686 8.727 8.156 8.758 8.383 8.461 8.335 8.567 8.602 8.411 8.411 8.435 8.625 8.760 8.615 8.463 8.600 7.671 6.307 6.466 6.640 5.988 5.813 5.511 4.838 5.575 6.134 6.053 5.666 5.789 5.984 5.890 + 8.647 8.393 9.503 8.804 8.794 9.143 8.997 9.180 9.152 9.173 9.122 9.380 9.326 9.234 9.225 9.316 9.370 9.475 9.483 9.626 9.661 8.524 6.784 6.513 7.227 6.462 6.586 5.840 5.511 6.391 6.908 6.269 7.128 7.126 7.523 7.501 + 7.003 7.534 7.513 7.776 6.707 5.953 5.948 5.670 4.430 4.081 3.755 2.852 2.719 2.374 3.137 3.412 3.586 3.242 2.280 2.966 2.891 3.023 3.342 5.012 4.123 3.405 3.801 3.731 4.343 4.519 4.200 4.229 4.354 3.788 3.802 3.198 + 6.648 7.607 7.596 6.928 6.726 5.422 5.242 5.333 4.597 3.443 3.362 4.710 3.607 4.055 3.800 3.942 3.464 3.744 2.765 2.502 3.517 3.130 3.507 3.508 3.154 3.599 3.910 4.797 3.434 3.603 3.561 4.040 4.557 4.179 3.537 2.402 + 7.001 8.175 7.647 5.736 5.433 4.924 3.725 4.683 5.370 4.834 5.143 4.353 3.572 5.114 4.852 2.959 3.552 3.280 3.740 2.194 3.826 2.712 3.228 3.505 3.440 4.070 3.820 3.848 3.447 3.956 4.118 4.465 4.812 3.719 4.581 3.095 + 6.027 6.252 4.952 4.900 5.735 5.399 5.543 4.666 6.112 5.502 4.766 4.153 3.682 3.727 4.500 4.524 3.179 3.741 3.603 3.861 3.787 4.269 4.215 4.674 4.416 4.300 3.934 3.704 3.953 4.292 3.942 4.393 4.266 3.875 3.966 3.255 + 5.324 6.365 4.936 5.399 6.201 5.775 5.424 3.769 5.246 5.640 6.124 5.935 5.714 5.726 6.007 5.864 5.518 5.464 5.506 5.825 5.597 5.455 5.336 5.756 5.341 4.930 5.404 5.062 5.787 6.236 6.535 6.869 6.996 6.946 6.444 6.017 + 4.842 5.147 3.440 5.308 5.527 4.657 4.173 4.616 4.245 3.331 2.867 3.623 4.110 3.538 4.173 3.840 3.817 4.153 4.038 4.430 3.750 3.002 3.921 3.817 3.355 3.304 3.536 3.430 2.146 2.391 2.691 3.163 2.820 2.806 2.652 2.589 + 5.521 5.352 5.560 4.747 2.381 3.504 3.660 3.850 3.779 3.239 2.918 3.958 3.371 3.688 3.457 2.453 4.007 4.076 3.860 3.766 4.198 4.019 3.444 3.672 2.987 3.347 2.836 2.824 3.022 2.997 2.825 2.823 2.456 2.834 2.749 1.192 + 5.317 5.419 5.318 5.012 4.753 5.048 5.456 3.917 4.026 4.824 4.357 4.034 3.578 3.325 3.662 3.393 5.058 3.217 3.681 3.876 3.579 3.717 3.098 3.250 2.791 3.294 2.523 2.649 2.483 3.197 3.208 2.785 2.425 2.380 2.823 2.195 + 5.673 4.553 5.300 4.946 4.287 4.539 4.385 3.233 4.042 4.147 3.901 4.297 4.425 3.725 4.041 3.369 4.782 4.586 2.999 4.533 4.725 3.512 3.954 3.453 3.525 3.206 2.625 2.336 2.151 3.432 3.538 3.229 2.880 2.430 2.189 2.159 + 2.366 4.893 4.745 4.038 5.608 6.025 5.539 5.046 4.654 5.051 3.218 4.779 5.123 5.249 4.342 3.942 4.658 3.924 3.362 3.821 3.608 3.476 4.414 3.900 3.272 3.702 3.611 3.900 2.805 3.184 3.959 3.345 3.135 3.548 2.592 2.626 + 1.378 4.478 5.349 4.020 4.493 4.928 4.823 5.220 4.333 4.124 3.625 3.734 3.167 4.204 3.659 3.665 4.927 3.764 4.187 4.189 3.888 3.947 3.671 3.237 3.033 2.455 3.267 3.849 2.121 2.861 3.483 3.026 2.538 3.596 2.445 1.539 + 5.202 4.753 4.812 3.583 2.265 5.120 5.816 4.463 3.133 4.092 4.448 4.714 5.233 4.728 4.132 4.122 4.385 3.619 3.677 3.802 3.953 3.721 4.065 3.759 3.929 3.332 3.691 3.373 2.360 3.028 2.286 2.210 3.255 3.357 3.015 2.612 + 5.090 3.966 3.448 4.461 5.017 5.737 3.963 3.614 2.992 4.544 5.006 4.552 4.482 3.678 4.239 3.180 3.920 4.021 3.151 4.640 4.751 3.223 4.149 3.676 3.961 3.901 3.093 2.535 3.055 2.615 2.384 2.703 3.649 3.186 2.474 2.033 + 4.619 4.423 4.569 3.531 4.238 5.095 5.355 5.405 4.707 5.080 4.588 4.771 4.876 3.181 3.880 4.657 4.403 4.192 3.914 4.068 3.996 3.192 4.765 4.539 3.671 2.884 3.219 3.064 3.661 3.478 3.161 2.594 2.737 3.310 2.982 3.138 + 2.790 3.909 4.069 4.748 5.219 5.580 5.482 5.049 4.640 4.525 4.492 3.792 4.196 5.033 5.120 5.420 5.251 5.575 5.901 5.521 5.893 6.506 6.362 6.470 6.599 7.079 7.362 7.247 7.502 7.712 7.721 7.943 7.879 7.832 7.700 7.050 + 4.720 4.457 4.522 5.391 6.870 6.303 5.007 4.760 4.846 5.095 4.198 4.475 4.813 3.634 3.649 4.236 3.778 4.124 4.143 3.830 4.129 5.104 5.019 5.012 5.091 5.691 5.928 6.064 5.994 6.008 5.991 6.249 6.428 6.369 6.334 5.898 + 6.260 4.880 3.767 5.870 6.859 6.016 5.895 5.570 4.422 3.023 4.473 4.120 3.515 3.272 3.090 2.789 2.736 3.415 3.133 4.245 4.205 4.205 3.710 4.716 4.024 4.357 4.040 3.918 4.238 3.747 2.820 2.130 2.538 2.477 2.147 2.496 + 5.976 4.398 5.401 6.174 6.315 5.425 4.717 4.263 3.831 2.754 4.400 4.309 3.535 2.772 3.223 3.572 3.275 2.864 3.054 2.957 2.553 3.359 3.385 2.906 2.862 2.330 2.888 2.165 3.135 2.889 2.569 2.123 3.671 3.625 2.721 2.725 + 5.188 4.296 4.020 4.136 4.030 3.286 3.300 3.620 3.359 2.955 4.210 5.203 3.409 3.194 3.548 3.716 4.382 3.440 3.444 3.364 3.026 3.280 3.363 3.987 3.552 3.701 3.915 3.954 3.819 2.739 3.121 3.159 3.140 3.554 3.480 2.693 + 2.914 3.784 4.077 3.644 4.139 4.677 3.069 3.377 3.718 2.870 2.484 3.493 1.842 3.543 3.537 4.402 3.541 2.336 3.093 2.445 2.145 3.968 4.608 3.468 2.826 3.520 3.513 3.492 3.033 1.888 3.802 3.783 3.740 3.808 3.527 2.713 + 2.564 1.636 3.098 3.139 4.185 3.538 3.422 1.675 2.332 2.090 3.195 2.191 1.082 2.690 3.068 2.757 3.031 2.782 1.986 2.896 2.863 3.305 3.478 2.755 2.220 2.746 3.195 3.078 1.733 1.146 1.801 2.045 2.819 2.663 2.707 2.538 + 2.114 2.303 3.163 2.543 1.594 2.175 2.840 2.944 2.737 2.262 2.843 2.521 2.275 1.964 2.762 2.821 3.421 3.093 1.741 3.051 3.337 4.699 3.500 2.929 2.855 2.767 2.638 2.797 2.649 3.038 2.159 3.366 3.596 2.704 2.444 1.482 + 3.127 2.454 2.409 1.981 2.943 2.933 3.405 2.526 1.124 1.784 1.900 3.074 2.102 2.971 1.958 2.599 2.959 3.167 2.871 3.295 3.365 3.808 2.746 3.625 3.191 2.748 2.656 2.416 2.340 2.921 2.699 2.571 3.079 3.125 2.657 1.869 + 1.176 3.633 4.330 2.948 3.095 2.415 2.783 2.825 2.522 3.614 3.213 2.502 2.392 2.871 2.505 2.000 2.514 3.028 3.621 3.454 3.108 3.909 4.011 3.411 2.847 2.761 2.360 2.255 1.808 3.017 3.500 2.342 3.124 2.584 1.968 1.504 + 1.937 4.163 4.483 2.787 3.525 3.238 2.560 1.169 2.454 2.045 1.574 1.719 2.157 2.703 1.956 2.861 0.955 2.633 2.020 2.253 2.927 3.016 2.864 2.909 2.601 2.038 2.749 2.510 2.293 3.219 2.793 2.283 2.168 2.273 2.269 1.602 + 2.630 4.008 3.478 2.402 1.969 2.551 1.311 1.544 1.493 2.122 3.195 2.689 2.101 1.765 0.695 2.535 2.015 2.954 2.475 3.018 3.051 2.982 2.996 2.337 3.172 2.101 1.924 2.017 2.480 2.543 1.989 1.947 1.888 2.617 2.596 1.933 + 3.423 3.298 3.992 2.304 1.220 0.577 0.742 1.961 2.665 2.863 2.203 1.680 2.515 3.656 2.129 1.091 1.444 2.066 3.201 1.892 3.468 3.227 4.156 2.890 2.999 2.720 2.731 2.537 2.118 2.129 2.091 2.035 2.372 3.174 2.525 2.320 + 2.383 3.351 3.255 2.474 2.497 2.289 3.208 3.571 3.152 2.067 2.921 2.673 2.545 3.102 3.032 2.913 1.898 2.407 2.352 1.539 2.629 2.776 1.514 2.215 2.596 2.413 2.598 2.542 1.902 2.265 2.526 2.996 2.437 1.936 1.914 1.432 + 3.496 2.546 3.102 2.845 2.988 2.266 2.341 1.784 3.072 1.954 2.666 2.372 1.994 2.524 2.295 2.710 1.859 1.808 2.469 2.033 2.232 1.020 1.857 2.311 2.356 2.980 2.588 2.636 2.452 2.212 1.847 2.710 1.849 1.548 2.320 2.060 + 2.566 1.921 3.022 2.910 3.385 2.821 0.987 2.786 2.832 2.296 3.353 2.457 1.928 2.370 2.305 1.938 1.537 1.788 1.775 2.498 2.548 1.692 2.545 1.381 1.950 1.927 1.963 2.818 2.834 2.680 3.213 4.472 4.525 4.462 4.266 3.546 + 3.824 3.673 3.542 3.276 3.446 2.384 3.005 3.953 4.073 3.008 2.106 3.869 3.748 2.285 3.288 3.259 2.804 2.066 1.141 1.888 2.220 1.893 2.349 1.486 0.684 0.780 2.263 2.733 2.566 3.330 3.983 4.277 4.485 4.448 4.276 3.489 + 3.478 4.550 4.133 2.793 3.291 3.646 4.768 4.501 3.773 3.411 4.550 3.854 2.302 3.011 3.259 3.782 1.541 3.052 2.775 2.055 2.180 2.361 1.229 2.021 2.156 2.465 2.176 2.437 1.796 2.285 2.064 1.765 2.159 1.400 0.562 1.236 + 2.433 3.305 3.609 3.433 3.175 2.852 2.538 2.417 3.377 3.901 4.942 3.852 3.570 3.600 3.548 3.808 2.032 2.049 1.806 3.319 2.432 2.656 2.174 3.060 2.513 1.729 2.585 2.230 2.536 2.384 1.835 1.305 1.889 1.653 1.460 1.580 + 3.347 4.340 3.672 2.964 3.299 3.260 3.781 4.492 4.511 4.414 4.290 3.800 3.032 2.414 2.807 2.429 1.731 0.741 1.005 1.168 1.801 2.305 2.370 0.428 0.988 1.937 2.001 1.469 2.005 1.821 1.807 1.543 1.386 0.958 1.480 0.895 + 1.365 1.881 2.204 2.725 3.799 4.252 3.735 4.504 3.820 4.248 3.466 1.999 1.617 1.047 1.042 1.729 2.675 2.499 2.808 2.862 1.828 2.830 3.195 2.036 2.065 2.699 2.373 1.522 2.171 2.394 1.115 1.755 1.710 2.446 1.811 1.446 + 4.358 4.566 5.061 4.980 3.928 3.543 4.690 4.067 5.126 5.972 3.836 1.900 2.427 2.020 1.785 0.902 1.444 2.273 2.401 1.958 3.774 3.645 3.474 2.784 2.227 3.795 4.140 2.900 2.835 3.486 2.492 3.058 2.636 3.599 3.191 2.341 + 4.826 5.858 5.783 6.069 6.251 4.985 5.690 5.722 5.382 5.422 5.706 5.595 5.157 4.822 4.161 3.617 2.760 3.468 3.113 2.794 4.050 3.790 4.423 3.787 3.388 2.858 3.317 3.200 3.819 2.922 2.591 3.011 2.177 2.504 2.927 2.121 + 2.345 4.361 4.618 4.489 5.071 5.747 6.142 6.458 6.209 5.548 5.806 5.862 4.587 3.662 4.185 2.893 2.399 2.371 3.508 3.394 3.907 3.803 4.481 4.390 5.057 4.497 3.918 4.132 4.167 3.185 2.656 3.237 4.109 3.734 3.664 2.676 + 3.576 4.431 4.941 5.574 6.095 4.736 4.718 5.349 6.156 5.872 5.217 5.832 3.981 4.060 3.951 3.126 2.330 1.661 2.635 2.230 3.008 4.194 4.736 4.737 5.561 4.888 4.458 3.856 4.088 3.776 3.085 3.193 3.738 3.662 3.094 2.393 + 5.298 4.360 4.539 4.946 5.569 5.293 6.367 5.721 4.796 5.379 5.505 5.011 4.783 5.008 4.951 4.949 4.000 2.872 4.349 3.771 3.388 4.699 4.542 4.097 4.162 3.573 4.142 2.895 2.685 1.872 1.946 1.540 0.487 0.882 0.761 -0.847 + 4.999 4.284 5.561 5.964 5.901 4.501 5.083 4.640 4.615 4.714 4.889 3.190 3.982 2.598 2.461 2.817 3.032 2.673 3.315 2.978 1.288 2.821 2.233 3.737 3.720 3.478 2.559 2.893 2.365 1.763 0.935 1.115 0.646 1.344 1.053 -0.206 + 3.624 5.403 6.121 4.322 4.533 5.022 6.086 6.172 5.033 4.758 5.074 5.416 4.770 5.058 4.546 3.779 4.762 3.727 2.648 3.441 3.362 2.792 3.548 4.233 3.583 2.571 2.632 2.800 1.352 1.173 0.974 0.777 0.885 1.623 1.118 -0.236 + 4.226 5.823 5.915 5.739 4.840 4.117 4.952 5.092 5.070 5.193 5.165 6.479 5.889 4.641 3.945 1.961 3.599 3.708 3.254 2.544 3.400 2.717 2.779 2.924 3.004 3.386 3.628 1.982 1.457 2.054 1.247 1.141 1.476 0.405 0.479 0.311 + 4.862 3.363 4.324 5.217 5.063 5.764 5.077 5.090 5.456 5.546 6.062 5.014 4.259 3.947 3.904 3.928 2.561 3.368 3.112 1.751 2.727 2.956 3.351 3.206 3.285 3.047 3.539 1.994 1.749 2.514 1.500 1.423 1.293 0.886 -0.029 0.267 + 5.675 4.469 4.969 5.675 6.221 6.431 5.415 6.402 5.952 7.114 7.536 6.280 4.907 4.739 5.275 4.567 3.933 4.118 3.715 3.862 2.589 3.196 3.350 3.822 3.712 2.833 3.279 2.987 2.486 1.613 1.173 0.675 0.627 0.631 0.340 0.429 + 5.527 6.793 6.729 6.879 6.963 5.293 6.261 6.174 4.573 6.233 5.971 4.128 4.996 5.955 5.522 4.181 3.464 3.547 3.775 3.348 3.063 4.378 4.994 4.402 4.931 5.417 3.541 2.917 1.963 1.576 1.196 0.953 1.505 0.430 0.223 -0.215 + 6.110 6.329 4.860 5.773 6.972 6.717 4.776 4.661 6.055 5.071 4.233 4.202 3.361 3.636 3.538 1.881 2.118 2.423 3.265 3.191 2.716 3.789 4.649 4.592 4.547 4.355 3.337 3.194 1.936 2.406 2.385 2.163 2.578 1.924 1.746 -0.306 + 5.886 6.442 4.739 6.878 8.145 6.733 4.390 6.362 6.578 5.478 4.775 4.739 5.360 4.545 2.934 2.564 3.080 3.391 3.222 2.896 2.459 2.460 2.915 3.768 5.535 5.604 3.053 3.678 2.681 2.007 1.757 1.466 1.259 0.785 0.498 -0.451 + 5.940 5.989 2.967 4.137 7.233 6.418 4.856 4.266 4.239 4.030 4.640 4.682 4.533 3.270 1.282 2.358 2.659 3.738 3.322 4.909 4.714 5.095 5.291 4.609 4.944 5.115 3.237 3.940 2.754 2.681 1.123 0.702 0.374 0.678 0.118 -0.291 + 7.157 7.261 5.268 5.331 8.283 7.716 5.110 6.407 5.647 3.079 5.195 4.765 4.517 3.155 5.644 5.757 3.873 4.403 4.437 4.926 4.646 5.349 5.489 3.974 4.184 4.289 3.789 3.895 2.399 1.647 1.198 1.908 2.152 1.689 1.379 1.131 + 7.145 7.482 5.745 7.234 9.218 8.135 4.718 7.186 6.703 4.082 3.902 2.931 3.121 4.557 6.986 6.688 3.097 4.037 4.206 5.287 4.879 4.226 4.356 3.600 5.240 5.833 5.655 4.026 3.382 3.690 3.317 3.390 3.084 3.816 3.422 3.132 + 6.820 7.096 4.591 6.221 9.381 8.641 4.572 8.202 7.691 4.472 5.400 4.309 4.630 3.443 6.672 6.935 3.369 2.919 4.092 5.040 5.040 4.842 5.011 5.356 5.646 6.445 5.351 3.286 3.377 4.399 5.387 3.816 4.174 5.422 3.614 2.625 + 6.977 7.435 5.584 7.075 9.813 9.006 5.272 8.253 7.506 4.847 6.217 5.180 3.123 4.204 6.873 6.927 3.418 2.204 3.157 3.399 3.554 3.875 4.402 5.534 6.285 6.018 5.260 2.784 3.748 4.960 4.422 3.231 3.839 5.268 2.943 1.710 + 7.151 7.378 5.182 7.045 9.987 9.127 4.849 8.233 7.877 4.807 6.023 4.677 3.468 4.330 7.144 6.901 2.498 2.637 3.911 3.070 3.498 3.776 4.647 4.962 5.903 6.912 5.347 3.058 3.762 5.305 5.572 3.850 4.372 5.403 3.159 1.592 + 7.409 7.722 6.333 7.777 10.216 9.317 5.766 8.437 7.606 3.868 5.802 5.168 4.010 2.632 7.416 7.240 2.355 2.052 2.668 3.026 3.662 4.427 4.865 5.075 5.569 6.428 4.219 3.531 4.028 5.153 5.608 4.062 4.691 6.246 3.518 2.437 + 6.576 7.253 5.613 7.727 10.167 8.983 5.245 7.981 7.466 4.988 6.796 5.933 4.405 4.535 8.304 7.868 4.138 3.140 4.344 5.327 4.987 4.763 5.844 5.356 6.278 7.177 5.599 3.695 3.554 4.422 4.825 4.267 5.207 5.748 3.501 2.042 + 8.082 7.948 5.374 8.396 10.203 8.652 4.268 6.768 5.363 4.785 5.988 5.774 6.499 5.501 8.258 7.556 4.301 3.970 4.958 5.935 5.694 5.909 4.918 4.858 5.630 5.829 4.974 4.482 4.317 4.574 5.046 4.298 5.088 5.753 3.899 3.056 + 7.373 8.099 6.134 7.697 9.684 8.763 5.982 6.916 5.643 3.477 4.360 4.301 5.187 4.903 6.702 5.798 4.055 4.238 3.212 4.396 4.705 5.359 4.987 4.938 5.036 5.391 4.136 3.853 3.964 5.352 5.993 3.984 4.708 4.620 3.285 2.767 + 8.989 9.584 9.840 8.793 7.718 7.411 6.071 6.334 7.052 7.719 8.232 7.186 5.215 5.369 5.868 5.631 4.422 4.185 3.345 4.863 5.457 5.583 4.251 4.530 4.748 5.023 4.175 3.879 3.354 4.705 5.225 4.855 4.189 5.005 5.110 4.181 + 10.392 10.470 10.430 9.911 9.828 8.275 6.006 6.708 6.706 6.240 7.387 5.856 4.337 3.497 5.126 5.129 3.818 2.710 3.795 3.882 4.429 4.130 4.124 4.520 5.054 5.289 4.400 4.773 4.336 4.764 5.097 5.031 5.025 5.004 4.654 3.995 + 8.447 7.373 5.984 6.008 8.660 7.938 7.142 6.513 5.620 6.132 6.074 5.776 4.672 4.786 4.691 4.970 4.437 3.411 3.245 3.437 3.810 3.984 3.658 4.694 5.001 4.944 5.141 4.317 4.539 4.411 5.025 4.282 4.065 4.205 4.255 3.787 + 5.571 6.136 5.730 6.039 7.718 6.998 5.837 5.251 3.113 3.641 4.555 3.017 2.708 4.855 4.391 4.114 4.239 4.441 4.607 5.371 4.491 4.495 5.331 5.484 5.274 4.817 4.860 4.443 4.531 4.630 5.037 4.865 4.660 5.176 4.426 3.276 + 5.144 5.217 4.209 6.326 8.137 7.492 5.861 4.931 3.875 4.093 4.193 2.477 4.416 5.252 4.063 5.025 5.387 5.287 4.560 5.611 6.484 5.798 6.232 6.376 7.560 7.112 5.432 5.150 4.841 5.448 5.403 5.003 5.248 5.368 5.387 5.277 + 7.742 7.407 6.710 6.642 8.490 9.170 7.422 8.283 7.553 7.522 5.253 6.015 5.970 5.474 5.734 6.742 6.843 5.735 4.970 5.475 7.059 7.540 6.891 8.249 9.061 9.324 7.274 6.322 6.652 6.716 6.338 7.218 6.494 6.771 6.242 5.586 + 12.227 11.089 9.092 9.770 10.982 11.643 11.392 11.013 10.547 9.768 8.881 7.854 7.216 7.644 8.249 9.158 9.322 8.209 6.147 6.926 7.316 8.233 8.193 7.353 9.472 10.127 9.280 8.795 9.345 8.740 8.301 9.442 8.558 7.726 7.891 6.158 + 10.999 9.692 9.265 9.355 9.424 8.756 8.772 7.713 7.261 7.670 6.831 6.244 5.485 6.482 6.583 6.143 6.649 6.285 5.325 5.910 7.111 7.848 8.552 8.235 10.117 10.313 9.236 6.566 6.681 6.926 6.547 6.827 7.388 7.309 7.116 5.651 + 11.774 11.923 10.553 11.437 10.745 9.481 10.491 9.513 8.994 9.550 9.224 9.149 9.090 8.757 8.867 8.381 8.027 7.979 7.835 7.270 7.130 8.780 9.287 8.662 9.563 10.054 8.782 8.031 7.665 7.045 8.061 7.994 8.087 8.630 7.910 5.545 + 13.374 13.032 12.293 12.164 11.141 10.622 10.809 10.084 9.007 9.787 10.128 10.267 9.856 9.929 9.756 9.226 8.487 7.432 7.455 7.569 7.470 8.167 8.337 9.376 9.782 10.804 9.979 8.691 7.874 7.537 8.238 8.360 7.660 8.623 8.028 6.388 + 10.713 9.142 6.409 8.645 8.170 6.312 6.732 6.445 6.628 6.927 6.453 5.867 5.611 5.636 5.178 5.225 3.318 4.267 4.906 5.233 5.313 6.012 7.777 8.353 9.307 10.131 8.466 6.033 5.526 5.629 6.292 6.838 7.535 8.104 7.763 5.383 + 5.910 5.916 5.206 6.274 7.353 7.065 8.175 6.947 4.940 5.631 5.519 5.730 4.842 3.831 5.375 5.206 2.833 3.901 3.890 3.873 4.523 4.798 6.697 8.150 9.374 9.516 8.412 6.222 5.074 5.722 4.918 5.859 6.305 6.905 7.138 5.266 + 6.478 4.873 3.966 6.741 7.633 6.792 8.152 6.267 4.929 5.122 4.628 3.920 4.223 4.321 5.080 4.146 3.410 3.859 3.585 4.055 4.143 4.953 5.904 7.558 8.167 9.738 8.791 6.349 4.360 4.262 4.617 5.032 6.712 7.414 7.207 5.267 + 6.425 5.724 5.615 8.705 8.627 7.828 8.102 5.035 5.784 5.020 4.531 3.567 3.840 4.277 4.376 4.172 4.195 3.091 3.585 3.884 4.511 5.148 6.331 7.845 8.841 10.220 8.654 6.353 5.316 5.552 5.850 5.478 6.258 6.765 6.203 5.231 + 4.886 5.377 6.656 9.754 9.097 7.904 8.880 6.409 5.739 4.995 5.024 4.593 1.382 4.697 5.865 5.633 5.102 3.626 4.837 4.983 5.158 5.017 6.861 9.282 10.116 10.733 9.939 7.320 6.187 6.644 7.077 6.947 7.379 7.045 7.524 6.066 + 3.857 4.079 8.294 10.288 9.229 8.432 8.187 6.744 5.842 5.553 4.438 4.824 3.946 4.406 5.090 4.697 3.704 3.664 3.216 4.147 5.126 5.518 7.137 10.009 10.369 10.569 10.072 7.752 5.638 5.778 6.491 5.875 6.676 7.444 7.529 5.474 + 5.844 4.552 7.781 9.544 8.610 7.819 6.344 8.022 8.344 5.911 5.088 5.589 4.454 4.722 3.747 3.905 3.810 3.378 3.458 4.131 5.036 6.343 8.258 10.092 10.373 11.035 9.989 7.742 6.095 5.580 6.439 6.520 7.622 8.562 7.877 5.696 + 3.074 4.796 5.531 7.068 8.109 8.502 7.067 9.145 9.266 6.520 5.570 3.873 3.544 5.024 4.119 3.861 2.570 2.699 4.082 4.380 4.879 6.074 8.922 10.541 10.852 10.842 9.867 7.964 5.719 5.891 6.657 6.772 7.221 8.616 8.192 6.418 + 3.063 5.290 5.791 5.207 6.814 8.687 7.288 8.400 8.155 7.019 6.329 5.796 4.116 4.410 5.557 4.499 3.541 3.561 4.028 5.056 4.536 4.931 8.812 10.279 10.017 10.671 10.084 7.646 5.702 5.691 5.603 6.756 6.533 7.842 8.181 6.556 + 3.181 4.766 5.262 6.798 7.314 8.807 7.241 8.421 8.035 6.773 5.760 4.509 5.301 4.921 5.059 5.163 3.226 4.254 4.746 4.023 5.332 4.572 8.724 10.652 10.182 10.559 9.510 7.504 6.146 5.722 6.010 5.537 5.747 7.753 7.889 5.723 + 4.503 4.751 7.228 7.901 7.499 8.895 7.566 8.048 7.291 6.992 6.441 4.105 4.093 4.307 4.095 3.235 3.274 4.577 5.944 5.168 4.984 5.037 7.375 9.148 9.667 9.255 7.528 6.632 5.321 4.043 5.218 5.490 7.033 7.480 7.103 5.912 + 4.873 4.551 6.373 7.924 6.749 6.874 5.953 6.609 5.605 4.332 5.650 5.369 3.739 3.869 4.942 3.642 2.745 3.083 3.040 2.695 3.904 3.625 5.264 8.083 8.768 8.667 7.235 5.655 4.507 4.594 4.625 4.728 5.983 7.153 7.206 4.915 + 7.530 6.645 7.203 7.273 6.527 6.740 5.843 6.740 6.830 6.284 5.952 3.722 2.942 4.362 4.165 3.437 4.305 4.118 3.661 3.508 4.839 5.103 4.978 7.129 8.181 8.260 5.413 4.834 4.247 4.382 4.716 5.116 5.590 6.189 5.964 3.726 + 8.714 7.046 7.651 6.826 6.498 6.116 6.187 6.067 5.437 5.125 5.284 4.545 4.399 4.718 4.852 4.175 3.878 3.835 4.511 4.514 5.030 5.266 4.950 5.640 6.831 7.010 5.046 5.191 5.690 4.997 3.722 4.756 5.712 5.995 6.178 5.003 + 8.332 7.441 6.522 6.653 6.707 6.707 5.054 5.257 5.571 5.317 4.428 4.793 3.349 4.286 5.315 4.475 4.271 4.360 4.995 4.967 4.835 4.459 6.079 6.164 6.129 5.197 5.038 4.639 5.066 4.968 4.475 4.999 5.720 6.780 6.054 5.039 + 6.397 5.646 6.229 6.053 5.726 7.284 5.846 5.433 4.988 5.190 3.496 4.407 4.787 3.413 4.694 4.433 3.265 4.144 4.005 4.029 4.619 5.361 5.408 5.040 4.846 3.720 5.099 4.975 5.012 4.603 4.227 4.289 4.307 4.949 5.089 3.563 + 7.246 7.495 6.581 6.374 7.234 6.861 6.115 5.543 4.321 5.464 5.510 4.683 4.198 3.876 4.043 4.750 3.648 4.287 4.431 4.076 4.274 4.474 4.929 6.408 5.904 5.983 5.589 4.771 4.355 3.923 3.623 3.654 3.975 3.976 4.075 2.488 + 8.663 8.341 6.967 6.696 6.961 7.034 6.617 4.781 4.890 4.406 5.348 4.200 3.607 4.361 4.056 4.911 5.310 4.039 3.729 4.281 4.777 4.247 4.449 6.016 5.272 5.225 4.984 5.511 4.147 4.971 4.995 5.209 5.318 4.767 4.074 2.623 + 7.009 6.547 5.560 5.271 4.629 5.730 5.922 5.190 4.061 4.530 5.024 5.230 4.424 4.649 5.318 4.112 4.925 4.965 3.619 3.530 3.365 4.540 4.942 5.622 6.144 6.039 5.766 5.962 5.522 5.142 4.349 4.662 5.755 5.206 5.642 3.940 + 5.780 5.863 6.752 6.979 5.810 6.113 5.833 5.181 5.634 6.397 4.538 4.088 3.928 4.968 4.691 4.077 4.059 4.075 3.615 4.394 5.191 4.809 4.853 6.812 7.928 8.095 6.807 5.309 4.736 5.246 4.603 4.678 5.523 5.969 5.386 4.761 + 4.867 6.254 6.973 5.717 6.399 7.677 5.719 4.750 4.858 5.863 3.828 3.336 2.355 4.255 4.088 3.763 3.853 3.127 3.819 3.801 5.381 5.029 4.670 8.256 8.071 8.751 7.175 5.970 5.313 5.083 5.111 4.970 5.832 6.331 6.598 5.147 + 4.752 5.830 6.243 5.704 7.061 8.328 6.459 6.238 5.579 4.780 3.715 2.733 2.579 3.329 4.531 3.717 3.722 2.362 2.723 3.820 4.010 4.550 6.423 8.548 8.521 7.958 8.506 7.297 5.974 4.895 6.300 6.303 6.328 7.218 6.976 4.922 + 6.343 6.064 6.376 6.780 8.045 8.322 7.510 8.392 7.512 6.165 4.965 2.825 2.706 4.256 4.257 3.783 2.997 2.998 2.857 5.807 6.297 6.450 8.529 9.226 8.815 8.747 8.917 7.670 7.214 6.047 6.646 6.220 6.545 6.979 7.381 5.449 + 4.507 5.052 5.948 6.624 6.910 6.096 6.896 7.146 6.281 6.521 5.146 4.945 4.738 5.294 4.964 3.758 3.313 5.584 5.351 6.891 7.404 7.709 8.920 8.147 8.459 8.829 8.942 7.303 6.222 5.718 6.528 5.884 7.020 7.206 7.638 5.555 + 5.337 4.635 5.761 5.272 3.925 3.576 5.167 4.941 6.831 6.464 3.631 4.968 5.248 4.664 5.375 4.715 3.540 4.842 5.063 6.569 7.653 8.857 8.213 7.212 8.031 8.471 8.300 6.341 5.947 5.882 5.704 5.902 8.000 7.670 7.188 5.232 + 5.424 5.426 6.225 4.977 5.797 5.159 4.856 4.959 7.250 6.740 4.108 3.291 4.425 5.155 5.257 5.130 4.140 5.331 5.895 6.470 8.068 8.905 6.615 6.595 7.254 8.261 7.660 6.592 5.853 5.760 5.713 5.932 7.427 7.702 6.973 5.876 + 5.315 5.391 6.731 5.971 6.236 6.003 6.904 5.686 6.173 5.841 5.043 3.343 4.123 6.323 5.039 4.947 4.977 5.729 6.149 7.928 8.517 7.888 7.495 7.668 7.045 7.843 8.118 6.727 5.377 5.089 5.526 5.729 6.754 7.306 7.545 5.608 + 5.443 5.399 4.793 5.100 4.984 5.670 7.164 6.036 6.393 6.709 6.880 4.341 5.257 6.073 5.834 4.732 4.862 6.132 5.597 9.035 9.143 7.649 6.156 6.668 6.764 7.613 7.708 6.510 4.199 4.615 5.686 6.077 6.923 7.396 7.244 5.267 + 3.026 4.286 3.281 4.644 5.153 5.177 5.730 6.568 7.409 8.215 7.543 7.062 5.948 6.112 6.715 4.922 5.077 6.777 6.989 9.551 9.489 7.679 5.576 6.024 6.058 6.687 6.779 5.691 4.273 4.108 4.335 5.741 6.790 6.689 6.850 3.774 + 12.004 12.272 12.025 12.068 12.121 12.217 12.154 11.972 10.575 10.583 10.639 11.025 10.600 9.497 9.650 9.561 9.714 9.322 8.710 9.890 9.720 7.998 6.911 7.649 6.736 7.892 7.166 6.994 5.832 5.961 5.332 6.604 6.847 6.837 6.712 5.365 + 14.501 13.377 12.750 11.967 12.822 12.642 13.057 12.930 11.222 9.277 11.175 11.859 10.945 9.026 9.784 9.642 10.092 9.579 8.760 10.051 10.128 9.089 7.885 8.489 8.074 8.964 7.859 7.424 6.429 6.747 6.774 7.269 7.531 6.361 6.839 6.414 + 11.849 10.464 8.361 9.306 8.716 9.164 8.451 7.660 9.115 9.299 8.040 7.623 7.590 6.674 6.486 5.851 5.203 6.408 6.819 9.542 9.526 7.619 5.544 6.247 5.854 6.267 6.893 6.218 5.268 4.052 5.014 5.235 5.657 5.680 6.211 4.332 + 9.006 5.350 5.341 4.543 5.380 4.950 5.302 7.155 7.414 7.578 6.439 5.871 5.895 4.587 4.196 3.580 5.050 5.685 7.082 8.316 8.213 5.364 4.099 5.552 5.446 5.911 7.462 6.257 4.235 4.789 4.767 5.868 6.548 5.983 6.351 4.834 + 5.850 4.983 5.008 5.102 5.831 5.071 3.459 5.853 8.012 7.655 5.136 6.213 5.385 4.768 5.166 3.198 3.664 6.314 7.334 9.134 9.085 6.118 5.544 4.710 5.579 5.309 6.691 6.706 5.580 4.849 4.859 5.848 6.552 5.441 5.485 3.999 + 4.196 4.742 4.925 5.273 6.127 5.997 5.296 6.298 7.189 8.356 6.033 5.551 6.259 5.518 5.834 4.369 4.960 5.507 6.316 9.024 8.599 6.690 5.345 5.101 5.902 5.225 6.691 6.223 4.596 4.419 4.710 5.566 6.273 5.411 4.847 2.900 + 6.629 6.114 6.284 6.768 6.093 6.605 5.921 7.205 7.637 8.502 6.645 6.013 5.242 6.184 5.189 4.368 5.295 6.833 7.484 9.436 8.432 6.457 4.691 4.174 4.887 5.317 6.208 5.906 4.636 4.695 4.163 4.423 4.162 4.672 5.068 2.490 + 7.257 8.129 8.404 8.889 8.966 9.889 10.267 9.502 9.501 9.995 9.159 9.152 8.645 8.260 8.167 7.622 8.135 7.468 7.495 7.415 7.936 7.440 7.457 7.603 8.400 7.430 7.254 7.193 6.666 6.801 7.450 8.664 9.469 8.014 8.549 7.442 + 10.758 8.711 7.481 8.481 8.323 9.634 10.222 9.829 9.103 9.591 9.149 8.842 7.960 6.952 7.475 7.028 7.592 7.591 7.045 6.836 8.074 8.475 8.148 9.393 10.026 8.881 8.924 8.436 7.497 7.970 8.657 9.273 9.780 9.238 8.721 7.675 + 10.355 9.839 9.659 9.830 9.766 9.591 9.435 10.147 9.564 9.540 9.216 8.239 8.325 8.267 7.390 7.673 8.282 8.808 9.125 8.462 8.559 8.525 9.433 10.453 11.120 10.774 9.699 8.437 9.838 10.498 10.964 11.507 11.707 11.322 10.471 8.619 + 11.378 8.736 7.575 8.116 6.899 6.619 7.761 8.083 6.731 5.706 5.567 4.167 3.901 3.891 4.081 4.095 5.031 5.759 5.793 6.490 6.545 6.471 5.248 6.370 6.582 6.369 5.186 5.273 5.185 5.397 5.689 6.424 6.243 5.841 5.554 4.168 + 8.153 7.445 7.636 8.765 7.328 5.246 6.203 7.809 7.880 7.472 5.826 4.111 4.463 4.935 4.282 3.649 3.033 4.099 4.875 5.269 5.115 5.783 4.882 5.009 4.045 4.776 4.830 5.069 4.468 4.562 5.165 5.198 4.967 4.258 5.088 4.484 + 6.807 6.622 6.280 7.225 6.991 6.550 5.645 4.867 5.349 5.981 5.384 4.485 4.073 4.647 5.139 3.104 3.757 4.112 4.387 6.081 5.865 4.428 4.415 5.351 4.031 4.459 4.405 4.736 4.181 3.713 4.307 5.260 4.753 4.987 4.544 4.075 + 7.275 7.043 6.839 6.992 7.868 6.444 5.642 6.109 7.043 7.300 6.446 5.541 5.583 5.228 4.823 4.869 3.596 3.032 4.996 5.269 5.830 5.949 4.756 4.918 4.439 4.787 4.992 5.118 4.892 4.458 3.419 4.358 4.267 4.774 4.546 5.020 + 8.280 8.160 7.813 8.206 8.250 7.529 6.717 5.921 6.083 5.992 5.349 5.592 4.229 5.490 5.532 4.167 3.211 3.274 3.977 5.496 5.251 4.916 4.782 5.396 5.113 5.456 4.860 5.181 4.910 4.918 4.530 5.288 5.259 5.517 4.334 4.559 + 6.191 7.335 6.993 9.137 8.912 5.952 6.296 6.307 4.583 5.686 6.223 4.565 3.824 5.976 6.274 5.570 2.943 2.888 3.796 5.109 4.730 5.305 4.330 5.584 4.857 4.359 5.064 5.211 5.583 5.118 5.164 5.561 5.700 5.414 4.551 3.704 + 6.203 4.793 5.939 8.083 7.838 6.969 6.546 6.308 6.071 5.700 5.022 5.118 4.940 4.636 4.705 4.367 4.050 3.595 3.842 5.182 5.265 5.929 4.920 5.690 5.015 4.950 4.503 4.354 4.666 4.299 4.278 4.574 4.895 5.461 5.259 4.401 + 5.631 5.010 5.488 6.228 6.261 6.374 6.639 5.731 5.091 4.574 5.772 4.906 2.893 2.360 3.799 4.332 4.063 4.356 3.626 3.928 5.660 5.489 4.929 5.354 5.945 4.758 4.574 4.428 4.752 5.201 4.367 4.119 5.127 5.121 4.280 3.758 + 5.318 5.006 6.248 7.150 6.277 6.056 5.349 5.244 6.234 5.926 5.805 5.047 3.606 3.147 4.389 4.087 3.493 4.168 3.869 4.517 5.504 5.751 6.263 4.895 5.418 4.785 4.030 4.273 4.437 4.173 4.787 4.283 4.755 5.193 4.809 3.704 + 7.121 6.227 5.638 7.692 8.127 7.470 7.139 7.043 6.130 6.378 5.385 4.618 6.776 6.220 5.321 4.906 3.470 4.633 3.806 4.890 4.800 5.088 5.329 5.222 4.561 4.687 5.168 4.960 4.615 4.995 5.700 5.339 5.565 5.465 5.856 3.975 + 5.191 6.696 6.642 6.884 7.003 6.335 6.347 5.470 5.035 5.282 6.633 6.989 6.694 5.282 5.458 5.354 3.146 4.064 4.422 4.885 4.814 5.917 5.684 4.468 4.218 4.444 5.197 5.071 3.817 3.176 4.454 4.714 5.204 4.935 4.601 3.365 + 8.169 6.435 6.853 6.926 5.673 6.056 7.484 7.290 6.128 6.560 7.007 5.659 4.544 5.456 5.327 5.546 5.105 4.052 4.353 4.524 4.611 4.910 7.036 6.257 4.765 5.512 4.808 4.343 4.650 4.794 4.335 5.055 5.141 5.061 5.068 3.594 + 10.039 9.937 9.287 7.960 7.050 6.493 6.126 7.406 7.505 6.341 6.707 5.988 5.555 6.190 6.292 5.594 5.416 4.528 2.926 4.295 5.089 5.314 5.592 5.511 5.290 4.966 4.825 4.594 4.510 5.455 5.045 4.919 4.987 5.231 5.611 5.281 + 7.975 8.164 6.693 5.854 5.941 6.649 6.649 5.998 6.453 5.081 5.573 6.724 5.262 6.275 5.825 4.429 4.667 5.489 4.687 4.536 4.814 4.937 5.377 5.600 4.969 5.248 5.075 4.354 5.215 5.272 5.235 5.722 5.908 5.365 5.605 5.334 + 4.632 5.071 6.400 5.610 5.380 4.923 5.756 5.507 6.168 5.556 5.530 5.022 4.689 4.759 3.949 4.155 4.113 3.654 3.667 4.612 4.996 5.527 5.161 4.201 4.747 4.766 4.828 5.027 5.515 5.623 4.996 4.894 5.761 6.562 5.337 5.159 + 5.194 4.489 4.734 5.768 6.323 4.139 3.942 4.975 5.631 5.265 5.531 4.942 5.039 3.848 2.890 3.493 4.150 2.679 2.857 4.706 5.447 4.771 5.469 5.005 3.917 5.253 4.957 4.677 5.085 5.370 5.188 4.779 4.992 4.595 4.833 5.070 + 4.299 5.837 5.963 6.256 5.057 4.169 3.456 5.660 6.086 4.171 5.133 5.514 3.764 2.152 3.662 2.955 4.423 4.786 3.485 3.991 4.925 4.774 4.483 4.511 5.051 4.586 4.322 4.128 4.583 5.291 5.332 5.202 4.465 4.769 5.383 4.529 + 4.773 4.945 4.380 6.364 6.200 5.181 5.187 4.049 4.651 4.620 5.445 5.770 3.912 3.989 4.135 3.947 3.832 4.304 4.141 4.346 4.765 4.745 4.835 4.671 4.818 4.277 3.945 5.311 4.860 5.086 4.997 5.636 5.763 5.019 5.368 4.166 + 5.125 5.103 5.121 5.423 5.545 4.771 5.869 5.373 4.908 4.867 5.840 5.159 2.076 4.015 3.708 3.925 4.043 4.563 3.977 4.019 4.569 4.899 4.628 4.786 3.997 5.125 4.911 4.941 5.148 5.032 5.399 5.435 5.583 4.702 5.481 4.994 + 4.580 3.397 3.791 5.716 4.596 4.393 5.149 5.519 5.279 5.917 5.096 4.292 4.782 5.136 5.034 4.479 4.443 4.859 4.633 4.770 5.269 4.825 4.785 3.812 3.529 5.020 5.091 4.686 4.531 4.496 4.982 5.057 6.493 6.341 6.252 5.923 + 6.284 4.622 4.435 5.519 5.820 4.437 5.185 4.799 4.485 5.203 4.403 3.434 3.941 3.535 2.182 2.659 2.757 3.134 2.553 3.471 4.449 3.558 4.263 4.020 4.650 4.183 4.546 4.808 4.254 4.491 5.131 5.051 5.526 5.231 5.658 5.121 + 6.046 4.941 3.641 4.708 4.430 4.371 4.616 4.323 5.189 5.242 5.078 3.743 2.773 2.937 2.513 2.487 2.427 2.623 2.784 3.613 3.645 2.972 3.834 3.283 4.378 3.982 3.633 4.435 4.825 4.279 4.662 4.520 4.587 5.304 4.700 4.906 + 3.545 5.963 5.908 5.860 5.568 4.172 3.805 3.367 5.348 4.867 4.526 4.647 4.391 5.070 4.112 3.048 3.152 3.682 2.792 2.703 3.484 3.647 4.071 3.847 3.986 4.152 3.556 4.158 3.882 4.073 4.453 4.839 4.560 4.464 4.447 4.076 + 5.067 5.715 5.514 4.233 2.077 4.205 5.242 4.301 4.853 3.985 3.589 3.115 2.443 3.614 2.598 3.221 4.014 2.911 2.731 1.555 3.086 4.137 3.942 4.048 3.843 4.157 3.801 3.849 3.814 3.653 4.509 5.144 4.021 4.297 4.452 3.471 + 4.197 5.229 5.858 4.767 4.049 4.373 3.799 3.016 4.294 3.474 3.291 1.470 2.122 2.475 1.023 1.408 2.986 1.996 1.177 1.603 3.443 4.072 3.465 2.727 3.286 4.125 2.861 2.892 3.481 3.233 3.839 3.923 3.061 3.365 2.984 2.344 + 4.739 5.811 5.359 4.480 4.772 5.418 5.289 4.417 4.431 4.036 3.582 2.929 2.563 2.491 1.948 2.175 2.692 3.197 1.891 2.610 3.331 2.057 2.097 3.525 3.793 3.832 3.657 2.699 4.199 4.311 4.339 3.811 3.696 3.674 4.049 2.689 + 4.764 5.180 4.653 4.253 4.150 6.018 5.350 4.326 4.589 4.018 3.859 3.571 2.610 3.649 3.087 2.680 2.383 2.104 1.637 2.714 2.726 3.452 3.885 3.708 2.886 2.876 2.976 3.312 3.263 3.866 3.517 2.916 3.734 3.536 3.801 3.057 + 2.647 1.856 3.759 5.386 4.749 3.277 3.933 3.858 4.110 4.038 3.260 4.339 3.437 3.605 4.414 3.206 4.363 3.547 2.505 2.198 3.512 3.246 3.340 2.213 2.884 3.519 2.538 2.983 2.653 3.871 3.547 3.456 3.252 3.576 3.406 2.105 + 2.999 1.990 3.686 5.410 4.785 3.667 2.976 3.112 4.002 3.755 2.985 2.996 3.014 1.821 2.522 3.440 3.392 3.397 2.519 2.562 3.956 2.776 3.361 2.992 3.009 2.645 2.569 2.849 2.890 3.315 2.934 3.170 2.872 2.823 2.719 2.113 + 3.778 4.762 5.466 3.805 4.462 3.856 2.981 1.636 3.777 3.453 2.420 3.186 3.708 3.128 3.065 3.591 3.403 3.292 3.602 3.010 3.303 3.425 4.657 3.677 3.622 3.018 3.053 3.027 2.687 3.496 2.415 2.499 2.873 2.722 2.460 1.880 + 3.118 3.782 5.264 4.609 4.882 4.693 3.918 2.355 2.137 1.343 3.457 3.294 2.308 1.730 1.886 2.058 3.279 3.022 2.668 2.745 3.991 4.049 3.189 3.127 2.590 2.897 2.954 2.885 3.677 3.418 2.852 2.206 2.500 2.633 2.495 1.598 + 4.965 5.185 3.707 0.920 2.034 2.509 3.496 3.655 1.509 2.295 3.159 1.769 0.576 1.226 0.774 1.481 1.879 2.213 1.771 1.320 1.759 2.447 3.172 2.896 2.306 1.760 1.580 1.983 2.262 2.363 2.436 1.353 2.116 2.355 2.241 1.562 + 5.137 4.109 3.946 2.889 2.204 1.588 2.669 2.567 1.847 4.059 3.396 2.835 2.253 1.226 0.910 0.718 1.298 1.947 1.606 2.087 2.751 2.463 2.222 2.317 2.674 1.375 1.571 1.520 2.407 2.865 1.703 2.062 1.671 2.401 2.248 1.007 + 2.692 4.316 4.801 3.919 2.109 2.179 2.022 1.607 1.492 4.635 4.411 2.864 2.329 2.376 2.381 1.372 1.903 2.126 3.037 2.519 3.063 3.336 3.351 3.062 2.974 1.563 1.438 1.956 2.234 2.389 1.843 2.242 2.446 2.422 1.834 2.121 + 3.757 3.955 3.437 3.521 2.930 2.265 2.106 2.720 2.795 3.894 3.041 2.580 2.405 2.910 1.680 1.861 1.826 2.485 1.354 1.997 2.110 3.417 2.963 3.012 2.596 2.727 1.345 1.377 2.275 2.387 1.818 2.267 1.856 2.885 2.730 1.728 + 2.245 2.943 3.878 2.017 4.165 3.675 2.627 1.695 2.119 1.982 3.310 2.905 1.893 1.880 1.893 1.332 0.727 1.135 0.871 1.428 3.122 3.548 2.826 1.265 2.042 2.701 2.247 1.696 2.118 2.868 1.962 2.653 2.186 1.861 2.016 1.167 + 2.649 4.603 4.963 5.001 4.248 3.904 3.383 1.790 2.075 2.266 4.402 3.480 2.377 3.259 2.796 0.683 0.748 1.951 1.434 1.877 2.263 2.275 2.734 1.771 1.604 2.312 1.877 1.268 1.134 1.597 2.221 2.089 1.683 1.751 2.151 1.075 + 3.523 4.663 4.359 4.905 4.202 2.395 2.904 3.052 2.362 1.790 2.635 1.281 2.186 2.438 1.565 1.631 1.860 1.328 1.176 1.430 1.996 2.493 2.749 1.760 1.316 1.286 2.878 1.839 1.794 2.273 2.050 1.895 1.909 2.444 2.028 0.962 + 2.494 3.262 3.540 4.099 4.213 2.077 1.975 1.981 0.440 0.975 1.317 0.674 1.094 2.565 2.036 0.894 0.478 0.769 0.560 2.351 2.236 2.816 2.638 3.183 3.145 1.162 1.696 2.007 1.871 1.646 1.548 1.817 2.250 2.187 2.528 2.143 + 2.144 4.079 3.357 1.584 2.353 2.216 2.363 2.125 1.904 3.032 1.933 1.013 1.004 1.636 0.729 -0.172 0.952 1.921 2.112 1.445 1.846 3.564 3.294 3.466 3.773 2.623 2.570 2.864 2.850 2.722 2.428 2.509 3.189 2.876 2.598 2.052 + 4.162 3.730 4.031 4.516 2.915 2.661 4.427 4.674 3.322 4.514 4.328 3.014 1.037 2.210 2.039 1.920 2.380 3.024 2.544 2.341 2.255 2.551 3.150 3.070 2.776 2.625 3.085 2.314 2.890 2.892 2.543 3.124 4.104 3.634 2.590 1.607 + 5.963 5.658 4.882 5.025 5.516 4.183 4.557 5.747 4.558 4.920 4.313 2.992 3.396 3.934 3.723 1.874 1.339 2.051 1.737 1.976 2.741 2.058 3.232 3.413 3.282 3.533 3.316 3.324 3.792 3.939 2.799 2.535 3.053 2.665 2.223 1.303 + 7.140 8.512 7.840 6.677 6.545 7.475 7.563 5.473 5.690 6.474 5.128 4.499 4.290 4.310 3.106 2.544 2.520 2.147 2.672 3.307 3.589 4.751 5.604 6.213 5.733 5.646 6.397 5.761 5.447 5.003 5.402 5.368 5.945 4.531 4.242 4.006 + 7.106 7.305 7.379 5.523 6.374 6.561 7.269 6.630 5.202 3.886 5.102 4.222 2.582 3.180 3.427 3.035 3.544 3.329 3.145 4.652 4.458 5.196 6.910 7.076 6.860 6.491 6.977 6.813 5.496 5.211 5.095 4.200 5.228 5.048 4.465 3.240 + 7.083 7.853 7.141 5.196 5.944 7.637 7.968 5.614 4.013 3.827 5.120 4.427 2.933 3.674 3.486 4.317 3.844 3.907 3.428 5.415 5.228 6.190 7.784 7.710 7.572 7.492 7.905 8.086 6.658 5.784 5.222 5.757 5.788 4.982 4.308 3.808 + 6.376 6.720 7.268 7.732 7.788 6.628 8.489 7.763 5.926 6.492 4.837 4.616 4.437 4.363 4.833 4.980 4.078 4.232 4.995 5.404 5.119 6.666 8.517 7.326 6.895 6.919 6.913 7.495 6.972 5.093 6.138 6.267 6.285 5.461 4.698 4.194 + 9.920 9.919 9.498 7.776 6.783 7.811 8.214 6.890 8.211 8.333 6.065 5.677 5.132 4.171 4.684 4.443 4.648 4.346 5.854 5.329 5.187 7.397 8.532 7.906 7.503 7.284 7.852 8.514 6.706 4.936 6.002 6.540 6.219 6.012 5.738 5.744 + 11.704 11.285 10.830 10.055 10.398 10.551 10.184 9.129 7.273 7.532 8.251 7.947 7.571 7.072 6.497 5.446 4.549 4.764 5.142 4.952 5.444 5.715 6.977 6.442 7.078 7.243 7.190 7.615 6.728 5.455 5.600 5.298 5.899 5.742 6.442 5.422 + 10.510 11.263 10.532 9.690 9.945 10.428 10.649 8.254 8.201 8.586 7.980 8.096 7.807 7.673 7.062 6.381 6.120 6.569 6.741 5.828 5.718 7.423 7.500 6.405 8.014 8.538 7.741 8.230 7.015 6.077 7.053 7.318 7.702 5.852 6.219 5.186 + 10.867 10.376 10.274 9.869 10.977 11.394 10.183 8.696 7.453 8.790 8.711 7.605 8.370 8.076 7.417 7.754 7.817 8.452 8.534 7.574 6.679 7.682 7.313 7.524 8.297 8.755 7.651 6.851 6.229 6.584 6.448 7.095 7.257 6.987 6.819 5.625 + 11.818 12.110 11.865 11.948 11.900 11.985 11.047 8.631 7.943 8.498 9.165 7.684 8.645 8.489 8.500 8.453 8.509 8.702 8.241 7.017 7.353 7.812 7.075 7.856 8.900 8.326 7.389 6.291 6.101 6.893 7.297 7.772 7.644 7.157 6.359 6.138 + 6.801 7.308 7.479 8.698 8.083 9.422 9.033 6.767 6.901 6.981 7.183 5.708 5.296 5.703 5.778 6.405 5.799 6.506 8.096 8.267 7.293 6.419 6.294 7.127 7.579 7.249 6.500 7.467 6.849 7.525 6.981 7.033 7.404 7.446 7.276 6.531 + 7.490 6.593 5.676 7.038 7.580 7.930 7.531 7.475 7.202 7.528 7.652 6.733 6.808 7.085 7.336 7.633 8.005 7.472 7.440 8.396 8.821 8.191 8.280 9.463 10.074 9.343 7.876 8.128 7.860 7.788 8.893 8.822 9.563 9.624 9.378 8.472 + 6.919 6.654 7.343 6.553 6.174 8.422 7.461 6.701 7.019 6.606 5.772 5.675 5.599 5.961 5.404 5.900 6.953 6.856 6.853 7.103 7.638 6.838 6.642 8.203 8.694 8.221 7.165 7.122 7.233 7.962 8.274 7.426 8.308 8.802 8.473 7.373 + 6.936 7.051 7.227 6.469 6.613 8.409 7.295 2.824 2.971 3.422 4.087 4.613 4.516 3.979 4.415 5.045 5.747 5.622 6.846 7.225 6.091 6.246 5.895 6.750 6.704 6.832 7.215 7.192 7.952 7.561 8.103 8.475 8.378 8.411 7.683 6.530 + 8.374 8.845 7.672 5.961 7.198 7.300 7.657 5.644 5.971 5.753 4.626 5.328 6.196 5.029 4.944 5.881 6.097 6.291 6.776 6.722 6.726 7.226 8.024 7.610 7.936 7.487 6.990 7.748 8.383 9.075 9.056 9.073 8.911 9.369 8.813 8.361 + 6.714 9.000 9.013 6.942 6.724 7.347 6.308 6.342 6.622 7.131 5.791 5.057 5.681 5.074 4.632 5.259 5.922 5.714 5.436 5.847 6.680 5.745 5.620 6.037 6.211 6.908 6.438 6.030 7.424 9.024 8.383 8.338 8.727 8.176 7.820 7.694 + 5.940 6.318 7.533 6.992 7.868 7.600 5.630 6.252 6.317 5.692 5.478 4.872 4.983 4.488 4.932 5.195 4.672 3.942 5.980 6.356 5.687 6.407 6.015 6.314 6.234 6.137 6.235 6.953 7.246 8.302 7.949 8.230 8.707 8.022 7.033 6.521 + 6.062 6.488 6.957 7.432 6.395 5.031 5.695 4.712 3.330 4.207 3.913 4.932 4.832 3.988 3.454 3.770 4.004 3.415 4.668 4.304 4.660 4.776 5.819 5.682 5.376 6.256 6.534 5.896 6.167 6.600 7.180 7.156 7.675 7.243 6.888 5.752 + 4.863 6.005 4.884 5.852 4.848 5.626 5.947 4.380 2.808 4.155 4.558 3.201 2.659 2.792 4.330 4.067 2.503 4.290 4.559 4.241 4.421 4.013 4.374 3.574 4.954 3.780 4.810 5.171 5.352 5.076 5.669 5.083 4.964 5.633 5.212 4.257 + 8.661 8.391 7.455 6.095 6.490 4.460 4.131 3.391 3.464 4.122 4.186 4.633 4.557 4.431 5.073 4.742 3.768 4.073 5.006 4.905 4.137 3.173 3.301 3.579 4.536 3.784 4.748 5.173 5.068 5.525 4.736 5.018 5.017 5.688 5.404 4.553 + 6.854 6.300 7.149 5.513 5.872 4.796 3.765 3.568 4.261 4.312 4.634 2.819 3.559 4.404 3.521 3.683 4.167 3.499 4.410 4.352 3.242 4.299 3.915 4.460 4.028 4.179 4.583 4.401 4.427 4.773 5.156 4.495 5.229 5.708 5.353 3.437 + 3.633 5.471 6.711 6.101 4.984 2.714 2.783 4.396 3.420 4.715 4.420 3.313 2.978 2.774 3.511 3.769 4.549 3.437 4.448 3.850 3.273 4.344 4.882 4.555 4.397 4.482 4.727 4.694 4.619 4.763 5.059 4.253 4.774 5.192 5.196 3.954 + 5.773 5.420 7.721 8.140 8.471 7.572 5.335 7.163 7.203 6.541 4.637 4.503 5.688 4.889 5.317 5.937 5.063 5.182 5.509 5.401 4.468 4.346 4.972 3.942 3.795 4.384 4.909 5.021 4.534 4.813 5.058 4.761 4.927 4.464 5.386 3.848 + 9.124 8.711 8.697 9.524 9.518 9.196 9.044 8.802 8.447 7.128 4.152 5.944 6.027 5.360 4.721 5.749 5.062 4.442 4.794 4.615 3.603 3.753 3.390 3.847 3.856 3.794 4.324 4.609 3.932 3.787 4.384 4.651 4.093 4.320 5.509 3.554 + 6.505 5.992 4.230 5.111 4.149 5.064 5.111 4.599 2.946 3.046 1.316 3.401 2.553 3.467 3.220 2.761 3.949 3.380 2.285 3.216 3.428 2.938 2.638 3.042 4.107 3.934 3.659 4.064 4.726 4.418 4.346 5.585 4.420 5.220 6.345 5.004 + 3.284 3.529 1.814 2.876 4.139 5.036 4.259 4.186 4.555 3.640 1.901 3.931 2.915 4.257 4.606 3.140 2.678 3.572 2.641 3.210 3.364 4.623 3.308 2.647 4.340 4.402 3.659 4.438 5.032 3.859 3.739 4.290 4.531 4.453 5.003 3.755 + 4.836 3.324 3.511 3.745 3.871 4.203 4.109 5.224 4.726 3.611 2.567 4.114 3.512 2.935 3.692 3.106 2.977 2.336 3.869 3.144 3.735 3.489 3.061 3.472 4.249 4.542 4.247 4.313 4.985 4.261 3.910 3.838 4.047 4.002 5.372 3.966 + 4.488 3.484 2.788 2.402 2.401 3.932 4.410 3.745 2.603 3.396 1.584 1.496 2.353 3.397 3.330 2.707 3.239 2.281 3.151 3.311 3.445 3.559 3.809 3.209 3.166 3.562 3.395 3.359 3.093 3.937 3.625 3.231 4.244 3.766 4.357 3.544 + 4.886 4.081 3.634 3.762 3.645 3.893 3.905 3.528 3.456 3.679 3.214 2.001 2.325 2.995 3.180 2.082 2.145 2.461 2.915 3.579 3.453 3.462 3.278 4.023 4.159 4.373 3.195 3.220 3.734 4.248 3.582 3.882 3.950 4.114 4.951 4.215 + 4.525 4.019 3.378 4.411 5.047 4.005 3.939 2.364 3.049 3.155 2.376 1.972 2.064 3.199 3.374 2.374 2.544 2.775 3.332 3.045 3.948 3.310 3.079 4.430 3.965 4.059 3.360 3.641 3.695 4.440 4.064 3.626 4.479 3.357 4.807 4.477 + 5.397 5.143 4.987 5.085 5.102 5.121 5.709 3.819 1.733 3.388 3.179 3.097 3.034 2.863 3.234 1.799 2.277 1.925 2.963 3.192 3.206 2.952 2.962 2.971 3.277 3.664 3.135 2.516 2.236 2.961 2.826 3.017 2.914 3.712 2.925 2.046 + 2.566 5.148 5.636 4.349 3.060 4.661 4.528 3.535 3.571 3.058 1.954 3.464 3.067 2.817 3.405 3.139 2.499 1.331 1.900 3.038 3.518 3.145 2.892 2.995 2.655 3.038 4.394 4.176 2.974 3.435 3.181 3.254 2.914 3.346 3.109 2.485 + 4.862 5.175 3.882 2.312 2.362 3.515 3.297 3.440 3.630 3.154 3.015 3.647 4.308 3.495 2.870 1.268 1.523 2.653 2.482 1.898 3.243 2.280 3.388 3.226 3.221 3.811 4.027 4.431 3.390 4.019 3.637 3.192 3.270 3.192 2.722 2.198 + 3.967 3.934 3.838 3.625 3.572 4.585 5.240 4.791 3.945 3.066 2.915 2.324 2.947 3.717 2.484 2.296 2.856 2.637 3.284 2.978 3.693 3.356 3.708 3.465 3.110 4.131 3.942 3.605 3.335 3.556 3.891 3.583 3.537 2.732 3.485 3.212 + 5.338 6.219 5.484 4.442 5.060 5.090 4.892 3.786 4.312 2.942 2.957 2.245 2.563 2.849 3.175 2.684 2.316 1.865 2.393 3.198 2.157 1.671 2.468 3.102 3.162 3.762 3.683 3.252 3.496 3.496 3.249 3.323 3.453 3.456 3.301 2.809 + 4.454 4.105 3.374 4.182 3.194 4.785 3.996 3.444 2.759 3.276 2.748 3.214 2.715 2.598 1.505 1.469 0.499 0.893 1.151 2.867 2.875 1.167 1.645 2.330 2.210 2.331 2.522 2.614 3.213 2.772 2.085 2.164 2.824 3.211 3.139 2.370 + 4.100 4.941 4.264 3.855 3.348 3.960 4.701 4.179 3.065 3.070 2.564 3.042 3.436 3.050 2.161 0.946 0.800 0.491 1.974 2.413 2.612 2.476 2.175 2.085 2.320 1.529 2.069 2.758 2.675 2.810 2.730 2.671 3.419 3.076 3.463 2.753 + 5.324 3.857 3.335 1.885 2.917 4.215 3.754 3.122 2.481 3.255 3.347 3.153 1.257 1.539 1.634 1.198 1.689 1.197 2.025 3.714 3.395 2.714 2.065 1.023 2.189 2.725 2.929 2.962 2.985 3.256 3.905 3.510 3.504 3.494 3.867 3.004 + 5.053 4.443 4.651 5.262 4.997 4.061 3.024 2.826 3.124 4.113 3.998 2.325 2.418 3.044 2.814 1.250 1.895 2.236 1.589 1.693 1.200 2.053 2.850 3.201 3.142 3.369 1.120 1.845 2.926 2.638 2.979 3.629 2.944 3.399 3.352 2.791 + 3.882 4.909 4.178 4.762 4.925 4.671 4.571 3.121 2.599 3.155 4.435 3.576 3.737 3.884 4.269 2.242 1.860 1.310 1.554 0.618 0.899 1.795 2.119 2.416 2.763 3.050 1.596 2.583 3.057 2.856 2.976 3.199 3.349 3.340 2.867 2.878 + 5.153 5.432 4.144 4.809 5.075 3.892 4.058 3.759 3.278 3.876 4.009 3.002 2.605 2.151 1.522 1.705 2.498 1.793 1.642 2.180 2.187 2.170 0.909 2.027 2.986 2.768 2.029 3.675 4.445 4.080 3.986 4.652 5.302 4.998 4.341 4.707 + 4.684 3.569 4.384 5.102 4.300 3.774 4.094 3.588 1.801 2.820 2.928 2.200 1.359 0.931 2.431 2.085 1.724 1.865 3.387 3.551 2.452 2.379 2.029 2.044 2.876 2.423 3.122 3.947 4.224 4.306 5.154 5.013 5.036 5.326 5.457 5.010 + 4.466 3.722 3.520 3.472 3.038 4.064 3.607 1.953 0.891 2.047 2.176 2.687 1.587 2.359 2.656 2.536 3.304 2.978 3.526 3.168 2.247 2.621 2.484 1.462 2.881 3.287 2.774 3.370 4.528 5.425 5.410 5.800 5.277 5.714 5.769 4.638 + 3.098 4.614 4.743 4.143 4.056 4.562 3.954 1.067 0.994 2.116 2.652 2.928 1.699 2.214 2.542 2.132 2.559 3.558 3.731 3.079 2.719 2.339 3.587 4.048 4.448 4.101 3.459 3.982 4.349 5.550 6.475 5.785 5.573 5.581 5.274 4.620 + 5.175 4.025 3.413 2.527 2.251 3.877 4.295 3.305 3.308 1.303 1.808 1.404 2.366 2.997 3.236 2.226 2.538 3.521 2.903 2.849 3.685 4.207 3.380 4.478 4.685 4.509 3.920 4.312 5.745 4.758 5.995 6.005 6.319 5.433 4.989 4.271 + 5.713 5.182 4.303 3.553 2.693 2.836 4.044 3.674 2.884 2.840 3.434 2.684 2.074 3.032 3.539 3.184 3.223 4.298 3.539 3.229 4.364 4.686 4.660 5.331 5.443 4.947 6.504 5.675 5.894 5.556 5.924 6.486 6.791 6.604 6.868 6.011 + 3.441 2.767 2.814 3.552 4.263 3.247 4.194 3.172 2.519 2.655 2.456 3.398 4.072 4.310 3.798 4.116 4.816 4.788 4.533 3.653 4.969 5.502 6.094 5.327 5.043 5.225 5.796 6.416 6.600 6.207 5.799 6.269 6.952 7.458 7.146 6.430 + 3.274 4.026 3.759 3.699 3.939 4.040 3.392 2.766 3.013 3.886 4.271 3.657 2.560 3.451 3.473 4.031 4.652 3.350 2.705 3.466 4.969 4.696 4.924 4.929 5.416 4.754 5.101 5.425 6.196 6.057 5.089 5.095 5.248 5.662 5.248 4.335 + 1.082 2.926 3.194 3.391 2.847 1.965 2.090 1.455 2.611 2.684 3.921 2.377 2.018 3.037 2.571 3.162 3.167 2.574 3.220 3.652 3.493 3.957 3.898 5.147 4.773 4.672 5.169 5.101 5.222 4.414 4.984 4.335 4.586 4.495 4.136 2.986 + 3.352 1.621 2.211 2.984 4.184 3.916 5.604 5.352 4.860 4.525 4.130 3.321 2.726 2.063 2.410 2.279 3.214 2.069 2.930 4.742 4.811 4.205 3.738 4.710 5.064 4.805 5.259 5.075 5.111 4.048 4.854 4.389 4.230 4.533 3.381 2.171 + 4.721 3.876 5.050 4.440 5.033 5.083 5.799 5.037 3.359 4.644 5.203 5.243 2.806 1.284 1.367 0.825 1.053 2.039 2.405 2.623 3.484 1.749 2.719 3.571 2.601 1.463 2.677 2.052 1.930 2.333 2.806 2.453 2.980 2.610 2.374 1.741 + 3.994 4.449 4.047 3.762 2.686 3.108 3.524 2.464 2.087 2.273 3.801 3.096 2.588 2.737 1.578 0.923 1.684 2.301 2.831 1.321 2.702 2.100 3.000 2.676 2.678 2.350 3.559 3.236 4.069 4.474 3.612 4.025 4.177 2.680 2.624 2.968 + 6.837 6.616 5.929 5.987 5.267 5.629 6.366 6.030 5.417 5.155 3.461 4.193 4.392 3.505 3.301 2.353 2.088 1.804 2.186 1.703 2.519 1.202 1.974 2.605 3.197 3.609 4.638 4.036 5.112 4.675 3.934 4.093 3.955 2.703 2.734 2.192 + 8.274 8.527 6.739 5.827 6.013 5.834 6.935 6.526 6.419 6.065 5.450 5.980 5.418 4.734 3.886 2.826 3.070 1.951 2.319 2.040 1.837 2.032 1.832 3.334 3.162 3.246 4.112 4.498 4.797 4.421 2.942 3.772 4.417 3.203 3.371 2.864 + 8.753 8.905 7.034 6.724 6.766 6.568 6.823 7.442 6.618 5.427 6.306 6.245 5.594 4.988 3.126 2.881 3.115 3.396 2.763 2.556 2.965 3.719 3.414 3.707 4.458 4.597 4.223 3.964 4.516 3.816 4.214 4.070 4.260 4.560 2.954 2.126 + 8.176 8.112 8.011 7.092 6.770 6.495 6.616 7.869 7.284 7.123 7.058 6.639 6.030 6.554 5.855 5.011 3.837 3.781 3.864 3.689 3.872 4.507 4.900 3.779 5.472 5.288 5.118 6.158 5.975 5.569 5.473 4.939 5.215 4.861 4.288 3.867 + 8.892 9.393 7.956 8.472 8.369 8.517 8.287 7.549 6.725 7.358 7.068 6.765 5.520 6.415 6.524 6.168 4.749 5.224 5.124 4.335 5.753 5.491 5.880 5.690 7.568 6.981 7.399 6.619 6.504 6.028 5.999 6.203 5.742 5.632 6.637 5.034 + 9.206 8.182 8.636 7.341 8.779 8.918 8.751 7.188 7.729 7.285 7.220 7.598 6.344 6.710 7.095 7.579 6.584 6.492 6.686 5.904 6.671 6.889 6.665 7.624 7.543 7.025 7.803 7.725 6.704 6.835 6.607 6.346 6.350 6.491 7.399 5.892 + 8.544 8.675 7.681 7.446 8.154 6.768 7.444 8.174 6.826 7.204 7.657 7.533 6.882 6.960 6.029 6.292 6.071 6.132 5.932 6.128 6.551 5.055 6.049 6.407 6.138 6.895 7.308 6.838 7.382 7.110 7.004 7.043 7.251 7.197 6.777 6.036 + 8.916 8.331 7.004 6.505 7.556 6.673 6.937 7.979 7.303 7.149 7.425 7.696 7.112 7.349 6.159 6.031 5.811 6.048 6.983 6.151 6.105 4.109 4.918 5.127 6.479 7.720 7.415 5.982 6.638 7.268 6.555 6.581 6.853 6.455 6.226 5.032 + 8.582 8.568 7.878 6.702 7.301 8.334 7.497 7.406 7.773 7.135 7.090 7.326 7.348 7.542 6.653 5.896 6.049 6.532 6.319 6.523 6.856 5.811 5.404 5.706 6.903 7.393 6.837 6.450 6.647 6.429 6.386 6.304 6.539 5.750 5.257 3.974 + 9.553 8.461 8.045 9.193 8.868 7.669 7.533 7.038 7.732 6.438 7.580 7.102 6.874 7.586 6.903 6.676 5.708 6.734 5.297 5.075 6.756 6.434 5.607 7.155 7.505 7.683 7.102 6.365 6.443 6.387 5.995 6.901 6.907 6.752 6.631 4.979 + 7.776 8.302 6.721 7.784 7.871 6.440 7.373 8.132 7.335 4.865 4.836 3.174 3.725 5.330 5.176 4.367 4.894 5.910 6.306 6.388 6.351 6.191 5.148 6.938 7.490 6.601 7.110 6.482 6.832 6.990 6.615 6.701 6.095 6.641 6.651 4.461 + 5.801 5.564 3.789 4.041 5.214 8.144 9.295 8.541 7.774 6.260 5.458 4.617 6.132 6.559 5.156 4.160 6.116 7.158 7.685 7.135 6.568 7.032 6.311 8.373 8.927 8.012 8.560 7.825 7.555 8.723 8.392 9.381 8.575 8.595 8.875 7.823 + 8.787 8.804 7.880 6.874 5.873 8.693 9.064 7.704 7.821 8.380 6.758 7.184 6.655 6.726 6.918 6.738 6.493 7.381 7.659 5.799 7.413 7.688 7.698 7.944 8.294 8.033 8.139 8.122 9.112 9.836 8.858 8.997 9.318 8.456 8.887 8.087 + 7.767 8.895 7.989 7.234 9.615 9.942 8.190 8.050 7.573 7.950 6.460 6.608 6.993 6.578 6.923 7.324 5.853 7.151 6.492 7.540 7.601 7.939 7.809 7.878 8.622 8.740 8.076 8.400 8.944 9.060 9.026 8.000 8.813 8.682 8.552 7.834 + 8.585 7.733 7.016 6.911 9.009 9.058 8.005 8.389 6.668 6.519 6.366 5.979 6.752 7.898 6.971 7.883 7.667 7.199 6.317 7.342 8.175 8.044 8.132 8.445 9.262 9.315 9.366 9.998 9.449 8.997 8.328 8.423 9.114 9.021 9.204 8.219 + 7.773 7.711 6.894 6.200 5.646 8.540 8.848 7.768 7.496 7.108 5.638 6.825 7.948 6.556 7.378 8.068 6.269 7.556 7.729 7.348 7.527 7.726 8.230 9.098 9.335 9.262 9.431 9.811 9.197 9.367 8.558 8.755 8.366 8.781 9.133 7.390 + 4.430 5.857 6.542 5.939 6.087 8.814 8.812 7.325 7.660 6.984 6.956 6.687 6.933 7.339 6.920 7.506 6.752 6.504 6.615 6.179 5.761 6.563 9.360 8.521 8.589 8.837 9.320 8.783 8.130 9.202 9.289 8.539 8.070 8.459 8.278 8.290 + 6.970 6.198 6.557 7.231 8.387 8.266 8.313 7.706 7.431 6.864 6.775 6.795 6.951 7.467 6.984 7.955 7.625 7.155 7.343 7.085 6.854 8.122 8.887 8.369 8.848 10.265 10.498 9.235 8.556 8.598 8.561 9.204 8.589 8.215 8.565 7.768 + 5.714 6.172 5.908 6.508 8.446 9.890 9.094 7.696 8.136 7.148 7.599 7.380 7.605 6.443 5.875 6.716 7.552 6.502 6.717 7.837 7.762 8.382 9.175 8.476 8.979 10.268 10.533 9.484 9.693 7.888 8.372 8.343 8.822 9.050 8.310 8.553 + 4.778 3.878 4.908 5.158 6.645 7.551 7.679 8.719 7.365 5.990 6.209 7.093 7.191 6.016 6.196 6.652 6.937 6.161 6.273 5.971 7.677 8.262 9.026 8.138 9.271 10.017 10.283 8.719 9.351 7.947 7.519 7.704 8.209 7.833 8.043 7.640 + 5.277 5.825 6.623 6.225 5.653 5.596 7.434 7.128 5.832 5.617 5.329 6.666 6.729 5.795 6.788 6.671 6.891 6.717 5.904 4.440 6.341 8.046 7.857 9.024 8.611 8.526 9.371 8.065 8.293 7.795 7.246 6.626 7.702 8.519 8.665 8.226 + 5.963 4.360 4.969 5.028 5.045 6.835 6.356 6.091 5.415 5.984 6.007 6.140 6.323 6.444 6.135 6.667 6.499 5.801 6.196 6.920 7.150 8.867 8.417 8.845 8.682 8.642 9.061 8.378 7.667 6.907 6.560 7.153 7.304 7.642 8.359 7.675 + 3.843 3.099 3.760 4.184 5.562 6.470 5.876 5.907 4.368 5.625 6.328 5.913 5.980 6.554 6.501 6.867 5.092 6.637 6.492 7.202 7.075 8.211 9.533 9.855 9.398 10.134 9.764 9.428 8.715 7.829 6.982 7.469 7.829 8.179 8.575 8.395 + 1.951 2.047 2.277 3.668 4.201 5.016 5.906 4.859 3.824 3.319 2.752 4.444 5.038 6.240 6.398 6.856 6.852 6.573 8.042 7.502 7.531 8.116 7.932 9.475 7.885 8.022 9.350 9.499 8.425 7.095 6.593 7.950 8.520 8.432 7.970 8.375 + 3.165 3.183 4.344 5.162 4.329 5.928 5.818 5.718 4.668 3.226 3.115 4.571 5.378 5.967 6.409 6.297 7.124 6.105 7.553 7.330 6.637 6.985 8.282 7.605 7.468 7.687 8.666 8.321 8.039 6.775 6.845 7.663 7.935 7.675 7.108 6.630 + 3.583 3.973 3.988 4.586 5.896 6.224 4.363 3.773 4.041 2.084 1.931 4.869 5.021 6.385 6.907 6.359 6.820 6.103 4.911 6.359 6.469 5.620 6.862 6.660 7.633 7.794 7.344 6.976 7.144 6.250 6.931 6.841 6.924 6.589 6.060 5.748 + 4.594 4.539 4.461 4.197 4.978 5.145 6.665 6.701 5.806 6.111 6.036 5.728 5.983 4.732 4.647 4.183 5.534 5.371 4.745 4.960 5.530 4.944 5.466 5.270 5.679 5.920 5.914 6.086 4.813 5.147 4.379 4.884 5.319 4.048 4.305 4.365 + 4.533 4.881 4.065 5.304 4.682 5.621 6.013 5.872 5.721 5.624 5.535 5.335 5.446 3.954 4.349 4.020 2.933 2.135 3.239 2.496 2.257 2.853 4.073 3.983 5.263 4.572 4.281 5.130 4.955 4.592 4.214 4.345 4.711 4.178 3.951 3.729 + 5.166 6.016 5.411 7.605 7.985 7.871 7.961 6.437 5.601 5.488 5.525 4.233 3.364 5.202 4.418 4.451 3.813 3.214 4.601 3.890 3.505 2.755 3.165 3.361 3.209 3.417 3.204 3.952 3.798 3.704 2.952 3.743 3.428 3.607 2.736 1.913 + 7.754 7.526 7.049 8.110 10.306 9.648 9.754 9.075 8.378 7.452 7.695 7.883 7.411 7.598 7.314 7.396 8.280 7.962 6.606 5.495 5.252 4.660 4.982 4.930 5.309 6.729 6.153 4.953 6.090 5.520 3.621 3.658 3.652 3.400 3.456 1.668 + 7.723 8.295 7.421 8.275 10.894 10.629 10.716 9.669 9.171 7.883 8.393 8.444 8.391 8.192 7.979 8.616 9.839 9.460 7.250 5.939 5.630 5.323 5.399 5.839 6.756 7.858 6.959 5.812 6.842 6.572 3.950 3.783 3.664 2.998 2.698 1.512 + 8.105 8.661 7.576 8.379 10.951 10.591 10.750 9.873 9.497 7.754 8.353 8.679 8.581 8.270 8.040 9.208 10.132 9.536 7.546 5.572 5.339 5.771 5.389 6.415 7.481 8.617 7.604 6.709 7.445 6.908 4.836 5.415 5.187 3.256 3.655 3.039 + 8.278 8.849 7.642 8.445 10.997 10.508 10.622 9.732 9.323 7.588 7.981 8.573 8.486 8.034 7.785 9.404 9.887 8.950 7.169 5.793 5.531 5.037 5.322 6.509 7.575 8.636 7.382 6.814 7.344 5.944 4.156 4.537 4.214 3.009 3.020 2.678 + 8.406 8.948 7.546 8.450 11.117 10.787 10.533 9.414 8.964 6.960 7.459 8.390 8.323 7.616 7.195 9.370 9.721 8.335 6.449 5.327 5.333 4.932 5.303 6.250 7.265 8.009 6.723 6.705 7.166 4.465 3.165 4.026 4.162 2.856 2.933 2.643 + 8.761 8.840 7.819 8.597 10.999 10.459 9.577 8.852 8.262 6.590 6.729 8.253 7.937 7.116 6.612 9.146 9.344 7.459 5.736 4.892 5.242 5.282 5.162 6.011 6.568 6.984 6.196 6.197 6.624 4.215 3.501 4.245 4.641 3.332 3.685 2.628 + 8.634 8.635 7.545 8.914 10.653 9.556 7.635 8.154 7.212 5.640 6.458 7.668 7.052 7.110 6.697 8.480 8.750 6.494 6.250 5.831 4.750 4.123 4.784 5.891 6.610 6.821 5.824 5.263 6.145 3.965 3.112 4.446 4.783 3.280 3.417 2.565 + 8.426 8.417 7.744 8.402 9.380 7.866 7.081 5.077 5.832 6.242 6.429 6.158 4.963 6.032 4.859 5.892 6.270 5.649 5.359 4.030 3.279 4.272 4.436 5.022 6.425 6.018 4.231 4.143 4.203 3.553 3.076 3.123 3.142 3.018 3.811 2.916 + 8.207 7.599 7.120 7.401 7.240 5.529 6.868 5.859 3.596 3.864 4.373 4.909 4.200 4.189 4.619 4.209 4.861 5.171 4.178 4.436 3.605 3.309 3.104 3.815 5.154 5.654 3.809 4.424 4.135 3.591 3.114 3.322 3.923 2.901 3.760 3.177 + 7.434 6.347 5.129 5.707 7.095 7.599 7.863 6.401 3.817 4.329 4.948 4.256 3.411 4.318 4.238 4.222 4.748 4.471 4.779 3.731 2.310 3.555 3.450 1.869 2.797 3.573 3.630 3.663 3.851 3.412 3.254 3.917 4.135 2.684 3.904 3.921 + 7.080 6.142 4.729 5.635 6.715 6.500 7.604 5.449 4.103 2.904 3.694 3.927 2.384 2.104 2.724 3.909 4.691 4.352 3.607 3.960 3.186 3.278 2.964 2.323 3.951 3.495 3.364 3.820 3.631 3.046 2.781 3.141 3.706 2.555 3.517 3.425 + 6.390 5.673 5.342 4.725 5.387 7.279 7.835 5.663 3.624 2.304 2.909 4.230 3.070 3.045 3.357 4.256 4.391 3.223 3.191 3.528 3.486 3.935 3.600 1.955 3.465 3.066 3.472 3.311 2.419 3.487 3.077 3.350 4.046 3.028 3.343 2.897 + 5.776 4.996 4.639 4.402 4.968 4.553 6.280 5.214 4.116 2.584 3.464 4.367 4.164 3.879 4.650 4.695 4.398 4.565 3.391 3.620 3.056 2.849 2.808 3.396 3.333 2.958 3.679 3.603 3.481 3.509 3.030 3.523 3.635 2.098 2.931 2.637 + 6.109 5.495 4.947 4.234 5.597 6.428 6.720 5.686 4.891 3.925 3.986 3.289 4.153 4.402 4.049 3.550 4.251 4.183 3.240 3.298 2.713 2.613 2.472 2.385 3.190 3.680 3.349 4.324 3.700 4.064 3.302 3.390 3.354 2.401 2.636 2.824 + 7.013 6.750 5.552 5.336 6.211 4.859 5.796 5.867 4.492 4.196 4.666 4.556 4.542 4.934 4.958 4.495 4.717 4.803 3.939 2.478 3.386 3.187 2.717 2.732 3.433 4.267 3.506 3.303 3.434 3.593 3.478 3.214 2.860 2.371 3.281 3.040 + 8.301 7.704 5.527 4.704 6.309 6.337 7.042 6.686 5.839 5.513 5.264 5.831 5.585 6.379 5.270 5.184 5.591 5.194 3.705 2.213 3.709 4.049 4.205 3.295 4.060 3.257 3.574 3.236 3.559 3.724 3.805 3.881 4.093 3.201 3.291 3.529 + 8.873 8.644 7.082 5.503 5.814 6.081 7.113 7.611 7.208 6.723 6.844 7.053 6.998 6.893 5.984 5.864 6.756 6.577 4.551 3.122 3.644 4.573 4.400 3.271 4.799 4.206 3.222 3.146 3.058 3.527 3.414 3.373 3.537 2.989 3.600 2.388 + 8.658 8.486 7.347 6.427 5.329 6.093 7.025 8.374 8.083 7.783 7.450 7.336 7.639 7.873 7.141 7.101 7.764 7.271 4.507 2.781 4.204 5.466 5.283 4.326 5.206 4.704 3.025 2.269 2.677 3.746 2.684 3.153 3.491 2.649 2.776 1.670 + 8.426 8.164 7.685 7.146 5.348 6.971 7.714 8.137 7.907 7.871 7.757 7.791 7.837 8.036 7.949 7.827 8.720 8.161 6.065 5.016 4.890 4.840 4.995 4.273 5.599 5.411 2.342 2.728 3.252 3.782 2.372 3.305 3.240 2.035 2.234 1.250 + 8.342 7.660 7.384 6.518 6.127 7.177 7.957 8.346 8.181 8.141 7.597 7.490 7.885 8.014 7.483 7.055 7.780 7.492 5.899 3.884 3.429 4.759 5.443 4.087 5.471 5.453 2.319 2.683 3.583 4.180 3.422 2.893 3.374 2.346 2.269 1.489 + 8.015 6.999 6.656 5.442 5.943 6.228 8.172 8.311 7.230 7.148 6.160 7.191 6.687 6.682 6.495 6.436 7.259 6.536 5.528 5.006 4.750 4.660 4.971 3.903 5.815 5.082 2.438 2.030 3.805 4.111 2.929 3.126 3.630 2.783 2.126 1.695 + 7.556 6.410 5.273 5.588 5.637 6.600 7.845 7.495 6.740 5.695 4.583 5.998 5.343 5.194 5.495 5.077 5.432 5.753 4.918 5.184 4.772 4.816 4.569 4.592 5.624 5.199 3.778 2.494 4.073 4.296 2.759 2.970 2.270 1.542 2.045 1.857 + 7.724 7.817 6.500 3.745 5.311 6.149 6.707 6.783 6.427 4.518 2.688 4.335 4.170 4.542 4.450 3.796 4.643 4.049 4.374 2.412 3.786 4.828 4.282 4.076 6.031 5.592 2.720 2.747 3.985 4.138 2.921 2.599 1.938 1.730 1.719 1.603 + 4.005 5.794 5.350 3.214 4.264 4.984 4.538 5.095 5.304 3.561 3.628 3.496 2.343 3.634 3.373 2.921 3.602 2.469 2.032 1.375 2.526 2.785 3.051 2.642 3.476 2.956 2.684 1.904 1.581 2.089 2.287 1.874 1.883 1.412 0.530 0.774 + 6.221 6.153 5.116 1.938 4.248 5.114 4.440 5.203 3.380 3.096 4.619 3.295 3.305 4.629 4.217 2.945 3.123 2.866 2.636 2.872 2.232 3.074 2.944 3.565 3.841 3.138 2.523 2.240 2.092 1.811 1.960 1.966 1.991 1.972 1.096 1.159 + 6.868 7.165 5.874 3.738 3.160 4.028 4.579 4.783 3.485 1.585 3.399 3.161 1.421 2.519 2.849 1.853 0.912 3.965 3.603 2.342 1.485 1.788 1.937 2.622 1.633 2.218 1.303 2.056 1.496 1.311 1.200 1.321 1.258 1.686 1.905 0.295 + 5.409 5.603 4.747 3.043 3.160 3.295 3.810 3.485 3.503 1.889 2.685 2.912 1.978 3.558 3.597 3.590 2.893 4.087 3.532 2.911 2.642 0.627 1.494 2.380 1.673 1.336 2.034 2.617 1.428 1.817 1.039 1.567 1.445 1.270 0.763 0.055 + 1.484 3.819 4.862 3.867 3.693 4.278 3.561 4.823 3.878 1.699 3.354 3.408 2.289 4.040 4.041 2.416 2.755 3.158 2.862 2.610 2.198 1.687 1.954 2.323 1.619 1.677 1.623 1.957 2.533 2.158 0.978 1.205 1.149 1.023 0.649 0.797 + 3.804 3.960 4.208 3.909 4.186 3.978 3.872 4.742 2.643 2.031 2.911 0.988 1.758 2.658 2.477 1.972 2.492 2.414 2.545 2.598 2.611 1.973 1.536 1.903 2.315 1.826 1.979 2.220 1.819 2.053 1.260 1.430 0.056 0.646 0.875 0.713 + 5.138 6.068 5.933 4.059 3.760 5.373 5.175 3.513 2.744 1.578 2.213 2.209 2.835 3.236 2.800 3.012 2.944 3.001 0.586 1.264 2.489 2.502 2.486 2.613 1.709 1.455 1.184 1.768 1.658 1.235 1.171 0.668 0.820 1.521 1.113 0.292 + 4.642 5.104 5.126 2.258 2.862 5.506 5.395 3.797 3.247 3.365 3.469 2.645 2.780 2.666 4.100 3.749 3.950 3.670 2.467 2.437 1.998 2.534 1.158 2.243 2.319 1.371 0.575 0.842 0.871 1.462 0.829 0.849 0.676 0.831 0.525 0.297 + 8.042 7.581 7.091 6.738 6.797 6.334 4.820 3.589 4.502 4.611 3.114 3.459 3.599 4.215 4.598 4.678 3.722 3.257 3.495 3.694 2.240 3.242 3.589 4.902 5.449 5.246 5.184 5.372 5.631 5.131 5.783 4.820 3.214 4.189 5.077 5.352 + 8.873 9.279 8.105 7.637 8.142 7.581 6.349 5.900 5.481 6.054 4.530 5.536 5.488 5.627 8.111 9.092 8.225 8.356 8.177 6.586 5.396 6.472 7.974 7.734 7.753 7.918 7.761 8.023 8.885 8.868 8.295 7.632 6.288 6.166 7.691 7.751 + 7.101 4.800 4.440 3.480 2.775 3.109 4.215 5.151 4.482 4.055 2.992 3.615 3.825 4.026 6.792 7.541 7.112 6.553 5.857 3.786 3.853 5.504 6.337 5.180 6.215 5.414 6.381 6.525 6.945 7.070 5.625 4.663 4.505 4.982 5.118 5.134 + 4.720 3.945 3.325 1.462 1.503 2.326 3.087 2.448 2.086 2.016 0.864 2.437 2.280 2.645 2.551 2.434 2.563 2.885 1.795 1.841 2.543 1.846 2.433 2.589 2.434 2.419 2.217 2.407 2.853 3.047 2.913 1.970 2.055 1.602 2.089 1.400 + 3.539 3.776 3.620 4.178 3.924 2.916 3.247 4.287 2.326 1.054 1.835 3.487 3.881 3.752 3.884 3.159 3.094 2.885 2.810 2.165 2.296 2.759 2.979 3.303 3.758 2.939 2.889 2.769 4.006 3.926 3.954 4.092 4.493 4.212 4.501 4.131 + 4.022 3.801 3.107 3.979 3.893 3.658 3.082 2.731 1.786 1.328 3.407 3.524 2.518 3.456 3.743 3.504 3.473 3.995 4.425 3.623 4.209 4.060 3.655 3.620 4.085 3.987 3.546 3.314 4.147 3.910 3.818 3.806 4.489 4.114 4.437 3.966 + 5.141 4.497 1.682 3.133 3.651 3.995 3.970 3.264 3.497 3.021 3.919 2.815 2.572 3.731 4.552 4.900 5.049 4.203 4.198 4.612 4.701 5.513 6.457 6.872 7.508 7.536 7.395 7.181 6.598 6.141 5.660 5.789 6.346 6.809 7.061 6.675 + 5.043 4.211 4.372 4.902 4.243 4.350 5.375 5.145 4.000 4.320 5.015 4.199 3.874 4.803 6.103 5.423 4.506 4.498 4.101 3.557 4.822 5.877 7.459 7.091 8.335 8.368 8.191 7.897 7.456 6.770 6.757 6.428 6.780 6.714 6.672 5.684 + 4.304 4.400 3.845 1.695 3.215 3.016 3.585 3.762 4.032 3.243 2.516 3.178 4.641 5.440 5.608 4.981 6.631 5.756 4.570 5.204 6.787 6.155 7.276 7.259 8.584 8.948 8.638 8.809 8.484 7.909 8.556 7.544 7.858 7.124 7.660 5.820 + 5.434 5.745 4.968 3.768 4.345 3.783 3.758 4.036 3.437 2.640 3.097 3.683 4.365 4.138 4.220 5.549 5.969 4.687 4.151 4.507 5.285 6.202 6.949 7.281 6.703 6.503 6.248 6.472 6.709 6.498 6.879 6.343 6.157 5.763 6.093 5.511 + 6.224 5.838 6.268 5.872 6.792 6.449 6.914 5.562 4.511 4.190 3.987 2.377 4.369 5.236 4.908 6.355 7.132 5.778 5.144 4.297 4.911 5.340 6.462 6.470 6.181 5.492 5.351 5.217 4.935 4.243 5.991 6.369 6.613 5.377 6.430 6.050 + 7.392 6.887 5.484 4.498 5.645 6.649 7.311 5.624 4.432 5.556 4.977 3.217 3.845 3.150 3.540 3.603 4.424 4.730 3.280 4.084 4.357 4.981 4.952 4.301 5.077 5.728 5.608 5.899 6.175 4.772 5.210 6.308 6.085 5.179 6.073 6.489 + 8.077 6.249 5.872 6.855 7.117 6.721 6.178 6.149 4.180 3.957 4.335 4.259 3.043 2.656 3.421 3.917 4.354 4.818 3.202 3.745 4.550 4.606 4.266 4.738 3.873 4.370 4.517 4.421 4.368 4.511 4.516 4.856 4.304 4.960 4.905 5.254 + 3.650 5.253 5.090 4.844 5.038 4.837 4.113 3.860 3.899 3.080 2.838 3.031 4.777 3.667 3.287 3.596 5.014 4.671 5.095 3.767 3.972 4.528 3.952 4.507 3.961 5.276 4.398 4.488 4.300 3.783 3.412 3.948 3.566 2.745 3.428 4.194 + 3.858 4.548 5.304 5.238 4.765 4.196 3.874 3.771 4.157 3.938 3.337 2.799 3.874 3.797 4.479 3.273 3.469 4.689 4.523 3.332 3.018 4.558 4.963 4.851 4.004 5.468 4.124 4.314 4.197 4.722 4.305 5.119 3.962 3.740 4.519 4.335 + 4.573 4.127 5.466 5.892 5.086 4.067 3.992 4.393 4.833 5.258 4.341 2.690 4.251 4.654 3.901 3.272 3.618 3.486 2.765 2.693 3.580 3.642 3.710 4.133 3.987 4.597 3.502 4.296 3.916 3.255 3.113 2.952 3.353 3.508 3.890 3.202 + 4.774 2.836 4.121 5.287 4.706 4.103 4.827 4.589 3.940 4.102 3.484 4.552 4.149 4.410 3.923 3.231 1.716 3.588 3.678 2.106 3.056 3.934 4.080 4.373 4.030 4.588 4.543 4.438 3.304 3.657 3.921 3.263 3.900 4.238 3.791 2.918 + 5.304 4.147 3.412 3.335 3.983 3.431 3.097 3.892 2.909 2.614 1.871 3.030 2.840 3.626 3.494 2.844 3.287 3.112 3.253 2.721 2.229 2.778 3.335 3.429 2.790 3.781 3.025 2.507 3.341 3.536 3.039 2.727 2.473 2.440 2.636 2.148 + 2.982 2.678 4.334 5.098 3.886 3.836 3.831 4.134 3.682 3.143 2.712 2.224 3.061 3.976 3.898 1.870 1.689 0.914 3.023 2.379 2.201 2.702 2.062 1.717 3.149 3.334 2.564 3.031 3.382 2.189 2.950 3.030 2.103 2.409 1.884 1.587 + 3.124 1.220 1.407 2.881 4.005 4.193 2.968 1.771 2.617 2.937 2.191 2.275 2.713 3.187 3.287 1.527 3.196 3.080 3.101 3.223 3.585 2.781 2.507 3.001 4.539 4.781 4.331 4.805 4.753 4.313 3.841 3.385 3.631 2.954 2.885 2.235 + 4.202 3.430 2.389 2.855 2.734 3.143 3.034 3.370 2.869 3.789 2.649 3.431 3.132 4.619 4.038 3.515 3.438 3.408 3.308 2.682 2.813 3.500 3.852 4.222 4.804 4.466 4.820 5.165 4.117 4.499 3.894 3.434 4.203 3.745 4.334 3.578 + 4.366 4.472 4.050 2.677 3.495 3.918 3.650 4.291 4.518 2.964 4.108 5.409 4.862 4.868 4.184 3.171 3.423 4.118 3.235 2.262 1.177 2.425 4.062 3.810 3.175 4.562 4.725 4.285 4.664 4.386 3.966 4.102 4.921 4.581 4.499 3.798 + 2.340 4.132 4.052 2.937 2.912 2.535 3.926 3.280 1.775 1.227 1.821 2.949 2.675 4.204 4.554 5.310 4.832 4.982 4.719 4.448 5.204 4.949 4.538 6.490 5.871 5.900 6.083 6.961 6.596 7.482 6.775 7.406 7.233 6.523 7.043 6.608 + 3.889 3.022 2.612 2.852 2.403 3.129 4.430 3.916 2.951 1.973 2.711 2.792 2.244 2.822 3.368 3.903 4.178 3.767 3.482 3.331 4.525 3.937 4.335 5.064 5.116 5.613 5.835 5.661 5.502 6.087 5.715 5.955 6.390 5.515 5.935 5.389 + 4.756 6.219 6.882 7.575 7.997 8.342 8.202 7.519 6.496 4.961 5.527 5.519 4.541 3.839 3.494 2.771 3.109 3.424 3.189 4.200 3.530 3.224 4.964 4.452 4.298 4.631 3.886 4.819 5.925 5.937 5.356 5.168 5.879 5.858 4.968 3.775 + 5.458 4.925 5.155 6.226 5.838 7.145 6.689 5.213 4.325 4.186 3.645 1.773 3.251 4.490 3.600 3.057 4.053 4.140 3.619 4.250 3.727 5.262 5.433 5.627 5.656 4.940 5.270 5.541 4.068 4.340 4.760 5.797 5.678 5.366 5.221 4.159 + 5.552 6.375 5.092 5.818 8.297 8.470 7.679 8.650 7.025 5.762 6.500 5.871 5.396 5.668 4.976 5.740 5.197 5.623 6.189 5.531 6.014 7.250 8.789 8.552 8.467 6.892 7.184 7.296 6.696 7.647 7.841 7.545 7.003 6.860 6.732 6.734 + 5.919 5.595 5.440 6.410 8.876 8.045 6.858 9.203 8.787 5.512 6.428 6.032 5.099 4.573 5.508 5.495 5.435 5.334 5.762 5.073 5.320 6.013 8.642 8.833 8.797 8.108 8.500 8.378 7.513 8.038 7.729 6.647 7.345 7.427 6.423 6.651 + 4.953 5.368 3.968 6.839 9.017 8.110 6.281 9.030 8.431 4.586 3.599 3.664 4.155 4.318 3.451 3.609 4.128 3.068 4.640 4.797 5.221 6.759 9.005 8.453 7.937 8.401 8.824 9.209 8.039 7.156 5.645 7.223 6.777 5.244 4.813 3.917 + 4.887 4.468 3.980 6.010 8.100 7.322 6.791 9.022 7.963 5.201 6.043 4.975 4.594 3.437 3.353 3.022 3.140 2.864 4.843 4.953 5.837 7.135 8.892 7.917 7.713 7.554 8.165 8.452 7.703 6.980 6.186 7.668 6.642 4.662 3.963 2.935 + 4.214 3.796 3.173 5.663 6.286 4.008 3.993 5.601 5.492 2.936 3.207 2.456 2.623 3.110 2.774 2.468 3.581 3.855 3.743 3.886 4.644 5.942 5.990 5.257 5.292 5.721 5.599 5.192 4.967 4.778 5.295 5.568 5.617 3.614 3.277 2.587 + 3.109 3.337 2.260 4.742 5.262 5.805 4.906 4.005 4.097 4.061 3.181 2.107 1.967 1.782 1.615 1.372 2.030 2.675 2.606 2.744 2.736 3.927 4.869 4.598 4.503 4.344 3.945 4.101 4.055 2.978 4.377 4.729 5.177 3.522 3.364 2.628 + 5.882 5.336 2.659 5.662 7.634 6.637 4.956 4.705 4.618 3.098 2.366 1.956 2.399 2.364 2.180 1.568 1.031 2.126 2.234 2.097 2.385 3.667 4.594 4.160 3.682 3.879 4.245 4.113 4.517 3.927 4.009 4.308 4.140 4.179 4.168 3.860 + 5.810 6.276 4.930 5.804 7.417 6.459 3.954 4.412 4.015 3.348 4.049 3.411 2.413 2.858 2.424 1.302 1.461 1.744 2.251 2.802 2.490 3.733 3.889 3.755 3.648 3.442 3.735 4.037 4.754 3.681 3.521 3.256 3.496 2.601 1.890 1.924 + 3.240 4.528 3.760 5.408 5.337 4.806 3.061 3.459 2.795 2.662 4.661 3.693 1.866 1.451 1.910 1.289 2.235 2.419 3.102 2.844 2.187 2.413 3.960 4.342 3.805 3.372 3.931 3.871 3.424 2.176 3.103 3.847 3.507 3.638 3.161 2.213 + 4.494 3.290 3.776 5.394 6.657 5.612 5.109 5.866 4.527 3.370 4.729 4.616 4.022 3.223 3.389 1.651 2.653 4.049 2.797 2.079 3.829 3.850 3.327 4.514 5.144 4.512 4.796 4.758 3.792 3.232 3.880 4.459 4.225 3.657 4.259 3.343 + 2.974 3.070 2.061 2.949 5.471 6.089 5.128 4.071 3.478 2.687 2.281 2.777 3.192 3.041 3.024 1.108 1.837 2.710 2.282 3.472 4.635 3.751 4.159 3.892 4.067 4.064 6.697 6.320 4.217 3.885 4.941 4.309 4.292 4.274 4.769 5.026 + 3.459 3.729 3.371 4.156 7.479 9.306 8.376 5.348 4.841 3.298 3.273 3.370 2.542 3.479 3.556 3.495 3.563 4.898 6.390 7.522 6.667 5.559 5.361 5.800 6.304 6.586 7.106 6.426 5.184 4.643 4.637 3.909 4.292 3.869 4.664 4.568 + 1.904 1.862 2.520 3.852 9.443 10.731 8.886 6.234 6.291 5.238 4.730 5.287 3.886 6.173 5.238 5.431 5.112 7.673 8.084 9.822 7.758 7.591 5.599 7.491 7.735 8.417 9.270 9.131 6.591 6.589 6.118 5.348 6.294 5.679 4.993 4.554 + 3.119 4.338 4.668 4.633 9.720 10.938 8.665 6.952 8.267 7.252 5.905 6.220 4.631 7.208 6.183 6.153 5.751 8.590 9.132 10.633 7.807 7.331 5.322 7.352 8.152 9.007 9.909 10.420 7.425 6.885 7.006 7.719 8.323 6.856 4.896 4.984 + 3.283 3.564 4.926 4.190 9.609 10.656 8.272 8.417 10.388 8.793 5.370 6.829 4.749 7.036 6.088 6.884 6.281 9.152 9.129 10.591 7.884 7.664 4.658 7.438 8.105 9.124 10.138 10.679 7.736 7.065 7.475 8.403 8.973 6.777 4.880 4.543 + 4.006 4.581 4.053 3.855 8.955 9.514 5.637 8.776 11.061 9.425 6.175 7.102 4.880 6.699 5.732 7.006 6.523 9.861 9.016 9.577 7.561 7.405 4.513 7.745 8.042 9.124 10.280 10.878 7.263 6.770 7.386 9.062 9.557 6.525 4.264 5.285 + 5.792 5.572 4.699 5.390 9.486 9.902 6.979 9.843 11.643 9.705 6.613 7.140 4.702 6.522 5.360 6.703 7.019 10.396 9.212 8.932 6.956 6.561 5.346 7.507 8.437 8.830 9.702 10.256 7.367 6.816 6.248 9.431 9.630 5.448 4.658 5.104 + 3.845 3.312 4.849 5.565 9.453 9.413 6.939 10.796 11.983 9.593 7.336 7.584 6.562 7.233 5.592 6.846 7.203 9.596 8.977 8.956 5.914 5.192 5.599 6.437 7.415 8.382 9.725 9.257 7.116 5.910 6.507 8.229 8.484 5.754 4.694 4.793 + 6.572 6.976 5.572 6.968 9.881 9.565 7.575 11.298 11.480 8.691 6.434 6.073 6.455 7.807 6.071 5.567 5.627 6.922 7.681 6.853 6.285 4.626 4.955 4.719 4.863 6.861 8.568 8.195 7.360 7.366 7.060 8.054 8.527 6.904 6.802 5.927 + 5.375 6.100 5.954 7.379 8.445 9.039 8.641 10.688 9.424 6.685 6.028 5.519 6.536 7.198 5.423 5.128 7.653 8.186 8.026 6.685 6.186 5.651 4.011 4.705 5.129 5.928 8.081 7.878 5.843 5.495 5.916 7.860 8.182 5.746 4.652 4.209 + 6.701 5.596 5.291 5.966 8.171 7.976 7.660 8.777 8.242 7.101 6.462 6.522 5.507 6.075 6.375 6.619 7.138 6.995 6.527 5.958 4.825 4.727 4.392 5.067 4.145 4.490 6.186 6.405 4.052 4.170 4.080 4.641 4.777 3.539 3.325 2.927 + 5.876 6.145 4.622 5.739 6.481 5.683 6.084 7.904 7.049 5.979 7.286 6.362 4.456 4.532 4.469 5.612 5.955 6.851 5.497 6.153 4.213 4.060 3.540 3.822 3.610 4.330 5.642 5.381 3.134 3.004 4.014 4.770 4.280 2.421 3.130 2.386 + 6.427 6.713 5.217 6.473 7.859 7.233 7.189 8.013 8.198 6.554 5.489 4.794 4.663 5.204 4.568 5.003 4.822 5.313 4.351 4.710 3.931 3.586 4.180 4.714 4.630 5.007 5.263 4.518 3.268 2.376 3.999 5.004 4.830 2.628 2.425 2.661 + 4.590 5.369 5.117 7.054 8.111 6.361 5.598 5.465 6.811 5.052 4.281 4.961 5.794 5.506 4.698 5.640 5.934 3.292 4.523 5.201 4.238 4.163 4.441 4.923 3.859 4.320 3.924 4.781 3.539 2.877 3.301 4.506 4.204 2.779 2.466 2.896 + 1.960 3.059 4.191 5.998 7.555 6.155 5.300 7.273 7.340 4.621 4.492 4.492 6.002 4.704 4.571 6.168 6.303 4.864 4.975 4.817 4.279 3.746 5.249 4.777 4.003 4.044 3.566 3.772 2.916 3.213 2.839 3.623 3.362 3.415 2.892 2.570 + 4.139 2.835 4.049 5.164 6.341 5.545 6.683 7.480 5.940 4.815 5.610 5.166 5.507 4.556 5.014 5.627 5.651 4.833 4.698 3.996 3.889 3.266 4.387 5.508 4.319 4.038 4.925 4.545 4.029 3.516 4.015 4.457 3.488 2.851 2.914 3.204 + 2.527 3.007 3.573 6.212 7.157 5.694 6.942 8.094 5.914 4.915 5.323 5.070 6.021 5.387 6.470 5.614 4.688 6.365 5.306 4.299 3.262 3.911 5.467 5.499 5.071 4.722 4.802 4.699 3.910 3.906 3.866 4.129 3.792 3.144 2.984 2.310 + 4.247 3.927 4.296 6.404 7.648 5.556 6.722 8.143 6.114 5.164 5.181 4.964 5.449 4.751 5.026 5.146 5.432 6.062 5.017 5.048 4.365 3.804 4.276 5.663 4.514 4.484 4.947 5.038 4.311 3.384 3.505 4.472 4.693 4.087 3.856 3.475 + 6.525 5.645 5.451 7.213 7.804 5.512 6.452 7.247 5.261 5.511 5.420 6.175 6.691 3.505 3.983 6.368 5.722 5.300 5.027 5.019 4.919 4.386 5.074 5.440 4.221 4.401 5.391 5.320 3.769 4.094 4.593 5.094 4.889 4.376 3.818 2.882 + 6.359 5.319 5.146 7.022 8.367 6.713 5.877 6.393 4.821 5.527 3.637 7.115 7.521 5.134 4.115 6.732 6.213 5.518 5.635 4.689 4.993 4.321 5.465 5.661 4.333 4.745 6.217 5.551 4.311 4.283 3.106 5.181 4.676 3.820 3.331 3.389 + 6.423 5.081 5.696 7.709 8.655 6.492 7.428 8.525 6.549 6.028 4.992 7.682 7.658 4.901 4.936 6.819 5.732 5.780 4.843 4.453 3.748 3.913 5.081 4.610 4.305 4.111 4.468 4.444 4.536 4.211 4.479 4.488 5.021 5.091 5.437 3.954 + 5.654 6.024 5.548 8.191 8.907 6.673 8.594 8.784 6.352 6.536 5.081 7.731 7.119 3.708 4.857 6.424 4.663 5.063 4.706 3.899 2.474 3.523 3.783 4.488 4.413 3.583 4.085 4.774 4.543 3.471 4.398 4.286 3.855 3.460 3.806 2.916 + 7.330 5.667 4.067 8.141 8.929 6.983 8.951 9.194 6.443 7.007 6.898 7.424 7.762 6.118 6.460 6.799 6.460 6.948 6.660 6.803 6.968 6.905 7.163 7.530 7.391 7.591 7.493 7.307 7.158 6.972 7.546 7.970 8.231 8.252 7.972 7.281 + 4.050 2.384 3.071 6.810 7.931 7.005 8.923 8.182 7.082 7.527 7.720 8.341 6.818 5.647 5.768 5.921 4.950 5.652 5.497 5.191 5.716 5.489 6.043 6.029 6.214 6.392 6.076 6.029 6.200 5.692 6.272 6.780 6.917 6.790 6.455 5.904 + 5.484 5.169 5.306 7.684 8.065 6.868 7.131 5.641 7.403 8.050 7.541 8.206 7.291 6.340 6.253 5.997 4.830 5.481 4.791 3.236 3.506 4.101 3.193 2.352 2.876 3.320 4.170 5.534 5.924 4.889 5.122 4.382 4.278 3.172 3.162 2.017 + 5.730 5.580 5.056 6.918 7.819 7.081 6.522 8.009 7.694 7.840 7.672 7.215 6.979 5.493 6.018 6.920 4.877 4.346 4.310 4.883 2.840 3.028 3.679 3.209 3.015 3.228 3.779 4.747 5.061 4.088 4.109 3.933 4.023 3.821 2.924 1.485 + 5.884 4.883 4.433 6.791 7.298 7.041 8.031 8.544 8.011 7.927 7.535 7.877 7.315 7.026 7.417 8.762 6.463 5.429 4.966 4.327 4.106 3.399 3.664 3.019 2.942 2.872 3.586 3.864 3.837 3.403 4.623 4.221 3.679 3.137 2.362 1.622 + 5.508 6.131 5.263 6.944 6.813 7.205 8.393 8.405 7.889 8.095 8.522 8.180 8.464 7.110 7.254 10.309 9.537 7.058 5.571 5.005 4.605 3.947 3.471 3.636 2.887 3.303 5.175 5.369 5.069 3.359 5.659 4.906 4.591 2.906 2.803 1.281 + 3.684 5.311 5.483 6.320 6.339 5.589 6.806 5.939 8.384 8.655 7.698 8.494 6.236 7.916 7.805 8.972 8.961 7.900 7.093 6.164 5.702 5.169 4.494 4.282 4.554 4.783 6.256 6.505 5.683 5.668 5.353 5.177 5.319 4.085 2.930 1.596 + 4.329 3.531 2.346 5.293 4.722 6.083 8.182 7.008 8.966 9.664 8.937 10.011 8.178 6.707 7.533 7.360 7.687 8.893 9.303 7.672 6.702 6.173 6.114 6.210 6.106 6.653 8.226 8.344 6.820 7.037 6.733 6.445 5.733 5.251 3.708 2.213 + 4.185 3.410 4.050 5.633 5.268 6.737 8.956 7.890 9.377 9.872 8.764 9.528 6.764 7.585 6.863 7.342 8.044 8.596 9.661 10.021 8.997 6.788 6.735 6.949 7.087 7.696 8.960 9.043 7.635 7.291 6.546 6.968 6.345 5.617 3.417 2.402 + 4.758 4.911 3.837 4.383 5.194 6.722 8.780 7.762 9.707 10.404 8.443 9.395 7.558 7.760 6.417 7.018 7.760 8.064 9.006 10.618 10.247 7.451 8.158 7.761 7.946 8.983 8.638 9.069 8.018 7.657 8.061 8.070 7.557 6.993 3.858 3.346 + 2.638 2.564 3.027 5.131 5.503 5.603 8.102 7.006 9.972 10.411 7.384 7.953 5.908 6.726 6.439 7.273 6.159 6.713 7.469 8.885 8.846 9.011 9.291 8.097 8.820 9.809 8.747 8.594 6.517 7.870 8.379 6.967 7.306 6.616 4.635 4.003 + 4.129 4.344 4.253 5.805 5.426 6.062 8.138 6.908 8.964 9.392 6.379 7.340 5.492 6.137 4.931 6.109 6.692 5.926 6.393 8.193 8.066 8.188 9.751 8.805 9.444 9.855 8.829 7.456 5.916 7.144 8.679 6.905 7.279 6.922 4.672 3.756 + 4.752 2.285 2.638 6.068 6.438 6.658 8.275 6.793 7.618 8.115 5.400 6.620 5.634 5.690 4.814 5.223 4.129 4.469 5.855 8.390 8.189 7.560 8.430 9.952 9.595 9.129 8.958 7.817 6.955 6.697 8.820 7.044 6.845 6.150 4.425 4.611 + 3.850 3.521 3.474 5.297 4.554 4.692 6.465 6.012 5.972 5.887 4.803 5.054 4.574 5.699 3.856 3.724 3.476 4.382 4.969 7.431 7.274 7.499 7.841 9.462 8.857 9.368 8.432 6.856 6.609 6.360 7.154 5.877 6.316 6.340 5.386 4.725 + 4.431 3.174 2.323 4.724 4.127 5.055 4.855 3.237 3.974 4.754 4.333 5.204 4.270 5.564 4.883 4.618 5.203 4.863 3.183 5.582 6.293 6.206 6.085 7.611 7.865 7.282 6.148 6.429 4.666 4.237 4.257 4.758 3.893 3.859 3.987 2.617 + 3.717 4.840 5.354 4.892 5.612 5.637 5.657 4.400 4.828 4.433 4.922 5.322 2.950 4.373 3.918 4.213 5.600 5.106 4.909 5.917 5.455 5.139 4.972 5.950 6.501 6.587 6.266 5.711 6.429 5.973 6.401 6.429 5.298 5.062 5.644 5.744 + 5.325 5.398 5.147 6.647 5.834 5.603 5.910 5.377 4.634 4.117 4.924 5.270 4.376 4.304 4.609 4.796 5.723 5.773 5.116 5.782 5.255 4.652 3.755 4.812 5.504 6.058 5.860 5.124 5.960 6.639 5.988 6.821 6.304 6.647 6.727 6.120 + 5.258 6.448 7.184 8.214 8.143 8.304 8.143 6.132 6.084 5.158 5.610 5.810 4.946 4.575 5.440 7.271 7.616 6.280 6.522 7.358 6.739 6.666 7.041 7.780 6.741 7.922 8.162 9.094 8.588 8.739 8.571 8.212 8.395 8.208 7.758 7.625 + 7.102 7.291 7.248 7.877 7.745 6.984 8.016 6.422 4.718 5.679 5.884 4.657 7.038 6.724 6.816 7.848 8.102 7.343 7.547 8.469 8.524 8.543 7.892 8.977 8.312 9.429 9.701 9.884 10.090 9.710 9.280 8.634 9.592 9.646 8.752 8.211 + 7.584 6.883 6.570 7.053 6.770 6.955 7.780 6.737 7.000 6.060 6.490 5.593 5.214 7.641 7.178 7.852 7.898 7.731 7.389 7.731 7.784 7.926 6.967 8.142 7.683 7.597 7.890 7.806 9.016 9.006 8.369 7.458 7.957 8.264 8.625 7.708 + 6.004 6.840 6.844 7.568 6.817 7.853 8.004 6.683 6.653 8.215 8.365 6.038 6.437 8.558 7.915 7.981 8.624 7.552 7.320 6.860 5.694 7.571 7.490 8.080 8.596 7.822 6.760 8.243 8.105 8.166 7.413 7.233 7.409 8.159 7.980 7.700 + 5.145 4.990 6.083 5.608 5.408 6.334 6.822 6.252 6.488 7.596 7.299 6.994 6.957 6.748 6.013 6.625 7.379 5.363 5.690 5.879 5.755 5.920 7.288 7.943 8.079 7.212 6.448 7.661 7.779 7.008 6.099 5.909 5.675 5.747 4.392 3.773 + 3.132 4.141 4.749 6.395 7.044 7.377 8.261 7.743 5.843 5.700 5.331 5.362 6.745 6.561 6.571 6.046 5.375 6.345 5.667 6.543 6.922 7.167 8.075 7.008 7.649 8.379 8.381 7.961 7.237 6.050 5.788 7.040 6.385 4.407 5.072 5.009 + 6.906 7.637 7.395 6.329 6.575 9.046 9.537 8.456 7.517 7.960 7.229 6.378 6.757 7.502 7.771 8.465 8.636 8.438 7.290 9.441 9.065 8.637 8.835 8.394 9.756 10.078 9.756 9.440 8.791 8.873 8.373 8.415 8.280 7.906 6.948 6.842 + 6.398 6.326 3.875 4.552 6.646 6.228 5.661 6.648 5.820 4.377 5.698 5.919 5.994 5.842 6.000 7.047 6.543 5.349 4.716 7.850 7.412 7.168 7.904 7.316 7.422 7.835 7.323 7.131 7.799 7.440 7.708 7.431 7.465 6.544 5.555 4.771 + 5.383 5.712 4.104 5.844 6.202 5.123 6.091 6.827 4.335 2.917 4.354 4.841 4.582 4.558 4.765 5.870 5.049 3.008 4.203 4.601 5.361 5.692 6.006 6.227 6.191 5.483 5.643 4.994 4.754 4.764 4.886 4.897 4.657 3.992 4.001 3.328 + 4.700 5.020 3.670 5.792 4.546 4.631 7.257 7.442 5.605 4.697 4.237 5.260 3.852 5.238 4.544 4.444 3.614 4.146 4.990 5.464 5.975 6.742 7.883 8.725 7.734 7.828 8.103 7.921 7.603 7.903 6.470 6.790 6.099 4.771 4.657 4.054 + 4.999 5.090 4.567 5.789 5.681 6.640 8.172 6.837 4.209 4.573 5.195 4.990 5.177 4.445 5.982 5.463 4.838 3.712 5.897 6.605 5.998 6.673 7.365 7.116 7.013 8.065 7.603 7.491 7.911 7.329 6.859 6.793 6.626 5.394 4.414 3.804 + 2.798 3.815 5.827 5.713 5.165 5.899 7.569 7.371 6.140 5.503 5.466 4.968 5.171 5.570 6.170 6.961 6.334 6.001 5.207 6.302 6.280 7.151 7.790 8.143 8.421 8.629 8.122 6.929 6.908 7.274 6.828 6.558 6.500 6.516 5.587 3.567 + 3.837 4.272 6.525 8.525 7.858 5.889 6.922 5.403 4.101 4.683 5.434 4.918 5.055 5.257 6.154 6.268 5.980 4.871 5.473 6.177 5.397 6.172 7.071 9.164 9.477 7.732 7.847 7.344 6.376 6.797 6.447 6.726 6.203 6.862 6.243 3.596 + 5.296 5.062 6.808 8.777 7.628 6.641 6.662 4.507 5.133 5.350 3.996 5.352 5.839 6.319 7.596 5.633 7.041 6.400 6.608 7.334 7.531 7.386 7.000 8.450 9.122 7.983 8.825 8.146 6.878 7.348 8.385 8.165 6.682 7.261 6.850 5.672 + 5.620 4.998 7.621 8.573 6.667 6.535 4.774 4.184 5.576 5.377 4.724 4.139 4.848 4.570 6.623 6.456 5.098 4.915 6.522 7.454 7.549 7.890 7.585 7.763 8.243 8.142 8.429 7.909 7.710 7.197 7.809 7.657 7.161 7.345 7.137 6.683 + 5.678 4.981 7.639 8.692 6.858 5.957 7.115 5.219 4.819 4.464 4.734 4.411 4.829 4.763 5.864 5.548 4.066 4.779 5.066 4.288 5.072 5.241 5.516 7.525 7.747 7.381 8.059 6.768 6.265 7.270 7.318 7.620 6.779 7.299 7.079 5.570 + 6.468 5.506 7.212 7.815 5.683 6.650 6.843 4.800 4.167 4.262 4.827 2.554 2.850 3.471 4.615 4.749 3.046 3.694 3.990 2.744 4.134 5.056 4.928 7.373 8.815 7.833 7.576 6.732 6.034 6.711 7.355 6.829 6.385 7.486 6.422 4.374 + 5.077 3.606 7.254 8.067 6.253 5.301 3.880 3.800 3.813 3.722 5.400 3.513 3.108 4.552 4.212 3.375 3.106 3.610 3.250 3.639 3.542 4.120 4.817 7.405 9.159 8.109 7.010 5.037 5.406 5.598 7.279 7.151 5.514 7.305 7.073 4.530 + 6.661 5.957 7.827 8.826 6.996 5.591 4.650 3.755 4.946 4.950 5.455 3.343 3.463 3.165 3.359 2.857 2.046 2.643 3.494 3.536 2.840 4.933 5.650 6.919 9.245 7.715 6.762 5.859 4.688 5.850 6.796 6.616 6.070 7.087 6.455 4.433 + 7.003 7.634 8.409 7.950 8.532 8.597 8.225 6.888 7.612 7.739 5.811 5.550 6.293 7.101 5.643 4.579 4.620 5.362 4.991 5.902 4.697 5.151 7.056 7.600 9.495 9.114 8.044 6.614 6.684 7.327 7.898 7.133 6.824 7.054 6.619 4.771 + 6.216 6.724 7.769 8.845 9.468 10.474 9.114 8.280 7.196 8.356 7.818 7.611 7.966 7.752 7.328 5.519 6.200 5.437 4.631 4.317 5.451 5.108 6.019 6.002 7.892 7.929 7.559 7.109 7.950 7.427 7.990 7.292 6.950 7.876 7.200 6.335 + 6.479 6.315 7.877 7.751 8.627 9.870 9.432 7.503 7.235 7.507 7.262 7.980 7.491 6.897 6.627 6.901 6.533 5.502 4.536 4.663 5.436 5.102 4.911 7.160 7.174 7.622 8.066 7.353 7.385 6.619 7.082 6.878 6.968 7.339 5.637 4.846 + 4.018 3.817 6.412 6.815 5.598 6.639 7.144 6.266 5.773 5.286 4.209 5.180 5.519 4.883 4.423 4.725 4.324 2.420 2.729 3.497 3.177 3.398 4.609 4.869 5.422 5.607 5.704 6.379 5.916 5.836 5.227 5.143 4.870 4.238 4.021 3.802 + 3.967 4.063 5.613 6.096 7.276 8.181 7.819 6.155 4.656 4.006 3.281 4.108 4.086 4.623 3.933 4.192 2.734 3.532 3.610 4.082 3.049 3.814 4.914 4.604 6.133 6.001 6.218 6.654 6.023 6.671 4.890 4.870 5.730 6.298 4.920 4.247 + 4.657 3.304 3.876 3.809 5.279 6.242 6.229 6.569 6.477 4.095 3.888 4.424 4.745 4.351 4.911 4.548 2.974 4.530 4.061 4.546 4.007 3.647 4.646 4.761 7.179 7.143 6.221 6.491 6.091 5.614 5.331 5.077 5.291 4.702 3.419 3.212 + 4.101 2.305 3.250 4.998 3.892 3.663 4.083 5.791 4.932 4.895 3.581 3.795 5.744 6.353 5.847 5.624 4.842 4.525 4.939 3.830 3.902 5.023 5.546 6.038 7.425 7.721 6.612 6.108 6.465 6.777 5.981 5.298 5.735 4.976 4.109 3.287 + 2.400 1.472 2.855 5.059 5.033 5.403 5.656 5.388 4.767 3.714 4.117 3.473 3.231 4.336 4.930 5.045 4.620 5.051 5.657 4.735 3.752 5.223 5.510 6.798 6.901 7.117 7.296 6.709 7.299 7.722 7.186 6.116 5.798 5.806 4.543 3.752 + 2.932 3.097 5.099 5.922 6.837 7.973 7.698 6.935 5.277 4.119 4.922 3.596 2.180 3.423 3.299 4.046 4.238 4.780 4.934 3.763 4.038 4.318 5.144 5.637 5.717 5.206 5.853 5.143 5.272 5.647 4.068 3.503 3.702 4.807 3.942 2.448 + 1.821 2.486 4.424 3.888 3.280 5.036 4.624 3.186 3.298 2.184 3.379 3.197 1.787 2.234 2.570 2.159 2.351 2.628 2.524 2.434 2.416 2.253 2.820 3.760 4.798 3.510 4.127 3.840 3.513 3.197 2.260 2.366 2.455 2.471 1.789 0.488 + 4.810 3.487 3.185 3.874 3.457 4.211 3.627 2.699 2.375 2.323 2.104 2.430 1.480 1.838 1.502 1.213 1.841 1.959 2.194 2.276 1.767 1.684 2.651 3.133 3.306 3.329 3.026 2.285 2.067 1.917 2.183 2.567 1.571 2.004 0.641 0.552 + 4.170 4.164 3.306 3.468 3.039 3.579 3.718 3.074 3.356 3.230 2.716 2.143 2.999 2.735 2.667 0.993 1.363 1.826 2.018 1.824 2.217 2.193 2.068 2.232 1.931 3.069 3.388 2.514 1.472 1.605 2.059 1.685 1.791 1.764 0.837 0.603 + 3.042 2.895 4.442 4.604 3.035 2.849 1.961 2.647 2.624 3.052 2.999 0.962 2.479 2.228 2.778 2.643 2.711 2.713 2.605 1.092 1.974 2.476 2.179 1.624 1.106 2.196 2.654 2.749 2.798 1.902 1.939 1.600 1.353 2.477 1.717 1.462 + 2.505 3.099 4.860 4.435 1.668 2.297 1.835 2.999 1.932 2.305 3.372 2.238 1.355 3.914 3.513 2.802 3.474 3.420 1.158 1.628 2.613 2.213 1.798 1.538 2.729 2.696 2.479 2.760 2.824 1.264 1.893 2.368 2.025 2.362 1.551 0.536 + 3.825 4.033 4.143 3.045 3.751 4.918 4.897 5.193 4.360 3.879 2.958 2.766 2.614 4.275 4.318 3.995 3.955 3.305 3.117 2.691 2.566 2.779 2.672 2.436 2.683 2.820 2.730 2.954 2.818 3.544 3.752 3.032 3.023 2.829 1.872 1.132 + 3.616 3.435 4.492 5.959 5.171 7.288 9.221 8.924 7.826 6.978 6.265 6.538 5.521 6.227 7.657 7.494 8.132 8.834 7.163 6.126 5.162 4.677 3.582 4.664 4.973 5.557 5.715 4.968 4.815 7.076 7.040 6.054 4.963 4.388 2.498 1.168 + 2.124 3.332 4.791 7.152 6.407 7.754 9.924 9.073 8.482 9.010 7.976 8.437 6.714 6.577 7.883 8.209 8.897 9.795 8.371 7.899 6.779 4.554 3.941 4.889 5.770 6.558 7.257 6.247 6.346 8.436 8.312 7.449 5.834 5.717 4.148 1.705 + 2.081 3.074 5.417 7.893 7.059 7.600 9.433 7.624 9.553 9.464 7.663 7.392 7.059 7.104 9.096 7.940 8.670 10.404 9.557 8.277 7.147 5.686 3.984 5.634 6.497 8.265 8.864 7.021 7.187 9.573 9.440 8.199 6.655 5.700 4.249 2.505 + 2.226 1.808 5.705 7.930 6.995 7.869 9.092 6.886 9.056 8.696 6.865 7.269 7.322 7.370 9.837 8.779 8.873 10.337 9.709 8.995 7.272 5.950 4.441 5.763 7.587 8.348 8.777 7.734 7.739 9.429 9.188 8.331 7.014 5.638 3.711 2.483 + 3.458 3.672 5.506 8.046 7.155 7.756 9.276 7.322 9.248 9.824 8.780 8.510 7.474 7.686 9.444 8.847 8.401 8.862 9.804 9.932 6.664 5.845 5.652 5.789 7.148 8.033 8.270 8.165 8.053 8.971 9.881 8.203 7.187 5.549 3.600 1.698 + 4.161 3.898 6.311 8.291 7.285 8.113 9.651 7.667 9.417 9.536 8.425 8.588 7.624 7.902 9.701 8.783 8.363 8.892 10.345 10.922 6.905 5.785 5.011 5.727 6.312 8.269 9.677 8.054 6.619 8.992 9.733 7.865 7.199 5.621 3.620 1.836 + 1.892 1.630 5.441 8.191 7.232 8.346 9.847 8.142 8.948 9.192 8.999 8.649 7.255 7.078 9.549 8.527 8.350 7.615 11.061 11.659 8.286 6.272 5.537 5.967 6.204 7.313 9.261 9.069 6.957 8.629 9.728 8.426 7.858 6.233 4.282 2.944 + 2.723 4.338 6.416 8.106 6.893 7.582 9.028 7.823 10.966 10.559 8.324 7.020 6.959 7.358 9.532 8.209 8.167 9.484 9.994 10.853 10.588 7.296 6.550 6.918 7.769 8.625 9.451 9.163 8.193 8.164 10.342 9.384 8.981 7.713 5.387 2.950 + 2.708 3.676 5.612 7.407 6.362 6.510 8.018 9.197 11.679 10.804 9.442 8.495 7.527 7.354 8.694 7.257 6.983 8.548 8.458 10.907 11.087 7.425 6.569 6.798 7.552 9.128 9.773 9.225 7.400 7.244 8.878 8.123 7.565 6.933 4.451 3.273 + 2.252 2.100 4.984 5.554 4.196 6.898 8.772 8.692 10.684 9.293 8.892 8.783 6.322 5.378 6.826 6.515 6.078 7.461 8.697 10.047 10.381 6.364 5.630 6.246 7.071 7.947 9.302 8.473 6.885 6.705 8.542 7.644 6.636 6.007 4.228 2.411 + 2.463 2.786 4.828 4.378 4.634 6.596 8.193 8.389 8.865 8.713 6.545 6.005 5.829 4.940 6.674 5.069 4.923 6.812 8.436 8.898 9.185 7.334 4.855 4.989 6.530 7.244 7.566 6.667 5.737 5.948 7.629 6.879 5.770 4.477 3.495 2.465 + 2.303 2.742 4.399 4.872 5.688 7.241 6.188 7.639 9.835 9.126 4.996 4.364 3.358 4.377 5.973 5.060 3.915 4.803 6.301 7.028 8.741 7.654 5.059 4.315 5.566 6.455 6.751 6.059 5.001 4.694 5.442 4.791 5.736 4.378 1.337 0.748 + 3.439 4.273 4.268 3.851 4.467 7.904 9.348 8.560 9.450 8.341 5.647 4.914 4.463 4.158 5.164 4.948 4.950 6.216 6.410 7.193 8.859 7.192 5.420 5.503 5.411 6.237 5.884 6.078 6.279 5.374 5.808 4.227 4.756 3.809 2.384 0.728 + 2.851 3.488 4.780 5.674 4.854 7.912 9.422 8.055 8.845 7.690 6.329 5.962 4.097 3.527 4.467 4.184 5.304 7.030 6.604 7.001 7.705 6.475 5.037 4.958 4.764 5.186 7.256 6.916 5.351 5.723 5.774 4.224 4.130 3.536 1.533 0.217 + 3.163 2.399 1.809 5.341 5.957 7.808 8.175 6.981 7.617 6.384 4.876 5.314 4.530 3.939 5.364 4.367 4.849 6.806 6.645 6.595 7.663 6.313 5.716 5.383 5.014 5.932 8.504 8.042 5.930 6.217 5.863 5.229 4.074 3.197 2.066 0.986 + 3.729 3.205 3.289 5.158 7.045 8.079 7.484 5.814 7.408 6.361 5.087 4.295 4.072 4.693 5.542 4.702 4.143 6.592 6.639 6.370 6.937 6.355 4.643 4.986 4.874 5.921 6.416 5.811 5.245 5.422 4.696 3.554 3.281 3.168 1.566 0.468 + 4.935 4.544 3.763 3.071 6.567 7.430 7.009 6.329 7.110 5.197 4.157 4.349 4.088 4.326 4.805 3.583 4.850 5.997 5.764 6.249 5.923 4.887 3.996 3.015 3.676 5.249 6.083 5.445 4.465 4.098 4.458 3.007 3.934 3.685 2.349 1.338 + 3.898 3.254 4.822 4.749 5.703 7.308 7.504 5.661 5.666 4.923 3.261 3.146 3.615 4.538 4.515 4.463 4.666 4.744 4.373 5.824 5.949 4.612 3.386 2.976 2.437 3.839 5.317 4.837 5.003 4.504 3.729 3.590 3.735 3.087 2.214 1.971 + 4.058 3.664 3.182 4.344 4.791 4.506 5.001 4.038 5.748 5.379 4.701 3.475 3.194 3.599 3.683 4.109 3.287 5.291 4.652 5.034 5.110 3.772 3.110 3.466 3.131 3.896 4.678 4.488 3.934 4.214 3.994 4.016 3.281 2.663 1.937 1.487 + 4.954 3.962 2.884 4.813 4.859 4.699 5.828 5.413 5.532 4.342 3.779 4.235 3.851 3.612 3.945 2.934 3.965 4.666 3.866 4.949 4.906 3.877 4.225 3.096 3.151 3.403 3.591 3.305 3.207 3.700 3.733 2.874 3.416 2.885 1.685 1.127 + 1.839 1.480 2.421 2.889 3.842 4.950 5.895 4.506 4.714 4.692 3.666 3.444 2.086 4.539 4.953 3.708 3.385 4.898 4.595 4.597 4.780 3.713 4.010 3.263 2.171 2.976 3.001 3.004 3.235 3.862 4.938 3.464 3.348 2.330 2.241 0.682 + 5.138 4.893 4.716 3.753 3.288 3.468 4.289 3.000 4.535 4.739 3.345 3.057 2.564 4.614 5.116 3.840 4.091 4.567 4.950 5.034 5.598 3.682 4.164 3.645 2.816 3.531 4.594 3.462 3.203 2.980 3.181 3.059 3.657 3.340 2.493 0.972 + 3.710 4.314 5.028 4.623 3.376 3.715 5.425 4.356 5.061 4.691 2.952 2.533 2.682 4.803 4.747 3.345 3.931 4.147 4.398 4.380 4.646 3.119 3.153 3.440 3.211 3.190 3.782 3.774 3.828 4.341 3.377 3.110 2.695 1.730 1.706 -0.024 + 4.154 4.271 4.103 4.457 2.739 5.144 6.030 4.060 3.784 3.402 3.943 3.781 3.503 4.154 4.571 4.129 3.322 4.874 5.158 4.869 4.048 4.066 3.430 2.199 3.577 3.940 3.708 3.873 4.314 3.752 3.960 3.419 2.514 2.424 1.745 0.629 + 2.926 4.166 3.409 1.890 2.257 4.373 5.024 2.329 3.890 3.649 4.017 4.367 3.405 4.471 4.890 3.143 2.833 4.485 4.336 4.630 4.306 3.032 2.818 2.712 3.349 3.511 3.986 3.191 4.018 4.231 3.466 2.788 2.186 2.386 2.502 0.732 + 1.862 2.655 2.223 1.468 2.832 4.313 3.596 3.223 4.064 3.442 3.365 2.089 2.467 4.946 4.332 3.447 4.272 5.274 4.170 3.902 4.971 3.580 3.333 3.598 3.230 2.986 4.277 3.587 3.639 3.595 3.141 2.673 1.918 2.875 2.271 0.635 + 4.333 3.414 1.962 1.650 1.338 2.895 4.167 4.464 4.212 3.109 2.979 3.541 2.874 4.217 4.636 2.799 4.155 5.012 5.050 4.870 4.580 4.137 3.435 3.820 3.613 3.722 3.649 3.858 3.396 2.694 2.602 2.259 1.835 2.415 1.674 1.475 + 3.799 3.448 3.991 3.830 3.190 3.015 2.879 4.181 4.928 3.343 1.823 3.923 3.344 5.027 5.073 3.096 4.141 4.553 4.902 5.038 4.041 3.540 3.680 3.696 2.906 2.507 3.152 3.863 4.071 3.568 2.937 2.331 2.362 1.546 1.578 1.171 + 4.699 4.631 4.291 2.872 3.705 4.729 4.223 4.848 3.946 3.075 2.869 3.443 3.077 4.763 4.392 2.353 3.028 6.022 5.482 4.358 3.609 2.933 2.975 3.269 3.212 3.631 2.830 3.358 3.000 2.385 2.604 2.859 3.006 2.375 2.790 1.431 + 3.407 3.300 2.932 1.999 1.785 3.083 3.923 3.986 3.647 3.367 4.366 3.620 3.241 4.615 3.527 3.290 2.820 5.357 4.759 4.945 2.902 2.200 3.414 3.217 3.082 2.411 3.588 3.369 3.507 2.995 1.963 2.260 2.622 2.430 2.662 1.236 + 4.277 4.392 3.087 2.312 2.762 5.206 5.058 3.376 4.333 3.053 3.995 3.906 3.133 2.798 2.732 3.337 3.410 4.229 4.271 3.659 1.545 2.478 2.013 2.005 2.818 3.034 3.481 3.314 3.176 2.968 3.462 2.720 2.622 2.554 2.177 0.799 + 2.561 2.487 2.386 3.075 2.502 4.980 4.605 3.479 5.197 4.435 3.402 3.229 3.837 2.985 2.516 3.444 2.355 2.673 3.321 3.771 2.647 3.309 3.832 3.675 1.881 2.424 3.413 3.908 2.951 3.060 2.483 1.863 2.366 2.558 2.573 0.999 + 2.520 1.518 2.313 1.790 0.718 3.452 3.497 3.341 4.407 2.624 2.625 3.419 3.144 3.473 3.496 4.198 3.454 4.236 4.041 3.561 3.677 3.504 4.023 3.532 2.046 2.859 3.614 2.548 3.435 3.248 2.648 2.322 2.345 2.613 2.824 0.899 + 2.556 2.180 3.019 3.548 2.598 3.169 4.116 3.069 4.193 3.843 2.038 4.159 3.479 3.602 3.767 3.673 4.188 4.566 4.618 4.729 3.405 3.515 4.416 3.464 2.092 2.592 2.995 3.163 3.580 2.851 2.945 2.682 2.050 2.620 2.607 0.683 + 2.946 2.484 2.897 3.408 2.932 2.883 4.047 5.028 3.295 2.250 1.030 3.882 4.116 5.061 4.595 3.198 3.336 3.601 3.977 4.014 2.482 2.729 2.974 3.532 2.529 1.892 2.299 3.449 2.947 2.186 2.601 2.376 1.650 2.449 2.991 2.028 + 3.775 4.012 2.952 2.314 3.264 4.655 5.310 3.266 2.242 3.108 2.666 2.767 3.953 4.043 3.277 2.945 2.564 5.010 4.762 3.031 2.634 2.449 1.775 3.831 3.368 2.366 2.421 3.058 2.497 2.359 2.532 2.538 2.149 2.541 2.891 1.173 + 2.159 3.858 3.990 3.248 2.443 4.736 4.592 3.307 3.285 4.100 4.237 2.703 2.644 4.069 3.037 2.384 2.851 2.933 2.981 2.562 3.240 3.239 2.542 2.648 3.004 2.025 3.078 3.365 2.738 1.990 2.763 2.177 1.452 2.234 2.473 1.059 + 1.471 2.201 3.577 2.798 1.616 3.491 4.333 4.693 3.109 2.987 2.607 1.717 2.666 3.069 3.045 2.353 4.085 3.552 4.358 3.703 3.513 2.338 3.843 4.546 3.088 2.257 2.704 2.864 2.268 2.275 2.390 2.152 2.045 1.828 2.126 0.787 + 2.734 1.446 1.603 1.553 1.085 2.725 3.509 2.779 2.751 3.598 4.068 2.703 2.247 2.161 1.833 2.609 3.652 3.375 4.073 3.173 2.989 2.537 2.861 3.823 2.970 2.789 2.142 1.750 1.938 1.954 2.607 1.936 1.848 1.664 1.885 0.741 + 1.626 1.662 1.679 2.535 2.983 3.016 3.263 2.770 3.033 2.722 1.824 2.424 2.646 3.210 2.641 2.645 2.303 3.140 3.653 3.261 2.022 2.564 3.590 2.697 2.603 2.184 1.737 2.023 2.019 2.800 3.006 2.423 1.484 1.301 1.604 -0.432 + 3.481 1.693 1.666 2.084 2.330 3.627 3.951 3.168 3.295 1.619 1.576 2.903 2.282 3.171 2.672 2.383 3.216 3.028 3.075 2.534 3.299 2.697 3.604 3.352 3.328 2.808 2.204 2.437 2.105 1.910 2.142 0.948 2.181 2.281 1.510 -0.477 + 2.963 2.855 1.786 1.079 0.299 3.445 3.855 2.404 3.036 0.744 0.495 1.445 2.359 2.956 2.560 2.444 2.978 3.527 3.848 1.620 1.778 1.646 3.306 3.307 2.659 2.096 2.352 2.746 1.706 1.755 1.768 0.878 2.197 2.248 1.325 -0.364 + 2.871 3.464 2.103 2.093 2.837 3.539 4.054 2.903 2.931 2.198 -0.188 1.788 2.966 3.382 3.197 2.353 1.994 3.317 3.270 3.146 2.326 2.106 3.573 2.761 2.093 3.128 2.342 2.729 1.893 1.774 1.834 1.332 1.555 0.917 0.412 -0.086 + 2.136 3.184 1.597 1.373 2.489 3.649 3.865 3.943 2.235 2.028 3.007 1.975 2.633 2.980 2.636 2.216 1.781 2.564 2.091 3.289 2.889 2.269 2.744 1.907 2.689 2.769 2.512 3.077 2.499 1.638 1.322 1.409 1.057 1.288 0.829 0.479 + 2.576 1.409 1.687 -0.475 2.183 4.132 4.389 2.762 2.684 2.693 3.428 2.085 2.298 3.633 3.344 2.350 2.014 1.763 2.621 2.253 1.559 2.728 3.174 1.981 1.995 2.915 2.086 2.571 1.845 1.749 1.298 0.937 1.055 1.619 0.899 0.621 + 3.453 2.281 2.994 2.732 3.015 4.051 3.493 2.463 1.440 2.743 1.743 1.060 0.701 2.333 2.163 2.509 2.420 2.711 2.043 1.584 1.737 1.950 1.371 1.059 1.376 1.655 1.840 2.349 2.410 2.566 1.936 1.286 1.183 1.336 1.035 0.599 + 0.803 1.356 1.801 1.418 1.771 2.051 2.479 2.358 1.989 1.675 1.256 1.592 -0.232 1.271 1.847 2.181 1.912 1.609 2.014 2.292 1.769 1.417 1.850 2.221 1.817 1.561 2.147 1.724 2.057 1.905 1.455 0.813 1.396 0.740 0.943 -0.252 + 0.707 0.627 -0.131 0.298 0.258 2.065 2.071 1.688 1.195 1.888 2.160 1.181 1.953 1.754 1.885 2.408 2.003 3.700 3.602 2.965 2.518 2.042 1.473 1.117 0.509 1.585 0.981 0.848 1.264 0.994 0.527 0.720 0.689 0.449 0.619 -0.625 + 1.520 1.349 2.313 1.610 1.735 2.992 2.020 1.866 1.299 1.357 0.866 0.047 1.930 2.915 1.439 2.819 2.627 3.916 2.258 1.666 2.127 1.189 0.868 1.559 1.265 2.332 1.204 1.026 1.695 2.238 1.114 0.612 0.586 0.495 0.601 -1.000 + 2.441 2.384 1.805 1.755 2.139 2.578 2.869 2.892 2.225 1.759 1.522 0.081 1.222 3.066 1.954 1.398 2.227 2.876 1.831 0.860 0.864 0.611 -0.640 0.958 1.073 1.060 1.279 1.402 1.196 1.248 0.563 -0.063 0.081 0.285 0.956 -0.138 + 1.323 1.161 1.421 1.824 1.728 3.295 3.668 2.629 3.017 1.584 1.402 -0.000 1.044 2.331 2.412 2.134 2.976 3.523 2.383 1.495 1.763 1.844 1.112 1.024 -0.255 0.072 0.929 0.679 0.865 0.600 0.462 -0.357 0.036 -0.177 0.447 -0.411 + 0.962 1.098 -1.477 -1.476 0.635 1.632 2.131 2.328 1.170 1.255 2.080 1.119 1.344 3.233 2.945 0.007 1.206 0.722 0.372 0.953 0.724 1.398 1.787 1.424 0.746 0.952 1.692 1.954 2.138 1.509 1.375 1.101 1.048 0.495 0.206 -0.644 + 3.770 2.109 0.096 0.697 0.391 2.131 2.451 2.244 1.883 1.551 1.303 2.971 3.386 4.470 4.253 1.743 2.873 2.005 1.597 1.485 1.376 1.955 1.254 1.030 0.882 0.596 0.135 0.591 0.311 0.799 0.467 0.858 0.617 0.764 0.377 -0.004 + 1.715 1.131 0.506 2.358 3.070 3.601 3.578 2.486 3.463 2.277 2.761 2.828 2.795 3.490 3.315 0.720 2.158 2.274 2.222 1.735 0.561 0.567 0.367 0.856 1.541 1.807 1.411 1.299 1.183 1.683 0.885 0.744 0.732 0.981 0.273 -0.602 + 3.634 3.957 3.458 1.968 2.326 3.603 3.460 2.431 4.149 3.226 2.552 1.907 1.196 2.189 2.435 2.300 1.394 1.910 1.672 0.779 1.517 0.876 1.018 1.292 1.651 2.963 1.624 1.358 0.683 0.926 -0.006 0.900 1.349 0.790 1.232 0.281 + 0.589 2.377 1.559 1.507 1.589 3.254 3.129 3.135 2.668 1.147 0.939 1.089 2.280 1.368 1.618 1.539 1.884 3.009 2.075 0.494 0.706 0.749 1.521 -0.001 0.799 1.906 1.285 1.509 2.018 1.240 -0.202 -0.307 0.623 0.377 0.296 -0.402 + 4.808 4.168 3.351 1.906 2.784 3.432 3.464 1.718 1.204 0.214 -0.818 -0.072 0.464 2.452 2.875 2.654 2.589 2.981 3.140 2.066 1.704 1.230 2.299 2.150 1.877 2.368 1.995 2.171 1.332 0.524 0.995 0.376 0.523 0.788 -0.185 -0.668 + 2.394 1.787 1.314 0.907 0.978 1.320 1.018 0.108 0.071 0.496 -0.221 0.112 1.447 2.220 1.925 2.270 2.752 3.156 2.653 2.288 1.327 1.944 3.008 2.125 0.343 1.875 1.556 2.021 1.495 0.394 1.347 1.236 1.345 0.682 0.192 0.484 + 4.355 3.189 1.586 3.228 4.373 3.683 3.300 1.690 1.794 1.730 1.467 2.035 2.852 2.689 2.001 2.844 2.916 1.660 1.556 2.636 2.680 2.566 2.161 1.998 2.788 1.863 1.173 1.911 1.411 1.318 0.786 0.891 0.741 1.009 0.430 0.717 + 4.266 4.858 3.866 4.639 5.488 5.307 5.044 2.856 2.804 2.062 1.791 0.537 1.072 2.941 2.993 2.552 2.539 2.209 3.119 2.966 1.957 2.250 3.080 2.039 1.713 3.092 2.044 2.353 1.465 2.070 1.205 1.532 0.580 1.742 1.491 1.317 + 1.554 2.700 2.156 2.712 3.104 2.775 3.787 3.091 2.777 2.838 3.560 2.714 1.106 2.950 3.099 2.516 3.233 2.979 2.799 4.257 3.210 2.879 2.857 3.313 3.331 2.801 3.928 3.812 3.260 1.927 2.170 2.926 1.811 1.778 1.696 1.387 + 0.581 2.078 2.416 1.577 1.633 2.482 3.147 3.580 2.975 0.662 1.007 1.187 0.593 3.164 2.648 1.593 1.501 2.541 3.170 2.966 2.634 2.765 3.349 3.839 3.931 3.572 4.011 3.245 2.677 2.441 1.995 2.222 2.127 2.121 1.972 1.394 + 0.484 1.267 1.976 1.334 1.673 3.365 3.064 1.976 2.455 2.432 2.039 1.839 1.751 3.621 3.574 1.976 1.181 2.392 1.986 1.741 2.326 2.342 2.527 2.541 2.810 2.996 2.829 2.491 2.607 2.928 2.382 2.387 2.466 1.809 1.816 1.105 + 4.722 4.042 2.246 3.348 2.935 1.992 2.293 2.491 1.279 1.310 3.001 2.811 1.995 1.633 1.443 1.125 2.586 1.956 2.269 2.749 2.801 1.964 2.875 3.307 2.409 2.667 2.336 2.818 1.359 2.962 2.041 2.350 1.844 1.836 0.963 0.291 + 2.955 4.125 2.974 2.706 1.746 1.998 1.607 2.737 2.212 2.216 2.611 2.256 1.619 2.375 2.517 2.176 2.421 2.915 2.298 3.203 2.615 2.810 3.445 3.011 2.358 2.700 1.935 2.989 1.986 1.263 1.209 1.757 2.331 2.304 1.847 1.393 + 4.729 3.337 1.368 1.801 2.418 2.965 3.375 3.881 2.973 1.888 2.864 2.247 1.841 3.682 4.343 3.645 4.129 3.583 2.479 2.181 2.377 3.297 3.323 2.885 3.134 3.421 2.830 2.154 1.069 2.547 1.842 0.407 0.974 1.992 1.630 0.895 + 1.536 2.399 2.062 1.039 1.430 2.870 3.146 3.164 1.357 0.540 2.101 2.241 1.515 3.535 4.420 3.778 3.641 4.005 2.131 2.334 2.630 3.444 3.035 2.527 2.318 2.396 3.052 3.125 2.775 2.150 1.194 0.226 1.508 1.849 1.408 0.791 + 4.404 3.834 3.162 2.251 2.516 3.231 2.811 3.053 1.658 1.635 3.170 2.406 2.901 3.742 3.328 2.595 3.458 2.304 2.208 2.136 2.109 2.162 2.959 1.845 2.659 2.616 2.432 2.533 2.817 2.382 2.096 0.572 1.294 1.767 1.474 0.488 + 2.347 3.601 2.865 3.255 1.922 2.356 2.292 3.017 1.266 1.747 3.461 3.657 3.723 4.448 4.146 2.979 4.740 3.652 2.747 2.698 2.116 2.358 1.686 2.145 2.803 2.710 1.447 1.367 1.840 1.775 1.576 0.876 0.560 0.803 0.946 0.089 + 3.195 3.567 2.800 2.957 1.995 1.415 2.114 2.655 1.422 1.193 2.786 2.554 2.645 4.144 3.754 2.374 4.503 4.568 3.007 2.970 2.365 2.974 2.271 2.200 2.661 3.051 1.899 2.243 2.007 1.291 1.710 2.326 2.134 2.315 1.239 1.009 + 3.024 3.493 2.378 0.382 1.981 2.987 3.246 2.154 1.758 1.743 3.049 3.188 1.655 4.486 4.246 2.539 3.079 3.782 4.321 3.489 2.669 4.098 3.724 2.921 3.283 3.249 2.247 3.034 2.720 1.521 2.122 2.393 3.026 2.127 2.630 1.957 + 2.245 1.155 1.018 2.184 1.454 -0.261 0.584 1.496 1.561 1.648 3.600 3.251 2.409 3.869 3.924 3.503 3.394 3.359 3.364 3.704 2.588 3.146 4.248 3.697 3.431 4.190 3.564 2.579 3.161 2.579 2.600 3.579 3.591 3.163 3.613 3.240 + 1.708 1.850 0.700 0.966 0.692 0.808 0.990 3.275 2.516 0.659 1.475 2.607 3.741 4.052 3.182 4.030 4.479 3.872 3.432 2.822 3.083 3.768 4.860 4.652 4.307 4.215 4.564 3.707 4.012 4.162 3.920 5.039 4.528 3.475 4.622 4.034 + 2.484 1.578 0.615 -0.695 0.851 1.050 2.952 2.986 3.119 2.941 3.271 3.298 3.044 2.541 2.846 3.150 2.894 3.337 2.227 2.410 3.475 4.890 6.473 5.647 5.590 4.937 4.197 4.411 5.329 5.911 5.558 5.820 5.598 5.261 5.265 4.046 + 3.777 3.512 3.426 1.517 3.250 3.924 3.002 4.021 3.977 3.819 4.077 4.202 3.767 4.105 3.543 3.582 4.535 4.140 2.641 3.527 4.856 5.643 5.341 5.591 5.943 5.437 4.944 5.318 6.329 6.001 6.511 6.547 6.252 5.903 5.533 4.619 + 1.824 2.838 3.289 2.564 3.952 4.371 4.441 4.084 3.857 3.190 4.128 4.961 4.245 3.918 4.670 5.458 5.624 4.517 4.257 4.839 3.764 5.640 6.274 6.380 5.574 5.681 6.116 6.440 5.471 5.513 6.659 7.504 7.019 6.424 6.237 5.536 + 2.977 2.309 3.227 4.173 3.280 2.922 3.462 4.770 3.689 2.956 4.917 4.891 4.308 4.583 4.230 4.692 4.603 4.934 4.547 5.222 4.172 5.279 6.270 6.268 6.270 6.807 7.165 7.338 7.035 6.468 6.137 7.637 7.616 7.356 7.540 6.936 + 3.479 3.372 4.297 3.899 2.764 4.163 4.354 4.464 2.643 2.861 3.307 4.802 4.233 3.134 5.318 5.659 5.252 6.230 6.322 6.259 5.550 6.380 6.348 6.500 7.551 6.525 6.691 6.860 7.188 7.699 7.954 7.546 8.152 8.211 7.582 6.340 + 2.856 4.052 3.256 1.911 1.177 2.783 3.400 3.885 3.367 3.553 2.045 4.007 4.869 3.766 4.553 6.392 6.408 5.339 5.883 7.040 5.663 6.689 7.551 6.381 6.263 6.551 6.226 7.276 6.975 7.578 7.941 7.806 8.021 7.109 7.280 6.870 + 4.279 4.422 3.714 3.185 4.666 4.937 4.827 5.192 3.939 1.481 2.183 3.373 4.125 3.936 3.981 6.443 6.522 6.079 6.757 6.966 6.516 6.202 7.497 7.385 7.447 7.601 7.133 6.942 7.920 8.107 8.465 8.347 8.204 6.502 7.569 7.326 + 3.244 2.846 2.306 3.434 3.820 3.475 3.923 4.985 4.752 3.825 4.007 4.773 4.601 5.479 5.468 6.727 5.904 4.888 5.623 5.705 6.168 7.132 7.319 8.867 8.413 8.086 6.883 7.018 7.104 7.035 7.205 8.882 9.076 7.764 8.307 7.978 + 2.770 4.020 3.463 2.112 3.621 3.722 3.317 2.400 3.822 4.592 5.408 5.838 4.001 6.417 5.749 7.004 7.007 6.016 6.784 6.354 6.974 7.940 8.273 8.225 7.874 6.655 6.123 6.952 7.172 6.521 7.059 8.030 7.573 7.960 7.676 6.682 + 1.805 3.171 3.306 2.214 3.590 3.225 2.431 3.417 3.956 3.950 5.041 5.482 4.823 5.393 6.031 6.374 6.473 6.688 6.051 6.349 6.480 7.548 7.722 7.166 7.436 7.626 6.615 7.177 7.498 8.015 7.246 8.019 8.024 7.530 7.973 6.578 + 4.236 4.150 2.934 3.573 3.027 3.499 3.689 3.741 2.073 2.796 4.416 5.173 5.304 4.925 5.062 4.947 5.283 6.436 6.334 6.075 6.649 6.618 8.047 7.707 6.681 6.501 5.800 6.561 7.922 7.791 6.855 6.994 7.697 6.596 7.382 6.420 + 4.811 4.262 1.958 2.463 2.864 3.398 3.220 2.115 2.633 3.566 3.474 3.714 4.119 4.463 4.253 4.595 5.768 5.381 5.645 5.247 6.235 6.671 7.702 7.462 7.287 6.889 6.440 7.675 8.141 7.963 7.247 7.205 7.293 7.558 8.039 6.572 + 1.961 1.958 2.113 -0.595 1.381 3.166 2.818 2.545 2.858 4.320 3.636 3.163 2.660 3.655 3.374 3.590 5.291 4.611 6.453 5.902 5.103 6.257 7.101 6.347 6.727 6.252 6.216 6.226 6.867 5.266 6.663 7.135 7.587 7.023 7.526 6.822 + 2.168 3.139 3.062 2.302 2.578 4.554 4.108 2.669 3.013 4.238 4.699 3.518 4.103 4.992 4.859 4.780 6.555 5.181 5.263 5.717 5.443 6.369 6.735 6.321 6.920 6.557 6.550 6.609 6.930 7.100 7.181 7.637 7.764 6.840 6.719 6.195 + 2.772 3.429 3.777 2.458 2.807 4.426 4.377 3.143 4.000 3.982 4.309 4.759 4.316 5.893 6.067 5.957 5.282 3.901 5.234 5.460 5.762 6.845 7.871 7.594 7.836 7.356 6.301 6.561 5.926 6.493 6.798 8.437 7.631 6.854 6.863 6.516 + 3.005 3.500 3.590 3.312 2.409 3.870 4.840 3.248 3.426 3.656 3.032 4.374 4.379 4.905 5.058 5.650 3.952 4.572 5.321 4.219 5.069 6.046 7.391 7.513 6.512 5.741 5.962 5.766 6.483 5.386 5.712 6.881 6.579 4.786 6.778 5.693 + 5.757 5.262 4.091 2.954 3.545 5.699 5.182 2.150 3.053 4.053 4.316 4.821 4.397 5.244 5.004 4.973 4.164 3.923 4.041 4.902 4.684 4.120 5.602 5.327 4.120 3.954 5.021 4.850 4.739 4.957 5.658 6.259 6.106 5.718 5.670 4.745 + 4.490 4.348 5.037 4.688 2.608 4.924 4.792 3.107 2.483 2.179 3.724 3.417 3.381 5.131 5.904 5.856 5.828 6.573 6.634 6.242 5.199 5.603 6.149 6.047 5.625 5.878 6.099 6.455 5.876 5.395 4.750 4.926 4.606 3.458 4.325 3.623 + 3.718 3.358 3.813 2.692 3.007 4.279 4.579 3.940 2.735 2.996 3.338 2.359 2.517 5.162 5.131 4.808 5.962 6.943 6.546 6.350 4.670 5.319 5.675 6.027 5.296 5.630 6.059 6.611 5.695 5.297 4.986 5.020 5.483 3.686 3.657 3.007 + 4.095 4.202 5.030 3.638 1.156 3.753 4.702 3.732 2.999 3.561 2.490 1.197 2.382 4.499 4.574 3.284 3.672 4.844 3.915 2.618 2.868 3.618 2.536 2.900 2.698 3.047 2.730 3.147 2.232 2.436 2.524 2.749 3.068 2.276 2.725 1.757 + 4.116 5.443 5.194 3.563 2.319 2.810 2.872 2.576 2.408 2.967 2.304 1.792 1.945 3.377 3.122 1.730 2.373 3.223 2.548 1.302 1.833 2.910 2.516 1.826 2.303 1.956 2.211 2.222 2.246 2.439 2.794 1.998 2.591 1.753 1.523 1.433 + 5.110 5.357 5.827 4.938 4.620 5.402 5.958 4.521 1.832 2.690 3.593 3.037 2.171 4.870 3.834 3.237 3.602 4.147 4.087 4.397 5.067 5.273 6.447 7.127 6.540 5.515 4.480 3.829 4.809 6.114 6.118 6.509 6.981 6.146 7.289 8.860 + 5.966 4.245 4.527 4.837 3.986 4.147 4.357 4.079 2.070 1.488 3.069 1.715 1.339 4.114 4.082 2.832 3.782 4.070 4.015 3.996 4.207 4.521 6.321 7.256 6.356 5.605 5.513 3.760 5.818 6.646 5.652 6.006 6.582 5.423 6.909 8.825 + 4.780 2.582 2.739 2.084 2.738 2.350 2.894 1.030 1.609 0.640 1.509 2.726 2.819 3.859 4.368 3.605 1.731 2.132 2.983 2.357 1.110 0.939 1.533 2.167 2.675 3.535 3.110 1.909 1.929 1.077 1.863 2.292 2.365 2.327 2.104 2.068 + 2.761 1.780 1.725 3.626 3.404 3.516 3.792 1.792 1.593 1.764 1.701 2.601 1.459 4.572 4.964 3.019 2.220 3.684 2.982 3.178 2.193 1.483 2.276 3.425 3.589 2.961 2.560 3.661 3.567 3.415 3.323 4.173 4.432 4.555 4.608 3.565 + 4.621 4.124 2.980 3.426 3.021 2.866 4.033 2.765 0.584 2.050 1.110 0.817 1.688 4.715 3.664 3.187 3.576 4.098 2.907 2.618 2.473 1.532 2.165 2.259 3.810 3.121 3.678 4.355 4.622 5.197 5.290 5.494 4.691 4.626 4.357 3.287 + 3.991 4.837 5.406 4.864 3.214 4.684 4.959 4.188 2.972 2.093 2.615 2.139 2.451 3.364 3.288 2.340 2.512 3.028 2.734 2.766 2.982 3.144 1.918 1.635 3.218 3.369 2.529 1.974 2.604 2.649 2.695 3.248 3.241 3.497 3.352 1.996 + 4.563 3.747 4.018 4.654 3.031 5.151 4.900 3.822 2.971 2.131 1.778 2.405 1.795 2.919 2.321 1.462 2.254 2.774 2.578 2.615 2.857 3.062 2.490 1.914 3.262 3.646 3.588 2.860 2.503 2.649 2.969 2.420 2.118 2.322 2.369 1.239 + 5.466 6.521 5.631 5.208 5.505 5.698 5.748 5.892 5.193 4.346 3.000 3.999 4.170 4.108 3.629 3.288 3.896 3.533 3.666 3.440 4.475 3.888 4.738 3.850 4.149 5.989 5.794 5.961 5.220 4.042 4.943 5.871 5.209 3.604 2.603 3.785 + 12.092 12.191 11.524 11.722 10.723 10.520 10.718 10.750 9.164 9.228 6.970 8.322 9.268 8.213 7.364 8.141 8.582 9.111 8.029 10.000 10.136 10.182 9.489 9.115 8.288 10.813 11.997 11.593 10.010 9.473 11.079 12.226 10.870 10.171 11.063 11.911 + 13.149 14.201 14.777 14.484 14.856 13.698 12.325 12.295 10.989 10.352 10.708 9.580 9.985 10.404 10.299 10.808 11.193 11.518 11.029 12.922 14.705 13.628 12.362 11.978 11.884 12.849 14.555 13.587 12.294 12.841 14.125 15.083 13.507 11.730 12.519 13.789 + 12.900 15.086 16.334 14.912 16.171 15.724 14.415 13.913 11.842 11.538 12.382 11.698 12.114 11.790 12.118 12.220 12.379 12.793 13.189 14.856 17.136 16.179 14.540 14.254 14.132 15.057 16.487 15.641 14.555 14.911 16.661 17.679 15.822 12.415 12.134 11.929 + 13.507 15.291 16.865 15.506 17.148 17.022 14.786 14.797 13.184 13.167 12.228 12.343 13.289 12.342 12.436 12.668 13.052 13.093 14.121 15.327 18.067 17.488 15.486 15.215 15.096 15.658 17.459 16.792 15.813 16.119 18.024 18.769 17.226 13.420 11.889 12.982 + 13.480 15.270 16.931 15.730 17.540 17.507 14.651 14.786 13.414 13.560 12.087 12.183 13.295 12.532 12.495 12.632 13.169 13.154 14.089 15.569 18.315 18.295 15.332 15.238 15.000 15.998 17.741 17.381 16.143 16.449 18.260 19.065 17.700 14.351 11.787 12.450 + 13.330 15.383 16.930 15.695 17.706 17.542 14.543 14.594 13.275 13.411 11.671 11.875 13.078 12.333 12.313 12.415 13.019 13.032 14.094 15.397 18.332 18.276 15.762 15.450 15.161 16.146 17.843 17.570 16.183 16.337 18.155 18.961 17.743 15.176 12.342 12.407 + 13.136 15.478 16.890 15.632 17.584 17.208 14.392 14.393 13.257 13.234 11.435 11.563 12.840 12.264 12.203 12.286 12.882 12.796 13.936 14.993 17.877 17.555 15.627 15.250 14.890 15.778 17.450 17.246 15.743 15.856 17.579 18.606 17.611 15.367 11.956 11.798 + 13.110 15.392 16.346 15.189 16.758 15.958 14.030 13.280 12.699 12.284 10.951 11.697 11.723 11.882 11.688 11.880 12.337 12.652 13.525 14.602 17.012 16.340 14.715 14.219 14.032 15.220 16.766 16.389 14.670 14.751 16.369 17.993 16.838 14.373 11.700 11.063 + 11.791 13.336 13.266 13.882 13.959 12.634 13.219 12.880 12.005 11.908 12.398 12.378 10.913 10.744 10.829 10.426 9.802 11.227 11.588 12.482 14.083 13.296 12.506 12.116 11.780 12.495 13.787 12.383 11.197 11.666 13.219 15.258 13.982 11.636 10.752 10.386 + 10.048 12.389 12.489 9.950 8.841 8.570 7.695 8.220 7.518 7.961 6.632 6.460 6.474 6.508 5.875 5.314 5.776 6.176 7.301 8.135 7.575 7.348 7.483 7.784 7.407 7.645 7.695 7.767 6.403 6.840 8.770 10.099 9.291 7.815 6.693 6.199 + 9.501 12.189 11.798 7.998 8.188 7.468 6.831 6.290 5.683 6.174 5.485 4.722 4.615 4.216 4.336 4.000 4.452 4.628 6.784 7.323 7.999 7.164 5.871 5.083 4.744 6.302 7.201 6.480 5.110 5.304 7.330 8.673 8.258 6.423 3.949 3.251 + 10.084 12.597 12.296 8.944 7.418 7.514 7.681 7.510 5.820 5.883 3.939 3.972 3.804 4.336 3.899 3.527 4.202 3.789 5.721 7.425 7.661 7.317 5.137 4.549 5.330 6.412 7.167 6.244 5.326 4.742 7.054 7.719 7.524 4.685 3.694 3.526 + 10.074 12.405 11.593 8.383 8.177 7.542 7.020 7.875 5.876 4.807 5.628 4.657 4.082 4.262 3.909 3.619 3.417 4.799 5.984 6.861 7.634 7.297 5.069 4.397 4.927 6.398 6.193 5.810 4.985 4.947 6.547 7.128 7.026 5.827 3.123 2.077 + 9.906 12.493 12.020 8.921 9.697 9.127 7.509 6.643 5.208 5.057 6.290 4.667 6.155 6.904 7.058 7.243 7.219 6.455 6.797 7.790 8.576 7.394 6.321 6.405 7.236 8.325 8.349 7.003 5.494 5.688 6.947 8.245 8.459 7.663 7.564 7.442 + 10.290 12.645 13.464 12.514 12.218 10.733 10.834 10.107 9.459 9.866 9.762 9.276 8.686 9.984 10.364 10.020 10.137 10.086 10.063 11.520 13.384 12.554 9.114 10.584 11.483 12.820 12.591 11.313 11.628 11.004 11.700 13.345 12.583 12.457 12.957 12.529 + 10.357 13.284 13.697 11.592 12.762 11.048 12.311 11.040 9.923 9.609 9.806 9.872 9.338 9.583 9.719 9.496 10.149 10.963 10.972 12.068 14.592 14.329 11.732 11.518 12.239 13.049 13.422 12.674 13.125 12.995 13.765 14.502 13.813 14.202 14.425 13.992 + 10.785 14.125 14.887 13.419 14.662 13.257 13.034 11.683 10.990 11.319 10.791 11.329 10.586 10.669 11.162 10.533 10.866 11.770 11.598 12.812 15.405 15.156 12.953 12.317 12.228 13.576 14.790 13.502 12.734 12.410 13.689 15.624 14.010 13.674 12.877 11.864 + 12.388 14.596 15.879 14.500 16.042 15.193 13.608 13.187 12.346 11.770 10.733 11.084 11.775 11.929 11.865 12.023 12.250 12.274 12.839 13.546 16.139 17.220 15.139 13.827 13.175 14.092 15.486 14.709 12.983 12.772 14.290 15.907 14.591 12.743 13.183 12.277 + 12.898 14.889 16.284 14.897 16.505 16.029 13.689 13.750 12.743 12.635 11.103 10.991 11.861 11.889 11.717 11.837 12.403 12.395 12.772 13.651 15.725 17.180 15.699 14.030 13.237 14.072 15.689 15.027 13.133 12.935 14.227 15.605 13.881 12.108 12.279 10.987 + 12.881 14.756 16.377 15.157 16.346 16.243 13.799 14.082 12.971 13.305 11.581 11.573 11.993 12.047 12.166 11.882 12.498 12.761 12.869 13.784 16.079 16.470 15.462 14.567 13.760 14.449 16.150 15.754 13.868 13.340 13.852 15.142 13.799 11.399 12.168 9.468 + 12.686 14.532 16.180 15.004 15.748 15.782 13.286 13.533 12.531 12.953 11.464 11.445 11.199 11.709 12.118 11.946 12.081 12.619 12.820 13.409 16.143 16.526 14.352 14.001 13.175 14.120 15.332 15.061 13.208 12.733 13.257 14.524 13.490 10.356 11.240 8.662 + 12.106 14.193 15.209 13.756 14.521 14.205 11.970 11.550 11.189 11.446 11.157 10.426 10.587 10.856 11.202 11.062 11.048 11.574 11.948 12.692 15.559 15.307 12.991 12.422 11.616 12.381 13.988 13.381 11.326 10.631 11.377 13.285 12.419 10.477 9.913 8.767 + 10.342 12.194 11.216 11.051 11.091 9.561 8.855 8.656 7.907 6.913 7.068 7.203 7.623 6.680 6.600 6.529 7.532 8.194 8.291 9.390 11.779 10.966 9.187 8.167 8.153 9.082 10.568 9.372 7.748 7.615 8.545 11.142 10.409 8.325 8.246 6.711 + 9.685 11.706 11.385 9.290 7.075 6.171 6.602 6.496 5.986 6.243 4.576 3.852 4.823 4.579 3.379 2.502 3.550 4.776 5.130 6.315 8.102 8.190 4.946 5.281 5.304 6.277 6.167 5.457 5.082 4.861 5.537 6.420 6.334 5.787 5.673 5.553 + 9.530 10.970 10.117 8.700 6.063 5.320 4.851 5.363 6.917 6.632 7.064 6.130 5.807 4.805 4.748 4.113 4.579 4.051 5.328 5.714 6.817 7.286 5.787 6.544 5.643 5.556 5.756 5.800 5.853 5.998 6.104 6.558 6.653 5.985 5.537 5.131 + 9.152 10.361 10.739 8.903 7.641 6.767 6.383 6.335 7.096 6.313 6.194 6.009 4.716 4.677 3.802 3.602 4.252 4.127 4.981 5.516 6.128 6.472 5.315 4.518 4.528 4.727 6.417 5.755 4.933 6.005 6.734 6.964 6.967 6.325 6.327 6.425 + 8.048 7.936 9.380 8.747 7.208 6.596 6.376 6.048 6.895 5.416 3.783 5.667 4.847 5.039 4.508 3.761 4.575 5.490 4.553 4.220 4.325 5.798 5.339 4.075 4.398 4.919 6.465 4.693 4.771 5.789 5.463 6.219 7.052 5.526 7.255 8.197 + 8.573 9.110 10.228 8.580 8.025 7.625 4.804 4.800 5.675 3.795 4.138 5.127 3.801 4.168 4.459 4.144 4.082 4.073 3.564 4.310 5.206 6.313 5.800 5.023 4.675 5.405 6.527 5.906 5.649 5.945 6.263 6.864 6.569 6.427 8.782 9.037 + 8.575 9.662 9.631 7.400 7.918 7.204 4.161 3.203 6.023 5.871 5.452 5.300 3.394 4.331 3.713 5.515 4.485 2.313 3.452 4.903 6.187 6.389 5.409 4.804 4.795 4.974 6.688 6.809 6.294 7.187 8.051 8.233 7.530 6.117 8.075 8.297 + 9.742 10.699 10.321 8.532 8.529 7.798 8.254 8.296 8.301 8.608 8.497 7.930 7.775 7.577 7.743 8.226 8.017 7.823 7.204 6.833 7.462 8.171 8.390 7.928 8.110 8.015 9.685 10.586 10.117 10.025 9.401 11.168 11.295 10.781 10.894 9.307 + 11.459 11.129 12.032 11.094 11.089 10.884 9.730 10.078 9.748 9.630 9.233 9.263 8.631 8.487 9.062 9.186 8.998 9.042 8.858 8.922 9.956 10.774 10.150 9.309 10.012 10.479 11.836 12.158 11.356 12.066 10.953 13.414 12.992 12.370 12.769 11.739 + 9.921 12.301 13.188 11.600 12.372 11.793 11.700 10.450 9.551 9.762 10.176 9.080 8.363 9.310 8.825 8.183 8.709 8.726 9.742 11.141 13.739 13.524 11.526 11.167 10.108 10.954 13.964 13.070 11.884 12.709 12.330 14.003 13.741 13.114 14.297 13.593 + 11.513 13.624 14.913 13.805 14.339 13.281 12.936 12.647 10.839 10.417 10.862 10.412 10.758 10.274 10.698 11.055 11.520 11.796 12.231 13.103 15.345 15.800 12.854 12.553 12.381 13.103 14.263 13.995 13.142 12.216 12.997 14.312 13.339 13.818 14.404 13.161 + 12.706 14.493 15.848 14.188 15.889 15.542 14.078 13.626 12.567 11.773 12.038 12.093 12.658 12.063 11.981 12.109 12.047 12.200 13.032 13.476 16.007 16.683 15.066 14.093 13.545 14.305 15.813 15.550 14.259 14.086 15.221 16.420 14.526 13.172 13.378 11.426 + 12.994 14.919 16.295 14.994 16.876 16.469 14.289 14.175 12.726 12.372 12.041 12.073 12.878 12.098 12.216 12.378 12.609 12.978 13.864 14.440 16.578 16.800 15.698 14.781 14.410 15.501 16.929 16.027 14.724 14.518 15.847 17.126 15.069 13.234 12.794 9.861 + 13.026 15.074 16.383 15.120 17.338 16.820 14.639 14.254 13.209 12.723 12.677 12.524 13.284 12.437 12.525 12.777 12.902 13.326 14.218 14.957 17.295 17.377 16.049 15.210 14.677 16.029 17.329 16.004 14.836 14.649 15.912 17.289 15.364 12.977 12.937 10.163 + 12.909 15.061 16.402 15.309 17.533 17.027 14.772 14.393 13.249 12.983 12.919 12.676 13.436 12.470 12.688 12.865 12.928 13.398 14.146 15.034 17.504 16.987 15.905 15.109 14.850 16.091 17.662 16.021 14.638 14.328 15.432 17.066 15.447 12.789 12.848 11.458 + 13.063 14.995 16.197 15.293 17.331 16.631 13.998 14.119 12.707 12.149 12.728 12.248 12.898 12.180 12.232 12.645 12.803 13.526 14.043 15.811 17.808 16.488 14.906 14.234 14.135 15.845 16.991 14.848 13.730 13.642 14.670 16.501 15.338 12.453 12.652 10.430 + 12.856 14.785 15.625 14.705 16.399 15.083 14.150 13.667 11.118 11.040 12.903 11.615 12.007 10.918 11.352 11.610 12.039 13.084 13.656 15.939 17.068 14.895 13.339 13.000 12.985 15.339 15.603 13.735 12.909 13.092 14.323 16.055 15.084 12.631 12.496 11.650 + 12.172 13.905 14.480 13.177 14.652 13.120 13.251 12.338 11.100 12.068 13.001 11.576 10.172 9.260 10.175 9.947 10.267 11.363 12.722 14.236 13.951 12.582 12.088 11.232 11.235 13.178 12.587 11.663 12.456 13.025 13.095 14.330 14.016 12.281 11.680 10.032 + 11.952 13.695 15.141 14.375 15.076 14.197 13.048 12.862 11.302 9.807 11.836 10.540 9.997 9.730 10.345 10.792 10.880 11.111 12.875 14.696 13.392 12.661 12.003 11.420 12.243 13.890 13.451 12.166 13.135 13.805 14.224 14.000 13.998 13.800 12.396 9.506 + 12.484 14.132 15.611 14.071 15.027 14.419 13.687 13.418 9.529 8.186 11.659 11.030 11.196 10.725 10.753 11.037 11.348 11.911 13.023 15.340 14.981 13.514 12.471 12.546 13.222 14.873 14.069 12.268 12.575 13.336 14.024 14.315 13.942 13.001 12.780 10.654 + 12.832 14.291 15.898 14.594 15.089 14.922 13.960 14.129 11.160 9.938 11.613 11.263 11.686 10.735 10.831 11.475 11.574 12.364 13.369 15.452 15.391 13.753 13.312 13.232 13.558 15.386 15.059 12.136 12.476 12.338 13.464 14.308 12.824 11.105 10.193 9.613 + 13.002 14.288 16.219 15.153 15.275 15.563 14.043 14.732 11.998 10.996 12.396 12.636 12.604 11.847 11.806 12.525 12.104 12.721 13.563 15.714 16.631 14.206 13.650 13.464 13.552 15.291 15.225 13.798 13.415 13.051 13.786 14.689 13.046 10.338 9.567 9.049 + 13.238 14.068 16.391 15.857 15.417 16.177 14.081 14.984 13.153 12.065 11.887 12.898 12.511 12.690 12.318 12.645 12.641 12.976 13.654 15.404 17.400 15.742 14.040 13.313 14.123 16.223 16.334 14.422 13.388 13.583 14.927 15.478 13.484 10.032 9.855 8.860 + 13.163 13.898 16.398 15.944 14.972 16.012 13.967 14.831 13.503 12.988 11.810 12.178 12.115 12.752 12.098 12.588 12.832 13.209 13.722 15.600 17.329 16.222 14.008 13.825 13.857 16.104 16.327 14.272 13.578 13.556 14.245 15.007 13.709 10.612 9.191 7.562 + 13.071 14.016 16.306 15.796 13.956 15.069 13.405 14.348 13.032 13.270 11.799 10.985 11.166 11.945 11.520 12.120 12.582 13.196 13.718 15.823 15.826 15.127 13.510 13.682 14.197 15.724 15.694 13.439 12.822 13.311 14.130 14.080 12.763 10.699 9.125 5.943 + 11.916 13.693 15.138 14.598 13.177 12.448 12.170 12.228 11.512 12.366 11.523 10.787 10.356 10.898 10.286 11.047 11.524 11.814 13.403 15.027 13.675 12.713 12.036 12.258 13.465 13.546 12.954 11.721 11.917 11.027 10.590 11.004 10.184 8.240 6.954 4.774 + 8.275 11.087 11.944 10.695 9.912 7.531 6.351 7.537 8.165 8.401 8.156 7.377 7.426 7.232 7.213 8.165 9.133 7.941 8.436 8.560 7.716 8.575 8.487 7.989 7.192 6.594 6.793 6.629 5.522 5.275 6.290 7.046 6.094 4.209 4.415 3.324 + 8.540 9.578 11.414 10.476 7.189 7.148 5.187 5.775 5.132 5.790 4.796 3.650 3.308 4.351 5.017 6.091 6.471 5.832 6.381 7.891 6.919 6.294 5.256 5.103 5.075 4.671 5.348 4.262 3.602 4.398 4.794 5.577 4.784 3.522 3.675 3.015 + 10.274 10.127 10.796 10.508 8.355 7.730 5.477 5.375 5.723 6.225 5.869 4.542 4.221 5.584 5.755 6.511 6.500 6.001 6.242 7.192 7.389 5.801 5.117 3.961 4.742 5.912 5.731 3.585 3.269 2.909 4.439 5.397 4.621 4.284 3.586 2.898 + 9.404 10.287 10.832 8.625 7.689 7.831 4.852 4.992 4.890 5.920 5.255 3.549 3.096 4.101 4.982 5.859 5.790 4.787 5.046 6.183 6.368 6.264 5.405 4.530 4.458 4.662 4.758 3.527 3.094 3.398 4.292 5.488 5.119 3.888 3.619 3.557 + 8.677 8.991 9.655 8.012 8.319 8.162 5.592 4.222 4.225 5.691 5.281 3.565 4.691 4.675 5.056 5.185 5.605 6.132 6.637 6.220 7.221 6.832 5.892 4.732 4.954 5.458 5.670 5.716 4.181 4.634 4.553 4.907 5.240 5.338 4.686 3.126 + 8.596 9.191 8.511 7.499 5.611 6.092 5.905 5.442 6.088 6.864 6.586 6.165 5.246 5.272 5.674 6.006 5.939 6.078 6.100 6.299 6.377 6.390 6.463 6.457 6.656 6.168 5.590 5.429 5.245 5.239 4.174 5.247 5.925 5.779 4.726 3.753 + 8.204 9.007 10.221 9.896 8.067 7.675 8.051 8.119 9.201 9.980 10.328 9.664 8.128 6.953 8.472 9.031 9.388 9.626 9.282 9.255 9.008 9.262 9.706 10.106 10.228 9.566 8.603 8.075 8.427 8.380 6.765 7.224 8.284 8.038 7.352 6.165 + 7.789 8.865 9.470 7.836 7.066 6.441 5.752 6.837 6.568 7.627 8.284 7.396 4.803 5.106 6.274 5.959 6.239 7.146 6.051 6.141 6.257 6.263 6.500 7.167 7.286 6.517 5.818 5.272 5.841 5.629 4.822 5.530 5.632 5.491 5.061 4.154 + 7.936 8.785 7.298 5.904 5.746 6.826 6.019 6.605 4.741 4.372 2.930 3.192 3.833 5.022 4.771 3.854 3.526 3.624 5.037 4.663 5.566 4.786 4.846 5.246 4.104 4.728 4.985 4.185 4.432 4.549 3.913 5.250 4.582 5.229 4.264 3.473 + 6.749 6.828 5.366 5.357 6.196 6.599 5.316 5.820 3.996 5.583 6.027 4.417 3.090 4.167 4.554 4.430 4.420 4.429 4.994 5.443 5.971 5.432 5.362 5.510 3.993 4.040 4.085 4.496 5.025 4.460 4.850 5.308 4.219 3.475 3.672 2.740 + 4.752 4.794 5.815 5.830 6.109 6.530 4.755 4.631 3.748 5.027 4.699 3.525 4.106 4.811 5.007 4.955 4.511 4.716 5.120 5.076 6.188 5.599 5.680 4.873 4.299 4.406 5.007 4.541 4.198 4.692 4.229 4.413 4.290 4.292 4.656 3.453 + 4.292 4.598 6.827 6.650 4.848 5.520 5.878 4.560 4.200 5.049 4.728 3.719 3.396 4.487 4.182 3.427 4.175 4.312 4.473 5.710 6.472 4.501 5.506 6.029 5.139 4.243 4.193 4.235 4.087 4.428 4.413 4.909 4.749 4.195 4.819 3.528 + 5.088 5.463 6.752 6.312 4.595 5.102 5.071 4.490 4.939 4.452 3.087 4.206 4.052 6.346 5.930 3.878 5.303 5.123 5.145 5.506 6.939 6.327 6.111 5.535 6.401 4.882 4.228 5.253 4.289 4.379 4.496 5.180 5.004 4.336 4.350 3.450 + 6.446 6.029 5.924 5.803 5.139 6.478 6.139 5.576 4.223 4.242 5.469 4.601 4.908 5.673 5.894 3.604 5.050 6.043 5.926 6.300 6.805 6.534 5.666 5.476 6.576 5.425 4.721 4.902 4.491 4.967 4.733 5.384 4.923 4.906 4.119 3.434 + 6.232 5.724 5.743 6.785 6.152 5.790 6.311 6.225 4.781 4.644 5.025 4.511 3.780 5.998 5.549 2.783 4.080 5.590 5.760 4.953 5.846 5.642 4.801 4.746 5.620 4.479 5.904 6.135 4.920 5.079 5.110 3.873 4.249 4.628 4.272 3.344 + 7.231 6.654 5.675 5.755 4.519 5.160 6.104 6.356 5.841 4.350 3.883 4.944 4.605 6.901 5.981 3.268 4.065 5.640 4.988 5.952 5.752 5.944 6.353 4.987 4.537 4.272 5.229 6.102 5.079 4.795 5.193 5.349 4.778 4.532 3.915 3.459 + 7.653 6.917 5.378 5.627 4.877 5.871 5.750 5.974 5.908 4.890 4.277 5.259 4.642 5.412 5.071 4.294 5.610 5.473 5.839 5.873 5.755 5.333 5.985 6.207 5.510 4.861 4.203 5.927 5.576 5.055 4.694 5.778 5.124 5.345 4.788 3.419 + 5.232 6.149 6.316 5.864 6.885 6.787 5.693 4.223 4.913 4.337 5.565 6.650 5.953 6.632 6.601 5.361 5.600 5.633 5.918 6.428 6.506 6.328 5.922 5.979 5.853 5.139 5.588 5.928 5.408 5.565 5.219 5.451 5.030 5.462 5.143 4.623 + 6.112 6.784 5.425 5.813 7.187 6.980 6.934 5.541 4.993 5.784 5.101 5.375 5.540 6.207 5.839 5.835 5.114 5.864 6.244 6.136 7.182 6.652 6.192 5.874 5.771 6.064 5.922 4.883 4.957 5.251 5.207 5.580 5.000 4.857 4.620 4.458 + 5.540 6.956 6.323 5.747 5.821 6.856 6.826 6.272 5.937 5.269 5.195 6.003 6.630 5.742 6.552 6.794 6.945 7.008 6.379 6.396 6.162 6.243 7.047 5.574 6.566 5.657 5.840 5.622 5.046 5.045 4.553 5.310 5.519 5.192 4.655 3.931 + 7.581 7.919 8.143 6.879 6.618 6.863 6.614 5.296 5.059 5.344 6.071 5.964 5.663 6.533 6.370 6.263 5.633 5.822 6.799 6.743 5.740 7.532 7.308 6.481 6.786 5.905 5.531 6.168 6.088 5.793 4.764 5.242 6.044 5.832 5.385 5.223 + 7.988 6.720 6.266 5.710 5.941 7.584 6.994 6.605 6.107 5.684 5.418 4.742 4.415 6.286 5.981 5.846 5.508 6.437 6.568 6.035 5.616 6.808 7.106 6.075 6.028 5.988 5.185 5.623 5.555 5.612 6.040 6.207 6.209 5.870 4.870 4.708 + 8.739 7.884 5.787 6.864 6.600 7.150 7.452 6.239 5.744 4.698 5.063 4.504 5.593 6.554 6.586 6.782 6.590 6.054 6.384 5.819 6.289 6.931 6.233 5.491 5.598 5.361 5.646 6.475 5.871 4.889 6.191 5.886 6.475 6.299 5.522 4.685 + 8.870 9.056 7.541 6.329 6.065 7.264 7.574 6.405 4.836 3.882 5.184 5.811 5.121 7.140 7.667 6.698 6.010 6.373 6.060 6.270 7.669 7.152 6.821 7.299 6.524 5.904 7.201 6.310 5.333 5.563 6.765 5.849 6.399 6.514 6.018 5.151 + 7.344 8.773 9.272 10.554 11.381 12.212 12.056 10.172 8.702 8.361 8.157 8.278 7.590 6.975 9.379 11.475 11.952 10.308 10.577 10.158 9.891 10.142 10.050 9.995 10.273 9.684 10.051 9.975 9.561 9.293 10.456 8.936 8.310 7.807 8.810 7.564 + 7.350 8.117 8.488 9.729 11.588 13.116 13.670 11.743 9.090 7.293 7.300 7.303 6.543 6.130 9.174 11.937 13.269 11.387 10.004 9.294 8.875 9.255 8.970 9.191 9.401 8.681 10.010 9.406 8.612 8.687 10.791 8.778 7.167 6.878 8.858 8.029 + 6.491 5.953 5.962 6.369 6.622 8.841 11.200 11.653 10.624 8.116 4.233 4.330 3.829 3.616 3.929 7.228 10.409 10.082 6.588 6.280 8.908 9.421 9.410 10.158 8.807 8.779 8.822 8.018 7.845 9.060 9.238 8.353 5.983 9.077 10.385 9.175 + 7.355 5.631 6.798 7.478 6.276 6.653 9.266 8.392 9.090 8.465 6.637 7.229 5.952 6.247 6.790 9.156 10.515 9.676 9.820 8.834 8.679 9.324 9.322 8.888 7.863 7.655 8.058 8.006 7.816 7.713 8.327 7.943 6.669 7.376 8.491 6.766 + 7.068 8.800 8.523 8.128 7.835 10.585 11.749 11.893 11.507 10.757 11.922 11.055 11.467 11.728 12.227 13.216 13.712 11.915 11.493 11.455 10.590 10.257 10.520 11.846 10.823 9.700 8.158 8.679 9.138 9.721 10.079 9.164 7.886 7.067 6.269 6.448 + 10.797 11.421 11.279 11.200 12.004 12.902 13.457 13.606 14.844 16.134 16.435 16.196 15.553 14.957 15.147 15.871 16.601 15.504 13.919 12.594 12.235 12.137 12.038 12.230 11.187 8.962 9.689 9.847 10.067 10.155 12.483 12.958 11.672 8.550 7.385 7.220 + 10.867 12.547 12.175 12.062 11.794 13.252 14.008 13.970 14.916 16.982 17.084 17.491 16.462 15.033 15.027 16.117 17.540 16.979 15.004 13.831 13.235 12.892 13.173 13.645 12.643 11.154 10.833 10.421 10.011 10.228 12.362 12.846 11.684 9.697 7.569 6.038 + 10.783 12.870 12.773 11.823 12.069 13.496 13.756 14.630 15.612 17.023 16.867 17.121 15.616 14.585 14.918 15.806 16.681 17.421 16.406 15.247 14.363 13.771 13.915 15.014 15.317 14.285 12.989 11.515 10.285 11.985 13.474 13.188 11.544 9.882 8.639 6.854 + 11.138 13.328 13.284 12.496 12.994 13.652 14.397 15.509 15.921 17.381 16.620 16.947 15.581 14.956 15.282 15.779 16.013 16.894 16.559 15.522 14.850 14.011 14.310 15.225 15.338 13.828 12.645 11.702 11.507 11.152 12.838 12.837 11.312 9.449 9.288 8.010 + 11.626 13.630 13.871 12.637 13.683 13.951 15.017 16.093 16.728 17.782 17.074 16.442 15.638 15.061 14.882 15.207 15.811 16.703 17.713 17.305 16.162 15.609 15.675 16.226 16.317 14.995 13.905 13.302 12.169 12.190 13.580 13.629 12.403 11.704 11.411 8.663 + 12.003 13.631 14.404 12.651 14.434 14.500 16.241 16.323 17.192 16.712 16.276 15.254 15.025 14.517 14.279 14.103 14.470 15.365 16.654 17.205 16.822 15.559 15.263 15.298 15.410 14.591 13.113 12.714 11.732 11.424 12.061 13.193 12.691 12.345 10.899 7.684 + 12.848 13.466 14.821 13.800 15.512 15.564 17.064 16.460 16.090 15.737 14.763 14.307 14.413 13.476 13.256 13.194 13.970 14.613 15.691 16.967 17.220 16.139 15.533 15.458 15.708 14.378 13.764 13.243 11.673 11.821 12.774 13.624 13.626 13.054 9.918 6.053 + 13.064 12.769 14.764 14.048 15.897 15.635 15.782 15.844 13.318 14.057 12.532 12.664 12.150 12.362 11.854 11.592 12.896 13.452 14.479 16.366 17.066 15.061 14.773 14.779 15.405 14.242 14.118 12.772 10.816 10.456 11.646 12.916 13.150 12.227 8.531 5.257 + 13.967 12.376 14.903 14.880 14.950 16.024 14.040 12.777 12.369 12.950 11.978 11.421 11.412 12.053 10.950 11.148 11.907 12.768 13.793 15.550 15.840 14.544 13.872 13.945 15.077 15.423 14.596 12.267 10.072 9.847 10.976 12.271 12.752 11.082 7.654 5.956 + 14.376 12.286 14.772 16.133 14.746 16.173 15.861 12.973 13.674 12.171 12.076 10.825 11.806 11.350 11.569 11.133 11.998 12.491 13.484 14.773 15.667 15.032 13.245 13.434 14.291 15.696 14.629 11.283 9.468 9.640 10.648 12.126 12.013 11.019 7.970 6.229 + 14.837 13.443 14.047 16.829 16.223 14.902 16.326 14.630 13.576 13.517 11.444 12.060 11.609 12.328 11.750 11.645 12.594 12.692 13.580 14.875 16.258 16.246 15.302 14.609 15.126 16.099 15.605 12.561 11.834 11.337 11.764 13.207 13.467 12.188 8.553 7.554 + 14.885 14.115 12.647 17.160 17.261 14.205 16.229 15.820 13.259 14.547 12.438 12.567 11.702 12.558 11.878 12.053 12.241 13.000 13.464 14.835 16.374 17.562 16.262 15.227 15.987 16.616 15.595 13.382 12.786 11.966 12.357 13.499 14.068 12.967 8.630 8.012 + 14.632 14.194 12.289 16.931 17.484 14.658 15.197 15.847 12.956 14.188 13.057 11.874 12.041 11.768 12.154 11.531 11.675 13.196 12.988 13.653 15.455 17.460 16.685 15.648 15.516 16.074 15.509 13.928 13.666 12.675 12.614 13.597 14.048 12.869 8.766 8.222 + 14.928 14.736 12.202 15.388 17.059 15.626 13.532 15.502 14.097 11.951 12.802 10.831 11.642 10.609 11.425 10.791 11.977 12.223 12.858 13.245 14.897 16.538 17.220 15.716 15.443 15.878 15.592 14.482 14.277 13.156 13.107 14.150 14.675 13.936 9.427 8.437 + 14.823 14.853 11.936 14.160 16.141 14.822 11.886 14.668 13.647 12.352 13.794 11.693 11.124 10.121 11.174 10.389 11.397 10.788 11.752 12.174 13.791 14.864 16.499 15.157 14.487 15.077 14.926 13.739 13.662 12.447 12.444 13.423 13.904 12.863 9.145 8.159 + 14.891 14.832 11.755 13.290 14.931 13.441 11.099 13.936 13.488 11.468 13.577 12.239 10.460 10.204 10.370 10.095 10.705 9.797 10.488 10.767 12.462 13.980 14.933 14.034 13.710 13.285 13.192 12.495 11.820 10.864 11.022 12.298 12.977 10.181 9.211 8.557 + 15.206 15.514 13.540 11.764 13.558 12.332 9.643 11.557 11.270 9.592 12.601 11.343 8.620 9.299 10.035 10.117 10.142 9.720 9.346 9.558 10.432 12.302 11.098 11.211 11.432 9.888 8.903 8.871 8.251 7.474 8.204 10.461 11.649 9.284 8.387 7.925 + 15.425 15.736 13.405 10.646 13.670 12.986 8.867 11.706 11.233 9.878 12.709 11.377 8.144 8.107 9.819 10.044 10.583 10.018 9.591 9.092 9.591 11.287 9.770 11.206 11.569 10.250 8.401 6.924 5.542 5.685 7.212 10.306 11.305 9.315 8.755 8.066 + 15.480 15.558 12.993 11.704 14.091 13.097 9.554 12.015 11.094 10.956 12.987 11.126 9.169 8.440 10.136 9.684 10.999 10.107 10.299 9.845 10.417 11.447 9.966 11.877 11.830 11.070 7.692 6.753 6.817 7.216 7.787 11.176 13.019 9.744 9.089 9.238 + 15.416 15.225 12.332 12.653 14.429 12.854 9.952 12.099 10.563 11.986 12.870 9.868 9.772 8.193 10.089 9.539 10.778 10.325 10.529 10.361 10.763 10.961 10.837 12.235 12.496 11.317 8.590 7.634 7.304 8.156 8.648 11.995 12.864 9.546 9.381 10.151 + 15.078 14.637 11.460 13.262 14.520 12.437 11.276 12.449 9.876 12.667 12.417 8.982 9.828 9.052 9.560 10.167 10.120 10.606 9.869 9.965 10.443 11.125 12.029 12.655 13.657 12.268 11.253 10.753 10.217 10.411 10.956 12.694 13.365 10.817 10.256 10.444 + 14.719 14.050 11.715 13.206 14.138 11.897 12.793 13.241 12.376 13.437 11.500 10.163 9.675 10.447 9.914 10.600 10.280 10.963 9.582 9.024 9.329 10.894 13.587 14.410 13.623 13.643 12.938 13.343 12.044 11.739 12.328 13.924 14.056 11.263 10.570 10.403 + 13.980 12.672 11.251 13.999 13.324 11.360 13.399 12.424 12.733 13.100 10.987 11.767 9.651 10.162 10.394 10.423 11.125 10.340 9.186 8.529 9.296 11.353 13.810 14.831 13.468 13.182 13.540 14.370 13.568 12.723 13.252 14.948 14.168 10.419 9.179 9.040 + 13.705 12.077 12.067 14.155 12.935 12.125 13.088 10.873 12.764 12.057 11.597 11.659 9.309 9.277 10.589 10.113 10.288 10.269 9.020 8.397 9.116 10.936 13.254 14.313 13.501 12.482 13.240 14.687 14.078 13.178 13.694 15.026 13.855 10.903 10.453 9.495 + 13.786 11.891 12.908 14.327 12.584 12.710 12.798 10.699 12.509 10.900 11.864 10.824 9.147 9.185 10.150 10.049 9.724 10.109 8.953 8.462 9.089 11.377 12.847 13.939 13.114 12.225 12.891 14.224 14.011 13.079 13.992 15.252 13.525 10.767 10.482 9.609 + 13.772 11.539 13.564 14.415 12.171 13.148 12.523 11.281 12.146 10.469 11.435 9.334 9.227 9.825 9.859 10.142 9.762 9.587 8.663 8.657 9.817 11.272 12.569 14.307 13.128 12.171 13.195 13.956 13.700 13.111 14.185 15.645 13.315 10.965 11.070 10.200 + 13.399 11.162 13.766 14.281 11.959 13.480 12.312 11.801 12.052 10.944 11.371 9.573 9.582 9.911 9.695 9.716 9.882 9.210 9.168 9.638 10.736 12.076 14.038 15.095 13.418 13.109 13.568 13.612 12.835 12.530 14.237 15.058 13.352 10.583 11.030 10.301 + 13.282 11.851 14.282 14.297 12.410 13.973 12.443 12.231 11.869 11.493 11.188 10.378 9.993 9.928 9.976 10.062 10.203 10.356 10.637 11.292 12.193 13.877 15.417 15.228 13.540 11.674 11.663 11.099 10.187 10.550 12.442 13.064 11.541 9.525 10.673 9.871 + 12.843 12.167 14.523 14.054 12.828 14.173 12.063 12.178 11.183 11.516 10.347 10.471 9.510 9.442 10.484 10.283 10.538 11.270 11.431 12.073 12.761 13.432 13.660 14.003 12.098 8.637 8.542 8.152 8.355 8.979 11.949 12.143 10.318 8.557 10.798 9.348 + 12.560 12.667 14.651 13.749 13.297 14.030 11.837 11.790 10.558 11.212 9.167 9.593 9.079 9.507 10.730 10.403 10.714 11.394 11.990 12.072 11.826 11.807 12.268 12.945 10.926 7.980 7.403 6.572 6.862 7.368 10.351 10.061 8.371 7.597 9.821 8.030 + 12.113 13.440 14.728 13.142 13.705 13.365 12.118 11.705 11.362 11.097 10.817 10.006 10.137 9.461 9.611 9.657 10.330 11.500 12.334 12.416 11.135 10.963 11.581 12.603 10.808 8.032 7.142 7.089 7.397 7.904 9.061 8.326 7.791 7.263 7.776 5.918 + 11.671 14.012 14.755 12.870 13.956 12.918 12.809 11.422 11.533 11.074 11.390 10.346 10.087 8.963 8.651 9.756 10.336 10.992 11.633 12.179 11.562 11.100 12.048 12.424 10.875 8.848 8.115 7.246 8.777 9.931 11.367 10.434 9.107 8.617 10.571 8.843 + 11.685 14.440 14.593 13.121 13.925 13.317 13.581 11.616 11.491 11.824 10.851 10.003 9.460 9.113 9.215 9.913 10.059 10.068 10.574 11.949 12.664 12.556 12.590 13.174 12.621 9.518 8.348 7.915 8.673 9.717 11.444 10.604 9.241 8.172 9.538 7.803 + 12.330 14.742 14.379 13.416 13.426 14.357 13.897 11.532 11.649 12.044 10.692 9.910 9.125 8.793 9.538 9.491 10.215 10.064 11.054 12.436 14.436 14.802 14.001 14.293 13.870 12.317 10.145 10.191 9.919 9.965 12.079 10.799 10.441 9.386 9.403 8.282 + 13.150 14.815 13.871 12.951 12.878 14.021 13.128 11.602 11.291 11.194 10.975 10.021 8.446 8.628 8.903 8.522 9.397 9.454 9.945 11.080 13.318 13.937 12.957 13.084 13.385 13.362 11.039 10.257 10.285 10.509 12.465 12.362 12.018 8.513 9.238 8.768 + 13.920 15.186 13.965 12.780 12.245 12.527 9.997 9.906 9.556 9.575 9.530 8.228 7.642 6.531 7.594 7.538 9.128 8.999 8.564 9.070 9.794 9.797 8.185 9.054 10.500 10.787 8.878 7.468 7.351 7.312 8.705 10.751 11.293 8.239 7.470 7.882 + 14.268 15.153 13.554 12.281 12.494 12.244 10.081 9.235 8.967 9.815 8.316 7.891 8.338 6.034 6.823 7.080 8.481 8.978 8.641 9.044 10.556 9.869 6.892 7.987 9.401 11.104 9.982 7.241 8.468 8.199 6.138 9.835 10.646 8.363 8.808 9.193 + 14.394 14.887 13.349 12.561 12.832 11.912 10.320 9.036 9.008 9.788 8.979 9.574 9.109 6.625 7.071 7.524 8.427 8.593 8.384 8.733 9.748 9.489 6.857 8.129 9.532 10.262 9.864 6.967 8.099 8.465 6.762 9.771 10.386 8.461 9.446 9.564 + 14.182 14.350 13.055 12.504 12.509 11.092 10.271 8.929 9.364 9.685 9.074 9.201 7.656 6.103 7.473 7.817 7.597 7.493 7.038 7.513 9.364 9.379 7.440 8.613 10.009 10.201 9.737 7.276 7.820 8.230 7.802 10.451 10.949 9.791 9.199 8.977 + 13.271 12.934 12.307 11.761 11.058 9.155 9.769 9.490 9.984 9.624 8.915 9.020 7.412 5.202 6.792 6.964 6.848 7.836 7.522 7.738 9.015 8.956 8.311 8.883 9.416 9.462 8.919 6.998 6.648 7.681 7.615 7.631 9.471 9.561 8.713 8.240 + 11.288 10.542 11.012 9.366 8.337 7.955 7.653 7.362 8.614 8.441 8.851 7.605 6.939 6.157 7.521 7.569 7.599 7.657 7.084 7.089 7.848 8.086 7.865 8.438 8.600 8.392 8.036 7.254 6.743 6.573 6.000 6.089 6.865 7.846 7.611 6.122 + 9.718 9.983 8.713 8.510 7.203 6.494 5.932 7.293 7.441 7.980 7.711 5.908 4.829 4.746 4.676 5.399 5.916 7.244 5.861 5.037 6.725 6.708 5.999 6.579 7.335 7.048 6.770 5.835 5.288 5.005 5.258 5.404 5.901 6.057 5.749 5.457 + 6.169 7.964 8.145 6.215 4.007 5.219 5.293 5.373 7.335 8.687 8.370 6.182 5.027 4.510 3.987 4.878 5.439 6.458 6.728 5.776 5.447 5.735 5.902 6.993 7.270 6.733 6.258 5.866 4.387 4.429 4.899 5.287 5.827 6.011 5.277 4.790 + 5.266 5.508 6.676 5.936 5.346 5.751 4.193 4.647 6.135 7.998 7.957 5.864 4.151 5.426 4.083 3.944 4.664 5.065 5.387 4.850 4.448 5.178 4.788 5.903 6.033 6.242 5.876 5.108 4.257 4.781 4.888 5.714 5.267 5.430 4.599 3.841 + 7.177 7.750 7.767 8.226 8.391 8.504 8.319 8.402 8.424 8.478 8.263 8.279 7.959 8.306 8.267 8.367 8.689 9.038 9.040 9.450 9.416 9.689 9.781 9.919 9.988 9.961 11.023 12.453 12.653 11.905 10.999 10.780 9.709 9.285 8.795 7.993 + 8.187 9.416 8.936 10.350 9.875 10.652 10.008 10.165 9.928 9.912 10.146 10.036 10.076 10.466 10.909 11.150 11.659 11.745 11.725 11.250 10.451 11.690 11.816 12.048 12.111 12.932 14.932 15.506 15.677 14.308 14.447 14.661 15.484 15.447 13.734 13.702 + 9.575 8.608 9.385 9.976 9.163 9.874 9.888 8.983 9.032 9.501 8.776 9.260 8.709 9.533 10.043 10.291 11.271 11.061 11.297 11.573 11.254 13.199 12.729 13.026 13.016 15.009 17.074 16.090 17.536 17.930 17.272 17.452 17.022 17.179 17.525 16.851 + 8.997 9.787 8.415 7.464 9.169 9.528 8.407 7.515 9.858 9.769 7.388 8.458 9.269 9.752 10.118 9.690 10.480 10.336 10.055 10.203 11.604 12.987 12.776 14.402 14.725 17.889 18.296 17.647 18.942 18.874 17.737 18.073 18.047 17.779 18.607 18.157 + 9.187 10.004 9.868 9.376 9.233 10.478 8.997 6.586 9.391 8.989 9.663 9.626 9.282 10.201 10.402 9.019 9.956 11.459 10.905 9.678 13.184 14.910 13.787 14.696 16.490 18.066 17.978 18.153 19.090 18.180 18.254 18.161 17.660 17.243 18.254 18.275 + 10.007 9.552 10.456 10.003 10.062 9.940 8.639 7.889 9.949 9.688 8.263 8.201 9.543 11.023 10.469 10.502 10.442 10.304 10.322 11.901 13.130 14.407 14.571 15.041 16.206 18.156 17.889 17.301 18.617 18.602 16.949 16.840 17.155 17.677 17.344 16.889 + 11.542 9.885 10.192 9.386 9.498 8.077 8.061 8.723 9.358 9.228 7.986 8.509 9.802 10.021 9.893 9.434 10.349 11.239 10.748 12.999 14.619 15.955 13.939 14.959 15.831 16.946 17.237 16.669 17.751 17.274 16.662 16.428 17.039 16.481 17.000 16.731 + 13.170 11.763 9.999 9.680 10.146 10.058 10.303 9.115 9.312 9.149 9.178 9.930 9.943 9.292 9.601 9.552 9.565 10.645 11.110 12.715 14.337 16.092 14.040 14.734 16.472 17.825 17.415 15.946 17.998 17.701 16.838 16.517 16.438 16.936 16.921 16.607 + 11.555 9.718 8.968 10.504 10.040 9.709 9.224 9.627 8.656 9.205 9.361 9.121 9.149 9.687 8.937 8.585 8.313 9.949 11.954 12.410 14.728 14.667 12.560 14.348 16.638 18.739 17.007 15.662 16.615 16.588 15.695 15.795 14.005 15.324 14.578 14.006 + 12.064 10.366 10.201 9.953 9.421 7.347 8.786 9.531 7.842 7.171 7.769 8.441 6.909 7.421 7.365 7.868 7.347 8.949 9.207 10.667 12.153 12.727 12.428 12.921 14.478 16.191 14.464 13.713 13.495 12.638 12.289 12.520 11.580 11.218 11.055 10.406 + 13.390 13.482 13.527 13.531 14.859 15.080 15.323 15.456 14.373 13.473 13.306 13.418 12.903 11.820 11.836 12.143 12.734 12.869 13.288 14.039 14.747 14.878 13.537 13.183 13.828 13.939 12.816 12.147 11.763 10.598 9.445 10.057 10.931 11.038 10.755 9.004 + 13.282 14.341 15.143 13.426 15.908 16.491 17.726 18.255 16.730 15.476 15.593 14.974 14.923 14.645 14.254 14.331 14.708 15.024 15.731 17.014 18.157 17.600 15.990 15.852 16.240 16.127 15.094 14.061 12.923 10.888 12.240 13.352 12.964 11.833 11.702 10.217 + 12.231 14.033 14.810 13.925 15.040 15.802 18.615 18.525 18.432 17.165 16.106 15.423 14.734 14.736 14.584 14.747 14.844 15.195 16.172 17.676 19.046 18.099 16.595 16.405 16.776 16.915 15.605 14.868 14.003 12.601 15.126 15.590 14.529 13.646 12.384 11.240 + 11.273 13.943 13.982 14.193 15.142 16.231 17.382 18.665 19.510 17.295 15.544 15.954 15.736 14.948 14.805 15.143 15.454 15.399 16.678 18.180 19.553 18.615 16.555 16.514 16.072 16.613 15.554 15.012 14.097 14.089 16.005 16.096 15.259 14.516 12.250 10.016 + 11.168 13.930 13.278 14.316 14.288 14.994 15.909 18.890 19.129 18.644 16.501 15.984 15.629 15.143 14.722 15.258 15.363 15.351 16.666 18.178 19.225 18.217 16.684 16.598 16.414 15.679 14.669 14.449 13.370 14.575 16.408 17.097 16.530 15.905 13.013 10.996 + 11.468 13.507 12.820 13.771 13.367 14.620 16.095 17.561 18.528 18.748 15.665 15.044 14.675 14.829 14.778 14.717 14.718 15.552 16.263 18.017 18.852 17.563 16.855 16.271 16.159 15.186 14.466 13.944 12.758 15.119 16.128 16.994 16.484 15.746 13.130 11.591 + 10.888 12.998 12.080 13.415 13.293 14.388 15.993 16.735 18.725 18.151 15.044 15.223 14.697 14.484 14.403 14.279 14.545 15.282 15.646 17.488 18.505 17.605 16.757 16.103 16.050 14.651 13.904 13.517 12.715 14.655 15.693 16.151 16.197 15.619 12.852 11.540 + 11.382 12.984 12.412 13.535 13.455 14.808 16.548 17.001 18.262 17.042 14.340 13.891 13.957 13.876 13.453 13.375 14.103 14.056 14.922 16.046 17.650 17.272 15.847 15.461 15.371 13.925 12.839 12.458 12.019 12.953 14.088 14.780 14.928 14.784 12.840 11.260 + 11.589 13.050 12.536 13.029 13.589 14.745 16.390 16.538 16.357 14.651 13.895 11.500 11.718 11.060 10.580 10.005 11.196 10.952 12.000 13.256 14.454 15.761 14.617 14.343 14.353 13.758 12.539 11.902 11.255 9.523 12.352 13.420 13.414 13.691 12.496 10.473 + 9.039 10.432 10.452 10.366 11.916 13.809 14.400 13.218 11.843 12.004 10.712 8.278 8.681 8.871 8.644 7.380 8.828 8.465 9.026 10.518 11.432 12.362 13.156 12.893 12.872 12.597 11.081 10.820 9.891 9.443 10.707 11.019 12.143 12.376 11.485 10.178 + 7.916 8.373 7.716 5.247 7.151 8.153 9.524 10.491 11.435 10.535 8.539 7.204 6.587 7.371 7.908 6.446 6.724 6.979 8.057 8.516 9.587 9.918 10.641 10.146 8.949 8.879 8.107 7.953 6.735 7.355 9.016 8.302 8.672 8.216 7.361 7.475 + 4.548 6.485 6.067 6.335 7.046 7.860 9.817 10.919 10.927 10.134 7.641 5.092 6.320 5.538 5.944 4.443 4.321 4.207 6.871 8.790 9.594 9.164 7.913 6.894 7.466 7.639 7.659 7.144 6.976 7.616 7.929 8.336 7.392 7.514 6.222 5.433 + 5.047 6.619 5.641 4.940 6.207 7.491 8.495 9.491 9.845 8.789 5.865 5.334 5.692 5.501 4.870 4.099 5.013 4.250 6.597 8.767 9.386 9.100 7.995 7.489 7.699 6.662 6.476 5.990 6.377 6.932 7.653 7.975 7.486 7.198 6.860 5.897 + 4.473 5.780 5.762 6.193 6.087 7.204 8.469 7.559 8.058 7.851 5.099 4.818 5.151 4.516 5.303 5.426 6.458 6.954 7.366 7.939 10.045 9.661 8.194 7.736 9.343 9.803 10.790 11.226 11.326 11.359 11.405 10.692 9.541 8.536 8.318 8.059 + 5.661 4.482 6.384 6.459 5.148 6.217 8.303 8.172 9.737 8.721 5.732 5.559 5.208 5.488 6.737 7.634 7.735 8.115 8.383 8.209 9.575 8.976 8.644 7.844 9.923 10.161 11.304 11.738 11.864 11.854 11.844 11.042 9.746 8.818 9.109 8.967 + 3.973 5.144 5.087 5.057 5.873 6.956 7.607 9.010 9.894 8.549 6.362 4.324 5.405 4.623 4.594 4.971 6.103 6.899 6.753 7.232 8.097 7.308 6.551 6.340 6.995 6.883 5.691 6.217 6.639 6.298 6.598 7.761 7.608 5.535 6.148 6.093 + 4.364 4.413 5.313 3.612 4.044 5.448 7.919 8.116 9.619 9.619 7.515 5.755 5.026 4.368 5.236 4.990 6.139 6.311 6.224 7.160 7.729 7.665 5.114 6.440 6.637 6.684 5.978 4.824 6.407 6.643 8.088 8.317 6.850 6.452 6.538 5.887 + 4.518 4.949 4.432 5.351 6.307 6.820 7.560 8.428 9.551 9.240 6.016 5.897 4.844 4.618 5.130 4.591 5.777 6.196 7.147 8.477 9.272 8.508 6.038 6.216 6.244 6.028 4.977 5.616 6.140 6.272 7.923 8.075 8.127 7.067 6.408 5.024 + 7.827 7.798 7.764 8.877 9.092 9.406 9.832 8.784 9.233 9.278 10.018 9.928 9.861 9.488 9.500 9.995 10.497 11.397 11.951 12.093 11.923 11.148 10.513 10.578 11.247 12.235 13.060 13.410 12.718 13.485 14.567 14.549 13.523 12.884 13.394 12.694 + 8.810 6.895 6.662 9.110 10.047 10.460 11.155 10.492 9.788 10.861 10.795 10.721 10.815 10.887 10.465 11.185 11.307 12.120 12.650 12.661 12.474 12.145 11.605 11.441 12.016 12.687 13.460 13.804 13.288 14.203 14.761 14.735 13.803 13.252 13.494 12.467 + 5.572 6.135 5.329 4.889 7.150 8.105 7.144 6.715 8.065 8.135 8.261 7.913 7.653 7.731 7.921 7.713 7.917 8.300 8.792 8.908 8.686 8.934 8.262 7.869 8.502 9.379 10.142 10.115 10.453 11.978 12.283 11.748 12.196 11.554 10.731 10.752 + 6.582 8.436 9.271 9.064 8.386 9.860 9.691 9.518 9.159 9.386 9.679 8.862 8.510 8.802 8.332 8.603 8.897 8.540 8.613 8.455 8.639 8.655 8.044 7.938 8.647 9.425 10.211 10.529 11.377 12.919 13.735 13.694 12.897 12.342 12.151 11.583 + 9.358 10.652 11.044 12.306 12.736 12.892 11.945 10.724 10.178 10.993 10.644 9.475 9.737 9.447 9.261 9.972 9.524 8.786 9.482 9.595 10.331 11.372 10.528 10.187 9.922 10.628 11.958 12.244 12.352 12.611 12.671 13.086 12.946 12.099 12.751 12.251 + 12.363 12.513 12.988 13.954 15.119 15.658 14.187 13.000 12.349 12.192 11.256 10.426 9.935 10.188 10.014 10.153 10.225 10.394 10.792 11.890 13.840 14.923 13.371 11.717 11.506 11.928 10.959 12.345 12.591 12.224 14.552 15.694 14.807 13.679 10.818 9.151 + 12.655 12.800 13.364 14.013 15.427 16.218 16.239 14.454 12.968 12.923 12.359 12.020 11.391 10.847 10.962 10.794 11.116 11.546 11.671 13.066 15.077 15.294 13.285 11.964 12.152 12.772 11.496 11.904 12.788 12.399 13.678 14.705 13.525 13.051 11.243 9.796 + 12.781 12.881 13.581 13.537 14.286 16.823 16.719 14.856 13.715 13.848 13.274 12.130 11.152 11.127 10.439 10.816 11.190 11.179 12.026 13.086 14.623 14.472 12.982 12.054 12.660 12.337 12.577 13.248 12.804 12.365 14.174 15.068 13.730 12.205 11.248 10.191 + 12.676 12.666 13.453 13.152 13.916 16.113 16.728 16.972 14.226 13.484 13.344 12.781 12.147 12.145 11.792 11.923 12.420 12.274 13.704 14.810 16.150 14.684 13.178 12.531 12.693 11.797 13.112 13.730 12.617 12.004 13.922 15.259 14.362 13.556 10.550 7.822 + 12.492 12.467 13.307 12.867 13.469 14.562 17.047 17.031 15.130 14.811 14.244 13.079 11.877 12.511 12.325 12.367 13.236 13.045 14.650 16.112 16.893 14.575 13.137 12.785 11.797 11.989 13.405 13.698 12.113 11.607 14.004 15.396 14.484 14.007 11.422 8.236 + 12.389 12.294 13.083 12.496 13.524 14.451 16.856 16.942 15.895 14.883 14.148 12.779 12.288 12.580 12.220 12.725 13.093 13.752 15.622 16.534 15.655 14.082 13.157 12.114 11.321 12.546 13.647 13.069 11.733 11.131 14.362 15.635 14.438 13.542 10.830 9.409 + 12.488 12.555 12.933 12.519 13.599 15.065 16.575 16.916 16.325 14.948 13.744 12.461 12.574 12.643 12.299 12.926 12.962 14.499 15.523 15.127 13.282 11.923 11.230 10.939 11.067 13.501 14.305 12.666 11.464 9.744 13.464 15.391 14.400 13.204 10.806 9.513 + 12.260 12.402 11.833 11.493 12.984 13.329 14.545 16.056 14.094 13.677 13.654 12.966 11.541 11.059 11.938 11.770 13.722 14.464 13.972 13.081 12.035 10.616 10.172 11.158 11.720 13.939 13.189 11.500 10.435 10.013 11.858 14.251 13.634 11.848 11.849 10.854 + 9.775 9.720 10.231 11.181 11.462 9.794 13.045 14.242 13.749 14.267 13.092 11.935 12.014 10.820 11.273 11.569 12.981 13.887 14.323 12.527 11.167 10.160 9.725 9.569 10.873 13.151 11.353 9.949 9.471 10.331 12.375 12.684 11.835 10.323 10.734 10.287 + 8.740 9.607 8.559 6.881 9.028 8.733 8.720 9.929 9.261 10.730 9.994 9.032 7.723 7.340 8.299 8.988 9.237 9.889 11.099 10.419 8.889 9.078 8.554 9.142 10.237 10.936 10.434 11.304 12.903 13.744 15.016 14.787 14.124 16.390 16.503 14.476 + 9.314 8.760 7.533 8.333 8.413 7.751 8.008 7.645 7.576 9.063 8.346 8.631 8.119 8.595 8.258 9.201 8.895 8.590 9.535 9.291 9.576 8.530 8.162 9.489 10.528 10.996 11.442 11.882 14.255 14.564 16.306 15.735 15.083 18.373 19.025 17.276 + 8.797 7.824 7.555 6.980 7.879 8.233 7.271 8.049 8.044 8.178 7.771 9.134 8.119 7.323 6.814 8.026 7.329 6.680 8.968 8.831 8.392 6.445 7.882 8.715 9.288 11.717 11.000 11.920 13.207 14.449 15.263 15.646 16.320 18.148 18.042 17.250 + 6.563 7.387 8.228 6.946 9.044 9.414 8.639 8.504 7.504 7.415 8.080 8.280 7.665 8.212 7.068 7.646 7.125 8.336 9.536 8.547 7.951 8.352 8.815 8.499 9.001 11.161 10.843 11.526 12.405 13.995 15.259 16.292 17.015 18.378 17.792 16.407 + 7.071 7.483 8.181 7.968 8.747 8.010 7.364 8.944 8.913 8.900 7.936 6.516 6.790 7.304 7.379 7.173 6.776 7.412 8.776 8.962 9.652 8.876 9.030 8.914 9.526 10.671 10.461 10.671 12.028 13.425 14.241 15.200 16.431 17.280 16.684 16.553 + 6.397 5.738 6.469 6.491 6.566 6.944 8.371 8.820 6.453 6.145 5.993 6.787 7.582 6.974 6.285 7.442 7.326 8.023 6.965 8.068 8.397 8.312 8.281 8.782 8.514 7.929 9.384 9.929 10.818 11.304 12.818 12.568 14.044 14.911 14.923 13.628 + 2.985 4.878 5.874 7.518 9.305 8.668 9.183 8.730 6.397 6.846 7.818 6.738 6.832 6.621 7.596 6.416 5.436 6.625 7.293 7.361 7.509 7.279 5.673 7.068 6.916 8.249 7.689 8.372 8.744 9.287 10.513 10.240 11.298 11.547 12.185 10.662 + 4.881 5.000 5.681 9.043 10.146 8.473 6.665 6.488 6.050 9.189 9.149 5.631 5.087 8.456 8.851 6.258 6.342 8.759 7.675 7.059 7.490 7.296 7.196 7.476 7.707 8.205 8.296 9.581 9.227 10.235 11.296 11.587 11.502 10.047 9.993 8.897 + 3.609 6.233 8.085 9.620 9.855 8.449 7.602 7.963 7.175 9.231 8.651 6.716 7.776 7.816 7.691 8.108 8.164 8.413 7.442 8.505 8.662 8.265 8.579 8.205 9.837 9.689 10.404 11.219 13.096 13.329 12.912 14.033 12.914 11.739 11.973 11.025 + 5.953 8.489 9.305 8.336 8.985 7.746 8.593 8.746 7.685 8.667 7.452 8.063 8.107 6.824 6.383 8.071 8.416 8.127 7.895 9.527 9.470 9.937 9.972 11.628 12.730 13.536 14.093 13.621 15.750 16.444 16.030 15.421 15.287 14.547 13.824 13.092 + 7.918 9.333 10.244 10.189 11.389 10.781 10.535 11.098 11.818 11.542 11.082 10.835 10.733 10.307 10.574 10.756 10.434 10.230 10.323 11.338 11.737 12.164 12.229 13.075 14.482 14.741 16.018 15.739 17.400 17.038 17.012 16.911 16.224 15.806 15.913 14.876 + 9.126 7.676 10.529 11.445 11.619 12.137 12.546 11.664 12.130 12.086 12.456 12.165 12.014 11.397 11.788 11.911 11.147 11.430 11.445 11.962 13.121 12.862 12.819 13.030 14.461 16.397 16.275 15.976 16.885 16.383 16.848 15.635 15.985 15.130 14.834 14.226 + 12.652 13.212 12.228 13.330 14.278 14.517 12.757 12.455 12.148 11.881 10.857 9.647 10.401 10.076 10.174 9.834 10.722 11.268 12.248 12.932 11.811 11.495 11.769 11.280 14.521 14.772 14.054 13.041 12.514 12.365 13.625 12.717 11.836 12.068 11.495 11.550 + 13.199 13.328 13.776 14.441 15.434 15.980 13.979 12.841 12.757 12.676 11.242 10.978 10.943 10.585 10.965 11.192 11.764 12.185 13.987 14.548 13.469 12.355 12.446 12.249 12.596 11.686 9.408 8.507 9.697 9.694 12.065 11.717 11.574 10.160 9.247 6.493 + 13.942 13.200 13.072 13.896 15.060 15.982 13.882 12.099 12.622 12.301 10.852 10.984 10.506 10.460 10.946 10.728 11.396 12.772 14.602 15.122 13.922 12.939 13.058 11.637 9.886 10.601 8.920 9.497 10.161 11.632 13.071 13.361 12.570 10.113 7.017 5.681 + 13.313 13.191 12.698 13.351 14.699 15.051 12.269 12.066 11.216 9.483 9.964 10.156 8.977 10.010 9.919 10.709 11.204 12.295 14.257 14.489 12.765 12.084 11.738 11.694 11.875 12.178 11.007 9.349 10.341 11.628 11.858 12.120 11.224 8.566 7.587 6.811 + 11.292 11.413 11.738 11.645 12.598 12.720 10.993 8.999 8.565 7.287 6.504 7.253 6.589 6.562 7.288 7.980 8.574 9.781 12.636 12.897 10.406 10.050 10.696 10.464 10.154 9.787 8.904 7.286 8.252 9.162 9.739 9.794 8.544 7.394 6.855 6.223 + 10.124 9.616 9.203 8.296 7.837 7.778 6.298 6.909 6.083 4.530 6.603 6.287 3.920 4.459 4.058 4.226 6.222 6.932 8.551 8.167 7.029 6.019 7.120 7.473 8.788 8.300 7.107 5.531 7.459 7.108 9.288 7.766 6.393 6.492 6.746 6.344 + 10.093 10.003 10.160 9.606 7.888 5.701 4.611 4.998 4.653 5.058 5.220 4.839 3.590 3.367 4.129 5.392 4.887 6.051 6.894 7.572 7.699 6.531 7.622 8.113 9.031 8.481 6.972 7.222 6.977 8.064 8.505 7.263 6.971 7.168 8.031 7.667 + 9.935 9.307 9.362 9.786 7.502 8.270 7.243 6.826 7.571 6.923 6.633 6.219 5.806 6.119 6.368 6.471 6.642 7.817 9.361 8.349 7.590 7.630 7.726 9.401 9.511 9.672 9.537 9.097 8.922 8.667 8.641 8.083 7.810 7.602 7.422 6.306 + 12.354 11.662 11.936 12.013 13.414 14.206 13.642 11.220 11.134 11.805 11.427 9.721 10.027 11.253 11.151 10.440 12.039 12.536 14.224 15.135 14.507 13.184 12.898 13.223 13.338 13.668 13.386 13.002 12.296 13.204 13.550 13.721 13.046 12.336 9.994 8.006 + 12.909 12.274 12.642 12.539 13.914 16.177 15.234 14.688 14.674 13.342 11.421 12.385 11.640 11.611 12.045 11.938 12.840 13.135 15.075 16.414 16.164 13.868 13.302 13.762 14.268 13.263 12.169 11.163 10.442 12.805 13.013 14.151 13.517 12.990 11.911 10.338 + 12.924 12.160 12.741 12.368 14.146 15.868 16.622 15.983 14.557 13.788 11.673 12.150 11.920 11.638 12.193 12.276 12.935 13.415 14.852 16.967 16.642 14.096 13.601 13.827 14.316 13.476 12.201 10.638 9.612 11.261 12.204 14.056 13.938 13.418 11.472 10.425 + 12.942 12.268 12.900 12.806 14.326 15.902 17.218 16.633 14.885 14.231 12.698 12.487 12.357 11.942 12.363 12.591 13.180 13.584 14.594 16.420 17.100 15.131 14.251 14.185 14.716 14.079 12.662 11.366 10.376 11.539 12.512 14.229 14.034 13.240 10.835 10.637 + 13.002 12.878 12.996 12.603 14.545 16.034 17.128 15.879 14.828 14.274 12.689 12.185 12.291 11.764 12.219 12.098 12.858 12.919 14.087 15.796 17.149 15.675 14.677 14.479 15.137 14.536 12.847 11.572 11.512 13.289 13.647 13.589 13.971 13.571 11.565 11.192 + 12.996 12.976 13.107 12.308 14.690 15.690 16.745 15.247 14.082 13.706 12.395 11.652 11.842 11.264 11.415 11.124 12.238 12.723 13.275 14.626 16.495 16.318 14.999 14.419 14.352 13.397 11.477 11.675 12.164 12.649 14.491 14.431 13.079 12.196 10.370 10.297 + 12.988 12.898 13.039 11.880 14.982 15.675 16.039 14.608 13.657 13.071 11.712 11.392 11.393 10.674 11.368 11.005 12.010 12.355 13.340 14.053 15.673 15.742 14.555 14.562 14.696 13.307 12.302 11.415 11.435 12.414 13.956 14.016 13.309 12.982 10.947 9.914 + 12.894 12.596 12.965 11.438 15.169 15.869 15.205 13.753 13.206 12.670 11.282 10.893 11.191 10.477 10.994 10.643 11.609 11.859 12.683 13.411 15.126 15.756 15.060 14.904 14.141 12.574 11.675 10.602 11.072 11.774 13.642 14.313 13.095 12.963 10.444 8.367 + 12.741 12.379 12.810 11.862 15.097 15.611 14.098 13.113 12.581 12.211 10.961 10.409 10.683 10.406 10.651 10.467 11.376 11.611 12.657 13.388 15.422 15.975 15.514 15.103 13.168 11.369 10.539 9.370 10.743 11.475 13.338 14.195 12.966 13.240 10.751 8.396 + 12.763 12.723 13.117 13.634 15.401 15.328 12.785 12.309 11.976 11.556 10.311 10.207 10.248 10.126 10.732 10.938 11.627 11.721 13.661 14.677 14.362 14.715 14.907 13.479 11.703 10.882 8.909 8.881 9.259 10.279 12.783 14.421 13.617 13.895 11.765 8.781 + 12.886 13.130 13.597 14.413 15.469 15.056 12.100 11.901 12.101 11.721 10.797 11.006 10.795 10.822 11.862 12.871 12.664 11.956 11.681 11.375 10.992 12.011 12.745 12.107 10.691 10.332 8.014 7.349 8.297 9.106 11.068 12.879 11.948 11.879 9.873 8.389 + 12.762 12.937 13.017 13.995 14.577 14.445 11.603 11.553 11.925 11.236 10.813 11.725 12.273 12.789 11.602 10.366 10.091 9.547 9.773 9.779 8.033 9.485 10.845 10.069 8.910 9.552 6.813 6.813 6.665 8.141 9.533 11.831 11.156 11.386 9.032 7.826 + 12.527 12.125 12.238 13.905 13.958 13.825 11.254 11.830 11.830 10.946 11.550 11.992 11.843 11.560 10.416 9.138 7.517 8.264 8.395 8.652 6.463 8.413 10.006 9.945 8.715 9.076 6.346 6.582 7.246 7.764 9.012 11.642 11.204 11.221 9.201 7.665 + 12.515 11.856 12.652 14.038 13.972 13.947 11.369 12.040 11.960 11.490 11.567 12.200 11.997 10.461 9.604 8.711 7.943 8.294 8.094 7.917 7.510 8.810 10.533 10.296 8.312 8.389 6.325 6.663 7.855 8.269 9.558 11.763 11.298 11.345 9.077 7.259 + 12.279 11.947 12.664 14.286 14.710 14.686 12.220 12.525 12.368 12.279 12.023 13.313 12.752 10.805 9.843 8.605 8.623 8.697 8.551 8.008 8.487 9.607 11.437 10.832 8.462 8.378 7.427 7.352 8.730 9.487 10.610 12.268 11.585 11.666 8.949 7.407 + 12.213 12.382 12.939 13.979 15.107 15.798 13.812 13.183 13.189 13.054 12.410 13.479 14.077 13.079 11.231 10.151 9.354 9.062 8.870 8.701 9.002 10.417 12.072 11.223 9.212 7.964 7.263 7.503 9.013 8.752 11.596 12.219 12.091 11.672 9.117 6.901 + 12.885 13.008 13.436 13.535 14.848 16.529 15.282 13.733 14.058 13.637 12.233 13.143 14.225 13.723 13.302 11.369 10.628 10.544 10.688 10.138 9.956 11.299 13.185 12.314 9.900 8.807 8.803 9.265 10.195 9.490 12.129 12.496 12.768 12.090 9.930 7.925 + 13.045 12.823 12.862 12.206 14.926 16.597 15.540 15.785 15.146 14.292 12.524 13.552 13.906 14.780 15.108 13.377 12.001 11.173 11.220 10.570 10.652 11.490 13.166 12.730 10.999 10.259 8.583 9.763 10.138 9.450 11.998 12.126 11.626 11.579 10.277 8.343 + 12.529 12.285 12.442 12.624 14.360 15.524 16.657 16.131 15.528 14.929 13.405 13.699 13.969 14.663 16.203 14.742 14.214 12.744 12.169 11.573 11.442 11.634 13.216 13.359 11.187 10.515 9.968 10.414 10.107 10.374 12.203 11.563 10.987 11.075 10.125 9.195 + 12.434 12.209 12.962 11.960 13.808 14.834 16.909 17.536 16.763 15.054 13.386 13.929 13.816 13.972 15.403 16.438 15.689 13.271 12.585 11.700 11.614 12.448 14.104 14.231 12.285 11.055 10.803 11.083 10.237 10.422 12.384 10.971 10.787 10.748 9.839 9.827 + 12.504 12.045 12.796 12.316 13.563 14.492 15.875 17.295 17.260 14.926 13.381 13.851 13.713 13.688 14.408 16.301 17.176 14.763 13.100 12.063 12.115 13.010 14.669 15.419 13.706 11.965 11.759 12.169 10.564 11.291 12.409 10.774 11.310 10.895 9.517 9.735 + 12.030 11.912 11.847 11.988 13.440 14.233 15.084 17.335 17.084 15.662 14.965 14.665 13.972 13.957 14.216 15.200 16.490 15.403 14.123 13.249 12.915 13.053 13.915 15.390 15.044 13.232 12.522 12.373 10.750 11.704 12.473 11.459 12.081 11.310 8.935 9.276 + 12.123 12.047 12.156 12.268 13.462 14.134 15.078 17.186 16.381 15.713 14.685 14.286 13.331 13.659 13.771 14.843 15.747 16.058 14.481 13.412 12.718 12.658 12.915 14.582 15.537 14.577 13.334 13.129 12.281 13.676 13.959 13.058 13.434 11.727 8.486 8.608 + 12.152 11.891 12.183 11.800 13.233 14.190 15.073 17.068 15.910 14.641 14.151 13.979 12.923 13.266 13.273 14.358 15.592 15.661 13.616 12.859 12.287 12.226 12.412 13.632 15.101 14.315 12.576 12.156 11.984 13.027 13.496 12.689 13.202 11.688 9.026 8.439 + 11.934 11.331 11.769 11.325 13.166 14.050 15.888 17.008 15.428 14.120 13.006 13.021 12.291 12.565 12.625 14.003 15.956 15.651 12.968 11.955 11.436 11.410 11.743 12.995 15.019 14.089 11.749 11.101 11.954 13.174 13.315 12.875 13.409 11.637 8.256 7.029 + 11.673 11.104 11.246 11.855 13.413 14.637 14.679 14.835 13.472 11.496 10.724 11.087 10.517 11.263 11.821 13.764 14.847 14.164 11.503 10.936 10.493 10.794 11.371 12.894 14.776 13.454 10.964 10.182 12.094 13.684 13.692 12.973 13.843 11.741 7.943 6.194 + 11.341 10.992 10.926 11.946 12.950 13.041 12.383 11.313 10.421 10.229 10.067 9.547 9.556 9.723 10.737 12.168 12.596 10.893 9.961 9.229 9.409 9.722 9.918 11.272 12.267 10.901 9.677 8.820 10.634 12.028 12.096 11.390 12.528 10.342 7.150 7.135 + 11.547 11.401 11.647 12.073 13.317 13.257 12.997 12.221 10.249 10.368 10.846 10.130 10.000 9.965 11.215 12.333 13.146 11.888 11.249 10.463 10.016 9.385 9.581 11.233 12.744 11.386 10.280 9.921 11.478 12.632 12.609 11.899 13.241 10.848 7.959 5.921 + 11.863 11.831 11.906 11.986 13.554 14.084 14.189 13.791 12.440 10.640 11.377 11.048 10.284 10.879 11.173 12.588 13.865 14.222 11.698 10.999 10.651 10.459 10.933 12.006 14.469 13.703 11.695 10.898 12.720 13.925 13.436 12.587 13.933 11.661 8.402 6.588 + 12.168 11.595 12.112 11.930 13.791 14.772 15.573 14.397 13.457 12.382 10.808 11.372 10.830 11.302 11.573 12.529 14.607 15.397 12.771 12.007 11.213 11.230 11.508 12.132 14.748 14.546 11.672 11.029 13.182 14.279 13.761 13.507 14.690 12.392 8.729 7.157 + 12.261 11.605 11.922 12.216 13.607 14.901 16.082 15.395 13.807 12.848 11.117 11.431 10.958 11.304 11.751 12.707 14.642 15.903 14.093 12.267 11.643 11.686 12.023 12.912 14.714 14.291 12.048 11.603 13.210 14.402 13.473 14.116 14.575 12.264 9.146 8.311 + 12.214 11.838 12.165 12.598 13.834 15.205 16.077 15.121 14.043 13.136 11.543 11.497 10.801 11.112 11.581 12.796 14.646 15.951 14.780 13.019 12.441 12.428 13.189 14.944 14.418 13.105 12.654 12.830 12.240 13.838 12.605 13.368 13.357 11.337 9.317 8.317 + 12.534 12.247 12.512 12.904 14.236 15.069 15.770 14.408 13.951 12.947 11.452 11.490 11.310 11.523 12.050 13.330 15.190 16.021 15.118 13.746 14.010 14.555 14.185 12.893 11.944 10.960 11.119 10.836 10.857 12.723 11.575 12.562 12.434 10.782 9.274 8.021 + 12.425 12.411 12.581 12.773 14.394 14.836 15.524 14.008 13.699 12.996 11.625 11.884 12.011 12.057 13.259 14.506 15.569 15.414 15.531 15.020 14.357 12.471 11.510 9.437 8.661 8.590 8.867 9.373 8.326 10.011 8.577 10.205 10.568 9.477 8.068 5.776 + 12.236 12.095 12.358 12.673 14.481 14.881 15.226 13.280 12.529 12.332 11.481 11.107 11.761 11.849 13.454 14.341 15.324 14.470 14.646 14.262 12.693 10.158 9.219 8.075 7.701 7.217 8.203 8.307 6.997 8.452 7.056 9.480 9.728 8.932 7.287 4.994 + 11.911 11.701 11.847 12.403 14.635 14.986 14.746 12.803 12.339 12.064 11.333 11.122 11.453 12.001 13.859 14.472 13.944 13.660 14.582 12.816 10.166 8.358 8.634 7.475 7.675 6.658 7.259 7.166 6.125 7.164 5.434 8.648 8.915 7.691 6.709 5.255 + 11.857 11.736 11.845 12.732 14.479 14.843 14.368 12.824 12.424 12.117 11.368 11.573 11.972 13.282 14.523 13.449 12.279 12.828 13.622 11.937 8.013 7.573 7.772 6.534 6.657 6.552 6.805 7.147 5.972 6.559 5.074 7.008 7.595 6.497 5.572 4.388 + 11.668 12.208 12.277 13.086 14.634 14.936 14.545 13.446 12.944 12.785 12.436 12.532 13.378 14.280 14.552 13.401 12.144 12.304 13.279 12.692 8.967 8.524 7.897 7.318 6.288 6.757 6.937 6.886 5.584 5.891 5.580 6.358 6.959 6.819 5.744 4.736 + 11.451 12.216 12.375 12.910 13.656 15.347 14.606 13.047 12.352 12.345 12.261 12.590 13.534 14.244 13.715 12.766 11.679 11.345 12.142 12.434 10.293 8.567 7.749 7.889 6.159 6.662 6.775 6.596 6.428 6.597 5.982 7.091 7.665 7.967 6.854 4.810 + 9.981 11.168 10.637 11.259 14.049 14.827 13.869 12.225 11.434 11.533 11.610 11.490 12.628 14.143 13.138 11.807 11.090 10.199 11.288 12.500 11.060 8.409 8.295 6.812 6.331 6.320 7.111 7.855 6.576 6.439 5.944 7.704 7.602 7.945 7.629 5.988 + 10.944 11.351 11.837 12.580 14.498 15.171 14.453 13.311 12.536 12.462 12.422 12.521 13.542 14.804 14.321 12.868 12.002 10.956 11.428 12.917 13.148 9.827 9.086 8.460 7.738 6.320 7.003 7.270 6.123 6.047 6.193 8.927 8.760 9.542 9.394 7.282 + 10.967 12.003 12.400 12.488 13.749 14.327 14.810 13.556 12.093 12.067 12.600 12.367 12.537 14.076 14.425 12.869 12.120 10.938 10.844 11.520 12.733 12.119 8.938 8.721 7.491 6.834 7.379 7.617 6.764 8.431 7.957 8.553 9.170 10.187 9.978 8.422 + 9.809 11.216 10.965 11.417 13.548 15.085 13.886 12.570 11.784 11.909 11.428 11.459 12.008 13.133 14.496 13.655 11.550 10.942 10.115 10.687 12.419 12.383 9.818 8.336 7.085 6.846 7.410 8.255 6.912 7.564 7.285 7.559 8.109 9.859 9.967 7.601 + 10.543 11.513 11.432 12.200 14.165 15.761 15.325 13.519 12.863 12.466 11.843 11.856 12.227 12.861 14.568 15.120 13.295 11.786 11.084 11.375 12.772 13.799 12.056 9.328 8.058 7.715 8.727 9.135 7.246 7.187 7.181 6.831 8.604 10.386 9.822 7.169 + 11.661 12.295 12.439 12.608 13.891 15.762 15.699 13.763 13.222 12.668 11.726 11.686 11.747 12.127 13.244 14.086 14.126 12.463 11.730 11.428 12.252 13.462 13.752 11.716 9.240 8.589 10.127 10.288 8.439 8.347 8.869 7.906 8.541 9.766 9.993 7.582 + 11.966 12.128 12.455 12.652 14.343 14.890 15.607 13.625 12.967 12.162 11.240 11.644 11.319 11.764 12.334 13.649 14.536 13.298 12.788 11.549 11.219 12.106 12.721 12.621 11.442 10.504 11.104 11.244 9.451 9.045 10.000 9.323 10.036 10.365 9.956 7.351 + 12.149 11.692 12.000 12.161 14.464 15.101 15.418 13.748 12.872 11.522 11.056 11.096 10.544 11.678 11.769 13.338 14.269 14.468 12.909 12.233 11.548 11.569 12.220 13.255 13.074 11.789 11.113 11.322 10.325 11.643 12.562 11.467 11.479 11.388 9.900 7.071 + 12.411 11.574 12.138 12.290 14.264 15.450 15.437 13.481 12.801 12.383 11.853 10.765 10.821 11.335 11.992 12.904 14.104 14.678 13.563 12.083 11.399 11.417 11.917 13.289 13.963 12.514 11.496 11.925 11.593 12.979 14.049 12.503 12.790 13.109 10.783 7.397 + 12.658 12.349 11.223 12.813 13.582 13.108 14.221 12.955 10.995 12.524 11.391 10.525 10.477 10.747 11.573 11.762 13.781 14.096 13.337 10.701 10.531 10.801 11.280 12.411 14.249 13.203 11.041 10.908 11.991 12.300 13.689 12.681 12.568 12.861 10.383 8.468 + 11.204 10.788 12.028 12.284 12.483 12.463 11.804 10.897 10.716 10.268 10.670 9.461 9.111 9.215 9.367 10.078 11.134 12.016 10.762 11.298 10.363 8.836 8.205 9.337 11.593 11.449 11.636 10.537 12.080 13.767 14.933 14.429 13.633 13.216 12.416 11.572 + 9.079 8.896 10.225 10.040 10.310 10.644 9.254 7.969 8.537 6.921 7.653 7.831 7.595 7.625 7.269 8.014 9.852 10.677 10.276 10.625 9.127 8.589 8.628 8.505 10.241 10.459 10.462 10.999 13.330 12.855 14.748 16.771 16.690 15.507 14.919 13.953 + 9.491 7.847 8.714 10.105 10.547 10.389 7.623 8.226 7.426 6.893 6.315 7.565 6.442 6.262 7.051 7.268 7.660 8.355 9.800 9.334 7.452 7.783 7.373 8.747 10.422 11.014 10.612 11.953 12.817 14.141 15.412 16.891 16.714 16.965 15.551 14.724 + 8.221 8.538 8.014 8.973 10.400 9.798 8.638 8.341 7.411 7.268 7.339 6.401 6.799 7.000 8.058 7.234 7.223 8.621 9.234 8.716 7.834 7.629 8.055 8.914 9.437 10.374 10.980 12.059 13.877 15.211 14.979 16.116 17.847 17.414 16.346 14.883 + 9.890 9.289 9.339 9.332 9.538 9.806 8.527 9.028 9.529 9.624 9.355 8.197 7.829 7.632 8.411 8.465 8.909 10.060 10.800 9.193 8.227 8.119 8.679 8.155 9.524 11.762 11.147 12.829 14.315 15.335 15.704 17.007 17.339 16.047 15.425 14.405 + 10.106 9.610 6.769 8.933 10.456 10.479 9.213 9.228 8.669 7.359 7.972 8.797 8.317 7.622 7.311 8.297 9.121 10.519 10.785 9.478 8.561 8.689 7.303 9.028 10.056 11.175 11.877 14.393 15.149 15.002 16.682 16.385 15.584 14.732 13.773 12.142 + 10.929 10.008 7.196 8.607 10.012 10.486 10.244 8.112 9.312 7.806 7.639 8.069 6.884 6.969 6.050 7.276 8.380 10.196 9.960 9.746 8.543 7.518 8.219 8.348 10.190 10.732 11.989 13.773 12.793 11.631 12.151 10.855 10.238 10.070 10.022 9.099 + 11.184 10.289 9.759 10.048 9.329 11.117 10.489 9.760 10.036 9.879 9.657 9.574 8.121 6.596 7.228 7.380 8.653 10.018 8.848 8.116 6.852 7.333 8.010 7.847 7.374 9.002 8.502 7.460 6.855 8.034 7.526 7.523 8.606 8.530 8.020 7.017 + 12.274 12.624 11.855 11.084 9.860 10.618 10.122 7.685 7.145 9.028 10.089 9.344 6.397 7.051 7.382 8.320 9.136 9.848 9.792 9.099 8.430 8.769 8.706 7.401 6.744 7.362 7.800 7.571 6.599 6.766 7.288 6.990 7.459 8.988 8.708 8.300 + 13.234 13.226 11.688 11.829 11.796 10.352 9.649 9.514 8.656 10.287 9.891 9.152 8.079 7.619 8.702 10.018 9.784 9.343 9.614 8.981 8.775 8.870 9.809 8.866 7.293 7.298 7.939 8.118 6.192 6.279 7.104 7.562 7.291 9.669 9.031 7.744 + 13.825 13.445 12.086 11.495 10.993 10.907 10.582 9.267 9.751 9.864 9.841 9.212 7.586 7.180 10.404 10.126 10.617 10.297 9.622 9.408 9.189 9.166 10.823 9.644 8.194 6.595 8.580 9.933 7.355 7.819 8.279 8.687 9.124 9.940 9.825 8.453 + 14.000 13.555 13.009 11.752 11.485 12.137 10.493 9.671 10.254 9.484 9.708 9.814 8.026 8.739 9.978 10.854 10.244 11.450 10.880 11.227 10.883 11.393 12.385 11.141 9.750 7.995 7.868 9.861 8.158 6.676 7.834 8.454 9.770 9.101 9.104 8.927 + 13.716 13.093 13.341 11.298 11.505 11.630 9.210 9.051 9.432 8.990 8.327 7.884 8.339 9.350 9.464 10.228 9.741 10.600 10.092 10.041 10.392 11.383 12.367 12.145 10.193 8.409 7.420 9.094 9.139 6.905 9.736 11.056 12.103 11.025 10.057 8.710 + 13.516 12.647 13.266 11.146 11.434 12.130 9.858 9.026 9.285 8.901 8.207 9.040 9.235 9.473 9.097 9.433 9.187 10.026 9.524 9.332 9.583 10.827 12.108 11.648 9.600 8.052 6.394 8.445 8.814 6.649 9.787 10.836 11.960 11.260 9.928 9.434 + 13.407 12.612 13.010 11.406 11.914 13.258 12.311 10.643 11.379 11.179 9.144 9.712 10.272 10.482 10.825 10.509 10.899 9.987 9.750 9.616 9.638 10.417 11.999 10.782 9.845 7.628 7.396 7.574 9.195 8.925 9.536 10.371 11.560 10.449 9.930 10.532 + 13.034 12.557 13.162 11.090 13.643 14.986 14.466 13.154 12.596 12.344 10.880 11.097 11.001 11.399 11.671 12.675 12.000 10.955 10.647 10.182 10.107 11.068 12.566 12.004 9.822 7.248 7.467 7.787 9.239 9.305 10.872 11.572 11.521 10.951 10.951 8.684 + 13.376 13.283 13.462 11.857 14.234 14.944 14.371 13.814 13.144 12.397 10.780 11.376 11.338 11.796 11.774 13.490 13.139 11.728 11.123 10.364 10.082 10.733 12.281 11.762 10.032 8.007 7.286 7.778 9.107 9.858 12.606 13.025 12.360 11.802 11.584 9.355 + 13.444 13.405 13.469 12.277 14.646 14.886 13.955 13.737 13.363 12.338 10.478 11.335 10.832 11.713 11.662 13.748 13.673 12.584 11.799 10.766 10.708 11.703 13.216 12.399 10.841 8.841 7.613 6.578 9.088 10.452 12.939 13.740 11.189 10.665 11.504 9.815 + 13.459 13.289 13.477 12.429 14.846 15.253 13.225 13.558 13.492 12.416 10.968 11.704 10.713 12.075 11.963 13.860 14.057 12.989 12.383 11.575 11.380 12.237 13.749 13.051 11.097 8.951 8.266 8.394 9.733 11.167 12.660 13.600 12.031 11.486 11.626 9.685 + 13.318 12.841 13.259 12.494 14.772 15.429 13.033 13.245 13.120 11.893 11.022 11.379 10.358 11.750 11.735 13.568 13.496 13.075 11.689 11.146 10.964 11.754 13.513 13.095 10.517 9.004 8.202 7.908 8.981 10.204 12.167 13.143 12.057 11.784 11.043 9.426 + 13.205 12.504 13.023 13.029 14.912 15.465 12.811 13.049 12.696 11.967 10.915 11.347 10.418 11.530 11.698 13.508 13.762 13.368 11.731 11.362 11.202 11.893 13.531 13.020 10.474 8.518 7.516 7.807 8.517 9.282 11.529 12.523 11.902 12.000 10.440 9.096 + 13.093 12.558 13.045 13.823 14.969 15.343 12.968 12.757 12.319 11.053 10.840 11.190 10.483 11.470 11.970 13.542 14.190 13.557 12.056 11.641 11.581 12.426 13.781 13.366 10.685 8.334 8.258 8.559 8.337 9.198 11.243 12.332 11.293 11.101 10.384 9.112 + 12.684 12.543 12.876 13.878 15.102 15.317 12.923 12.830 12.077 11.376 11.425 11.575 11.175 11.714 12.460 13.913 14.477 13.847 12.108 11.431 11.068 12.155 13.876 13.530 10.841 8.666 8.504 9.197 9.391 9.572 12.383 12.703 10.241 9.919 10.570 9.671 + 13.354 13.531 13.183 13.514 14.404 14.530 12.345 12.660 11.343 11.320 11.645 10.907 11.343 11.204 12.250 13.232 13.921 12.843 12.507 11.116 11.109 11.987 13.145 12.195 10.547 9.389 8.917 7.722 8.434 10.194 12.263 12.464 11.652 10.432 9.701 8.327 + 13.921 12.588 12.917 13.634 13.265 12.998 12.672 11.465 10.925 11.811 10.733 10.588 10.682 11.026 11.442 13.154 13.143 12.730 11.593 10.429 10.852 10.810 12.731 12.118 10.343 8.630 9.048 9.073 9.045 10.165 11.535 11.958 11.362 10.194 10.559 9.663 + 13.307 11.983 10.224 11.968 12.155 12.565 12.269 10.384 11.099 11.023 10.262 10.223 9.954 10.739 11.025 12.522 12.603 11.578 10.115 9.617 10.034 10.240 11.947 11.031 9.236 7.664 8.777 7.945 8.477 9.739 11.492 11.429 11.327 10.106 9.551 8.645 + 9.261 9.597 10.502 10.830 11.545 12.172 11.785 11.067 10.987 9.893 9.334 9.370 9.044 9.671 10.421 11.743 11.837 11.349 10.336 9.822 8.805 10.702 12.058 11.254 8.900 8.280 8.223 7.516 8.719 10.601 12.496 12.076 11.661 9.832 9.504 8.544 + 10.307 9.785 9.979 10.593 10.884 11.503 11.114 11.081 11.413 10.506 10.254 9.321 8.613 9.242 10.015 10.647 11.799 12.486 11.796 10.918 10.417 11.028 12.460 11.346 9.604 7.984 7.774 7.963 8.292 10.061 12.054 11.538 10.715 8.846 9.345 8.484 + 10.757 10.295 10.560 11.827 12.001 12.113 12.561 12.271 12.555 12.167 10.974 11.482 10.474 11.195 11.167 12.031 12.642 12.991 12.686 11.747 11.228 12.190 13.080 12.316 10.952 8.790 8.898 8.211 9.906 11.613 13.028 12.355 11.605 10.033 9.288 8.174 + 10.281 9.100 10.232 11.222 12.285 12.965 13.236 13.753 12.768 12.271 12.575 11.615 10.788 11.348 11.412 12.415 13.290 14.097 14.018 12.863 12.396 13.243 14.264 13.283 11.169 8.591 8.597 8.974 9.875 11.909 13.560 12.526 12.136 10.483 9.328 8.356 + 11.104 11.242 11.309 10.124 12.588 13.943 14.875 14.895 13.999 13.444 11.904 11.784 11.553 11.286 11.761 12.353 13.508 15.121 15.529 13.493 13.263 13.843 15.277 14.489 11.926 10.530 9.230 9.216 10.769 12.540 14.060 12.708 12.530 10.648 9.462 8.787 + 10.882 11.110 11.729 10.203 12.476 14.015 15.461 16.054 15.482 14.347 11.767 11.846 12.003 11.344 11.989 11.813 12.922 14.118 15.817 15.879 14.647 14.365 15.467 15.420 13.636 11.529 9.895 9.336 11.147 12.493 13.235 12.167 10.648 9.423 10.317 10.040 + 12.574 12.781 13.092 11.953 13.042 14.174 15.513 15.701 16.304 15.400 13.176 11.840 12.365 11.578 12.429 12.057 13.013 13.832 15.818 17.005 15.773 15.140 15.710 15.843 15.038 11.756 10.259 9.846 12.921 13.933 14.045 12.941 11.786 10.404 11.299 11.540 + 12.826 12.874 13.086 11.275 12.552 13.629 14.693 15.927 16.304 14.473 12.141 12.801 12.204 12.000 12.559 12.185 13.017 13.329 14.794 16.216 16.655 15.217 15.089 15.764 15.048 13.211 11.136 10.923 12.059 13.695 14.394 12.561 10.736 9.789 8.967 9.513 + 12.818 12.488 12.979 10.866 11.038 12.710 14.040 15.944 15.849 13.740 12.467 12.977 11.885 11.540 11.997 11.513 12.218 11.996 12.987 15.209 16.368 15.706 15.205 15.791 15.936 13.799 11.874 11.140 12.014 13.329 14.008 12.955 11.144 8.613 7.055 7.556 + 12.782 12.212 12.860 10.666 11.452 12.212 13.772 15.917 15.482 13.337 12.879 13.010 10.860 11.237 11.086 11.046 11.092 10.967 11.476 13.371 15.283 15.389 14.956 15.663 15.943 13.878 11.310 10.494 11.742 13.021 13.916 13.256 11.592 9.541 7.600 7.886 + 12.908 12.353 12.796 11.014 11.344 12.602 13.821 15.589 14.943 13.155 13.071 12.992 10.809 10.772 11.005 10.961 10.730 10.588 10.861 11.953 14.192 15.543 15.079 15.415 15.723 13.886 10.795 10.134 9.367 11.839 12.862 12.615 11.663 9.590 6.971 6.009 + 13.092 12.761 12.403 11.187 10.949 12.147 13.211 14.242 13.485 11.800 13.096 12.464 10.940 10.167 10.675 10.880 10.580 10.607 9.713 9.234 11.649 14.003 14.604 14.495 14.677 12.891 9.791 9.307 9.177 10.361 11.207 11.483 11.604 9.858 8.078 7.150 + 13.113 12.413 11.404 11.119 10.751 11.401 12.590 11.891 11.316 12.100 12.324 11.312 10.795 8.998 9.959 9.841 9.965 9.944 9.693 9.878 9.188 9.639 11.978 11.987 12.115 10.661 8.385 7.680 7.961 9.035 10.359 11.289 11.784 10.709 9.082 7.640 + 12.214 10.506 9.935 10.505 9.601 10.854 11.237 12.250 12.073 10.210 11.646 11.094 10.325 9.061 9.162 9.647 9.412 9.932 10.121 9.952 10.153 10.262 10.870 10.353 9.468 8.249 6.568 6.169 6.881 6.512 8.582 10.132 10.342 10.022 9.409 7.183 + 10.741 11.345 10.524 9.622 9.178 9.424 9.928 10.565 10.167 7.869 9.687 10.129 9.847 7.378 7.469 8.411 8.333 9.365 9.892 9.147 9.919 10.394 10.492 9.451 8.813 8.113 6.716 5.679 5.921 6.255 7.128 9.762 9.961 8.874 9.108 8.666 + 7.018 9.348 10.038 9.962 8.202 8.241 8.666 8.626 7.844 8.076 7.490 7.714 6.940 5.492 5.264 6.188 6.734 8.305 8.025 7.067 8.589 9.744 9.488 9.178 9.239 7.803 6.823 5.707 6.459 7.139 6.771 10.280 10.713 9.364 10.214 10.357 + 7.952 7.502 7.870 9.398 8.175 8.137 7.820 8.938 8.353 6.797 5.871 7.033 5.968 3.882 3.753 4.768 5.063 6.999 6.798 6.781 8.088 9.415 8.602 7.503 8.327 8.009 6.807 6.762 6.476 8.140 7.866 7.391 6.777 5.427 5.164 4.641 + 5.225 7.026 7.769 9.077 8.238 7.534 7.280 7.068 6.402 5.625 7.292 6.966 6.216 5.511 4.402 3.857 3.762 5.385 6.628 6.967 8.934 9.702 8.151 7.068 8.487 8.732 7.481 6.385 6.847 8.633 8.045 6.819 5.812 4.769 4.942 3.791 + 5.416 7.858 7.946 7.855 7.020 8.233 7.355 5.661 6.275 5.878 6.628 6.323 5.256 5.054 5.898 5.110 4.764 5.756 5.632 7.258 9.022 9.573 7.174 7.087 9.431 9.239 7.346 6.512 6.817 8.810 7.868 6.820 5.795 4.451 4.579 3.750 + 6.515 8.489 8.542 9.033 8.174 8.075 7.246 6.561 6.646 5.884 5.142 5.962 5.637 5.509 5.418 5.062 5.074 6.006 6.639 7.913 8.521 9.238 7.896 7.264 8.408 8.134 7.572 6.171 6.858 9.277 9.217 7.042 5.263 4.254 4.329 3.230 + 6.308 7.539 6.980 9.929 9.457 8.702 8.102 6.770 6.204 5.678 5.442 5.038 4.535 5.940 5.210 4.194 5.503 6.608 7.173 9.336 9.452 8.297 7.215 6.584 8.769 9.122 6.879 5.920 6.337 8.809 8.287 6.840 4.737 3.998 4.365 3.958 + 6.487 7.639 7.992 10.287 9.702 7.625 7.024 5.407 5.083 6.526 6.769 5.461 4.860 4.233 5.854 6.087 5.367 4.964 6.947 8.398 9.374 8.024 6.977 6.456 9.212 8.928 5.766 5.100 5.674 8.506 8.116 6.303 5.066 4.124 3.927 3.663 + 6.537 7.791 7.259 9.691 9.852 7.402 5.743 6.088 5.853 5.582 5.582 5.466 4.278 4.486 4.999 5.477 5.678 6.267 7.127 7.747 7.952 7.801 6.561 6.334 7.253 7.488 6.640 5.254 5.142 7.179 7.402 5.429 4.554 3.978 3.819 3.931 + 5.630 6.488 7.364 9.647 8.997 8.624 6.550 6.276 6.615 5.753 5.019 4.984 5.299 5.132 5.205 5.351 5.263 6.431 7.532 7.516 7.979 7.697 6.814 6.722 7.906 7.092 5.989 5.431 6.662 7.778 7.373 5.303 4.607 3.748 3.962 4.251 + 6.486 7.982 7.964 8.719 8.178 8.549 6.899 7.111 7.202 6.019 6.393 6.473 6.296 5.374 5.293 6.116 6.441 7.031 9.228 8.730 8.707 8.253 6.250 6.535 8.544 7.875 6.140 5.556 6.159 8.201 6.949 4.830 5.199 4.171 4.602 3.436 + 6.543 8.645 7.771 6.538 7.260 7.481 6.995 7.971 6.363 6.393 7.873 7.337 5.855 6.367 7.093 5.971 6.058 9.147 9.737 8.300 7.934 8.258 7.636 7.457 8.111 8.939 9.318 8.077 8.197 8.169 7.020 6.443 6.264 5.659 5.191 4.875 + 7.131 8.582 7.806 7.736 7.795 8.618 8.540 8.923 6.692 7.140 6.967 7.699 5.436 6.496 6.262 6.887 7.220 7.974 9.572 8.846 7.684 8.058 7.552 7.482 7.818 8.816 9.382 8.086 7.866 8.085 6.997 6.324 5.747 6.188 5.278 5.165 + 7.114 8.236 8.254 9.698 9.682 9.975 8.989 8.312 6.769 7.887 8.157 7.975 6.252 6.539 5.513 7.153 6.771 8.233 8.439 8.280 8.078 7.717 6.528 6.477 7.477 7.514 7.076 6.271 8.247 8.202 6.994 5.299 4.964 6.128 5.425 4.920 + 7.458 8.074 8.709 10.624 10.710 11.062 9.167 8.277 7.724 8.785 8.507 8.089 5.547 7.226 6.429 7.647 7.839 9.965 9.311 8.983 8.602 7.349 6.354 7.607 7.593 8.479 7.480 6.714 7.623 7.180 6.379 4.658 4.312 5.908 5.101 4.867 + 6.448 7.415 9.005 10.762 11.199 11.556 8.592 7.743 8.209 8.125 8.205 8.137 5.751 6.336 6.198 6.896 9.716 10.963 10.111 8.414 8.093 7.622 7.131 6.255 6.290 7.239 7.301 7.036 7.136 6.858 6.435 4.211 4.418 4.801 3.767 3.714 + 6.268 7.124 8.729 10.166 11.818 12.079 8.432 7.227 7.765 7.239 7.546 7.172 7.034 6.707 6.791 8.575 9.728 10.319 9.354 9.774 8.287 9.493 8.445 6.160 7.293 7.943 6.840 6.237 6.502 7.144 7.587 4.836 5.190 6.279 4.649 3.504 + 6.060 6.316 7.262 8.305 12.149 12.259 8.923 8.234 8.127 8.757 8.248 6.417 7.647 7.982 7.357 9.715 9.823 9.696 8.919 8.589 8.635 8.400 7.419 7.225 7.614 7.895 6.855 5.816 6.758 6.846 7.566 6.352 5.890 5.974 4.713 4.059 + 6.238 5.614 7.007 8.471 11.944 11.872 8.528 8.066 8.062 8.956 9.315 8.720 8.723 8.096 6.922 8.324 8.153 8.646 8.232 8.262 8.178 8.322 7.870 7.148 6.816 6.800 6.321 5.954 7.350 7.502 7.192 7.080 6.139 6.365 4.504 4.657 + 6.599 7.020 8.673 9.675 10.651 10.859 7.818 7.576 7.318 7.446 9.133 8.520 8.216 7.141 6.814 7.467 7.748 7.985 7.707 7.481 8.554 8.886 8.468 7.952 7.880 7.604 6.743 7.006 6.690 7.509 8.048 8.464 8.097 6.009 5.143 4.304 + 7.348 7.733 8.994 9.671 10.269 10.726 8.577 7.489 8.348 9.510 9.513 8.615 7.013 5.333 6.305 7.175 6.862 7.229 8.280 7.439 9.440 10.320 8.955 7.976 7.914 6.716 6.861 7.207 7.236 7.949 7.278 7.566 7.831 6.803 5.195 3.829 + 7.051 7.448 8.952 9.537 10.573 9.848 9.251 7.597 8.550 9.064 9.449 10.123 8.321 6.099 6.344 6.712 7.192 8.111 7.847 7.545 9.585 9.902 8.681 7.803 7.942 7.312 6.300 6.668 7.242 7.183 6.951 7.171 7.325 6.734 5.830 4.132 + 6.751 6.952 9.265 9.875 9.541 9.345 9.400 7.775 8.660 8.542 9.445 10.262 6.987 6.385 7.467 7.585 7.207 7.756 7.337 7.396 8.360 9.570 8.214 8.718 8.444 7.890 7.212 7.758 7.298 6.885 7.173 8.025 8.037 6.838 6.169 4.338 + 6.302 6.710 9.082 9.984 10.349 9.727 8.891 6.493 7.855 8.108 9.384 10.801 9.120 6.911 6.339 7.247 7.129 6.950 6.719 7.445 9.451 10.576 8.768 8.711 8.749 8.229 7.542 7.411 6.915 7.161 6.871 7.495 7.684 6.208 5.894 4.661 + 6.017 6.445 8.412 9.585 10.674 10.070 10.017 8.204 8.487 8.241 8.265 10.410 9.865 8.200 7.196 6.458 7.091 7.169 7.746 7.001 9.647 10.296 9.074 8.690 9.045 8.288 7.265 7.693 7.374 7.637 7.287 7.097 7.351 5.701 5.473 4.627 + 6.577 6.352 7.819 8.504 8.058 9.371 10.043 8.633 9.040 9.224 7.977 8.211 9.845 9.553 8.807 7.868 7.274 7.519 7.429 8.046 9.834 9.382 8.086 8.090 8.587 7.131 7.426 7.040 7.481 6.636 6.706 7.348 7.048 5.815 5.565 4.730 + 6.590 6.579 7.440 7.735 8.614 8.191 7.755 9.059 9.885 8.531 7.418 7.308 7.993 8.447 9.776 8.713 8.118 7.706 7.994 8.544 9.316 9.347 8.987 8.472 8.556 8.218 7.444 8.093 7.359 6.605 6.522 6.866 7.160 5.387 4.743 4.488 + 6.762 6.869 6.527 7.459 8.770 8.379 8.585 7.953 9.063 8.523 7.109 8.289 7.761 8.353 10.329 9.612 8.455 6.771 8.046 8.318 9.348 9.638 9.101 7.637 8.509 7.497 6.329 7.463 7.406 6.853 7.688 5.567 6.954 6.200 5.365 4.728 + 6.018 5.668 6.323 5.711 5.977 6.808 8.520 9.786 9.745 7.959 5.488 6.680 6.531 8.068 9.771 9.658 8.335 7.237 7.723 8.730 9.671 10.178 8.344 7.395 9.032 8.458 7.653 7.622 7.415 6.423 7.565 7.025 6.600 5.285 4.308 4.058 + 3.577 5.326 6.960 6.456 6.832 6.923 6.855 8.739 8.880 6.670 4.813 6.630 6.228 5.474 6.873 9.010 7.639 7.302 7.006 8.737 9.615 9.518 7.443 7.827 8.759 7.899 6.935 6.391 6.684 6.900 7.355 7.165 7.148 5.278 4.565 4.417 + 4.990 5.107 6.291 5.160 5.870 5.409 5.954 7.560 6.820 6.996 5.461 6.625 5.750 6.093 7.679 7.832 7.569 6.883 6.777 8.688 9.943 9.856 8.257 7.858 7.673 6.930 7.120 6.420 6.726 6.857 8.308 7.434 7.224 6.549 5.241 4.863 + 5.173 5.081 6.605 6.118 4.480 4.845 5.027 7.455 7.749 5.914 4.835 4.797 4.650 5.466 5.962 7.288 6.668 7.394 6.426 7.701 8.422 8.699 8.341 7.360 7.096 6.702 6.863 7.238 6.472 7.037 8.110 7.048 8.025 7.185 6.241 6.029 + 6.026 5.559 5.293 5.767 5.624 7.350 7.332 7.599 7.895 6.638 5.576 6.685 6.255 4.563 6.340 7.979 6.351 5.449 6.810 7.744 9.559 10.480 8.006 6.711 8.732 7.366 7.271 8.975 7.759 7.182 8.702 8.148 8.021 6.784 6.072 5.384 + 5.793 5.213 5.300 4.622 5.573 6.971 6.963 7.743 9.529 7.700 6.253 6.688 6.378 5.088 6.433 8.714 8.178 7.032 7.037 7.465 9.875 10.951 8.790 6.248 8.123 8.432 7.235 7.846 7.246 8.211 8.471 8.244 8.544 6.781 6.955 5.557 + 5.387 5.421 5.461 4.972 5.253 5.207 7.834 9.182 10.064 8.394 7.067 7.234 7.085 6.033 6.409 8.930 8.802 7.607 7.093 7.317 8.103 8.946 8.683 7.159 8.098 7.944 7.667 8.173 7.590 8.801 8.740 8.513 8.088 7.197 6.402 6.147 + 4.738 4.223 4.274 4.390 4.086 5.370 7.656 9.668 10.918 9.369 7.538 8.284 7.992 6.422 6.292 8.172 7.533 7.543 7.465 6.813 8.275 8.804 7.819 6.634 7.733 7.947 7.968 8.933 7.969 7.814 8.700 8.246 7.726 7.473 6.250 5.789 + 3.711 4.695 5.543 4.487 5.229 6.872 7.625 9.438 11.129 9.615 7.108 8.579 8.515 7.214 6.916 8.302 7.713 7.194 7.777 7.231 9.325 9.110 7.670 6.355 6.745 8.622 7.230 7.943 8.445 8.368 7.106 8.296 9.230 7.415 6.421 5.690 + 3.810 5.008 6.327 5.697 5.559 6.295 7.163 9.121 10.799 9.291 8.097 8.260 8.473 7.403 6.613 6.509 7.299 8.391 9.126 8.347 8.376 8.746 6.907 7.059 7.823 7.730 7.612 7.750 8.373 8.583 8.588 8.630 9.116 7.807 6.729 6.085 + 5.154 5.646 6.460 5.637 4.575 7.069 6.985 8.519 9.995 8.827 7.976 7.554 5.653 6.468 5.208 6.280 7.883 8.593 8.803 8.856 8.662 7.535 5.904 6.798 7.721 7.809 8.105 8.699 7.720 8.086 8.613 8.321 8.525 7.418 6.831 5.766 + 6.631 6.547 6.877 6.408 4.751 6.920 7.289 7.928 8.494 7.519 7.823 6.189 6.342 5.287 5.762 5.164 8.034 8.783 7.999 8.730 10.418 9.469 6.662 5.773 7.891 7.968 7.260 7.918 8.157 8.610 8.713 8.249 8.866 7.549 6.608 5.813 + 6.993 6.917 6.942 5.913 4.339 5.194 6.302 6.814 7.908 7.128 6.397 5.181 5.775 5.795 4.986 5.308 6.858 7.409 8.793 9.595 8.658 8.337 8.402 7.111 7.247 7.655 7.236 8.135 8.200 8.259 9.629 8.687 8.827 7.694 6.628 5.942 + 6.551 6.909 6.549 6.345 5.735 5.518 7.988 9.515 9.274 7.654 6.814 6.629 6.387 6.024 3.380 4.977 6.287 7.845 8.734 8.871 8.944 7.395 6.518 6.758 7.158 7.883 7.704 7.402 7.044 8.029 9.056 8.932 8.707 7.686 6.772 6.424 + 4.835 6.164 5.651 4.569 5.531 5.702 6.819 8.800 8.615 6.606 4.775 5.938 6.073 4.566 3.598 5.358 5.829 6.922 7.364 8.854 9.481 8.432 6.570 7.520 6.340 7.375 7.848 7.236 6.870 7.753 9.028 8.733 8.370 7.196 7.530 6.469 + 3.974 3.754 3.661 2.876 4.077 4.569 4.574 5.030 6.337 5.439 5.190 4.470 5.214 2.830 3.571 4.853 5.495 6.575 6.245 8.006 8.845 8.857 7.477 7.089 7.247 7.478 6.874 7.798 7.670 7.817 8.864 7.435 8.786 7.535 6.875 6.098 + 2.452 3.571 3.613 4.119 3.794 4.014 5.711 7.024 6.095 4.721 3.970 4.190 3.784 4.194 4.304 5.496 6.057 6.843 6.758 8.686 8.433 9.030 7.666 7.592 7.598 6.581 6.375 6.801 6.458 7.340 8.578 7.559 7.717 6.974 6.116 5.846 + 3.811 3.466 3.858 3.833 3.790 3.427 5.528 7.252 5.904 2.599 3.214 2.895 3.359 4.857 5.077 5.355 6.151 6.182 7.150 8.216 9.172 9.055 6.658 7.006 6.602 6.413 6.446 6.777 7.004 7.282 8.317 8.678 7.874 7.352 6.910 7.118 + 2.599 3.411 4.006 2.802 2.765 4.506 5.446 6.360 4.688 4.125 3.918 4.799 3.502 3.933 5.319 5.533 5.571 6.336 6.583 6.468 8.017 7.466 7.321 6.789 6.357 5.828 6.445 7.914 8.119 7.995 8.455 7.835 7.630 7.754 7.733 6.764 + 1.555 2.633 2.008 2.094 2.997 4.145 6.022 7.464 6.675 4.465 3.559 4.086 3.275 4.137 4.155 4.558 5.223 5.559 6.606 6.550 8.073 6.911 6.075 5.345 6.970 6.378 5.823 7.680 8.371 7.951 8.109 8.325 8.184 7.710 7.181 6.680 + 3.880 4.275 3.327 3.452 3.819 3.607 3.604 6.657 6.419 3.659 3.680 4.560 3.688 5.089 4.874 3.846 4.595 4.023 5.490 7.190 8.325 7.344 5.707 6.553 7.279 5.835 5.798 7.276 8.111 8.517 8.075 8.415 8.199 7.938 7.474 7.866 + 2.864 3.928 3.073 2.256 1.281 3.850 4.965 5.016 5.039 3.298 2.588 3.589 3.440 4.572 4.997 3.533 2.728 4.371 5.029 5.349 6.528 6.577 6.497 6.415 6.098 6.017 6.437 7.370 7.655 7.590 8.426 8.058 8.306 7.184 7.303 6.878 + 3.502 3.801 2.052 1.776 2.494 4.299 4.806 4.054 5.591 4.254 3.150 4.117 3.587 3.772 4.067 4.385 4.317 4.756 5.275 7.841 9.260 8.337 6.797 6.713 7.517 7.056 6.485 7.298 7.369 7.561 8.690 8.148 7.855 7.626 7.468 6.780 + 3.287 4.381 3.868 2.990 0.262 4.514 5.840 5.009 5.641 4.996 4.568 4.216 2.468 3.578 4.446 4.258 4.010 5.661 6.418 8.337 9.448 8.452 6.753 6.471 7.124 5.664 6.744 7.118 7.851 8.242 8.735 7.850 8.017 7.259 7.985 7.718 + 0.521 2.868 3.944 3.401 2.696 3.609 4.237 5.121 5.580 3.510 5.096 4.972 4.030 4.631 4.470 4.060 5.118 5.163 5.679 7.334 9.283 8.163 5.887 6.880 5.712 6.073 6.112 6.748 7.300 7.797 8.639 7.552 7.720 7.218 6.772 5.886 + 2.192 2.855 2.142 1.545 2.855 4.259 4.861 5.265 4.130 4.410 4.618 3.992 4.987 4.820 3.696 4.102 4.876 5.749 5.546 7.584 8.900 7.512 5.052 6.327 6.941 6.593 5.842 6.635 7.398 8.613 7.118 7.980 8.207 6.544 6.383 5.561 + 2.469 2.462 0.979 1.804 3.879 4.835 5.440 3.279 4.392 4.302 3.972 3.952 3.687 2.986 3.534 4.788 5.161 5.019 5.575 7.861 8.868 6.640 6.408 7.072 7.550 5.895 5.824 6.969 7.907 7.325 7.426 7.277 7.078 6.866 6.259 5.847 + 3.302 3.793 3.922 4.023 5.178 6.135 5.920 4.386 6.607 6.550 4.645 2.807 3.893 4.012 4.976 4.124 5.265 4.678 6.148 7.507 9.369 7.148 6.390 6.789 5.620 5.021 6.155 6.393 6.626 6.844 8.140 6.653 6.316 6.195 6.079 4.775 + 6.620 6.848 5.388 6.431 8.316 8.981 8.781 6.674 6.575 5.636 6.417 5.356 5.653 6.024 5.842 5.058 7.801 7.891 7.595 6.979 9.038 7.777 6.548 6.753 5.474 5.946 6.261 6.840 7.385 6.710 8.031 7.570 6.365 5.954 6.261 5.786 + 6.300 7.401 6.999 5.872 9.258 9.608 10.040 9.191 8.232 7.341 7.656 7.942 7.481 6.935 7.959 7.634 10.007 9.456 7.114 6.462 8.024 6.971 6.584 6.201 5.663 6.632 6.424 7.416 6.972 6.702 8.654 8.086 6.830 6.490 7.287 6.312 + 5.350 6.420 6.162 6.247 9.344 9.619 9.435 10.412 10.695 9.433 8.936 7.968 6.940 8.125 8.780 7.833 10.054 10.072 8.693 8.845 9.161 7.957 5.702 6.601 5.718 5.316 6.108 6.601 7.528 6.446 8.363 7.360 6.504 6.594 6.530 5.436 + 5.606 6.542 5.871 6.817 9.675 10.917 10.231 10.919 11.297 9.145 8.555 6.906 5.969 7.959 8.500 8.921 9.818 9.286 8.268 8.091 8.138 8.238 7.157 6.482 7.048 6.078 6.617 6.430 8.248 7.181 7.516 6.738 5.715 5.486 6.022 5.477 + 6.806 7.809 7.692 6.842 9.182 10.591 10.750 11.294 10.491 9.905 8.276 7.453 7.863 8.484 9.187 9.082 9.819 9.034 8.221 7.948 7.837 6.718 7.394 6.122 6.686 7.049 6.168 6.822 7.819 6.780 6.796 6.465 6.234 5.055 6.122 5.599 + 7.189 7.913 7.354 6.317 8.903 10.177 10.445 10.721 10.525 9.262 8.292 7.582 8.240 8.148 9.038 9.333 10.126 9.455 8.310 8.612 9.182 8.595 8.554 7.322 7.383 7.650 7.432 7.400 7.835 7.823 7.416 7.416 7.251 6.510 6.068 5.295 + 5.807 6.979 8.097 7.075 10.433 11.762 11.433 11.124 9.586 9.018 9.217 8.179 7.422 9.403 9.009 8.569 10.647 10.271 8.049 8.277 9.070 8.042 7.366 6.903 8.478 8.596 7.537 7.375 7.663 7.104 7.171 6.481 7.078 6.729 6.052 5.292 + 4.466 7.261 8.502 8.098 11.204 12.128 11.088 11.369 10.263 8.717 9.207 7.785 6.710 8.647 9.590 9.752 9.534 10.478 9.342 9.250 9.483 7.642 6.280 6.384 8.011 7.751 7.450 7.794 7.835 7.653 7.942 7.486 6.606 5.925 6.075 5.665 + 7.013 7.732 8.383 7.765 10.680 10.969 10.841 10.736 10.261 9.103 7.211 7.455 7.203 7.367 8.274 9.617 9.586 9.781 9.240 8.926 9.633 7.951 7.194 7.808 8.000 8.403 7.418 7.902 8.271 7.426 7.987 6.744 6.548 5.596 5.781 4.705 + 7.637 7.820 8.591 8.810 10.680 11.141 10.413 9.547 9.139 8.354 7.955 7.062 6.480 7.424 8.077 9.589 10.564 9.899 8.936 8.786 8.658 9.323 8.203 7.781 8.427 8.205 7.940 7.474 7.650 7.645 7.603 6.800 6.424 5.532 5.043 4.378 + 8.472 8.699 8.647 9.489 10.599 10.557 9.991 10.418 9.269 7.378 6.560 6.375 4.886 4.894 7.203 8.280 7.943 9.360 9.548 9.400 9.100 9.665 8.704 9.063 9.454 9.584 8.968 8.576 8.164 8.697 7.956 7.022 6.271 5.387 5.090 4.545 + 8.478 8.381 7.530 7.162 9.722 9.820 9.111 10.330 8.803 6.920 6.427 5.864 5.368 7.134 7.168 7.633 7.772 8.562 8.662 8.351 8.704 8.261 7.562 7.511 8.445 9.350 9.006 9.516 8.480 8.744 8.007 6.839 5.881 5.426 4.886 3.990 + 8.352 8.154 8.134 9.183 9.769 10.307 9.772 9.735 8.514 6.678 5.814 5.147 4.183 5.209 5.400 6.681 7.675 8.403 7.225 8.311 8.419 7.820 8.002 7.140 7.373 8.094 7.108 6.735 6.417 6.159 6.003 5.661 5.196 5.202 5.191 3.818 + 7.660 7.333 5.270 5.637 6.006 7.714 6.919 6.528 6.239 5.634 5.242 4.013 3.990 3.506 5.701 7.198 7.576 7.293 6.516 6.894 7.109 6.774 6.298 5.555 6.368 6.556 6.059 6.322 5.623 5.724 6.359 5.316 4.719 4.052 4.114 3.405 + 6.697 6.556 6.089 6.228 6.828 8.129 7.922 8.527 8.345 6.616 4.576 4.911 5.467 3.375 5.677 6.678 7.275 7.493 6.389 7.485 7.076 6.423 5.997 4.857 6.042 5.487 4.836 5.216 5.100 5.137 5.624 5.211 5.118 4.440 3.901 3.404 + 3.987 5.145 6.106 6.062 6.817 7.338 6.855 6.930 6.870 4.489 4.493 5.627 4.550 4.578 3.614 6.947 8.173 7.357 6.572 5.703 6.494 5.275 4.844 6.027 6.489 5.797 4.668 4.406 5.393 5.184 6.062 5.056 4.780 4.045 3.321 2.621 + 4.879 4.103 5.660 6.292 5.792 6.056 5.990 7.657 6.830 4.790 5.277 5.391 4.376 4.833 5.450 6.693 7.100 8.377 8.031 8.024 8.342 6.865 5.734 7.030 6.895 6.021 5.028 5.738 6.107 6.405 5.305 5.197 5.517 6.883 6.316 4.425 + 3.999 4.464 6.018 6.971 8.196 8.267 6.847 7.430 6.527 4.932 5.846 5.236 4.463 5.391 5.190 4.821 6.314 8.403 8.378 9.271 8.736 7.634 6.094 5.607 6.293 5.754 5.941 5.406 6.244 7.011 6.033 5.577 5.914 7.678 8.234 6.431 + 4.211 4.316 5.349 7.834 7.765 7.758 7.450 6.625 6.498 5.128 6.410 6.472 5.673 4.851 4.564 6.452 6.947 7.534 7.528 8.110 7.419 6.173 6.420 6.279 8.555 8.261 7.623 7.925 6.684 6.438 5.888 5.935 5.938 6.959 7.486 6.266 + 6.011 5.816 3.453 8.058 9.003 7.785 6.627 5.125 6.295 4.316 4.146 4.623 4.472 3.349 5.041 5.957 6.193 7.698 7.516 8.071 7.899 8.138 6.731 6.838 7.902 8.681 9.187 9.457 7.936 6.811 6.843 6.678 6.722 6.590 5.863 4.951 + 6.713 6.950 5.081 8.762 10.482 9.910 7.032 8.227 7.893 5.390 5.053 5.681 4.994 4.034 5.450 6.257 6.947 8.063 8.194 7.773 8.566 9.298 7.456 6.418 8.456 8.883 10.432 10.861 9.377 8.288 7.601 6.736 7.104 7.517 6.007 4.223 + 7.371 7.406 5.265 6.510 8.983 8.528 7.347 8.529 7.157 5.589 4.643 4.222 4.652 4.750 4.650 5.072 5.384 7.654 8.497 8.696 9.405 9.838 6.583 7.267 8.884 9.217 10.769 10.702 9.307 8.732 7.439 7.363 7.583 7.711 5.948 4.748 + 7.840 7.439 5.518 8.069 9.109 9.071 8.374 9.217 7.254 4.472 4.395 3.396 3.388 5.007 4.243 5.374 5.524 6.423 7.117 7.751 9.749 9.446 7.002 6.351 8.723 9.140 10.226 9.878 8.794 8.405 8.178 7.793 6.947 7.282 5.183 4.242 + 6.733 6.625 4.712 8.327 8.804 8.732 9.073 9.160 6.050 4.496 4.210 4.270 3.781 4.573 5.358 5.321 5.543 6.117 8.070 8.050 9.254 9.021 8.163 7.486 8.145 8.534 10.346 10.656 9.205 9.021 8.303 7.518 7.477 7.441 6.165 3.397 + 5.110 4.826 5.851 8.683 9.433 8.450 8.912 8.928 6.950 5.810 4.343 4.049 3.728 5.025 5.753 5.750 5.898 7.556 8.253 7.807 8.825 8.766 8.366 7.855 7.775 8.472 10.407 10.647 9.602 9.307 8.620 8.256 6.742 6.434 5.878 3.899 + 2.383 4.895 5.940 9.055 9.671 7.753 9.665 10.377 7.795 6.988 6.160 4.282 4.629 5.300 4.779 5.270 5.699 6.193 7.832 8.198 10.113 9.128 8.090 7.379 8.475 8.921 9.532 9.477 8.936 9.115 8.683 7.691 7.511 7.206 6.040 3.418 + 4.487 3.711 5.629 7.121 8.011 6.986 9.175 9.564 6.094 6.504 4.956 3.738 3.805 4.386 3.748 3.985 5.934 6.736 7.019 8.178 8.983 7.315 7.400 6.454 7.664 6.945 9.194 8.302 6.632 6.782 8.160 7.282 6.517 5.235 4.872 3.868 + 5.023 5.069 7.054 8.826 8.159 6.923 7.598 8.337 6.646 5.360 5.954 5.055 4.470 5.014 4.451 5.151 5.202 7.051 7.260 7.770 7.432 6.530 5.733 4.879 5.368 5.625 7.151 7.243 5.522 5.812 7.379 7.516 6.392 5.339 4.304 3.890 + 4.508 5.301 7.759 9.064 8.247 7.870 8.154 8.040 5.651 5.334 4.350 4.017 4.710 4.357 5.069 5.684 4.977 7.353 7.135 8.129 7.983 6.449 5.139 4.708 5.912 5.466 6.319 6.129 6.091 6.234 6.143 6.871 6.213 5.433 3.362 3.057 + 4.489 6.596 7.350 9.070 9.013 7.581 6.255 6.648 5.089 4.900 3.528 3.787 4.249 5.263 4.303 4.485 5.474 6.490 7.340 8.230 7.636 6.013 5.099 5.262 6.464 5.295 6.719 6.679 6.078 6.019 6.359 6.205 4.843 4.577 4.098 2.725 + 4.178 4.235 6.580 7.071 8.258 8.227 6.392 5.730 5.290 3.818 4.312 3.362 3.470 4.848 3.454 4.792 4.994 4.784 5.520 7.751 6.928 5.405 4.979 3.347 5.371 4.907 7.229 6.369 5.237 5.078 5.386 5.377 4.641 3.247 2.816 1.996 + 5.402 5.560 5.574 6.656 8.186 7.861 7.693 4.584 5.246 5.106 4.670 3.975 2.839 4.345 4.316 4.404 5.447 6.126 6.758 6.274 6.167 4.706 4.267 3.438 5.528 5.412 5.416 5.486 4.534 5.012 4.691 4.319 4.280 4.352 3.016 1.678 + 3.088 5.177 6.784 6.456 7.564 8.485 7.277 5.731 5.074 4.688 4.721 2.128 2.577 4.714 4.395 3.937 4.820 6.144 7.095 7.104 7.120 5.685 4.870 4.943 4.957 5.210 6.164 6.320 5.152 5.582 5.967 5.075 4.933 4.461 3.615 2.137 + 3.732 5.017 5.986 7.188 8.097 7.628 6.659 5.250 4.532 4.850 3.496 3.835 2.794 3.396 3.495 3.506 3.586 4.924 5.845 6.413 5.951 4.911 4.789 5.195 5.123 5.700 6.095 5.218 5.275 5.055 4.832 4.665 5.256 5.016 2.941 1.574 + 3.800 3.804 4.429 6.559 6.237 6.365 5.695 5.601 4.951 4.237 3.766 2.848 3.249 2.617 2.843 3.143 4.609 4.898 5.448 6.292 5.024 5.102 5.649 5.060 4.183 4.265 3.990 4.120 5.018 4.750 4.165 4.672 4.644 3.596 2.897 1.565 + 3.969 3.227 3.894 6.817 6.591 4.941 5.253 4.895 4.671 4.276 2.671 3.228 2.790 2.827 3.360 2.926 2.250 4.355 5.863 6.635 6.086 4.225 4.747 4.613 3.858 4.272 4.796 4.707 4.387 4.256 3.699 4.166 4.621 4.778 2.581 1.330 + 3.330 5.393 5.442 5.569 6.095 5.126 5.008 5.175 4.377 4.199 2.237 1.061 2.010 3.090 4.069 4.586 4.791 6.676 6.591 6.526 5.334 3.868 4.222 3.791 3.789 5.380 5.183 5.178 5.834 5.722 4.650 4.771 4.865 3.964 2.485 1.996 + 3.059 3.852 4.617 5.427 5.199 5.020 5.836 5.025 3.346 2.186 2.451 3.631 3.127 4.458 4.579 3.924 4.906 7.192 7.271 7.950 6.459 4.343 3.988 3.742 5.598 6.283 4.970 4.934 5.570 5.680 4.924 4.812 4.462 4.093 2.949 1.773 + 1.159 3.774 5.794 6.690 5.463 3.222 4.714 6.024 5.347 3.858 3.812 3.623 3.558 2.551 3.809 3.714 5.133 6.061 5.540 5.880 4.575 4.585 4.136 4.044 4.439 4.828 4.313 4.899 4.912 5.092 5.092 4.802 3.198 2.561 2.660 1.333 + 3.380 4.206 5.277 5.985 5.288 4.289 5.155 5.562 5.903 5.964 4.362 3.311 4.190 3.831 4.064 4.204 6.918 6.945 4.728 5.387 5.512 4.043 3.223 4.299 4.439 5.714 4.876 5.396 5.050 5.761 4.634 4.053 4.057 2.322 1.859 1.482 + 4.260 3.089 4.650 5.862 5.120 4.071 5.938 7.737 7.699 6.499 6.191 5.465 4.569 3.381 3.701 4.808 7.609 7.521 5.604 6.064 6.274 4.772 4.515 5.658 5.176 5.118 4.439 4.429 5.034 5.431 4.398 3.480 3.584 2.170 1.932 1.076 + 4.712 3.418 2.542 6.134 6.316 3.584 5.778 6.488 7.895 7.487 5.477 5.227 3.878 5.804 6.335 6.287 9.035 8.381 5.689 6.416 5.306 4.736 3.662 3.386 5.191 5.389 4.409 4.672 5.243 6.245 5.134 3.591 3.416 2.265 1.980 1.166 + 5.279 3.843 3.158 5.666 5.407 4.644 6.301 5.284 7.497 8.404 6.131 4.520 4.269 5.767 5.713 6.006 9.654 9.355 7.742 6.969 5.678 4.713 4.836 3.820 6.640 7.738 6.199 5.461 7.013 7.990 7.132 4.460 3.962 4.725 2.640 0.928 + 5.979 5.163 3.501 4.394 5.608 5.041 7.141 7.173 6.942 7.992 5.462 5.668 5.408 4.732 6.099 6.643 10.166 10.282 8.039 6.990 5.542 5.355 4.982 4.769 6.640 8.071 6.702 5.586 7.367 8.781 8.171 5.075 4.425 5.477 3.158 0.742 + 6.282 5.845 5.300 6.042 6.202 5.367 8.614 9.179 8.143 8.543 5.827 5.022 4.752 6.780 7.036 7.373 7.947 9.486 8.141 7.483 6.596 5.278 4.929 5.775 7.370 7.030 6.286 5.893 6.245 7.671 7.306 5.778 5.599 5.748 3.034 1.094 + 6.120 5.374 4.916 7.191 6.491 5.435 8.042 8.143 7.852 7.854 4.631 3.275 4.310 4.929 4.710 4.234 7.602 8.347 7.335 6.593 5.671 4.498 4.506 5.454 6.337 5.407 5.134 4.341 4.992 5.669 5.689 5.060 4.299 3.483 1.512 0.547 + 5.726 5.561 6.502 8.525 7.869 5.841 6.947 7.244 6.810 6.494 3.815 3.502 3.124 4.489 3.847 5.173 5.426 7.344 6.614 6.577 5.327 4.393 2.876 4.587 4.383 4.600 4.397 3.122 3.791 5.491 5.398 5.049 3.386 2.047 1.627 0.530 + 2.854 2.309 6.396 7.724 6.901 6.454 7.236 6.779 6.506 7.070 3.801 3.941 3.628 3.526 3.027 4.198 4.654 6.137 4.869 4.389 3.519 4.247 2.715 3.563 3.439 4.201 3.525 2.934 2.304 4.206 4.344 3.818 3.318 2.023 1.560 0.146 + 0.867 2.024 3.627 4.259 3.769 4.742 5.053 5.079 5.385 6.149 3.873 3.239 2.892 2.720 2.601 4.093 5.323 7.044 4.874 3.598 4.245 3.888 3.355 3.825 3.722 4.118 2.409 2.584 2.071 2.829 4.224 3.525 2.733 2.494 1.325 0.889 + 3.861 3.179 4.136 4.648 3.493 3.550 5.569 4.883 3.791 5.203 3.821 2.761 3.307 3.876 3.487 3.144 5.097 6.448 4.405 3.206 3.147 2.910 3.326 4.100 4.894 3.586 2.517 2.612 2.617 2.893 3.409 3.245 3.077 3.041 2.650 1.825 + 4.263 3.467 3.997 5.477 5.244 3.240 5.092 4.027 3.865 4.692 2.092 2.058 2.572 4.081 3.691 3.396 4.817 5.102 4.826 4.497 3.232 3.197 4.302 4.262 4.296 4.620 5.098 5.572 6.018 5.829 5.909 5.250 4.232 4.793 4.884 3.575 + 2.836 3.705 3.338 5.802 5.665 2.094 4.645 4.389 3.796 4.223 2.533 1.341 2.800 4.079 3.807 2.698 3.250 3.145 4.015 3.514 3.110 3.192 3.303 3.287 4.102 3.610 3.979 3.907 4.381 3.908 4.140 4.062 3.026 3.673 4.227 3.064 + 2.658 1.919 2.365 5.437 5.465 2.908 4.192 3.147 2.050 3.024 2.245 2.292 2.502 3.634 3.247 3.126 2.953 3.251 4.357 2.362 2.798 3.538 4.138 2.627 4.501 3.937 3.289 3.597 3.448 3.302 3.647 3.609 2.388 3.207 3.485 2.608 + 3.739 2.769 3.110 4.253 4.832 3.296 4.800 4.423 2.263 2.476 2.409 2.189 1.745 3.810 3.625 2.969 3.598 4.159 4.379 3.744 3.413 4.215 3.509 3.313 4.284 4.429 4.833 4.187 3.286 3.980 4.374 3.950 3.179 2.970 3.196 2.397 + 4.837 3.957 4.511 6.507 5.878 5.289 5.365 3.018 2.881 2.704 3.176 2.860 2.516 2.441 1.355 3.961 3.600 3.692 4.782 3.803 3.774 4.726 4.215 4.165 4.558 5.025 5.661 4.262 4.130 4.797 6.063 4.439 2.568 3.249 3.784 2.795 + 3.901 2.797 3.480 6.470 6.080 4.138 3.925 2.851 2.509 2.225 3.115 2.400 2.760 2.852 2.748 3.888 5.217 5.219 4.517 4.658 5.903 5.486 4.388 4.351 4.895 5.158 4.590 3.614 3.600 4.853 5.862 4.576 2.339 3.086 3.491 2.644 + 0.752 1.925 2.398 5.998 6.008 3.855 4.657 3.978 3.393 3.842 4.986 4.332 2.879 4.241 3.844 3.255 3.254 4.874 4.913 5.008 5.992 6.388 4.641 4.868 5.089 5.979 4.814 3.518 2.968 4.127 4.572 3.049 2.885 2.841 3.408 3.095 + 1.829 2.844 3.118 5.162 5.680 3.975 3.655 2.777 4.122 4.332 4.935 4.834 4.595 4.581 3.444 3.928 5.059 5.142 5.020 4.979 6.143 6.556 5.050 5.143 5.833 6.410 5.470 5.409 3.708 3.935 4.978 3.575 1.586 2.324 3.248 3.313 + 3.392 3.194 2.216 5.400 4.965 3.089 3.382 2.730 5.540 6.120 5.329 5.306 4.725 5.879 4.404 3.987 4.236 5.374 5.660 6.200 7.533 7.416 6.069 5.632 6.477 6.542 6.033 5.818 4.657 5.382 5.429 4.704 3.159 2.791 3.092 3.339 + 3.029 2.997 5.595 7.001 5.529 1.913 3.293 4.325 5.489 5.919 5.149 4.974 4.061 5.482 4.921 5.150 4.651 5.270 5.804 6.235 7.567 8.079 7.494 6.327 6.437 6.684 7.016 6.559 4.925 5.643 5.479 5.113 2.946 2.638 2.773 3.164 + 4.279 3.936 6.322 7.331 5.621 5.021 5.254 7.166 7.605 7.304 7.225 5.250 3.898 3.322 3.656 5.434 4.899 4.434 5.762 6.551 7.920 8.411 7.504 7.242 6.839 7.336 7.128 6.509 5.577 5.451 6.080 6.105 3.625 3.023 2.954 3.207 + 4.018 3.119 6.182 6.476 4.510 6.251 6.763 8.358 8.212 7.982 6.551 5.684 5.346 6.648 5.623 6.309 5.892 6.515 6.365 6.467 8.278 8.892 7.351 7.682 6.686 7.187 7.653 7.038 6.226 6.330 6.436 6.339 4.116 3.141 2.790 2.520 + 3.083 3.798 5.588 4.732 5.478 5.425 5.680 7.545 6.599 6.153 6.718 6.243 5.168 5.723 4.513 4.966 5.490 5.833 5.500 5.613 6.718 7.558 7.405 7.170 7.214 6.147 6.622 6.119 5.624 5.528 6.306 5.032 3.633 1.704 1.836 1.771 + 1.715 4.007 6.083 6.097 4.600 4.874 5.598 7.901 7.656 7.431 7.192 6.019 5.322 5.622 4.447 4.132 4.540 5.682 5.601 6.160 6.963 7.453 7.600 7.856 7.624 7.539 7.904 7.006 6.490 6.626 6.693 5.339 4.529 3.276 2.813 1.865 + 3.781 3.105 5.483 5.605 3.910 4.752 5.593 7.887 7.418 7.934 7.648 6.449 5.229 6.084 4.881 4.039 3.654 5.348 5.827 5.188 7.149 7.575 7.878 8.565 8.100 7.816 7.269 6.955 5.970 5.337 6.485 5.916 5.321 3.412 2.873 3.121 + 4.848 3.597 6.147 6.954 5.309 6.209 5.693 8.402 8.494 8.169 7.107 7.339 6.664 4.946 3.666 2.836 4.425 4.883 3.535 5.822 6.384 7.294 8.083 7.650 7.409 7.752 7.938 7.580 6.160 5.917 7.148 6.603 5.371 3.887 2.810 2.285 + 5.059 3.651 6.336 7.115 5.091 5.901 4.862 7.515 7.507 7.695 7.799 7.298 6.573 4.921 4.385 2.693 2.065 3.673 3.549 3.996 5.132 5.497 5.355 6.370 6.240 6.744 7.866 7.036 6.064 5.681 6.763 6.591 5.362 4.299 2.723 1.941 + 4.828 4.576 5.397 6.009 4.517 6.006 5.448 7.145 7.019 5.712 6.021 4.442 4.284 3.908 3.892 2.599 3.332 3.187 3.705 3.449 4.248 5.503 5.232 7.217 6.574 7.002 6.747 6.087 5.668 5.224 6.164 6.031 4.724 4.067 3.217 2.310 + 2.046 1.634 3.362 5.181 4.004 4.906 4.262 6.056 6.978 6.287 4.685 4.461 4.032 4.260 3.792 2.075 3.182 4.048 3.866 3.901 3.131 4.862 4.915 7.281 7.130 6.665 5.700 5.790 4.898 4.373 4.931 5.055 4.333 4.193 3.670 3.102 + 3.042 2.861 4.055 4.605 3.175 4.461 4.375 4.488 5.742 5.066 4.585 4.560 4.335 4.519 3.604 3.460 3.667 3.399 3.608 3.212 3.760 5.150 4.340 4.914 5.299 4.469 3.812 4.624 3.597 3.114 4.355 4.331 2.986 2.783 2.489 2.099 + 2.983 1.889 4.131 4.693 3.287 3.161 3.706 4.524 3.917 4.382 4.915 3.606 2.635 2.700 2.054 3.480 3.614 3.970 5.172 5.323 6.144 5.157 5.046 6.298 6.068 4.386 4.391 4.787 3.512 2.261 3.130 3.843 2.733 2.166 1.843 1.935 + 5.427 4.168 3.960 4.364 2.669 2.878 3.612 2.183 2.985 4.264 4.646 4.901 4.896 4.419 4.898 4.850 5.718 4.898 7.484 7.124 6.575 6.846 6.172 6.844 6.615 5.436 5.462 5.337 4.534 4.795 4.845 5.106 4.960 4.866 4.690 4.243 + 3.810 2.600 3.219 3.344 3.198 3.454 3.385 3.950 4.168 4.428 5.121 5.894 4.114 4.793 5.542 5.115 5.053 5.834 8.123 7.760 7.303 6.091 6.366 6.849 6.977 7.276 7.837 7.533 7.787 6.777 7.793 8.267 7.402 7.135 8.025 7.439 + 1.732 2.879 2.671 4.229 4.797 5.077 3.634 3.393 3.719 4.412 4.596 5.647 4.902 5.225 5.393 6.484 7.336 6.572 7.763 7.416 7.786 7.335 7.587 7.882 9.480 9.364 9.537 9.038 8.510 7.486 9.724 9.915 8.575 7.717 9.052 8.779 + 1.501 3.322 4.382 4.910 4.440 4.711 4.143 4.664 4.988 4.158 5.749 4.737 4.096 5.853 5.989 5.005 6.226 7.263 7.693 7.982 9.535 9.575 8.611 8.768 9.951 9.587 10.248 9.788 9.784 8.673 9.695 10.495 9.575 9.003 8.984 8.841 + 2.910 4.072 4.567 3.965 4.175 5.052 5.571 5.965 6.025 5.602 6.801 5.822 6.424 5.614 5.338 5.232 8.426 8.323 8.354 7.967 9.095 8.853 8.585 7.659 8.630 9.134 10.475 11.004 10.245 9.244 10.360 10.606 9.363 9.409 9.736 9.884 + 5.699 6.005 5.797 4.930 4.661 5.882 6.071 5.745 5.953 5.265 5.508 5.464 5.749 6.008 6.260 7.314 7.608 8.107 9.236 9.770 8.236 10.334 10.211 9.006 9.739 9.660 11.007 10.660 10.048 9.678 9.424 10.819 10.104 10.335 10.126 9.994 + 4.785 5.030 5.562 5.872 6.465 6.449 5.449 6.128 5.523 5.378 6.970 7.583 6.864 5.524 5.830 7.257 7.401 8.263 10.642 10.563 9.062 9.442 9.350 9.894 9.701 10.297 11.303 9.880 8.730 9.238 10.277 10.657 10.469 9.441 9.705 9.458 + 6.504 6.842 6.438 4.908 6.953 7.100 6.407 5.903 6.310 6.534 7.296 7.819 7.847 8.026 7.879 6.927 8.653 9.816 10.880 10.553 8.932 9.380 8.495 8.687 8.803 9.092 10.086 9.271 8.492 8.373 10.392 10.559 9.975 8.153 7.349 7.568 + 8.855 8.289 7.390 6.973 6.477 7.826 6.468 7.077 7.360 7.188 6.733 7.682 7.835 7.633 7.496 7.494 7.853 9.760 9.470 8.790 7.516 8.412 7.436 7.335 6.853 7.826 8.432 6.749 5.819 6.092 7.584 8.225 8.159 5.818 6.630 6.786 + 12.393 12.384 11.392 11.335 12.601 12.560 12.547 13.127 11.801 10.075 10.238 8.280 8.426 7.256 8.061 7.912 8.755 10.376 10.745 9.547 7.693 7.928 8.139 8.185 7.893 9.073 9.177 7.864 6.185 7.275 9.222 9.869 9.804 8.565 7.201 7.362 + 13.262 12.950 12.709 12.372 13.401 14.719 15.359 15.691 13.952 12.271 11.619 11.363 9.835 10.619 10.423 11.196 11.774 13.351 12.783 11.057 9.902 9.448 10.055 10.178 8.989 11.098 11.244 9.716 8.890 9.340 11.982 12.324 11.910 10.860 8.522 8.049 + 12.579 12.665 12.754 12.647 13.647 14.919 16.044 16.854 15.559 13.531 12.474 12.077 11.362 11.678 11.985 12.441 13.553 15.208 14.194 12.417 11.315 10.784 10.840 10.068 9.212 11.126 11.218 10.400 10.293 10.553 13.627 13.794 13.392 12.231 8.497 6.824 + 12.578 12.314 11.960 12.428 12.941 13.718 15.239 16.383 14.637 13.961 12.378 9.948 8.639 8.198 9.883 10.913 12.493 14.700 13.433 11.999 11.002 10.533 10.121 8.494 7.847 9.395 9.296 9.482 9.756 9.548 10.919 11.107 9.382 8.472 6.782 5.486 + 12.665 12.060 12.189 12.423 12.611 13.292 15.092 15.106 15.146 12.847 11.900 10.673 9.213 8.842 10.181 10.712 12.445 14.396 12.768 11.585 11.211 11.112 10.816 9.321 9.659 10.293 9.454 8.364 9.456 10.505 11.341 11.636 10.065 8.382 6.633 5.567 + 12.579 11.672 11.880 11.892 12.164 12.848 14.069 15.410 14.913 13.778 12.113 9.900 9.435 10.294 10.916 11.692 13.453 14.187 12.180 11.288 10.898 10.895 10.753 8.831 8.687 9.859 9.458 8.759 9.426 9.870 10.718 11.040 10.217 9.718 7.382 5.855 + 12.675 11.621 11.821 11.729 11.854 12.617 14.294 15.517 15.334 14.053 12.227 10.798 10.185 10.835 11.418 12.117 14.043 14.582 12.363 11.460 10.914 10.920 11.141 9.524 8.457 9.433 9.669 8.987 9.602 10.112 11.253 11.459 10.714 10.409 7.204 6.551 + 12.728 11.926 11.985 11.921 11.937 12.994 14.221 15.930 16.041 14.710 13.388 11.461 11.562 11.382 12.043 12.986 14.712 14.805 12.765 11.900 11.125 11.289 11.713 10.339 9.517 10.002 10.172 9.286 10.135 10.810 12.157 12.179 11.088 10.567 7.551 6.834 + 12.816 12.334 12.233 12.126 12.342 13.241 14.465 16.228 16.238 15.287 14.085 12.038 12.275 12.012 12.771 13.912 15.286 14.952 13.119 12.301 11.670 11.851 12.036 11.763 11.524 10.513 10.117 9.886 10.078 10.499 12.651 12.746 12.820 12.009 8.041 6.994 + 12.880 12.394 12.220 11.997 12.449 13.256 14.202 16.151 16.167 15.226 14.451 12.198 12.331 12.108 13.149 14.532 15.904 14.810 13.168 12.230 11.687 11.584 12.113 12.801 12.271 10.862 10.690 11.160 10.958 10.698 12.539 12.873 12.829 12.113 8.598 8.493 + 12.881 12.328 12.235 11.867 12.573 13.233 14.003 16.136 16.286 15.078 14.619 12.436 12.351 12.432 13.570 14.717 15.590 14.687 12.967 12.180 11.611 11.689 12.777 13.702 12.800 10.482 10.936 11.285 10.359 9.508 12.143 12.656 12.373 11.703 8.765 8.096 + 12.786 11.891 11.940 11.564 12.396 12.968 13.253 16.192 16.204 14.931 14.355 11.889 12.301 12.324 13.350 14.436 15.470 13.935 12.096 11.617 11.173 11.651 12.525 13.139 12.067 10.028 10.591 10.833 9.815 8.136 12.208 12.524 12.081 11.517 8.511 8.455 + 12.715 11.627 11.912 11.443 12.097 12.943 13.278 16.004 16.096 14.716 14.137 11.706 12.201 12.291 13.387 14.529 14.824 13.338 11.746 11.408 11.005 11.404 12.341 12.931 11.891 9.781 10.289 11.368 9.465 8.060 12.170 12.496 12.067 11.723 8.325 9.114 + 12.716 11.922 11.979 11.660 12.051 13.065 13.758 16.062 16.155 14.788 14.164 11.956 12.342 12.407 13.612 15.129 14.665 12.919 11.726 11.306 10.822 11.162 12.267 13.223 12.286 9.782 10.379 11.706 9.886 8.427 11.427 11.802 11.943 11.514 8.336 9.212 + 12.752 12.251 12.123 11.792 12.268 13.176 14.021 16.030 15.930 14.733 14.166 11.974 12.439 12.511 14.103 15.245 14.243 12.763 11.989 11.386 10.895 11.341 12.379 13.011 11.979 9.647 10.139 11.742 10.279 8.551 11.208 11.742 11.461 11.044 7.550 7.112 + 12.987 12.486 12.262 11.862 12.311 13.221 14.191 15.909 15.751 14.553 14.062 11.876 12.534 12.720 14.205 14.417 13.815 12.327 11.579 10.821 11.010 11.431 12.192 13.101 12.614 9.660 10.761 11.826 10.079 8.560 11.048 11.927 11.608 11.173 7.738 7.201 + 12.987 12.426 12.180 11.520 12.101 12.916 14.284 15.592 15.542 14.338 13.913 12.145 12.999 13.398 14.208 13.750 12.217 11.445 10.869 10.624 10.733 11.207 12.163 13.124 12.553 10.227 10.168 11.100 10.211 6.956 9.866 11.161 11.084 10.629 8.206 6.479 + 13.022 11.961 11.727 11.171 11.918 12.640 14.292 15.146 15.128 14.255 13.591 12.331 12.933 13.577 14.203 12.493 11.160 10.619 9.893 9.947 10.091 10.503 11.193 12.478 12.806 11.186 9.138 10.684 10.126 7.058 9.156 10.770 10.688 10.264 9.221 7.703 + 12.764 11.713 10.800 11.469 10.953 12.756 14.246 14.701 14.272 14.038 13.062 13.795 13.156 13.985 12.397 11.127 10.189 9.776 9.703 10.184 10.218 10.508 10.834 11.834 12.775 11.360 8.416 10.315 9.830 6.776 8.166 10.637 10.253 9.804 9.710 9.215 + 12.172 11.718 11.673 10.153 10.613 12.032 12.606 13.515 13.952 13.461 13.598 13.657 13.634 12.774 9.086 6.351 7.937 9.268 9.106 9.725 9.750 9.895 9.983 10.065 11.187 10.796 7.663 10.168 9.765 5.729 5.994 8.458 8.444 8.391 9.895 10.463 + 11.399 11.409 11.432 10.260 9.665 10.490 10.747 11.281 11.477 11.689 11.824 11.311 10.793 8.787 7.242 6.108 5.897 7.696 8.073 7.482 7.244 7.495 7.442 8.498 9.195 9.904 9.066 7.711 7.892 5.803 6.910 8.303 8.680 8.953 10.482 10.767 + 8.893 7.925 8.018 7.904 7.297 7.478 7.235 8.487 9.205 9.000 6.802 7.120 8.178 6.916 6.181 7.342 6.641 7.267 8.009 7.748 7.945 7.807 8.410 8.788 9.422 9.898 9.278 6.480 7.130 7.021 6.959 8.539 9.526 8.702 9.401 9.003 + 8.270 7.787 7.843 6.783 5.166 6.252 6.322 7.229 7.276 7.859 8.013 7.965 7.678 7.041 5.699 7.146 6.998 6.917 7.606 7.658 6.559 6.207 7.401 7.750 7.689 8.437 8.358 7.081 8.013 7.036 6.257 8.412 9.259 8.545 7.607 8.222 + 9.884 8.522 8.253 6.220 4.435 5.966 6.860 7.834 7.046 7.473 8.229 7.411 7.510 6.718 5.878 7.129 6.715 7.846 7.586 7.229 5.673 6.172 7.446 7.215 7.021 7.015 8.639 7.497 7.719 7.453 8.006 8.696 9.011 8.960 7.458 6.773 + 9.950 9.133 8.215 5.624 6.811 7.998 8.466 7.352 6.491 5.246 6.469 6.134 6.005 6.530 5.997 5.709 6.581 7.397 7.546 7.432 5.651 6.754 7.835 7.932 6.869 8.099 7.155 7.152 7.587 8.087 7.984 8.388 9.992 9.404 8.114 7.374 + 10.441 8.278 7.446 7.513 6.531 7.551 8.020 7.544 7.663 5.975 6.593 5.427 5.995 6.789 6.637 5.467 6.054 6.059 7.107 7.310 6.856 7.793 8.768 8.101 8.260 8.414 8.708 8.118 7.911 8.234 8.238 9.570 10.437 10.639 9.533 8.933 + 10.388 7.588 8.483 8.033 6.764 7.322 5.160 6.314 7.544 5.930 6.503 6.796 6.546 6.583 6.376 6.615 6.710 6.434 6.949 6.573 6.917 8.782 9.308 8.488 8.460 8.111 8.209 7.509 8.111 7.741 8.031 10.009 10.747 10.545 10.338 10.230 + 9.278 8.286 7.885 7.370 7.140 5.943 7.298 7.571 6.748 7.239 6.657 6.727 6.795 6.232 5.674 6.749 7.316 6.725 7.156 7.292 6.101 7.665 9.636 8.993 8.073 8.151 7.556 7.501 7.619 7.256 8.100 9.924 10.636 9.484 9.176 9.357 + 9.994 8.468 5.949 6.600 7.227 6.827 6.444 7.218 6.815 5.536 5.365 6.314 6.270 5.835 6.295 5.494 6.061 6.508 7.147 6.610 6.522 7.691 7.298 9.221 8.990 8.887 8.393 8.080 7.396 7.918 8.593 9.576 9.933 9.331 9.243 7.997 + 9.687 9.077 8.338 8.438 7.344 7.695 7.579 7.606 8.020 7.190 7.777 7.941 5.780 6.030 6.066 6.754 6.409 7.184 7.052 6.378 6.256 7.888 8.422 8.521 8.552 8.166 7.610 7.220 8.175 8.296 8.505 9.545 10.209 9.417 9.141 8.549 + 8.779 9.738 9.006 7.477 6.794 6.759 8.662 9.703 9.650 9.126 9.322 9.019 8.546 7.298 5.926 8.739 8.679 6.702 7.113 6.990 5.787 7.155 8.278 7.882 8.285 7.956 8.327 6.791 7.660 7.699 8.250 8.454 9.368 8.737 8.943 8.495 + 8.731 8.946 7.839 7.548 7.055 6.759 9.655 10.577 9.448 9.302 10.011 8.786 8.449 8.461 8.370 9.097 8.534 7.528 6.853 6.911 6.029 7.212 8.088 8.456 7.997 6.550 7.299 7.007 7.087 6.595 7.394 7.874 8.450 8.283 8.707 8.548 + 7.971 7.048 7.205 6.688 7.300 7.467 9.787 10.843 11.355 10.589 10.463 10.612 9.523 9.789 9.842 10.783 10.107 8.280 7.816 7.561 5.808 6.087 7.341 8.297 7.854 6.752 7.167 6.340 7.133 6.900 6.867 7.280 7.426 7.117 6.694 6.215 + 9.118 8.374 6.003 7.737 7.757 8.519 10.371 11.663 12.434 11.042 10.112 10.512 8.544 8.867 9.075 11.373 11.024 9.300 8.202 7.696 6.158 7.581 7.193 7.869 7.199 7.295 7.360 6.595 6.756 6.324 5.843 7.547 7.717 6.433 6.009 5.994 + 7.020 7.264 6.857 7.411 7.568 8.540 10.672 11.076 12.137 10.862 10.942 10.497 9.335 8.450 8.927 10.819 10.926 9.969 7.767 6.942 6.788 6.995 6.139 6.660 7.698 8.009 6.806 6.238 5.952 6.372 5.782 7.140 6.767 6.543 6.780 5.687 + 8.228 8.217 6.863 7.064 6.680 7.431 10.924 11.023 11.274 10.755 10.837 9.943 9.448 8.726 9.192 8.682 9.275 9.739 8.167 7.051 6.283 5.563 5.595 6.653 8.176 7.726 7.198 6.339 5.566 5.978 5.978 7.069 7.292 6.186 5.598 5.246 + 6.948 8.101 7.251 7.034 6.358 6.955 11.146 11.280 10.489 9.948 10.143 9.653 9.149 8.360 9.017 8.930 9.136 9.232 7.147 7.368 6.562 5.365 6.652 6.398 8.619 8.626 6.567 5.894 5.425 5.899 6.228 6.315 6.240 5.595 5.784 4.905 + 7.813 8.191 6.969 7.296 7.025 8.305 11.174 11.220 10.841 9.611 9.156 8.897 8.732 8.405 8.620 8.771 10.280 9.359 7.290 6.136 5.791 7.084 6.583 5.769 8.495 8.566 6.943 6.487 4.649 6.628 6.797 6.616 6.611 5.349 5.474 4.873 + 6.201 7.444 6.965 7.570 7.939 8.488 10.548 11.340 11.901 10.345 9.343 7.672 7.097 8.027 7.931 9.600 9.757 8.843 8.083 6.379 5.610 7.034 6.735 6.436 8.132 7.739 6.448 5.290 4.777 6.829 6.958 7.243 5.886 4.668 4.930 4.900 + 6.556 6.975 6.338 6.284 7.440 8.178 8.880 10.433 11.614 9.890 9.140 7.969 6.578 7.250 8.266 9.266 8.349 8.167 7.484 6.079 5.365 5.739 5.603 6.218 7.887 8.161 6.448 6.079 4.796 5.980 6.467 7.116 5.520 4.517 5.678 4.971 + 5.164 4.651 6.017 6.017 6.611 7.001 8.991 8.676 10.185 9.430 8.097 7.674 5.744 6.255 7.309 9.468 9.329 8.277 7.061 5.844 4.553 4.819 6.502 6.065 6.989 6.381 6.643 5.964 5.336 5.901 6.169 6.052 5.406 5.066 5.362 5.326 + 6.022 6.380 5.255 4.951 5.461 6.666 6.814 7.091 9.212 8.978 8.490 8.117 7.446 6.405 6.510 9.330 8.025 7.452 5.600 5.208 4.328 5.147 5.752 6.279 6.454 6.104 5.853 5.557 4.776 4.892 5.390 5.444 5.655 5.681 5.472 4.639 + 6.250 6.894 5.131 3.580 6.621 7.761 8.083 7.827 9.894 8.677 7.531 7.877 7.464 7.102 6.025 9.569 9.429 8.036 5.549 4.737 4.272 5.334 5.567 6.222 6.661 6.264 5.396 4.839 5.169 5.296 4.815 5.591 5.759 5.346 5.391 4.670 + 7.262 7.384 5.999 5.127 5.847 8.087 9.031 7.940 8.879 9.253 8.900 7.898 6.953 7.577 8.061 9.233 7.927 7.426 6.316 4.310 4.745 6.328 5.861 5.802 5.602 5.263 5.975 5.217 5.026 5.858 4.627 5.872 5.778 5.168 5.921 4.776 + 7.683 5.821 3.135 4.755 5.459 7.744 7.984 7.501 7.675 8.299 8.085 7.630 6.042 6.370 8.389 9.161 7.574 6.144 5.820 6.346 5.952 5.621 5.502 5.421 5.990 5.739 5.719 5.398 4.098 5.025 4.956 5.822 6.060 6.288 6.079 4.448 + 5.816 6.620 6.242 6.151 6.419 7.497 6.928 7.286 7.838 8.004 6.187 7.584 7.179 6.305 8.211 8.825 7.534 6.314 5.603 6.045 5.641 5.417 5.431 5.067 5.790 6.343 5.124 5.817 4.384 4.504 4.926 5.893 6.344 5.614 5.528 4.684 + 6.683 6.479 6.450 7.074 6.553 7.589 8.300 8.852 8.024 7.778 6.330 7.167 7.339 6.352 6.832 8.454 7.929 6.216 4.998 5.307 5.687 5.925 6.466 6.110 5.821 5.630 5.635 5.693 4.946 5.200 5.142 6.268 6.062 5.657 4.842 4.633 + 7.316 7.234 5.195 7.104 8.469 9.563 8.394 8.113 8.061 7.252 6.945 6.481 6.665 6.066 6.290 8.402 7.898 6.950 5.668 4.754 5.662 6.495 6.185 7.039 7.536 6.493 5.882 6.582 6.484 5.840 6.969 8.381 8.331 7.312 6.043 5.084 + 6.762 6.771 5.381 5.850 9.664 10.545 8.221 7.592 5.881 5.022 6.201 5.261 5.184 4.422 5.837 8.120 7.312 6.118 6.312 6.124 5.634 6.559 8.408 10.281 10.344 9.115 8.913 9.408 8.894 7.228 8.980 10.906 10.506 9.145 7.315 5.185 + 6.032 6.768 4.577 3.849 10.578 12.460 11.163 8.253 8.637 6.835 5.935 6.225 5.766 5.298 5.973 7.543 6.708 5.960 6.583 5.313 5.769 6.106 8.983 10.455 11.086 10.000 9.559 9.921 9.891 7.300 9.407 10.798 10.580 9.702 7.499 5.004 + 6.943 7.671 6.326 4.869 11.236 13.462 12.316 7.580 7.521 6.586 6.541 6.519 7.376 6.885 5.987 7.093 6.855 5.591 6.496 5.433 5.199 7.750 9.180 10.240 11.298 10.484 9.905 10.291 10.105 7.944 10.072 11.301 11.413 10.474 7.786 5.728 + 6.695 8.535 7.432 6.137 11.413 13.732 12.354 9.140 8.471 8.212 7.637 6.325 6.242 7.310 7.044 7.552 6.745 5.851 6.845 6.301 6.335 8.690 9.713 10.986 11.943 11.066 10.659 10.725 10.398 8.643 9.986 11.522 11.264 9.707 7.820 5.517 + 8.195 9.257 7.688 6.009 11.991 14.106 12.701 9.340 9.319 7.212 7.026 6.537 7.129 6.826 6.184 8.319 7.863 6.447 7.486 6.438 6.670 9.661 10.858 11.771 12.820 11.463 11.478 11.478 10.911 10.016 11.140 11.878 11.912 10.962 8.099 5.191 + 6.553 8.950 7.771 4.539 12.068 14.002 12.176 10.200 9.940 7.448 7.464 6.309 6.599 6.514 6.691 7.098 7.544 7.274 7.459 6.941 6.833 9.525 10.948 11.692 12.631 10.768 10.788 11.082 10.910 10.044 11.273 12.353 12.427 11.528 8.871 5.997 + 6.888 8.789 8.365 6.845 12.649 14.189 12.144 10.574 10.256 8.319 7.852 7.059 6.585 6.621 6.502 7.295 7.279 7.018 7.277 6.259 6.872 9.183 10.761 11.291 12.209 10.279 10.547 10.777 10.237 9.606 10.634 12.528 12.470 11.320 9.364 6.018 diff --git a/test/regression/chan3-smoothspec.cepview b/test/regression/chan3-smoothspec.cepview new file mode 100644 index 000000000..f65433c02 --- /dev/null +++ b/test/regression/chan3-smoothspec.cepview @@ -0,0 +1,2178 @@ + 5.386 5.066 4.613 4.237 3.998 3.807 3.584 3.402 3.457 3.877 4.552 5.165 5.423 4.688 5.481 6.331 7.030 7.386 7.355 7.104 6.917 6.989 7.280 7.553 7.570 7.294 6.929 6.763 6.950 7.404 7.877 8.137 8.109 7.879 7.607 7.435 + 3.618 3.976 4.484 4.865 4.936 4.697 4.299 3.933 3.754 3.835 4.165 4.642 5.090 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.725 4.219 4.860 5.243 5.235 5.035 4.941 5.073 5.292 5.385 5.293 5.156 5.135 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.987 4.147 4.449 4.822 5.127 5.222 5.075 4.812 4.639 4.700 4.970 5.296 5.541 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.177 4.150 4.197 4.399 4.697 4.927 4.971 4.872 4.789 4.827 4.929 4.945 4.823 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.756 3.524 4.577 5.298 5.367 4.944 4.495 4.398 4.665 4.983 5.016 4.709 4.342 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.305 3.696 4.257 4.680 4.760 4.518 4.177 4.014 4.186 4.626 5.103 5.374 5.344 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.319 4.004 4.885 5.360 5.157 4.490 3.835 3.534 3.572 3.688 3.670 3.568 3.630 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.593 3.995 4.553 4.963 5.083 4.993 4.870 4.793 4.678 4.396 3.959 3.585 3.580 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.834 3.711 3.621 3.728 4.044 4.404 4.586 4.481 4.164 3.827 3.653 3.734 4.087 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 1.740 2.557 3.737 4.662 4.936 4.586 3.981 3.547 3.503 3.797 4.228 4.636 4.987 5.325 5.662 5.933 6.046 5.993 5.885 5.896 6.130 6.537 6.940 7.155 7.113 6.904 6.711 6.685 6.864 7.169 7.468 7.662 7.723 7.688 7.620 7.573 + 5.196 4.786 4.244 3.930 4.044 4.501 5.011 5.276 5.166 4.767 4.296 3.971 3.920 4.154 4.581 5.058 5.449 5.684 5.796 5.886 6.050 6.286 6.493 6.547 6.417 6.215 6.126 6.273 6.617 6.994 7.237 7.292 7.237 7.183 7.185 7.211 + 8.865 8.412 7.659 6.834 6.124 5.600 5.208 4.848 4.486 4.189 4.073 4.187 4.438 4.631 4.610 4.378 4.109 4.018 4.201 4.586 5.012 5.375 5.703 6.079 6.519 6.906 7.072 6.956 6.684 6.494 6.551 6.826 7.127 7.275 7.246 7.166 + 7.880 7.485 6.730 5.776 4.939 4.547 4.697 5.134 5.406 5.210 4.631 4.064 3.875 4.088 4.388 4.424 4.125 3.755 3.661 3.960 4.452 4.828 4.947 4.937 5.022 5.292 5.611 5.772 5.706 5.542 5.467 5.538 5.638 5.618 5.462 5.310 + 6.485 6.189 5.638 4.981 4.481 4.383 4.711 5.191 5.418 5.162 4.563 4.021 3.881 4.157 4.551 4.721 4.561 4.240 4.008 3.969 4.046 4.137 4.264 4.546 5.024 5.537 5.819 5.744 5.477 5.358 5.589 6.034 6.314 6.155 5.657 5.225 + 4.243 4.135 4.092 4.253 4.532 4.657 4.425 3.929 3.520 3.510 3.899 4.364 4.539 4.326 3.960 3.762 3.847 4.038 4.076 3.906 3.751 3.911 4.461 5.151 5.588 5.557 5.183 4.818 4.750 5.010 5.396 5.664 5.706 5.577 5.407 5.298 + 5.627 5.470 5.155 4.735 4.353 4.166 4.215 4.356 4.347 4.057 3.610 3.329 3.491 4.089 4.792 5.169 4.990 4.396 3.790 3.560 3.822 4.372 4.853 4.987 4.720 4.214 3.728 3.482 3.567 3.926 4.380 4.712 4.765 4.529 4.160 3.890 + 3.693 4.038 4.526 4.906 5.038 4.950 4.748 4.476 4.081 3.508 2.832 2.294 2.167 2.552 3.267 3.945 4.265 4.168 3.871 3.688 3.788 4.083 4.314 4.260 3.914 3.486 3.243 3.327 3.666 4.039 4.224 4.128 3.809 3.414 3.083 2.900 + 3.801 3.408 2.988 2.963 3.450 4.157 4.602 4.483 3.882 3.180 2.773 2.832 3.258 3.807 4.253 4.466 4.412 4.136 3.761 3.458 3.366 3.488 3.664 3.677 3.435 3.058 2.799 2.835 3.110 3.377 3.393 3.108 2.682 2.333 2.161 2.118 + 2.453 2.567 2.915 3.550 4.278 4.708 4.521 3.749 2.812 2.251 2.364 3.026 3.811 4.309 4.374 4.144 3.861 3.684 3.620 3.594 3.553 3.488 3.418 3.351 3.295 3.282 3.348 3.479 3.580 3.519 3.236 2.808 2.410 2.188 2.152 2.190 + 3.216 3.742 4.457 4.948 5.029 4.827 4.611 4.535 4.532 4.437 4.195 3.938 3.862 4.022 4.257 4.305 4.033 3.544 3.099 2.919 3.033 3.303 3.562 3.732 3.831 3.898 3.931 3.899 3.794 3.650 3.499 3.330 3.088 2.753 2.396 2.158 + 4.372 5.078 5.847 5.969 5.288 4.316 3.762 3.912 4.435 4.742 4.543 4.063 3.760 3.861 4.155 4.241 3.941 3.467 3.198 3.305 3.604 3.767 3.660 3.459 3.437 3.665 3.921 3.919 3.604 3.219 3.076 3.263 3.581 3.759 3.712 3.595 + 4.514 4.949 5.590 6.092 6.174 5.763 5.015 4.212 3.580 3.178 2.938 2.793 2.784 3.011 3.486 4.012 4.270 4.047 3.448 2.861 2.685 3.015 3.566 3.915 3.851 3.536 3.337 3.478 3.823 4.004 3.754 3.164 2.601 2.393 2.544 2.762 + 5.189 5.077 5.108 5.488 6.071 6.383 5.982 4.855 3.483 2.514 2.315 2.762 3.409 3.854 3.969 3.856 3.655 3.410 3.127 2.886 2.844 3.099 3.553 3.944 4.046 3.858 3.591 3.467 3.521 3.595 3.537 3.382 3.332 3.553 3.970 4.306 + 7.692 7.615 7.493 7.377 7.313 7.299 7.267 7.127 6.838 6.466 6.149 5.992 5.964 5.917 5.700 5.293 4.827 4.474 4.317 4.312 4.408 4.661 5.241 6.251 7.551 8.745 9.411 9.393 8.929 8.466 8.320 8.459 8.584 8.439 8.058 7.731 + 11.102 11.186 11.271 11.264 11.134 10.905 10.584 10.142 9.568 8.943 8.428 8.127 7.975 7.776 7.410 7.006 6.894 7.312 8.130 8.872 9.090 8.771 8.413 8.634 9.629 10.949 11.828 11.796 11.047 10.257 9.989 10.246 10.546 10.422 9.882 9.385 + 12.162 12.684 13.368 13.768 13.669 13.171 12.515 11.850 11.158 10.382 9.567 8.863 8.392 8.144 8.045 8.114 8.515 9.393 10.619 11.737 12.227 11.900 11.088 10.410 10.301 10.691 11.132 11.229 10.980 10.713 10.702 10.848 10.761 10.163 9.234 8.526 + 12.239 12.855 13.789 14.617 15.000 14.811 14.126 13.137 12.075 11.146 10.483 10.087 9.836 9.586 9.339 9.312 9.802 10.916 12.367 13.574 14.034 13.691 12.986 12.518 12.586 12.995 13.299 13.233 12.954 12.849 13.103 13.451 13.370 12.575 11.363 10.455 + 12.807 13.411 14.355 15.251 15.769 15.743 15.198 14.297 13.295 12.459 11.955 11.748 11.614 11.321 10.868 10.580 10.906 12.033 13.627 14.977 15.476 15.076 14.315 13.867 13.997 14.391 14.515 14.178 13.742 13.775 14.437 15.202 15.221 14.081 12.268 10.901 + 13.239 13.774 14.685 15.692 16.454 16.683 16.257 15.298 14.143 13.187 12.656 12.479 12.363 12.060 11.624 11.432 11.910 13.136 14.683 15.842 16.120 15.587 14.800 14.333 14.324 14.432 14.239 13.724 13.347 13.609 14.489 15.284 15.087 13.561 11.353 9.742 + 13.551 13.910 14.654 15.707 16.779 17.421 17.272 16.317 14.949 13.740 13.073 12.905 12.868 12.631 12.226 12.061 12.573 13.809 15.302 16.365 16.588 16.124 15.517 15.219 15.208 15.079 14.505 13.658 13.160 13.539 14.655 15.628 15.433 13.736 11.290 9.514 + 13.729 13.904 14.440 15.449 16.706 17.663 17.776 16.911 15.471 14.130 13.365 13.151 13.089 12.820 12.393 12.249 12.826 14.135 15.667 16.741 16.992 16.608 16.098 15.813 15.651 15.221 14.319 13.274 12.790 13.356 14.707 15.842 15.688 13.939 11.414 9.585 + 13.930 13.919 14.235 15.153 16.482 17.572 17.772 16.941 15.558 14.337 13.680 13.454 13.242 12.828 12.428 12.494 13.278 14.571 15.842 16.633 16.843 16.668 16.311 15.768 14.905 13.735 12.592 11.996 12.274 13.246 14.243 14.476 13.523 11.603 9.493 8.127 + 14.060 13.957 14.154 15.009 16.371 17.578 17.932 17.246 15.964 14.766 14.043 13.696 13.411 13.084 12.965 13.395 14.413 15.640 16.550 16.875 16.744 16.456 16.126 15.586 14.625 13.331 12.168 11.666 11.997 12.787 13.351 13.147 12.096 10.575 9.152 8.313 + 14.066 14.064 14.370 15.252 16.559 17.722 18.133 17.590 16.412 15.162 14.243 13.731 13.518 13.565 13.958 14.730 15.671 16.387 16.581 16.306 15.908 15.684 15.579 15.228 14.334 13.045 11.956 11.696 12.413 13.607 14.426 14.204 12.853 10.851 8.950 7.814 + 13.849 14.094 14.667 15.588 16.666 17.519 17.773 17.291 16.254 15.055 14.104 13.671 13.833 14.473 15.303 15.928 16.012 15.485 14.649 14.037 14.042 14.581 15.085 14.892 13.773 12.182 10.997 10.912 11.943 13.397 14.336 14.149 12.865 11.027 9.342 8.362 + 13.570 13.972 14.756 15.801 16.831 17.466 17.401 16.611 15.411 14.333 13.858 14.153 14.980 15.808 16.087 15.529 14.276 12.844 11.875 11.792 12.556 13.647 14.335 14.095 12.927 11.379 10.238 10.071 10.891 12.158 13.089 13.085 12.020 10.276 8.530 7.453 + 13.459 13.766 14.468 15.533 16.634 17.239 16.958 15.873 14.557 13.722 13.756 14.487 15.322 15.646 15.156 13.975 12.519 11.290 10.691 10.900 11.782 12.877 13.547 13.295 12.085 10.440 9.173 8.908 9.682 10.941 11.894 11.990 11.184 9.869 8.603 7.849 + 13.157 13.631 14.500 15.559 16.464 16.835 16.456 15.451 14.289 13.558 13.627 14.400 15.339 15.767 15.261 13.903 12.233 10.940 10.503 10.960 11.934 12.844 13.176 12.691 11.497 10.011 8.806 8.386 8.939 10.189 11.449 11.929 11.158 9.302 7.144 5.710 + 13.013 13.710 14.808 15.878 16.566 16.700 16.278 15.430 14.406 13.575 13.308 13.766 14.696 15.483 15.480 14.448 12.773 11.263 10.642 11.100 12.207 13.226 13.552 12.996 11.781 10.360 9.227 8.794 9.261 10.472 11.854 12.583 12.030 10.211 7.922 6.345 + 13.284 13.995 15.051 15.974 16.452 16.439 16.036 15.340 14.438 13.526 12.960 13.091 13.951 15.088 15.760 15.421 14.131 12.568 11.590 11.662 12.572 13.607 14.029 13.504 12.225 10.735 9.634 9.338 9.940 11.167 12.432 13.043 12.542 11.013 9.135 7.855 + 13.269 13.997 15.087 16.039 16.507 16.433 15.964 15.270 14.451 13.594 12.887 12.614 12.984 13.909 14.955 15.553 15.367 14.543 13.639 13.243 13.559 14.243 14.623 14.157 12.810 11.111 9.842 9.576 10.354 11.679 12.793 13.082 12.357 10.920 9.390 8.421 + 13.572 14.067 14.898 15.778 16.367 16.417 15.887 14.967 13.961 13.121 12.551 12.250 12.222 12.525 13.192 14.107 14.985 15.530 15.639 15.489 15.369 15.399 15.370 14.885 13.711 12.073 10.615 10.023 10.573 11.917 13.272 13.870 13.373 12.026 10.487 9.486 + 13.596 13.947 14.630 15.506 16.259 16.506 16.041 15.002 13.809 12.886 12.396 12.207 12.098 12.002 12.085 12.567 13.501 14.682 15.788 16.588 17.025 17.120 16.825 16.013 14.649 12.987 11.576 10.996 11.483 12.727 13.993 14.523 13.950 12.492 10.825 9.735 + 13.543 13.843 14.469 15.339 16.168 16.551 16.213 15.227 13.996 12.992 12.448 12.252 12.123 11.897 11.686 11.785 12.428 13.593 15.023 16.383 17.417 17.974 17.953 17.274 15.975 14.334 12.874 12.163 12.491 13.635 14.918 15.549 15.062 13.596 11.838 10.661 + 13.448 13.648 14.161 15.010 15.943 16.490 16.266 15.277 13.952 12.854 12.291 12.142 12.041 11.737 11.334 11.208 11.702 12.844 14.335 15.757 16.813 17.408 17.542 17.187 16.309 15.011 13.654 12.770 12.766 13.606 14.737 15.359 14.901 13.404 11.547 10.281 + 13.381 13.556 14.038 14.882 15.872 16.549 16.492 15.634 14.343 13.178 12.503 12.263 12.111 11.756 11.253 10.980 11.335 12.402 13.863 15.216 16.105 16.492 16.557 16.442 16.115 15.459 14.512 13.596 13.168 13.475 14.280 14.941 14.820 13.763 12.266 11.190 + 13.524 13.545 13.844 14.628 15.745 16.672 16.854 16.126 14.856 13.675 13.011 12.811 12.675 12.266 11.652 11.280 11.607 12.710 14.189 15.449 16.100 16.164 15.948 15.713 15.470 15.044 14.351 13.583 13.128 13.246 13.796 14.255 14.072 13.098 11.758 10.801 + 13.197 13.242 13.531 14.246 15.311 16.327 16.789 16.423 15.399 14.226 13.399 13.054 12.926 12.636 12.092 11.631 11.774 12.768 14.297 15.647 16.199 15.867 15.112 14.523 14.342 14.338 14.127 13.620 13.158 13.174 13.701 14.193 13.901 12.536 10.627 9.245 + 12.909 12.923 13.162 13.836 14.903 15.999 16.623 16.465 15.634 14.582 13.775 13.368 13.143 12.781 12.231 11.842 12.096 13.160 14.635 15.770 16.002 15.375 14.483 13.959 13.959 14.098 13.889 13.278 12.753 12.889 13.709 14.492 14.272 12.668 10.345 8.648 + 12.878 12.847 13.042 13.719 14.833 15.977 16.624 16.492 15.732 14.790 14.067 13.653 13.353 12.968 12.559 12.453 12.957 14.030 15.212 15.896 15.760 14.992 14.135 13.666 13.662 13.814 13.765 13.453 13.154 13.178 13.490 13.637 13.075 11.662 9.900 8.676 + 12.706 12.673 12.895 13.648 14.863 16.080 16.737 16.567 15.771 14.831 14.134 13.735 13.438 13.101 12.848 12.988 13.700 14.778 15.682 15.900 15.323 14.331 13.505 13.191 13.283 13.376 13.159 12.693 12.345 12.418 12.805 12.990 12.423 10.995 9.232 8.018 + 12.488 12.456 12.716 13.561 14.876 16.118 16.686 16.366 15.462 14.510 13.857 13.476 13.156 12.843 12.772 13.233 14.215 15.263 15.749 15.340 14.273 13.184 12.620 12.644 12.845 12.728 12.160 11.487 11.235 11.661 12.487 13.066 12.829 11.710 10.231 9.198 + 11.965 11.991 12.351 13.292 14.627 15.768 16.146 15.651 14.688 13.802 13.252 12.921 12.619 12.413 12.619 13.425 14.531 15.224 14.896 13.590 12.059 11.239 11.538 12.526 13.288 13.132 12.095 10.866 10.233 10.528 11.459 12.395 12.823 12.638 12.124 11.716 + 11.583 11.803 12.319 13.156 14.163 15.012 15.365 15.072 14.264 13.276 12.469 12.081 12.186 12.712 13.477 14.195 14.522 14.180 13.145 11.747 10.574 10.177 10.741 11.947 13.157 13.792 13.675 13.095 12.566 12.462 12.771 13.153 13.213 12.807 12.148 11.656 + 12.640 12.912 13.400 14.044 14.799 15.555 16.059 15.987 15.190 13.925 12.810 12.447 12.986 13.993 14.763 14.827 14.217 13.300 12.372 11.458 10.485 9.621 9.342 10.071 11.686 13.433 14.418 14.319 13.652 13.299 13.667 14.257 14.072 12.571 10.299 8.601 + 13.113 13.200 13.472 14.066 15.020 16.132 16.941 16.959 16.048 14.645 13.563 13.444 14.256 15.288 15.680 15.069 13.806 12.562 11.727 11.164 10.542 9.870 9.637 10.352 11.925 13.538 14.260 13.887 13.187 13.227 14.300 15.476 15.285 13.039 9.647 7.128 + 13.012 12.984 13.152 13.791 14.965 16.344 17.298 17.271 16.233 14.817 13.941 14.129 15.067 15.803 15.500 14.113 12.413 11.301 11.042 11.105 10.787 9.991 9.410 9.857 11.399 13.137 13.953 13.568 12.872 13.126 14.670 16.374 16.446 14.026 10.170 7.264 + 12.694 12.730 13.027 13.822 15.092 16.424 17.199 17.006 16.005 14.905 14.486 14.970 15.774 15.913 14.790 12.745 10.834 9.994 10.286 10.880 10.839 9.990 9.087 9.097 10.259 11.810 12.685 12.537 12.109 12.510 14.039 15.652 15.715 13.454 9.862 7.161 + 12.557 12.626 13.000 13.886 15.163 16.340 16.853 16.492 15.608 14.886 14.819 15.287 15.607 15.059 13.492 11.502 10.008 9.555 9.905 10.293 10.107 9.429 8.930 9.226 10.275 11.391 11.885 11.761 11.764 12.670 14.417 15.895 15.717 13.404 10.001 7.513 + 12.301 12.550 13.119 14.028 15.118 16.046 16.457 16.235 15.629 15.110 15.007 15.194 15.134 14.288 12.615 10.706 9.396 9.115 9.540 9.881 9.591 8.891 8.592 9.337 10.925 12.367 12.710 11.912 10.965 11.045 12.404 13.983 14.194 12.292 9.157 6.778 + 11.908 12.336 13.106 14.043 14.915 15.494 15.655 15.458 15.123 14.879 14.763 14.534 13.819 12.447 10.696 9.206 8.547 8.754 9.247 9.280 8.598 7.733 7.617 8.758 10.690 12.227 12.394 11.284 10.050 9.966 11.285 12.905 13.201 11.401 8.363 6.046 + 11.502 12.146 13.139 14.075 14.656 14.822 14.718 14.554 14.470 14.450 14.317 13.809 12.733 11.156 9.477 8.271 7.928 8.325 8.841 8.801 8.055 7.192 7.127 8.320 10.268 11.788 11.939 10.848 9.680 9.692 11.105 12.781 13.075 11.220 8.109 5.740 + 11.105 12.053 13.390 14.410 14.746 14.542 14.232 14.148 14.292 14.402 14.176 13.441 12.207 10.654 9.118 8.023 7.680 8.038 8.610 8.762 8.231 7.434 7.218 8.145 9.902 11.420 11.712 10.749 9.584 9.489 10.802 12.494 12.939 11.302 8.381 6.119 + 10.845 11.987 13.516 14.534 14.676 14.284 13.974 14.053 14.304 14.270 13.686 12.646 11.421 10.204 9.077 8.164 7.696 7.815 8.310 8.650 8.416 7.774 7.458 8.147 9.756 11.333 11.805 10.964 9.768 9.556 10.811 12.575 13.157 11.609 8.683 6.379 + 10.473 11.679 13.268 14.287 14.407 14.070 13.958 14.305 14.711 14.563 13.624 12.217 10.891 9.952 9.327 8.819 8.406 8.230 8.320 8.439 8.290 7.918 7.817 8.516 9.984 11.461 12.029 11.444 10.463 10.231 11.213 12.643 13.092 11.732 9.194 7.197 + 10.655 11.615 12.964 14.011 14.444 14.470 14.512 14.769 15.039 14.921 14.179 12.921 11.505 10.287 9.470 9.102 9.127 9.380 9.582 9.451 8.949 8.429 8.472 9.413 10.956 12.259 12.558 11.821 10.849 10.634 11.476 12.626 12.857 11.528 9.243 7.485 + 11.203 11.596 12.341 13.319 14.323 15.125 15.587 15.732 15.685 15.538 15.238 14.634 13.638 12.387 11.223 10.486 10.266 10.331 10.312 10.020 9.635 9.581 10.170 11.299 12.454 13.072 12.971 12.522 12.375 12.928 13.952 14.681 14.360 12.845 10.811 9.374 + 11.476 11.422 11.675 12.573 14.024 15.489 16.381 16.533 16.299 16.188 16.368 16.485 15.992 14.686 12.974 11.610 11.121 11.406 11.848 11.860 11.366 10.845 10.885 11.666 12.793 13.629 13.824 13.597 13.525 14.013 14.890 15.477 15.087 13.600 11.654 10.292 + 11.370 11.130 11.137 11.898 13.429 15.163 16.368 16.707 16.457 16.195 16.250 16.412 16.153 15.152 13.649 12.297 11.644 11.692 11.930 11.797 11.195 10.577 10.559 11.376 12.658 13.720 14.119 14.003 13.945 14.403 15.252 15.797 15.296 13.604 11.413 9.881 + 11.414 11.145 11.036 11.577 12.892 14.589 16.026 16.758 16.814 16.586 16.439 16.391 16.131 15.352 14.095 12.787 11.934 11.710 11.832 11.814 11.412 10.854 10.659 11.179 12.270 13.392 14.061 14.254 14.393 14.901 15.704 16.156 15.518 13.630 11.219 9.536 + 11.494 11.248 11.100 11.484 12.597 14.213 15.793 16.811 17.084 16.851 16.529 16.354 16.193 15.703 14.700 13.397 12.296 11.787 11.817 11.940 11.730 11.182 10.744 10.915 11.779 12.911 13.762 14.160 14.445 15.067 15.996 16.545 15.854 13.694 10.886 8.908 + 11.649 11.422 11.250 11.520 12.465 13.968 15.578 16.756 17.210 17.074 16.760 16.598 16.554 16.275 15.445 14.134 12.810 11.978 11.770 11.850 11.752 11.336 10.929 11.013 11.745 12.783 13.595 13.968 14.193 14.720 15.575 16.129 15.541 13.543 10.893 9.011 + 11.664 11.519 11.384 11.531 12.226 13.525 15.134 16.506 17.175 17.085 16.634 16.328 16.347 16.380 15.922 14.770 13.265 12.044 11.524 11.577 11.705 11.541 11.191 11.104 11.610 12.583 13.564 14.205 14.576 14.997 15.567 15.884 15.319 13.646 11.458 9.905 + 11.791 11.629 11.456 11.555 12.210 13.494 15.103 16.447 17.021 16.782 16.206 15.906 16.105 16.425 16.212 15.124 13.478 12.021 11.325 11.350 11.553 11.431 10.985 10.683 10.980 11.879 12.932 13.660 13.952 14.048 14.153 14.110 13.509 12.162 10.472 9.281 + 11.918 11.752 11.553 11.587 12.141 13.315 14.830 16.101 16.606 16.291 15.652 15.352 15.658 16.185 16.202 15.265 13.632 12.082 11.289 11.308 11.598 11.564 11.086 10.587 10.598 11.262 12.220 12.957 13.225 13.149 12.954 12.654 12.032 10.962 9.704 8.833 + 11.765 11.560 11.297 11.264 11.776 12.929 14.396 15.528 15.781 15.172 14.332 14.027 14.502 15.236 15.351 14.377 12.688 11.211 10.655 10.944 11.353 11.210 10.503 9.855 9.905 10.715 11.740 12.354 12.389 12.175 12.077 12.037 11.619 10.520 9.032 7.948 + 11.556 11.495 11.356 11.259 11.505 12.337 13.590 14.642 14.842 14.107 13.102 12.746 13.409 14.531 15.060 14.364 12.785 11.329 10.767 10.996 11.246 10.919 10.213 9.926 10.618 11.969 13.003 12.963 12.019 11.088 10.936 11.428 11.666 10.909 9.368 8.108 + 11.423 11.483 11.482 11.421 11.577 12.272 13.448 14.500 14.684 13.790 12.454 11.727 12.203 13.488 14.514 14.443 13.339 12.020 11.267 11.164 11.194 10.925 10.548 10.680 11.634 12.922 13.573 13.025 11.707 10.701 10.730 11.435 11.676 10.622 8.627 7.031 + 11.384 11.381 11.341 11.337 11.596 12.313 13.347 14.162 14.166 13.218 11.840 10.873 10.846 11.591 12.458 12.912 12.940 12.912 13.075 13.248 13.041 12.378 11.723 11.714 12.493 13.427 13.585 12.584 11.018 9.985 10.097 10.865 11.099 9.998 7.961 6.348 + 11.253 11.274 11.239 11.169 11.278 11.790 12.620 13.276 13.189 12.212 10.826 9.798 9.585 10.023 10.606 11.047 11.535 12.407 13.581 14.400 14.162 12.865 11.403 10.892 11.665 12.885 13.233 12.102 10.200 8.946 9.160 10.244 10.670 9.394 6.898 4.897 + 11.395 11.416 11.346 11.164 11.079 11.353 11.970 12.501 12.403 11.503 10.195 9.120 8.622 8.523 8.462 8.432 8.897 10.280 12.295 13.877 13.948 12.415 10.430 9.544 10.408 12.172 13.199 12.489 10.553 8.916 8.702 9.606 10.213 9.376 7.360 5.662 + 11.080 11.297 11.447 11.278 10.880 10.625 10.791 11.239 11.483 11.110 10.152 9.058 8.305 8.039 8.080 8.252 8.641 9.469 10.708 11.861 12.228 11.480 10.029 8.788 8.488 9.119 9.996 10.378 10.074 9.516 9.265 9.469 9.782 9.771 9.382 8.989 + 10.992 11.300 11.578 11.486 11.024 10.534 10.361 10.500 10.582 10.230 9.427 8.554 8.044 7.993 8.106 8.035 7.773 7.712 8.265 9.392 10.484 10.756 9.851 8.165 6.612 6.014 6.588 7.878 9.138 9.818 9.818 9.407 8.943 8.645 8.537 8.525 + 10.548 10.968 11.376 11.303 10.686 9.921 9.500 9.565 9.783 9.667 9.019 8.105 7.410 7.219 7.408 7.624 7.654 7.618 7.807 8.327 8.905 9.041 8.404 7.129 5.771 4.965 5.053 5.932 7.182 8.310 8.951 8.949 8.353 7.391 6.420 5.813 + 9.919 10.248 10.622 10.697 10.340 9.720 9.160 8.876 8.809 8.687 8.242 7.420 6.426 5.598 5.204 5.304 5.746 6.259 6.593 6.618 6.364 5.980 5.643 5.455 5.400 5.396 5.395 5.464 5.737 6.282 6.967 7.482 7.521 7.022 6.260 5.702 + 9.315 9.556 9.807 9.786 9.386 8.774 8.289 8.186 8.431 8.690 8.554 7.838 6.747 5.761 5.314 5.501 6.007 6.343 6.190 5.617 5.008 4.764 5.010 5.516 5.881 5.828 5.390 4.878 4.668 4.969 5.734 6.723 7.657 8.358 8.779 8.965 + 8.983 9.084 9.129 8.955 8.558 8.121 7.888 7.981 8.321 8.695 8.894 8.814 8.475 7.975 7.464 7.104 7.024 7.234 7.575 7.786 7.681 7.308 6.947 6.906 7.274 7.827 8.208 8.215 7.989 7.903 8.266 9.083 10.061 10.853 11.300 11.462 + 9.202 9.169 9.120 9.088 9.107 9.193 9.328 9.476 9.614 9.742 9.852 9.890 9.763 9.427 8.981 8.663 8.703 9.121 9.648 9.892 9.646 9.090 8.690 8.835 9.503 10.252 10.573 10.314 9.820 9.640 10.047 10.791 11.305 11.198 10.602 10.062 + 9.135 9.266 9.525 9.865 10.177 10.334 10.274 10.056 9.805 9.599 9.393 9.072 8.602 8.146 8.013 8.435 9.337 10.299 10.790 10.525 9.696 8.865 8.597 9.066 9.944 10.644 10.742 10.273 9.678 9.465 9.840 10.586 11.265 11.558 11.481 11.312 + 10.214 10.468 10.969 11.639 12.282 12.650 12.589 12.148 11.539 10.976 10.528 10.133 9.745 9.471 9.537 10.073 10.910 11.591 11.651 10.973 9.932 9.183 9.210 9.981 10.961 11.496 11.285 10.586 10.009 10.059 10.763 11.668 12.187 12.036 11.434 10.915 + 10.079 10.557 11.456 12.571 13.518 13.886 13.508 12.604 11.639 10.986 10.686 10.522 10.326 10.223 10.539 11.435 12.609 13.389 13.202 12.047 10.564 9.608 9.645 10.452 11.330 11.655 11.314 10.713 10.413 10.702 11.420 12.136 12.467 12.322 11.916 11.590 + 10.139 10.650 11.545 12.561 13.356 13.648 13.371 12.719 12.011 11.476 11.130 10.867 10.654 10.635 11.002 11.737 12.481 12.697 12.055 10.739 9.390 8.698 8.948 9.838 10.733 11.118 10.930 10.517 10.331 10.587 11.149 11.681 11.900 11.754 11.418 11.157 + 10.069 10.489 11.253 12.157 12.875 13.102 12.745 12.005 11.228 10.655 10.284 9.978 9.711 9.664 10.064 10.873 11.670 11.882 11.224 9.972 8.805 8.329 8.667 9.442 10.144 10.526 10.699 10.903 11.204 11.452 11.488 11.377 11.386 11.725 12.300 12.750 + 10.734 10.439 10.045 9.764 9.667 9.672 9.697 9.772 9.979 10.292 10.501 10.367 9.881 9.367 9.262 9.736 10.489 10.940 10.691 9.869 9.046 8.786 9.221 9.999 10.627 10.889 10.963 11.185 11.706 12.380 12.937 13.266 13.483 13.766 14.135 14.413 + 8.839 9.167 9.539 9.634 9.380 9.029 8.959 9.356 10.030 10.542 10.521 9.958 9.217 8.779 8.898 9.431 9.965 10.119 9.814 9.304 8.979 9.091 9.605 10.255 10.750 10.967 11.004 11.088 11.414 12.027 12.817 13.597 14.211 14.597 14.784 14.849 + 10.660 10.523 10.188 9.648 9.041 8.615 8.567 8.890 9.377 9.772 9.941 9.933 9.891 9.916 10.016 10.137 10.233 10.278 10.236 10.067 9.791 9.544 9.536 9.895 10.517 11.102 11.373 11.341 11.340 11.783 12.802 14.089 15.099 15.463 15.274 14.978 + 9.865 9.873 9.919 10.014 10.103 10.087 9.910 9.628 9.390 9.331 9.470 9.697 9.873 9.958 10.054 10.305 10.750 11.234 11.484 11.295 10.698 9.960 9.432 9.338 9.655 10.180 10.695 11.125 11.557 12.133 12.912 13.808 14.640 15.253 15.603 15.746 + 9.916 9.983 10.091 10.192 10.236 10.201 10.131 10.112 10.216 10.427 10.629 10.686 10.551 10.327 10.212 10.358 10.748 11.196 11.461 11.407 11.084 10.675 10.373 10.269 10.343 10.528 10.797 11.181 11.736 12.471 13.328 14.199 14.973 15.574 15.972 16.167 + 12.502 11.945 11.240 10.847 10.890 11.093 11.085 10.774 10.431 10.408 10.770 11.190 11.234 10.774 10.149 9.905 10.339 11.230 11.999 12.161 11.688 10.998 10.608 10.747 11.236 11.693 11.866 11.808 11.800 12.121 12.848 13.837 14.837 15.640 16.159 16.402 + 8.762 9.057 9.524 9.952 10.120 9.929 9.503 9.154 9.196 9.717 10.470 11.015 11.023 10.527 9.917 9.673 10.032 10.821 11.598 11.965 11.830 11.426 11.112 11.121 11.433 11.859 12.209 12.434 12.637 12.968 13.522 14.276 15.116 15.893 16.481 16.794 + 10.212 9.839 9.442 9.385 9.697 10.049 10.074 9.723 9.322 9.266 9.653 10.203 10.525 10.486 10.317 10.377 10.808 11.402 11.807 11.859 11.716 11.692 11.947 12.348 12.619 12.614 12.473 12.498 12.897 13.624 14.445 15.136 15.621 15.953 16.188 16.323 + 9.166 8.813 8.492 8.607 9.195 9.870 10.155 9.899 9.401 9.137 9.339 9.798 10.069 9.875 9.369 9.020 9.258 10.163 11.434 12.608 13.341 13.526 13.259 12.728 12.139 11.683 11.499 11.609 11.906 12.236 12.534 12.888 13.458 14.284 15.167 15.750 + 6.857 6.720 6.554 6.493 6.589 6.756 6.821 6.662 6.329 6.040 6.023 6.317 6.705 6.874 6.702 6.424 6.512 7.301 8.659 9.977 10.544 10.028 8.711 7.279 6.346 6.079 6.198 6.302 6.231 6.152 6.360 6.982 7.876 8.748 9.370 9.672 + 4.184 4.285 4.412 4.499 4.572 4.722 5.000 5.335 5.581 5.648 5.597 5.589 5.725 5.932 6.004 5.783 5.313 4.819 4.529 4.491 4.545 4.471 4.171 3.729 3.315 3.044 2.917 2.900 3.013 3.340 3.933 4.714 5.487 6.061 6.369 6.478 + 2.108 2.638 3.650 4.950 6.155 6.840 6.814 6.289 5.755 5.630 5.947 6.355 6.423 6.000 5.320 4.783 4.622 4.740 4.846 4.726 4.400 4.054 3.829 3.695 3.516 3.219 2.893 2.726 2.854 3.272 3.871 4.551 5.266 5.984 6.608 6.982 + 6.583 6.951 7.648 8.575 9.560 10.407 10.969 11.196 11.116 10.772 10.199 9.454 8.680 8.084 7.837 7.946 8.225 8.427 8.435 8.362 8.459 8.894 9.580 10.206 10.452 10.211 9.653 9.081 8.721 8.595 8.568 8.490 8.310 8.078 7.878 7.767 + 8.140 8.257 8.668 9.511 10.658 11.731 12.348 12.404 12.125 11.851 11.750 11.715 11.518 11.071 10.537 10.202 10.237 10.577 11.025 11.459 11.941 12.610 13.474 14.301 14.735 14.549 13.828 12.931 12.257 12.006 12.094 12.266 12.291 12.106 11.817 11.606 + 10.874 11.130 11.658 12.415 13.223 13.794 13.854 13.321 12.380 11.398 10.708 10.421 10.392 10.383 10.290 10.244 10.517 11.277 12.415 13.574 14.379 14.678 14.604 14.425 14.306 14.202 13.947 13.459 12.856 12.382 12.207 12.285 12.405 12.378 12.198 12.027 + 11.935 12.149 12.640 13.457 14.521 15.560 16.167 16.015 15.099 13.806 12.702 12.165 12.156 12.325 12.393 12.457 12.900 13.972 15.413 16.527 16.700 15.941 14.922 14.437 14.719 15.246 15.231 14.377 13.193 12.557 12.882 13.671 13.902 12.941 11.183 9.799 + 12.003 12.015 12.240 12.916 14.093 15.494 16.590 16.885 16.241 14.993 13.749 12.988 12.795 12.918 13.105 13.377 13.973 15.001 16.162 16.856 16.661 15.750 14.821 14.537 14.939 15.395 15.181 14.196 13.138 12.915 13.765 14.908 15.105 13.721 11.379 9.585 + 11.894 11.829 11.915 12.433 13.518 14.999 16.422 17.257 17.178 16.256 14.913 13.691 12.979 12.883 13.283 13.984 14.804 15.574 16.098 16.209 15.890 15.347 14.908 14.783 14.880 14.876 14.520 13.913 13.480 13.611 14.244 14.801 14.575 13.323 11.566 10.296 + 11.849 11.901 12.083 12.538 13.393 14.629 15.982 16.990 17.212 16.511 15.184 13.824 12.998 12.964 13.596 14.540 15.434 16.041 16.259 16.095 15.651 15.131 14.763 14.662 14.724 14.700 14.431 14.047 13.916 14.315 15.085 15.608 15.212 13.733 11.772 10.386 + 11.999 12.214 12.571 13.036 13.682 14.620 15.802 16.907 17.451 17.100 15.948 14.530 13.532 13.387 14.050 15.086 15.969 16.377 16.297 15.932 15.526 15.236 15.078 14.961 14.761 14.422 14.042 13.864 14.128 14.840 15.633 15.888 15.116 13.354 11.278 9.880 + 11.793 12.064 12.496 13.020 13.706 14.673 15.859 16.897 17.278 16.721 15.447 14.095 13.328 13.426 14.179 15.110 15.815 16.135 16.100 15.801 15.338 14.861 14.564 14.557 14.733 14.812 14.602 14.261 14.245 14.890 15.961 16.606 15.917 13.696 10.821 8.805 + 11.801 11.990 12.344 12.877 13.674 14.776 16.022 17.006 17.269 16.622 15.326 13.982 13.177 13.165 13.796 14.703 15.537 16.076 16.204 15.884 15.207 14.446 13.965 13.971 14.320 14.593 14.467 14.058 13.890 14.410 15.452 16.157 15.548 13.370 10.490 8.452 + 11.509 11.477 11.613 12.180 13.301 14.808 16.256 17.119 17.061 16.127 14.719 13.385 12.563 12.433 12.934 13.854 14.905 15.750 16.061 15.662 14.692 13.606 12.943 12.958 13.427 13.815 13.734 13.302 13.074 13.527 14.528 15.274 14.846 12.987 10.467 8.672 + 11.850 11.460 11.208 11.694 13.050 14.767 16.018 16.224 15.402 14.073 12.828 11.959 11.417 11.082 11.008 11.413 12.389 13.641 14.536 14.502 13.461 11.946 10.763 10.436 10.870 11.476 11.666 11.303 10.750 10.513 10.774 11.223 11.325 10.793 9.867 9.152 + 10.302 9.838 9.355 9.329 9.842 10.531 10.945 10.942 10.734 10.567 10.386 9.873 8.842 7.597 6.849 7.184 8.536 10.149 11.112 11.033 10.294 9.696 9.805 10.554 11.392 11.786 11.629 11.230 10.982 11.029 11.218 11.291 11.123 10.781 10.435 10.226 + 12.960 12.274 11.321 10.606 10.334 10.303 10.140 9.642 8.916 8.230 7.754 7.444 7.180 6.985 7.073 7.656 8.690 9.810 10.560 10.746 10.605 10.637 11.235 12.390 13.708 14.687 15.045 14.835 14.336 13.826 13.429 13.120 12.826 12.520 12.245 12.080 + 13.802 13.319 12.488 11.511 10.562 9.757 9.154 8.786 8.639 8.625 8.586 8.380 7.997 7.615 7.507 7.857 8.604 9.458 10.108 10.464 10.749 11.336 12.454 13.961 15.378 16.185 16.154 15.497 14.715 14.258 14.243 14.428 14.447 14.108 13.550 13.125 + 13.186 12.746 11.983 11.094 10.283 9.691 9.352 9.197 9.105 8.973 8.763 8.510 8.286 8.169 8.211 8.422 8.779 9.237 9.759 10.357 11.095 12.057 13.251 14.542 15.665 16.344 16.467 16.174 15.781 15.581 15.646 15.789 15.737 15.361 14.806 14.397 + 9.688 9.521 9.159 8.645 8.175 8.027 8.363 9.061 9.740 9.993 9.663 8.944 8.257 7.972 8.208 8.818 9.536 10.164 10.666 11.154 11.800 12.729 13.942 15.274 16.427 17.097 17.143 16.706 16.144 15.820 15.860 16.078 16.143 15.862 15.350 14.949 + 9.917 9.547 9.020 8.618 8.505 8.647 8.869 8.993 8.934 8.708 8.372 7.988 7.639 7.461 7.629 8.262 9.316 10.569 11.731 12.613 13.243 13.823 14.560 15.499 16.473 17.219 17.549 17.474 17.169 16.840 16.589 16.377 16.105 15.731 15.334 15.073 + 9.888 9.134 8.098 7.402 7.416 8.068 8.961 9.664 9.932 9.753 9.256 8.625 8.074 7.822 8.030 8.689 9.602 10.494 11.211 11.820 12.521 13.442 14.491 15.424 16.048 16.376 16.583 16.806 16.988 16.930 16.512 15.852 15.256 14.981 15.025 15.160 + 13.552 12.774 11.672 10.776 10.293 10.034 9.707 9.246 8.850 8.723 8.814 8.859 8.686 8.467 8.609 9.366 10.546 11.625 12.199 12.351 12.585 13.353 14.623 15.884 16.579 16.568 16.202 15.951 15.984 16.074 15.901 15.419 14.915 14.719 14.871 15.094 + 14.017 13.115 11.868 10.931 10.564 10.535 10.451 10.168 9.854 9.703 9.636 9.350 8.684 7.918 7.647 8.289 9.674 11.128 12.012 12.240 12.300 12.767 13.748 14.777 15.229 14.878 14.074 13.415 13.249 13.457 13.666 13.640 13.461 13.359 13.429 13.549 + 14.276 13.182 11.635 10.421 9.897 9.838 9.766 9.431 8.981 8.722 8.746 8.823 8.667 8.289 8.065 8.424 9.434 10.686 11.590 11.836 11.603 11.357 11.443 11.834 12.222 12.338 12.171 11.916 11.759 11.712 11.663 11.531 11.361 11.259 11.266 11.313 + 14.017 13.090 11.916 11.324 11.672 12.632 13.513 13.796 13.443 12.773 12.111 11.574 11.133 10.821 10.796 11.183 11.859 12.454 12.613 12.290 11.798 11.547 11.693 12.019 12.133 11.814 11.186 10.580 10.241 10.147 10.072 9.807 9.326 8.772 8.320 8.079 + 13.498 13.243 12.916 12.779 13.012 13.568 14.173 14.466 14.223 13.510 12.624 11.892 11.478 11.361 11.467 11.783 12.314 12.930 13.291 13.040 12.132 11.010 10.365 10.605 11.454 12.083 11.762 10.496 9.098 8.544 9.140 10.197 10.564 9.598 7.762 6.316 + 13.077 12.702 12.246 12.098 12.477 13.261 14.047 14.385 14.054 13.180 12.138 11.319 10.935 10.992 11.376 11.954 12.572 13.002 12.979 12.375 11.390 10.552 10.412 11.116 12.197 12.835 12.454 11.194 9.856 9.292 9.717 10.509 10.694 9.765 8.142 6.890 + 12.623 12.406 12.101 11.918 12.042 12.491 13.045 13.321 13.004 12.077 10.882 9.937 9.630 10.009 10.802 11.609 12.106 12.139 11.712 10.977 10.242 9.910 10.286 11.308 12.441 12.927 12.291 10.749 9.140 8.357 8.674 9.529 9.970 9.427 8.192 7.181 + 12.374 12.182 11.900 11.669 11.581 11.613 11.635 11.473 11.020 10.297 9.455 8.706 8.245 8.177 8.491 9.053 9.631 9.971 9.928 9.592 9.302 9.478 10.320 11.588 12.646 12.843 11.976 10.513 9.332 9.137 9.942 11.042 11.527 10.963 9.733 8.748 + 12.210 12.189 12.048 11.736 11.375 11.175 11.222 11.324 11.132 10.437 9.394 8.449 8.021 8.218 8.809 9.441 9.881 10.088 10.118 10.048 9.999 10.186 10.811 11.821 12.747 12.915 11.973 10.327 9.027 9.049 10.485 12.343 13.225 12.415 10.491 8.921 + 11.640 11.203 10.650 10.400 10.664 11.281 11.790 11.736 10.978 9.817 8.831 8.528 9.064 10.189 11.434 12.379 12.813 12.733 12.248 11.534 10.831 10.418 10.483 10.955 11.465 11.555 11.032 10.193 9.670 9.951 10.930 11.881 11.956 10.849 9.110 7.817 + 11.804 11.642 11.459 11.477 11.864 12.589 13.351 13.701 13.313 12.245 10.974 10.141 10.157 10.969 12.128 13.103 13.585 13.570 13.236 12.767 12.289 11.900 11.700 11.714 11.815 11.766 11.422 10.924 10.664 10.971 11.754 12.446 12.367 11.285 9.687 8.517 + 11.338 11.252 11.145 11.189 11.615 12.515 13.631 14.374 14.179 12.957 11.277 10.049 9.922 10.869 12.266 13.383 13.855 13.772 13.412 12.954 12.432 11.918 11.616 11.711 12.102 12.367 12.103 11.366 10.748 10.907 11.898 12.948 12.968 11.478 9.139 7.388 + 11.357 11.171 10.991 11.126 11.837 13.115 14.554 15.487 15.369 14.174 12.490 11.190 10.894 11.607 12.798 13.815 14.281 14.206 13.799 13.250 12.675 12.214 12.061 12.323 12.836 13.182 12.993 12.312 11.637 11.526 12.055 12.637 12.433 11.083 9.118 7.676 + 11.434 11.398 11.480 11.890 12.734 13.874 14.918 15.390 15.016 13.938 12.677 11.849 11.801 12.436 13.321 13.991 14.194 13.943 13.407 12.788 12.280 12.074 12.285 12.816 13.300 13.269 12.502 11.291 10.331 10.234 11.013 11.986 12.246 11.376 9.830 8.638 + 9.797 10.400 11.275 12.045 12.575 12.970 13.318 13.465 13.112 12.163 10.990 10.283 10.547 11.660 12.891 13.401 12.835 11.540 10.260 9.592 9.651 10.130 10.624 10.883 10.844 10.521 9.961 9.308 8.834 8.812 9.285 9.938 10.289 10.052 9.402 8.856 + 9.234 9.830 10.694 11.441 11.898 12.116 12.153 11.891 11.147 9.981 8.873 8.493 9.188 10.608 11.852 12.074 11.098 9.531 8.309 8.037 8.640 9.541 10.147 10.204 9.821 9.237 8.632 8.117 7.811 7.832 8.164 8.573 8.706 8.374 7.742 7.243 + 7.543 7.680 7.669 7.283 6.667 6.265 6.389 6.849 7.054 6.528 5.402 4.382 4.196 4.972 6.106 6.735 6.414 5.433 4.531 4.289 4.739 5.451 5.950 6.063 5.930 5.770 5.685 5.655 5.672 5.787 6.016 6.229 6.194 5.788 5.165 4.698 + 7.255 7.312 7.181 6.697 6.069 5.765 6.068 6.716 7.035 6.509 5.284 4.130 3.842 4.578 5.720 6.368 6.046 5.035 4.076 3.760 4.135 4.805 5.350 5.654 5.860 6.108 6.340 6.377 6.133 5.731 5.386 5.197 5.077 4.884 4.603 4.384 + 6.917 7.035 7.222 7.420 7.604 7.753 7.786 7.549 6.894 5.823 4.581 3.577 3.167 3.428 4.091 4.701 4.897 4.616 4.105 3.734 3.759 4.196 4.850 5.463 5.857 5.990 5.927 5.767 5.587 5.421 5.271 5.124 4.972 4.820 4.692 4.617 + 6.603 6.764 6.959 7.066 7.079 7.093 7.147 7.109 6.728 5.850 4.618 3.457 2.830 2.928 3.542 4.208 4.520 4.378 4.009 3.779 3.954 4.554 5.373 6.105 6.492 6.434 6.041 5.591 5.392 5.605 6.117 6.588 6.667 6.241 5.547 5.029 + 5.894 6.961 8.392 9.327 9.382 8.852 8.346 8.232 8.367 8.312 7.793 6.956 6.236 5.985 6.215 6.660 7.033 7.236 7.336 7.434 7.558 7.706 7.910 8.221 8.607 8.917 8.994 8.875 8.837 9.197 9.990 10.838 11.186 10.756 9.830 9.087 + 9.889 9.234 8.317 7.668 7.630 8.166 8.926 9.473 9.526 9.070 8.326 7.631 7.288 7.441 8.006 8.695 9.161 9.198 8.886 8.544 8.513 8.907 9.523 9.996 10.072 9.792 9.436 9.287 9.418 9.670 9.824 9.794 9.665 9.581 9.599 9.651 + 9.746 9.531 9.394 9.668 10.438 11.454 12.301 12.667 12.499 11.962 11.294 10.714 10.401 10.499 11.048 11.891 12.683 13.065 12.915 12.462 12.135 12.236 12.705 13.171 13.261 12.898 12.343 11.961 11.921 12.084 12.150 11.914 11.403 10.815 10.350 10.108 + 10.544 10.282 10.188 10.754 12.098 13.827 15.281 15.941 15.685 14.756 13.550 12.438 11.719 11.607 12.164 13.184 14.202 14.715 14.514 13.862 13.318 13.315 13.819 14.353 14.388 13.768 12.834 12.149 12.059 12.460 12.905 12.956 12.462 11.609 10.757 10.239 + 11.066 10.835 10.755 11.257 12.435 13.943 15.231 15.891 15.839 15.235 14.306 13.266 12.370 11.945 12.255 13.256 14.498 15.339 15.373 14.742 14.034 13.830 14.255 14.888 15.121 14.647 13.681 12.762 12.318 12.370 12.576 12.532 12.057 11.278 10.500 10.026 + 10.970 10.871 10.917 11.396 12.410 13.760 15.051 15.889 16.058 15.569 14.617 13.510 12.614 12.263 12.630 13.602 14.769 15.608 15.774 15.323 14.684 14.358 14.574 15.121 15.515 15.356 14.626 13.702 13.072 12.973 13.220 13.336 12.903 11.874 10.641 9.806 + 10.536 10.494 10.611 11.129 12.137 13.471 14.779 15.689 15.968 15.589 14.716 13.638 12.714 12.286 12.554 13.453 14.611 15.493 15.691 15.190 14.406 13.926 14.091 14.729 15.260 15.128 14.258 13.165 12.600 12.956 13.892 14.492 13.893 11.959 9.491 7.776 + 10.015 10.256 10.692 11.298 12.109 13.176 14.434 15.619 16.327 16.234 15.315 13.937 12.711 12.198 12.629 13.780 15.088 15.936 15.974 15.311 14.453 14.000 14.252 14.974 15.529 15.330 14.326 13.134 12.644 13.325 14.746 15.741 15.186 12.870 9.800 7.639 + 10.712 10.943 11.340 11.849 12.498 13.371 14.478 15.628 16.440 16.528 15.765 14.447 13.204 12.681 13.157 14.367 15.640 16.302 16.081 15.266 14.492 14.304 14.770 15.428 15.613 14.950 13.680 12.545 12.294 13.125 14.452 15.221 14.587 12.523 9.930 8.149 + 10.574 10.876 11.362 11.905 12.494 13.232 14.210 15.325 16.242 16.546 16.036 14.930 13.822 13.351 13.793 14.869 15.901 16.261 15.791 14.899 14.254 14.298 14.907 15.479 15.373 14.405 13.025 12.053 12.119 13.198 14.563 15.195 14.413 12.336 9.864 8.207 + 9.370 9.859 10.575 11.232 11.774 12.418 13.431 14.802 16.115 16.761 16.369 15.144 13.812 13.194 13.652 14.845 15.949 16.227 15.527 14.374 13.573 13.622 14.347 15.030 14.933 13.852 12.304 11.203 11.248 12.422 13.946 14.732 14.047 11.996 9.506 7.825 + 9.599 9.983 10.543 11.073 11.591 12.339 13.523 15.024 16.326 16.808 16.191 14.818 13.510 13.055 13.693 14.943 15.935 15.998 15.115 13.916 13.217 13.439 14.314 15.067 14.976 13.892 12.387 11.400 11.611 12.955 14.584 15.346 14.487 12.150 9.360 7.489 + 10.154 10.547 11.113 11.625 12.088 12.742 13.818 15.228 16.488 16.983 16.427 15.146 13.939 13.571 14.245 15.447 16.296 16.160 15.108 13.848 13.216 13.572 14.538 15.281 15.112 13.996 12.596 11.834 12.259 13.648 15.103 15.568 14.463 12.053 9.344 7.573 + 9.850 10.286 10.911 11.468 11.937 12.562 13.600 14.994 16.283 16.858 16.416 15.254 14.133 13.780 14.372 15.399 16.033 15.734 14.656 13.531 13.126 13.662 14.650 15.244 14.869 13.649 12.343 11.826 12.489 13.968 15.349 15.708 14.640 12.483 10.140 8.638 + 9.183 9.711 10.436 11.021 11.461 12.103 13.291 14.937 16.423 16.980 16.286 14.793 13.486 13.206 14.036 15.231 15.767 15.098 13.572 12.172 11.795 12.599 13.891 14.646 14.242 12.906 11.549 11.136 12.030 13.752 15.262 15.575 14.308 11.882 9.297 7.652 + 9.939 10.394 11.048 11.640 12.168 12.889 14.027 15.451 16.624 16.947 16.234 14.945 13.930 13.840 14.642 15.618 15.884 15.047 13.512 12.214 11.947 12.800 14.092 14.857 14.522 13.304 12.058 11.697 12.581 14.272 15.774 16.117 14.892 12.488 9.896 8.237 + 10.216 10.675 11.358 12.030 12.686 13.527 14.670 15.896 16.692 16.624 15.739 14.628 14.043 14.348 15.229 15.907 15.710 14.566 13.056 12.008 11.929 12.688 13.644 14.084 13.684 12.703 11.808 11.672 12.563 14.147 15.614 16.082 15.084 12.878 10.382 8.743 + 9.743 10.223 10.947 11.682 12.426 13.362 14.572 15.784 16.452 16.164 15.046 13.787 13.189 13.581 14.547 15.208 14.853 13.451 11.663 10.371 10.091 10.683 11.519 11.952 11.729 11.108 10.653 10.864 11.871 13.331 14.585 14.975 14.195 12.485 10.568 9.315 + 9.287 9.726 10.434 11.259 12.212 13.403 14.781 15.977 16.458 15.936 14.689 13.474 13.031 13.540 14.468 14.943 14.375 12.866 11.115 9.929 9.720 10.313 11.143 11.647 11.573 11.074 10.585 10.579 11.313 12.637 13.999 14.672 14.160 12.549 10.564 9.212 + 9.766 10.011 10.579 11.560 12.937 14.491 15.814 16.462 16.213 15.243 14.088 13.355 13.369 13.970 14.620 14.734 14.025 12.636 11.039 9.780 9.241 9.506 10.337 11.262 11.757 11.511 10.649 9.736 9.470 10.197 11.582 12.729 12.752 11.428 9.445 7.997 + 9.537 9.908 10.680 11.843 13.252 14.584 15.427 15.478 14.748 13.620 12.678 12.380 12.792 13.562 14.154 14.161 13.487 12.321 10.982 9.810 9.121 9.158 9.958 11.193 12.206 12.351 11.476 10.169 9.465 10.104 11.891 13.697 14.210 12.930 10.630 8.866 + 8.214 8.231 8.634 9.793 11.646 13.570 14.707 14.514 13.146 11.384 10.159 10.005 10.802 11.947 12.755 12.815 12.081 10.765 9.202 7.797 6.994 7.148 8.275 9.872 11.064 11.096 9.897 8.261 7.406 8.128 10.167 12.289 13.114 12.115 10.040 8.404 + 8.488 9.259 10.563 12.018 13.235 13.913 13.887 13.178 12.032 10.892 10.243 10.363 11.142 12.115 12.723 12.621 11.835 10.659 9.448 8.476 7.941 8.002 8.709 9.833 10.816 11.020 10.198 8.805 7.824 8.093 9.632 11.520 12.521 12.016 10.501 9.228 + 5.046 5.910 7.273 8.648 9.698 10.312 10.479 10.162 9.339 8.169 7.071 6.540 6.822 7.696 8.587 8.921 8.450 7.318 5.900 4.605 3.807 3.805 4.708 6.217 7.580 7.925 6.886 5.041 3.678 3.920 5.796 8.075 9.108 8.094 5.763 3.876 + 6.661 6.450 6.150 5.992 6.236 6.998 8.089 9.018 9.240 8.514 7.112 5.697 4.921 5.021 5.703 6.381 6.573 6.179 5.465 4.826 4.536 4.632 4.960 5.293 5.433 5.282 4.888 4.446 4.212 4.339 4.734 5.069 4.990 4.390 3.533 2.913 + 7.402 6.901 6.294 6.095 6.580 7.597 8.657 9.221 8.993 8.047 6.759 5.611 4.988 5.020 5.542 6.162 6.452 6.179 5.455 4.679 4.296 4.494 5.074 5.583 5.634 5.182 4.545 4.169 4.303 4.829 5.343 5.427 4.904 3.931 2.906 2.257 + 4.392 4.230 4.121 4.379 5.227 6.605 8.111 9.144 9.225 8.298 6.818 5.516 4.979 5.304 6.068 6.627 6.539 5.817 4.870 4.204 4.106 4.502 5.054 5.390 5.306 4.857 4.294 3.924 3.941 4.314 4.783 4.981 4.653 3.828 2.846 2.184 + 3.237 3.779 4.500 5.035 5.372 5.828 6.663 7.695 8.333 8.044 6.855 5.429 4.602 4.758 5.564 6.274 6.326 5.738 5.005 4.628 4.724 4.997 5.059 4.769 4.308 3.989 3.999 4.289 4.658 4.905 4.909 4.622 4.060 3.322 2.604 2.157 + 5.377 4.738 3.906 3.509 3.980 5.280 6.888 8.082 8.339 7.630 6.410 5.334 4.860 5.007 5.410 5.607 5.355 4.763 4.181 3.944 4.159 4.668 5.171 5.412 5.308 4.962 4.581 4.359 4.379 4.576 4.761 4.714 4.311 3.612 2.863 2.379 + 4.177 4.436 4.965 5.724 6.574 7.309 7.772 7.946 7.952 7.924 7.879 7.696 7.240 6.537 5.834 5.479 5.690 6.388 7.236 7.872 8.149 8.194 8.254 8.446 8.636 8.545 8.004 7.136 6.309 5.874 5.903 6.130 6.164 5.801 5.191 4.725 + 3.118 3.628 4.512 5.539 6.466 7.120 7.460 7.573 7.608 7.670 7.746 7.710 7.432 6.895 6.258 5.782 5.667 5.916 6.335 6.687 6.873 6.994 7.232 7.642 8.042 8.108 7.634 6.731 5.799 5.256 5.236 5.495 5.611 5.332 4.776 4.332 + 4.282 3.910 3.578 3.793 4.752 6.149 7.329 7.715 7.185 6.149 5.258 4.958 5.221 5.629 5.733 5.391 4.835 4.442 4.427 4.707 5.039 5.253 5.372 5.511 5.687 5.750 5.523 5.017 4.486 4.242 4.364 4.582 4.477 3.843 2.913 2.227 + 4.893 4.207 3.411 3.219 3.942 5.268 6.501 7.045 6.766 5.998 5.246 4.869 4.937 5.308 5.774 6.151 6.305 6.169 5.792 5.364 5.141 5.282 5.709 6.125 6.203 5.813 5.114 4.434 4.042 3.976 4.055 4.035 3.779 3.329 2.859 2.562 + 4.398 3.975 3.601 3.843 4.890 6.349 7.473 7.670 6.927 5.819 5.103 5.189 5.881 6.578 6.754 6.336 5.701 5.314 5.347 5.583 5.675 5.494 5.237 5.213 5.507 5.854 5.854 5.338 4.552 3.963 3.870 4.148 4.372 4.208 3.716 3.287 + 3.916 3.462 3.048 3.241 4.179 5.437 6.337 6.465 5.954 5.348 5.164 5.539 6.187 6.670 6.710 6.330 5.762 5.271 5.026 5.074 5.368 5.777 6.116 6.205 5.973 5.521 5.071 4.816 4.793 4.866 4.852 4.664 4.363 4.079 3.898 3.823 + 4.988 4.467 3.876 3.769 4.375 5.419 6.329 6.653 6.367 5.855 5.587 5.772 6.239 6.624 6.670 6.416 6.116 6.002 6.093 6.211 6.161 5.906 5.587 5.377 5.317 5.294 5.159 4.888 4.617 4.515 4.604 4.707 4.575 4.106 3.472 3.016 + 5.607 4.967 4.264 4.195 5.005 6.268 7.174 7.111 6.097 4.765 3.913 3.983 4.820 5.861 6.548 6.671 6.402 6.086 5.963 6.049 6.208 6.297 6.266 6.136 5.936 5.671 5.355 5.051 4.857 4.829 4.899 4.886 4.618 4.075 3.441 3.013 + 3.534 3.576 3.814 4.406 5.324 6.292 6.900 6.862 6.218 5.350 4.769 4.807 5.426 6.255 6.842 6.927 6.572 6.067 5.715 5.651 5.817 6.049 6.204 6.214 6.063 5.769 5.384 5.012 4.786 4.783 4.936 5.042 4.882 4.402 3.784 3.350 + 3.929 3.990 4.303 5.004 5.931 6.656 6.804 6.376 5.783 5.537 5.840 6.439 6.851 6.773 6.313 5.869 5.776 6.033 6.349 6.428 6.233 5.995 5.983 6.245 6.552 6.593 6.231 5.615 5.058 4.793 4.805 4.866 4.724 4.300 3.755 3.373 + 4.819 5.074 5.444 5.786 6.070 6.338 6.560 6.577 6.242 5.640 5.143 5.175 5.848 6.819 7.515 7.576 7.117 6.580 6.317 6.305 6.248 5.949 5.559 5.444 5.784 6.330 6.579 6.240 5.526 4.978 4.954 5.270 5.353 4.790 3.762 2.948 + 5.571 5.496 5.484 5.713 6.242 6.924 7.443 7.498 7.027 6.291 5.741 5.712 6.185 6.796 7.110 6.945 6.489 6.122 6.100 6.365 6.632 6.655 6.429 6.140 5.955 5.861 5.708 5.410 5.071 4.905 5.002 5.192 5.153 4.704 4.007 3.481 + 4.894 5.210 5.716 6.248 6.701 7.040 7.232 7.197 6.849 6.217 5.522 5.103 5.209 5.807 6.570 7.078 7.091 6.698 6.230 6.015 6.155 6.490 6.746 6.737 6.472 6.107 5.805 5.629 5.528 5.408 5.212 4.955 4.695 4.490 4.363 4.307 + 7.630 7.138 6.619 6.579 7.103 7.763 7.990 7.566 6.798 6.247 6.247 6.654 7.010 6.962 6.534 6.064 5.868 5.989 6.208 6.293 6.212 6.131 6.218 6.460 6.673 6.667 6.408 6.036 5.729 5.565 5.484 5.376 5.184 4.935 4.707 4.575 + 6.578 6.640 6.789 7.053 7.408 7.741 7.868 7.645 7.122 6.588 6.425 6.829 7.604 8.243 8.267 7.586 6.579 5.811 5.605 5.823 6.039 5.935 5.570 5.298 5.409 5.851 6.275 6.346 6.035 5.608 5.355 5.313 5.268 5.006 4.558 4.202 + 5.354 6.105 7.214 8.138 8.506 8.319 7.903 7.645 7.721 7.994 8.162 8.022 7.642 7.296 7.224 7.411 7.587 7.454 6.946 6.319 5.961 6.101 6.624 7.166 7.377 7.158 6.683 6.221 5.941 5.843 5.861 5.976 6.235 6.657 7.134 7.457 + 7.532 8.632 10.127 11.089 11.006 10.109 9.178 8.940 9.520 10.352 10.626 9.940 8.641 7.576 7.429 8.176 9.098 9.348 8.634 7.444 6.657 6.843 7.831 8.872 9.231 8.718 7.740 6.916 6.605 6.757 7.115 7.527 8.041 8.728 9.475 9.981 + 7.510 8.297 9.164 9.336 8.662 7.727 7.312 7.696 8.453 8.874 8.596 7.859 7.204 6.957 7.010 7.053 6.965 6.945 7.247 7.850 8.402 8.540 8.226 7.777 7.540 7.553 7.556 7.320 6.953 6.830 7.201 7.864 8.280 8.049 7.313 6.674 + 6.143 7.135 8.350 8.924 8.618 7.946 7.624 7.904 8.408 8.576 8.227 7.694 7.424 7.508 7.624 7.444 7.036 6.831 7.162 7.861 8.366 8.257 7.678 7.224 7.346 7.890 8.228 7.889 7.064 6.468 6.667 7.515 8.256 8.231 7.499 6.785 + 2.439 3.628 5.295 6.586 7.143 7.265 7.512 8.133 8.863 9.223 9.002 8.453 8.035 7.981 8.111 8.043 7.581 6.900 6.380 6.273 6.537 6.944 7.303 7.563 7.709 7.651 7.272 6.622 6.018 5.871 6.343 7.141 7.700 7.634 7.072 6.551 + 4.102 5.095 6.530 7.683 8.129 7.986 7.752 7.904 8.546 9.355 9.841 9.699 9.004 8.137 7.513 7.327 7.470 7.654 7.641 7.402 7.124 7.051 7.281 7.661 7.866 7.619 6.918 6.079 5.563 5.659 6.265 6.928 7.153 6.750 5.983 5.389 + 3.042 4.370 6.262 7.715 8.161 7.801 7.371 7.556 8.479 9.646 10.334 10.126 9.178 8.067 7.364 7.272 7.572 7.868 7.900 7.699 7.482 7.430 7.538 7.639 7.562 7.278 6.912 6.634 6.536 6.578 6.646 6.642 6.545 6.401 6.272 6.199 + 2.610 4.051 6.208 8.052 8.840 8.530 7.762 7.390 7.878 8.982 9.934 10.035 9.193 8.009 7.322 7.578 8.495 9.306 9.364 8.622 7.622 7.027 7.104 7.570 7.885 7.707 7.137 6.574 6.365 6.544 6.869 7.046 6.946 6.645 6.318 6.116 + 2.868 3.695 5.059 6.476 7.464 7.768 7.511 7.117 7.035 7.419 8.023 8.403 8.282 7.790 7.369 7.411 7.927 8.522 8.709 8.298 7.544 6.947 6.865 7.270 7.800 8.065 7.920 7.528 7.179 7.064 7.152 7.266 7.238 7.030 6.744 6.544 + 4.274 4.643 5.424 6.506 7.492 7.869 7.396 6.374 5.491 5.327 5.916 6.760 7.273 7.266 7.047 7.070 7.481 7.990 8.164 7.855 7.358 7.149 7.466 8.122 8.687 8.870 8.720 8.513 8.467 8.561 8.620 8.528 8.336 8.189 8.158 8.187 + 1.162 2.804 5.281 7.432 8.385 8.024 6.991 6.231 6.356 7.267 8.272 8.631 8.111 7.155 6.531 6.742 7.653 8.615 8.970 8.541 7.721 7.134 7.154 7.659 8.196 8.358 8.078 7.620 7.321 7.333 7.540 7.696 7.618 7.307 6.919 6.657 + 3.457 4.832 6.690 7.941 8.115 7.655 7.470 8.135 9.398 10.381 10.276 8.975 7.151 5.763 5.410 5.990 6.881 7.417 7.295 6.665 5.915 5.386 5.202 5.280 5.453 5.586 5.631 5.621 5.625 5.684 5.772 5.800 5.677 5.389 5.041 4.802 + 2.794 4.170 5.960 7.043 7.052 6.600 6.667 7.698 9.210 10.207 10.003 8.729 7.168 6.115 5.850 6.090 6.352 6.320 5.957 5.387 4.774 4.301 4.180 4.542 5.271 5.962 6.168 5.768 5.126 4.842 5.235 6.047 6.631 6.515 5.831 5.204 + 3.130 4.245 5.579 6.148 5.757 5.136 5.229 6.323 7.795 8.683 8.495 7.543 6.551 5.990 5.790 5.608 5.293 5.029 5.041 5.247 5.282 4.902 4.316 4.052 4.439 5.217 5.724 5.522 4.855 4.469 4.905 5.951 6.795 6.761 5.954 5.174 + 3.719 4.718 5.967 6.623 6.458 5.956 5.769 6.079 6.475 6.434 5.889 5.298 5.183 5.604 6.118 6.239 5.929 5.595 5.622 5.926 6.015 5.511 4.604 3.946 4.050 4.792 5.514 5.645 5.252 4.964 5.331 6.254 7.053 7.110 6.475 5.829 + 3.956 4.498 5.360 6.229 6.865 7.163 7.122 6.799 6.316 5.873 5.684 5.833 6.163 6.345 6.126 5.563 5.015 4.853 5.133 5.530 5.624 5.294 4.853 4.780 5.266 6.010 6.461 6.313 5.791 5.464 5.732 6.464 7.114 7.218 6.812 6.379 + 3.479 4.414 5.776 6.897 7.379 7.257 6.850 6.458 6.192 6.023 5.924 5.921 6.017 6.117 6.079 5.856 5.576 5.437 5.501 5.603 5.494 5.103 4.668 4.567 4.979 5.686 6.227 6.282 5.948 5.656 5.785 6.339 6.968 7.301 7.268 7.115 + 4.484 4.976 5.682 6.255 6.520 6.536 6.466 6.406 6.340 6.232 6.119 6.082 6.128 6.137 5.959 5.591 5.237 5.151 5.391 5.726 5.819 5.529 5.063 4.803 4.958 5.365 5.643 5.559 5.267 5.176 5.559 6.268 6.841 6.909 6.531 6.141 + 2.586 3.292 4.392 5.489 6.346 6.940 7.317 7.449 7.251 6.745 6.152 5.776 5.756 5.938 6.010 5.804 5.459 5.290 5.454 5.771 5.868 5.546 4.997 4.652 4.788 5.260 5.639 5.619 5.322 5.180 5.505 6.159 6.655 6.601 6.078 5.585 + 4.193 4.527 5.115 5.825 6.510 7.026 7.250 7.130 6.737 6.275 5.985 5.987 6.185 6.323 6.192 5.801 5.378 5.167 5.204 5.281 5.143 4.746 4.334 4.239 4.575 5.117 5.472 5.427 5.133 4.970 5.198 5.719 6.159 6.212 5.916 5.607 + 3.732 4.296 5.078 5.708 6.106 6.477 6.986 7.482 7.574 7.016 6.021 5.171 4.957 5.372 5.930 6.104 5.773 5.277 5.046 5.188 5.420 5.382 5.012 4.592 4.451 4.642 4.916 5.024 5.000 5.126 5.596 6.231 6.574 6.307 5.588 4.980 + 3.273 3.392 3.758 4.495 5.556 6.676 7.485 7.722 7.395 6.775 6.218 5.946 5.939 6.003 5.952 5.750 5.513 5.385 5.402 5.463 5.428 5.241 4.976 4.757 4.648 4.604 4.541 4.441 4.392 4.513 4.818 5.169 5.358 5.274 5.003 4.772 + 5.053 5.187 5.394 5.632 5.934 6.362 6.903 7.402 7.651 7.548 7.179 6.743 6.373 6.046 5.665 5.226 4.896 4.877 5.188 5.578 5.694 5.383 4.847 4.496 4.603 5.067 5.499 5.553 5.214 4.781 4.577 4.672 4.855 4.874 4.690 4.494 + 4.408 5.055 5.858 6.261 6.117 5.793 5.825 6.454 7.421 8.193 8.376 7.954 7.206 6.436 5.792 5.292 4.949 4.806 4.854 4.943 4.863 4.533 4.126 3.951 4.181 4.678 5.087 5.145 4.903 4.654 4.614 4.693 4.564 4.010 3.192 2.579 + 4.254 4.391 4.559 4.679 4.821 5.190 5.957 7.049 8.106 8.652 8.400 7.460 6.294 5.440 5.189 5.441 5.817 5.943 5.685 5.194 4.748 4.546 4.596 4.754 4.870 4.893 4.876 4.897 4.965 5.012 4.940 4.704 4.342 3.951 3.632 3.457 + 3.397 3.508 3.621 3.662 3.735 4.093 4.938 6.178 7.378 7.980 7.655 6.552 5.244 4.389 4.339 4.950 5.708 6.078 5.829 5.141 4.432 4.079 4.186 4.568 4.911 4.992 4.808 4.546 4.426 4.535 4.767 4.893 4.726 4.258 3.684 3.292 + 2.756 3.232 3.949 4.569 4.841 4.750 4.512 4.434 4.703 5.249 5.784 5.995 5.752 5.202 4.654 4.367 4.384 4.525 4.551 4.345 3.978 3.642 3.493 3.560 3.756 3.968 4.137 4.267 4.367 4.417 4.363 4.166 3.844 3.471 3.149 2.963 + 3.905 3.988 4.273 4.842 5.571 6.145 6.257 5.839 5.135 4.535 4.325 4.519 4.920 5.301 5.559 5.722 5.831 5.849 5.681 5.286 4.762 4.314 4.111 4.167 4.337 4.427 4.339 4.127 3.934 3.875 3.952 4.070 4.117 4.049 3.912 3.805 + 2.970 2.717 2.562 2.893 3.775 4.857 5.605 5.695 5.223 4.594 4.201 4.161 4.319 4.456 4.504 4.565 4.748 5.009 5.150 5.001 4.606 4.227 4.154 4.460 4.925 5.203 5.093 4.708 4.377 4.372 4.667 4.941 4.820 4.186 3.308 2.679 + 3.901 3.192 2.387 2.179 2.756 3.654 4.178 3.988 3.339 2.817 2.825 3.292 3.811 2.320 2.217 2.215 2.295 2.517 2.932 3.480 4.009 4.397 4.666 4.941 5.287 5.602 5.677 5.412 4.963 4.672 4.812 5.372 6.076 6.608 6.847 6.895 + 4.378 3.639 2.714 2.277 2.612 3.408 4.022 3.976 3.302 2.484 2.066 2.259 2.825 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.120 3.165 3.260 3.414 3.630 3.858 3.973 3.813 3.288 2.492 1.712 1.285 1.385 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.814 3.740 3.687 3.772 4.029 4.334 4.446 4.152 3.444 2.594 2.025 2.047 2.624 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.106 2.023 2.029 2.355 3.103 4.096 4.879 4.959 4.154 2.819 1.699 1.464 2.235 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.433 2.230 2.049 2.149 2.600 3.196 3.575 3.474 2.921 2.237 1.828 1.927 2.453 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.262 2.364 2.540 2.749 2.943 3.086 3.155 3.139 3.044 2.900 2.767 2.718 2.807 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.856 1.046 1.491 2.197 3.003 3.617 3.804 3.566 3.155 2.899 2.960 3.242 3.494 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.142 1.711 1.262 1.276 1.907 2.859 3.612 3.803 3.448 2.858 2.365 2.109 2.031 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.512 3.674 2.616 2.061 2.266 2.856 3.205 2.981 2.396 1.962 2.020 2.463 2.883 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 5.717 5.015 4.327 4.397 5.252 6.113 6.039 4.764 2.963 1.727 1.697 2.601 3.552 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 9.339 9.520 9.786 10.001 10.060 9.918 9.569 9.022 8.315 7.540 6.843 6.366 6.152 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 11.058 11.268 11.552 11.743 11.744 11.541 11.137 10.505 9.633 8.627 7.730 7.206 7.139 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 9.880 10.171 10.585 10.913 11.039 10.958 10.685 10.175 9.357 8.269 7.142 6.319 6.026 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 9.508 9.483 9.487 9.572 9.716 9.780 9.551 8.862 7.728 6.397 5.259 4.633 4.580 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 6.781 6.860 6.985 7.097 7.121 6.951 6.464 5.585 4.386 3.146 2.257 2.008 2.377 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.866 2.979 3.333 3.987 4.750 5.227 5.088 4.334 3.320 2.507 2.151 2.183 2.342 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.769 4.171 4.794 5.381 5.740 5.828 5.731 5.572 5.414 5.227 4.947 4.550 4.096 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 7.178 7.395 7.570 7.481 7.223 7.190 7.734 8.795 9.865 10.331 9.934 8.955 7.985 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 5.579 5.805 5.878 5.458 4.681 4.142 4.426 5.562 6.912 7.617 7.230 6.027 4.746 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.143 2.714 3.432 3.793 3.612 3.131 2.775 2.789 3.069 3.300 3.252 2.945 2.575 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.460 3.515 3.626 3.793 4.007 4.245 4.462 4.587 4.539 4.258 3.753 3.145 2.650 2.494 2.803 3.508 4.363 5.061 5.401 5.389 5.222 5.145 5.302 5.651 6.023 6.245 6.264 6.166 6.107 6.201 6.451 6.760 7.005 7.122 7.130 7.103 + 2.823 2.692 2.586 2.719 3.222 4.050 4.983 5.719 6.013 5.771 5.088 4.209 3.452 3.120 3.400 4.277 5.503 6.652 7.300 7.240 6.619 5.873 5.478 5.655 6.237 6.797 6.958 6.666 6.209 5.987 6.205 6.730 7.222 7.414 7.313 7.152 + 3.826 4.096 4.379 4.426 4.270 4.243 4.696 5.645 6.660 7.119 6.642 5.383 3.962 3.102 3.217 4.222 5.634 6.865 7.505 7.467 6.971 6.394 6.070 6.125 6.426 6.681 6.655 6.346 5.996 5.912 6.221 6.764 7.215 7.340 7.177 6.979 + 2.592 3.311 4.176 4.576 4.423 4.204 4.476 5.287 6.075 6.152 5.317 4.059 3.164 3.110 3.763 4.601 5.182 5.427 5.518 5.612 5.689 5.672 5.603 5.635 5.834 6.011 5.850 5.232 4.450 4.043 4.343 5.161 5.911 6.103 5.759 5.356 + 5.085 4.760 4.320 4.037 4.074 4.398 4.829 5.180 5.362 5.385 5.283 5.039 4.602 3.963 3.228 2.609 2.311 2.414 2.816 3.298 3.656 3.800 3.774 3.687 3.620 3.589 3.569 3.546 3.538 3.576 3.662 3.749 3.776 3.713 3.596 3.505 + 5.698 6.062 6.464 6.529 6.142 5.525 5.019 4.790 4.709 4.514 4.075 3.521 3.116 3.012 3.108 3.155 2.987 2.678 2.476 2.580 2.964 3.389 3.590 3.468 3.141 2.832 2.702 2.771 2.939 3.083 3.122 3.031 2.827 2.561 2.309 2.154 + 5.620 5.759 5.862 5.750 5.411 5.004 4.703 4.528 4.350 4.048 3.659 3.359 3.288 3.391 3.452 3.298 2.982 2.752 2.831 3.195 3.568 3.642 3.326 2.812 2.406 2.284 2.390 2.540 2.603 2.585 2.555 2.523 2.412 2.158 1.822 1.578 + 4.957 4.960 4.901 4.739 4.528 4.385 4.368 4.408 4.358 4.144 3.839 3.595 3.485 3.416 3.219 2.844 2.448 2.283 2.468 2.851 3.117 3.049 2.706 2.357 2.231 2.325 2.440 2.414 2.290 2.263 2.447 2.701 2.724 2.333 1.679 1.176 + 4.545 4.952 5.477 5.764 5.639 5.201 4.693 4.288 3.986 3.690 3.367 3.108 3.052 3.217 3.442 3.493 3.251 2.834 2.522 2.552 2.944 3.485 3.885 3.957 3.714 3.315 2.936 2.674 2.521 2.419 2.313 2.179 2.021 1.861 1.728 1.652 + 4.875 5.058 5.337 5.563 5.588 5.341 4.890 4.419 4.125 4.089 4.213 4.285 4.117 3.675 3.094 2.585 2.312 2.326 2.571 2.945 3.338 3.645 3.779 3.703 3.466 3.189 2.997 2.928 2.900 2.784 2.515 2.161 1.874 1.767 1.820 1.905 + 6.099 5.674 5.089 4.679 4.605 4.769 4.928 4.891 4.644 4.301 3.965 3.635 3.245 2.771 2.309 2.023 2.026 2.288 2.662 2.993 3.221 3.386 3.558 3.755 3.925 3.999 3.955 3.832 3.700 3.602 3.540 3.488 3.425 3.354 3.292 3.256 + 6.256 6.345 6.389 6.271 6.033 5.857 5.884 6.048 6.104 5.831 5.226 4.520 3.992 3.759 3.735 3.761 3.782 3.874 4.125 4.510 4.897 5.198 5.488 5.953 6.679 7.485 7.981 7.834 7.041 5.981 5.192 5.048 5.566 6.457 7.320 7.833 + 4.912 5.042 5.232 5.389 5.450 5.390 5.204 4.902 4.524 4.162 3.916 3.813 3.750 3.552 3.122 2.568 2.159 2.136 2.506 3.023 3.395 3.545 3.691 4.148 5.013 6.005 6.618 6.501 5.732 4.783 4.199 4.247 4.807 5.538 6.128 6.434 + 5.919 6.197 6.497 6.530 6.233 5.829 5.629 5.763 6.056 6.153 5.799 5.025 4.126 3.442 3.151 3.200 3.400 3.578 3.670 3.707 3.756 3.879 4.120 4.495 4.967 5.421 5.685 5.614 5.176 4.494 3.783 3.242 2.964 2.916 2.988 3.060 + 5.296 5.337 5.326 5.151 4.781 4.322 3.966 3.872 4.033 4.257 4.277 3.940 3.326 2.709 2.373 2.420 2.724 3.044 3.208 3.211 3.162 3.158 3.211 3.280 3.361 3.506 3.736 3.945 3.921 3.509 2.800 2.155 1.982 2.425 3.215 3.819 + 3.163 3.960 4.996 5.577 5.373 4.624 3.900 3.643 3.862 4.197 4.250 3.893 3.319 2.835 2.620 2.636 2.730 2.800 2.855 2.958 3.125 3.305 3.443 3.556 3.719 3.970 4.230 4.318 4.077 3.514 2.832 2.333 2.234 2.535 3.016 3.366 + 6.149 6.265 6.329 6.160 5.758 5.352 5.263 5.653 6.358 6.944 6.966 6.269 5.103 3.976 3.341 3.330 3.707 4.076 4.144 3.890 3.509 3.237 3.191 3.341 3.590 3.861 4.118 4.315 4.369 4.199 3.815 3.349 2.992 2.866 2.932 3.034 + 5.690 6.176 6.618 6.436 5.537 4.429 3.820 4.046 4.809 5.441 5.426 4.762 3.890 3.302 3.199 3.434 3.721 3.870 3.864 3.772 3.647 3.525 3.465 3.555 3.823 4.171 4.407 4.395 4.177 3.936 3.829 3.840 3.803 3.578 3.215 2.934 + 5.794 5.360 4.677 4.064 3.851 4.194 4.946 5.705 6.047 5.811 5.197 4.601 4.310 4.301 4.328 4.181 3.894 3.706 3.825 4.221 4.650 4.864 4.811 4.639 4.518 4.482 4.453 4.396 4.421 4.689 5.196 5.665 5.711 5.166 4.287 3.625 + 3.984 4.185 4.422 4.501 4.363 4.145 4.082 4.334 4.855 5.409 5.718 5.631 5.210 4.669 4.234 4.019 4.002 4.082 4.178 4.284 4.443 4.689 4.985 5.232 5.323 5.231 5.041 4.918 5.012 5.356 5.836 6.248 6.418 6.309 6.047 5.838 + 4.894 4.744 4.540 4.378 4.271 4.173 4.089 4.130 4.424 4.955 5.492 5.728 5.526 5.072 4.754 4.851 5.293 5.710 5.736 5.330 4.817 4.624 4.936 5.550 6.050 6.142 5.861 5.506 5.388 5.605 6.015 6.379 6.542 6.503 6.370 6.266 + 4.035 4.187 4.330 4.296 4.098 3.947 4.095 4.625 5.365 6.004 6.306 6.260 6.043 5.855 5.765 5.699 5.550 5.310 5.099 5.075 5.307 5.712 6.112 6.344 6.346 6.174 5.948 5.779 5.731 5.811 5.988 6.213 6.432 6.609 6.725 6.780 + 2.146 1.691 1.213 1.244 2.028 3.370 4.798 5.886 6.456 6.566 6.361 5.977 5.546 5.228 5.160 5.347 5.614 5.721 5.570 5.323 5.280 5.615 6.191 6.635 6.632 6.186 5.617 5.303 5.396 5.752 6.105 6.309 6.417 6.558 6.765 6.929 + 1.417 1.507 1.705 2.017 2.408 2.813 3.177 3.476 3.705 3.849 3.886 3.826 3.752 3.789 4.006 4.339 4.606 4.651 4.493 4.346 4.474 4.970 5.657 6.190 6.306 6.007 5.544 5.218 5.175 5.348 5.569 5.730 5.842 5.970 6.125 6.240 + 1.485 1.724 2.222 2.894 3.486 3.709 3.496 3.111 2.966 3.266 3.810 4.165 4.067 3.686 3.478 3.748 4.339 4.754 4.619 4.060 3.626 3.815 4.626 5.543 5.968 5.707 5.085 4.618 4.579 4.833 5.066 5.126 5.131 5.282 5.598 5.867 + 2.919 2.585 2.269 2.333 2.793 3.315 3.558 3.511 3.490 3.780 4.298 4.614 4.344 3.543 2.708 2.376 2.676 3.242 3.563 3.424 3.050 2.832 2.941 3.194 3.276 3.082 2.812 2.763 3.024 3.389 3.573 3.490 3.316 3.289 3.457 3.641 + 1.634 2.403 3.387 3.941 3.854 3.471 3.331 3.667 4.214 4.484 4.229 3.661 3.254 3.309 3.697 3.987 3.826 3.228 2.531 2.099 2.055 2.247 2.427 2.463 2.378 2.266 2.182 2.126 2.106 2.154 2.287 2.441 2.494 2.365 2.114 1.914 + 3.388 2.796 2.010 1.515 1.528 1.863 2.124 2.034 1.634 1.214 1.064 1.272 1.710 2.176 2.533 2.746 2.822 2.764 2.589 2.378 2.264 2.344 2.573 2.769 2.734 2.412 1.945 1.581 1.495 1.671 1.927 2.050 1.933 1.623 1.272 1.046 + 2.406 2.343 2.276 2.285 2.408 2.592 2.708 2.622 2.294 1.831 1.434 1.278 1.388 1.622 1.780 1.755 1.619 1.559 1.724 2.098 2.495 2.691 2.582 2.245 1.880 1.673 1.697 1.895 2.147 2.338 2.394 2.285 2.024 1.668 1.322 1.108 + 2.682 2.805 2.887 2.772 2.479 2.194 2.103 2.219 2.376 2.405 2.299 2.216 2.306 2.539 2.707 2.612 2.250 1.837 1.627 1.717 1.999 2.285 2.472 2.583 2.664 2.683 2.546 2.229 1.868 1.692 1.822 2.146 2.389 2.343 2.056 1.792 + 2.176 2.494 2.868 2.990 2.748 2.297 1.902 1.739 1.796 1.964 2.173 2.428 2.736 3.017 3.125 2.982 2.682 2.435 2.400 2.537 2.652 2.584 2.377 2.260 2.451 2.965 3.592 4.074 4.306 4.384 4.481 4.668 4.870 4.966 4.933 4.864 + 2.940 2.388 1.734 1.520 1.950 2.742 3.363 3.433 2.985 2.378 1.995 1.972 2.170 2.351 2.386 2.325 2.299 2.395 2.592 2.806 2.962 3.025 3.000 2.918 2.845 2.876 3.092 3.489 3.953 4.319 4.489 4.505 4.509 4.617 4.813 4.972 + 0.310 0.681 1.210 1.631 1.813 1.810 1.761 1.750 1.766 1.784 1.852 2.074 2.489 2.973 3.285 3.244 2.894 2.496 2.337 2.509 2.845 3.046 2.913 2.477 1.950 1.564 1.435 1.536 1.768 2.018 2.181 2.153 1.870 1.367 0.812 0.447 + 2.023 1.999 1.963 1.935 1.921 1.913 1.898 1.871 1.862 1.927 2.131 2.500 2.979 3.429 3.675 3.596 3.204 2.661 2.203 2.010 2.097 2.310 2.432 2.333 2.060 1.796 1.720 1.869 2.113 2.256 2.173 1.900 1.585 1.368 1.288 1.284 + 3.430 2.887 2.210 1.880 2.049 2.424 2.524 2.093 1.337 0.779 0.865 1.626 2.655 3.399 3.530 3.117 2.508 2.052 1.893 1.949 2.056 2.120 2.157 2.223 2.326 2.404 2.380 2.233 2.018 1.819 1.681 1.584 1.472 1.316 1.145 1.030 + 1.647 1.616 1.646 1.829 2.148 2.474 2.671 2.694 2.619 2.551 2.525 2.489 2.376 2.193 2.029 1.975 2.028 2.085 2.033 1.856 1.660 1.589 1.711 1.971 2.247 2.435 2.507 2.483 2.376 2.181 1.907 1.617 1.410 1.349 1.406 1.480 + 4.190 3.639 2.947 2.605 2.788 3.228 3.439 3.113 2.360 1.615 1.306 1.556 2.125 2.610 2.716 2.408 1.871 1.350 1.018 0.931 1.051 1.293 1.563 1.786 1.936 2.043 2.164 2.326 2.481 2.536 2.419 2.145 1.810 1.528 1.357 1.287 + 4.832 4.242 3.453 2.941 2.902 3.128 3.196 2.830 2.123 1.466 1.240 1.532 2.085 2.507 2.546 2.236 1.821 1.551 1.524 1.665 1.829 1.918 1.919 1.867 1.794 1.716 1.654 1.651 1.752 1.948 2.148 2.213 2.043 1.656 1.207 0.908 + 4.101 3.753 3.337 3.175 3.348 3.611 3.581 3.064 2.252 1.619 1.593 2.234 3.164 3.817 3.812 3.191 2.349 1.742 1.587 1.776 2.023 2.102 1.982 1.788 1.646 1.588 1.566 1.554 1.594 1.748 1.990 2.173 2.114 1.757 1.252 0.888 + 2.682 2.310 1.956 2.072 2.783 3.755 4.430 4.438 3.865 3.167 2.819 2.971 3.371 3.596 3.376 2.780 2.119 1.698 1.612 1.732 1.859 1.889 1.856 1.843 1.877 1.892 1.809 1.631 1.459 1.412 1.514 1.659 1.687 1.521 1.239 1.024 + 1.259 1.038 0.834 0.939 1.458 2.209 2.819 2.969 2.605 1.967 1.432 1.285 1.561 2.072 2.548 2.789 2.733 2.424 1.951 1.417 0.952 0.700 0.756 1.087 1.502 1.747 1.668 1.330 0.991 0.916 1.189 1.644 1.997 2.066 1.897 1.715 + 2.149 2.332 2.648 3.028 3.401 3.682 3.762 3.539 3.002 2.303 1.719 1.497 1.678 2.049 2.286 2.185 1.798 1.370 1.124 1.087 1.109 1.031 0.856 0.755 0.903 1.307 1.779 2.076 2.083 1.874 1.626 1.467 1.401 1.360 1.304 1.255 + 1.377 1.862 2.640 3.436 4.015 4.237 4.039 3.413 2.458 1.426 0.695 0.578 1.112 1.968 2.626 2.703 2.215 1.545 1.159 1.275 1.731 2.151 2.239 1.970 1.558 1.253 1.168 1.245 1.356 1.422 1.438 1.432 1.417 1.382 1.330 1.289 + 1.082 1.569 2.256 2.804 3.062 3.100 3.036 2.868 2.506 1.958 1.463 1.361 1.812 2.609 3.306 3.554 3.354 2.990 2.729 2.582 2.363 1.967 1.564 1.468 1.809 2.327 2.547 2.186 1.435 0.810 0.700 1.021 1.302 1.137 0.575 0.075 + 2.360 2.304 2.047 1.518 0.909 0.583 0.749 1.233 1.585 1.478 1.027 0.722 1.007 1.876 2.865 3.420 3.329 2.828 2.324 2.034 1.879 1.686 1.456 1.388 1.644 2.118 2.463 2.386 1.924 1.411 1.168 1.204 1.230 0.969 0.459 0.041 + 5.089 4.804 4.395 4.086 4.002 4.071 4.042 3.652 2.837 1.830 1.050 0.837 1.207 1.834 2.284 2.321 2.059 1.833 1.903 2.243 2.576 2.620 2.328 1.910 1.645 1.649 1.803 1.879 1.744 1.451 1.170 1.032 1.043 1.116 1.173 1.195 + 3.600 3.967 4.493 4.919 5.111 5.059 4.762 4.144 3.153 1.941 0.925 0.578 1.081 2.128 3.093 3.458 3.153 2.540 2.056 1.865 1.792 1.576 1.171 0.791 0.689 0.891 1.158 1.218 1.019 0.772 0.730 0.942 1.217 1.324 1.220 1.075 + 4.220 4.401 4.646 4.805 4.794 4.638 4.436 4.280 4.197 4.162 4.133 4.107 4.119 4.232 4.499 4.944 5.535 6.172 6.682 6.875 6.630 5.986 5.161 4.473 4.186 4.385 4.943 5.604 6.117 6.344 6.276 5.992 5.601 5.202 4.880 4.700 + 5.606 5.634 5.765 6.044 6.393 6.654 6.724 6.662 6.630 6.714 6.806 6.676 6.214 5.616 5.330 5.758 6.936 8.447 9.646 10.038 9.540 8.478 7.352 6.585 6.376 6.705 7.398 8.195 8.813 9.033 8.801 8.258 7.665 7.240 7.047 7.001 + 1.706 1.731 1.871 2.181 2.568 2.814 2.744 2.403 2.056 2.015 2.397 3.036 3.613 3.923 4.042 4.265 4.857 5.808 6.782 7.307 7.079 6.155 4.945 3.984 3.662 4.043 4.873 5.720 6.190 6.084 5.452 4.526 3.591 2.856 2.399 2.194 + 0.103 0.322 0.697 1.131 1.515 1.735 1.691 1.363 0.896 0.596 0.772 1.485 2.429 3.085 3.099 2.588 2.093 2.167 2.905 3.832 4.256 3.822 2.803 1.872 1.559 1.860 2.320 2.475 2.249 1.951 1.912 2.140 2.322 2.159 1.690 1.280 + 1.837 1.862 1.873 1.835 1.756 1.685 1.669 1.721 1.831 2.009 2.296 2.718 3.218 3.641 3.815 3.672 3.321 2.988 2.866 2.985 3.204 3.327 3.247 2.999 2.715 2.519 2.465 2.543 2.720 2.952 3.164 3.247 3.109 2.753 2.317 2.017 + 2.896 2.647 2.366 2.352 2.786 3.587 4.432 4.962 5.058 4.944 5.023 5.523 6.256 6.721 6.515 5.725 4.938 4.824 5.595 6.811 7.702 7.761 7.111 6.357 6.064 6.321 6.750 6.903 6.659 6.275 6.067 6.089 6.097 5.841 5.354 4.956 + 1.295 1.682 2.264 2.857 3.470 4.248 5.246 6.281 7.046 7.393 7.474 7.575 7.807 7.982 7.857 7.505 7.402 8.053 9.452 10.913 11.510 10.821 9.311 7.994 7.623 8.122 8.737 8.759 8.130 7.407 7.142 7.318 7.387 6.855 5.837 5.011 + 5.004 5.047 5.132 5.327 5.763 6.509 7.418 8.146 8.419 8.306 8.230 8.619 9.485 10.355 10.665 10.307 9.797 9.854 10.738 11.946 12.593 12.160 10.949 9.822 9.448 9.760 10.094 9.872 9.155 8.554 8.594 9.164 9.605 9.348 8.487 7.725 + 7.858 7.920 7.935 7.833 7.711 7.798 8.266 9.070 9.965 10.697 11.166 11.434 11.591 11.645 11.571 11.438 11.454 11.819 12.502 13.177 13.435 13.103 12.393 11.720 11.341 11.147 10.815 10.171 9.427 9.028 9.254 9.927 10.538 10.666 10.338 9.974 + 10.413 10.695 11.125 11.546 11.894 12.216 12.585 13.017 13.448 13.803 14.046 14.171 14.160 13.991 13.697 13.415 13.330 13.513 13.822 13.976 13.783 13.322 12.885 12.681 12.584 12.192 11.203 9.804 8.669 8.493 9.410 10.795 11.682 11.505 10.540 9.675 + 12.176 12.311 12.535 12.808 13.145 13.609 14.247 15.008 15.732 16.209 16.297 16.012 15.533 15.120 14.990 15.203 15.635 16.033 16.152 15.881 15.307 14.642 14.073 13.620 13.132 12.430 11.505 10.603 10.086 10.158 10.650 11.070 10.921 10.071 8.893 8.050 + 12.544 12.533 12.509 12.498 12.592 12.945 13.699 14.858 16.183 17.243 17.625 17.220 16.356 15.637 15.568 16.208 17.140 17.781 17.805 17.344 16.818 16.542 16.452 16.187 15.440 14.264 13.072 12.330 12.197 12.416 12.514 12.144 11.284 10.203 9.257 8.718 + 11.894 11.916 11.974 12.092 12.318 12.746 13.501 14.639 16.001 17.186 17.728 17.420 16.541 15.745 15.630 16.303 17.300 17.940 17.853 17.232 16.603 16.322 16.267 15.974 15.113 13.836 12.682 12.131 12.188 12.393 12.219 11.499 10.506 9.667 9.207 9.056 + 12.493 12.418 12.342 12.363 12.557 12.997 13.763 14.881 16.204 17.351 17.866 17.540 16.649 15.860 15.784 16.512 17.533 18.119 17.910 17.174 16.534 16.389 16.562 16.475 15.715 14.448 13.312 12.877 13.147 13.553 13.426 12.516 11.130 9.819 8.953 8.572 + 12.482 12.587 12.721 12.828 12.970 13.344 14.146 15.381 16.747 17.752 18.001 17.502 16.707 16.240 16.459 17.189 17.848 17.902 17.280 16.424 15.922 16.009 16.375 16.423 15.781 14.633 13.588 13.200 13.530 14.092 14.217 13.504 12.054 10.335 8.884 8.075 + 13.039 13.239 13.424 13.433 13.407 13.736 14.711 16.177 17.554 18.229 18.033 17.374 16.916 17.051 17.607 18.014 17.782 16.897 15.822 15.139 15.128 15.591 16.030 15.992 15.342 14.318 13.367 12.895 13.043 13.590 14.023 13.770 12.523 10.478 8.327 6.948 + 13.587 13.656 13.765 13.941 14.310 15.010 16.010 17.030 17.673 17.719 17.312 16.872 16.763 16.982 17.148 16.808 15.826 14.538 13.541 13.281 13.754 14.526 15.021 14.865 14.057 12.913 11.874 11.289 11.270 11.635 11.960 11.762 10.760 9.087 7.307 6.159 + 14.344 13.694 12.938 12.722 13.280 14.270 15.083 15.328 15.098 14.806 14.773 14.955 15.006 14.615 13.780 12.802 12.036 11.648 11.583 11.729 12.068 12.640 13.366 13.917 13.834 12.857 11.193 9.494 8.481 8.469 9.133 9.709 9.500 8.358 6.808 5.712 + 14.046 13.869 13.518 12.974 12.213 11.289 10.427 9.991 10.270 11.225 12.406 13.168 13.087 12.258 11.227 10.587 10.558 10.875 11.091 11.027 10.960 11.359 12.379 13.547 13.970 12.980 10.719 8.203 6.729 7.002 8.626 10.334 10.838 9.711 7.687 6.144 + 14.084 13.702 13.133 12.566 12.004 11.334 10.585 10.065 10.187 11.064 12.269 13.046 12.862 11.845 10.702 10.166 10.416 10.993 11.277 11.081 10.841 11.189 12.295 13.566 14.002 12.957 10.701 8.313 6.981 7.218 8.552 9.889 10.254 9.406 7.935 6.834 + 13.870 13.590 13.185 12.747 12.154 11.228 10.082 9.256 9.384 10.615 12.309 13.399 13.186 11.901 10.533 10.016 10.495 11.287 11.578 11.199 10.774 11.096 12.306 13.638 13.971 12.753 10.491 8.424 7.640 8.338 9.773 10.834 10.789 9.670 8.155 7.111 + 13.781 13.544 13.220 12.865 12.288 11.245 9.857 8.772 8.776 10.105 12.066 13.424 13.312 11.913 10.308 9.590 10.007 10.874 11.303 11.057 10.742 11.154 12.416 13.708 13.869 12.379 9.863 7.693 7.012 7.957 9.634 10.797 10.660 9.311 7.542 6.335 + 13.718 13.547 13.264 12.858 12.198 11.200 10.089 9.425 9.737 11.023 12.575 13.394 12.929 11.514 10.113 9.556 9.918 10.577 10.875 10.745 10.725 11.344 12.476 13.289 12.891 11.124 8.805 7.178 7.031 8.161 9.569 10.178 9.504 7.851 6.022 4.856 + 14.137 13.375 12.650 12.786 13.825 14.948 15.208 14.384 13.176 12.563 12.945 13.835 14.349 13.987 12.990 12.015 11.512 11.428 11.444 11.421 11.525 11.926 12.420 12.456 11.612 10.086 8.676 8.205 8.867 10.068 10.894 10.785 9.850 8.639 7.674 7.183 + 13.480 13.082 12.738 12.980 13.985 15.396 16.548 16.920 16.474 15.651 15.055 15.063 15.616 16.300 16.615 16.256 15.269 14.012 12.975 12.540 12.779 13.392 13.852 13.691 12.792 11.487 10.383 9.999 10.448 11.350 12.048 11.975 10.963 9.314 7.647 6.612 + 12.014 12.299 12.738 13.248 13.922 14.920 16.190 17.319 17.730 17.148 15.927 14.909 14.842 15.804 17.101 17.756 17.214 15.739 14.189 13.390 13.585 14.344 14.936 14.842 14.036 12.912 11.990 11.619 11.824 12.319 12.639 12.332 11.192 9.416 7.586 6.423 + 12.734 12.675 12.685 12.969 13.700 14.878 16.244 17.314 17.606 16.932 15.600 14.327 13.866 14.537 15.982 17.337 17.766 16.995 15.493 14.156 13.691 14.157 14.960 15.311 14.787 13.591 12.357 11.657 11.627 11.933 12.079 11.762 11.026 10.153 9.438 9.052 + 13.570 13.016 12.483 12.646 13.724 15.294 16.597 17.056 16.586 15.522 14.332 13.386 12.926 13.113 13.973 15.257 16.399 16.761 16.064 14.668 13.408 13.021 13.593 14.464 14.691 13.749 11.921 10.099 9.171 9.446 10.513 11.581 12.006 11.654 10.892 10.304 + 12.822 12.564 12.354 12.521 13.110 13.827 14.251 14.140 13.538 12.646 11.635 10.590 9.636 9.051 9.172 10.127 11.625 13.037 13.769 13.660 13.060 12.539 12.450 12.693 12.857 12.590 11.881 11.044 10.457 10.289 10.427 10.612 10.640 10.476 10.231 10.058 + 10.231 9.402 8.356 7.868 8.314 9.422 10.501 10.923 10.501 9.515 8.443 7.660 7.317 7.400 7.843 8.544 9.308 9.848 9.914 9.480 8.819 8.363 8.416 8.948 9.612 9.999 9.922 9.523 9.128 8.976 9.033 9.035 8.706 7.998 7.157 6.587 + 7.060 7.165 7.249 7.238 7.268 7.625 8.476 9.615 10.485 10.524 9.595 8.167 7.051 6.868 7.630 8.737 9.407 9.213 8.347 7.439 7.091 7.475 8.257 8.874 8.912 8.329 7.403 6.494 5.829 5.439 5.244 5.170 5.196 5.314 5.478 5.597 + 6.336 6.430 6.358 5.985 5.628 5.925 7.260 9.267 10.918 11.231 10.027 8.125 6.769 6.736 7.835 9.146 9.760 9.405 8.518 7.797 7.683 8.143 8.839 9.419 9.696 9.623 9.224 8.582 7.863 7.298 7.054 7.114 7.292 7.387 7.340 7.255 + 6.417 6.151 5.773 5.553 5.771 6.576 7.852 9.200 10.078 10.076 9.180 7.826 6.699 6.347 6.850 7.771 8.434 8.361 7.574 6.572 5.990 6.179 6.991 7.902 8.360 8.123 7.357 6.482 5.886 5.724 5.900 6.191 6.410 6.488 6.465 6.424 + 6.395 6.825 7.440 7.957 8.280 8.545 8.950 9.547 10.162 10.537 10.542 10.275 9.969 9.809 9.819 9.902 9.968 10.012 10.094 10.251 10.478 10.774 11.205 11.881 12.838 13.931 14.845 15.258 15.030 14.281 13.302 12.388 11.700 11.257 11.004 10.889 + 5.585 6.210 7.158 8.040 8.632 8.968 9.234 9.565 9.929 10.190 10.247 10.126 9.942 9.788 9.669 9.543 9.414 9.377 9.563 10.033 10.731 11.536 12.357 13.181 14.026 14.850 15.504 15.802 15.639 15.078 14.328 13.633 13.156 12.926 12.869 12.876 + 6.954 6.945 6.959 7.027 7.152 7.320 7.526 7.772 8.027 8.201 8.189 7.975 7.716 7.680 8.070 8.848 9.740 10.438 10.854 11.197 11.793 12.791 13.998 15.004 15.493 15.471 15.239 15.127 15.240 15.429 15.480 15.329 15.107 14.992 15.031 15.115 + 7.756 7.744 7.998 8.739 9.825 10.770 11.134 10.899 10.481 10.363 10.679 11.138 11.349 11.225 11.078 11.328 12.094 13.077 13.818 14.094 14.073 14.112 14.404 14.823 15.080 15.028 14.804 14.680 14.805 15.078 15.269 15.250 15.090 14.956 14.934 14.969 + 10.622 10.716 10.898 11.092 11.130 10.851 10.257 9.574 9.126 9.093 9.383 9.736 9.975 10.179 10.599 11.400 12.460 13.428 13.995 14.121 14.030 13.972 14.004 13.990 13.803 13.519 13.380 13.567 13.994 14.346 14.332 13.930 13.389 13.007 12.887 12.907 + 14.182 14.580 14.877 14.487 13.225 11.486 9.970 9.213 9.272 9.796 10.361 10.774 11.124 11.603 12.275 13.010 13.580 13.808 13.648 13.166 12.481 11.738 11.096 10.688 10.561 10.631 10.731 10.724 10.608 10.504 10.549 10.778 11.098 11.374 11.532 11.590 + 14.343 14.274 14.039 13.614 13.164 12.936 12.986 13.051 12.745 11.951 11.033 10.615 11.075 12.189 13.272 13.702 13.385 12.751 12.312 12.202 12.120 11.694 10.891 10.070 9.643 9.691 9.908 9.925 9.673 9.424 9.492 9.892 10.311 10.419 10.191 9.924 + 16.963 16.549 15.792 14.862 14.007 13.439 13.189 13.065 12.792 12.251 11.618 11.257 11.438 12.085 12.794 13.105 12.822 12.135 11.442 11.048 10.965 10.961 10.788 10.379 9.864 9.436 9.199 9.124 9.109 9.082 9.036 8.991 8.959 8.930 8.898 8.875 + 16.951 16.489 15.726 14.904 14.226 13.747 13.356 12.880 12.241 11.557 11.090 11.052 11.433 11.980 12.366 12.403 12.131 11.729 11.330 10.937 10.500 10.053 9.750 9.737 9.970 10.187 10.093 9.617 9.002 8.614 8.622 8.836 8.859 8.444 7.737 7.191 + 17.467 16.711 15.616 14.696 14.197 13.985 13.745 13.297 12.727 12.252 11.993 11.867 11.715 11.497 11.347 11.421 11.684 11.870 11.672 11.010 10.133 9.456 9.259 9.497 9.868 10.058 9.957 9.677 9.401 9.212 9.052 8.802 8.406 7.921 7.482 7.222 + 15.467 15.499 15.378 14.917 14.115 13.176 12.354 11.780 11.420 11.191 11.074 11.111 11.282 11.430 11.346 10.947 10.379 9.911 9.706 9.681 9.597 9.301 8.886 8.610 8.639 8.877 9.045 8.946 8.648 8.406 8.382 8.449 8.287 7.703 6.873 6.262 + 13.524 13.136 12.574 12.058 11.597 11.011 10.180 9.288 8.797 9.116 10.223 11.566 12.382 12.205 11.190 9.997 9.320 9.419 9.992 10.456 10.391 9.806 9.069 8.597 8.560 8.818 9.078 9.124 8.938 8.644 8.370 8.154 7.949 7.711 7.467 7.306 + 12.822 12.170 11.340 10.841 10.759 10.705 10.234 9.362 8.662 8.845 10.129 11.959 13.336 13.506 12.484 11.001 9.954 9.798 10.321 10.911 11.050 10.634 9.947 9.365 9.091 9.075 9.130 9.101 8.944 8.701 8.433 8.179 7.954 7.767 7.630 7.557 + 9.644 9.403 9.238 9.411 9.770 9.815 9.164 8.017 7.147 7.372 8.907 11.149 13.056 13.824 13.336 12.089 10.757 9.775 9.228 9.011 9.006 9.124 9.250 9.242 9.036 8.734 8.548 8.601 8.777 8.791 8.441 7.809 7.214 6.944 7.013 7.172 + 9.376 9.430 9.711 10.317 11.024 11.339 10.850 9.610 8.208 7.425 7.705 8.846 10.146 10.882 10.765 10.038 9.211 8.662 8.433 8.325 8.157 7.943 7.845 7.981 8.282 8.513 8.454 8.070 7.527 7.061 6.808 6.725 6.665 6.516 6.297 6.131 + 6.280 6.541 7.056 7.753 8.448 8.855 8.712 7.952 6.821 5.824 5.482 6.030 7.242 8.522 9.239 9.084 8.226 7.168 6.410 6.162 6.284 6.467 6.480 6.304 6.079 5.947 5.942 5.993 6.014 5.980 5.926 5.895 5.898 5.910 5.913 5.909 + 5.505 5.821 6.313 6.773 7.019 6.975 6.684 6.269 5.876 5.635 5.644 5.948 6.511 7.173 7.679 7.784 7.413 6.753 6.187 6.057 6.423 6.986 7.277 6.987 6.201 5.347 4.889 4.997 5.443 5.814 5.847 5.622 5.446 5.563 5.923 6.237 + 4.247 4.508 5.044 5.758 6.375 6.568 6.216 5.552 5.026 4.971 5.361 5.878 6.233 6.412 6.641 7.095 7.670 8.046 7.992 7.612 7.273 7.280 7.597 7.902 7.902 7.607 7.292 7.185 7.206 7.035 6.447 5.586 4.889 4.709 4.994 5.330 + 5.500 5.032 4.738 5.254 6.546 7.858 8.344 7.783 6.732 6.001 5.969 6.372 6.699 6.755 6.821 7.292 8.201 9.129 9.587 9.464 9.089 8.864 8.869 8.851 8.592 8.220 8.102 8.398 8.756 8.548 7.477 5.974 4.939 4.996 5.919 6.789 + 5.820 5.132 4.510 4.786 6.125 7.859 9.028 9.138 8.472 7.750 7.498 7.705 7.999 8.100 8.074 8.196 8.611 9.176 9.620 9.813 9.852 9.898 9.975 9.969 9.828 9.701 9.812 10.160 10.379 9.990 8.859 7.450 6.544 6.625 7.445 8.203 + 6.518 6.052 5.626 5.794 6.665 7.830 8.745 9.195 9.401 9.698 10.137 10.417 10.222 9.610 9.065 9.127 9.928 11.067 11.915 12.082 11.638 10.955 10.374 10.027 9.895 9.969 10.249 10.619 10.770 10.373 9.398 8.263 7.601 7.771 8.533 9.204 + 9.279 8.972 8.689 8.804 9.416 10.267 10.960 11.258 11.218 11.048 10.882 10.686 10.383 10.045 9.933 10.306 11.170 12.190 12.875 12.906 12.331 11.501 10.801 10.418 10.296 10.285 10.302 10.370 10.534 10.747 10.858 10.708 10.247 9.585 8.943 8.551 + 7.801 7.864 7.987 8.160 8.370 8.627 8.986 9.528 10.287 11.168 11.926 12.272 12.061 11.438 10.816 10.661 11.192 12.210 13.194 13.614 13.264 12.377 11.452 10.904 10.827 10.999 11.125 11.090 11.017 11.093 11.338 11.530 11.368 10.750 9.914 9.317 + 9.044 8.747 8.353 8.136 8.271 8.766 9.507 10.376 11.318 12.285 13.134 13.593 13.412 12.611 11.614 11.099 11.579 12.996 14.656 15.620 15.319 13.942 12.299 11.241 11.083 11.454 11.686 11.385 10.723 10.224 10.260 10.722 11.134 11.099 10.658 10.237 + 9.521 9.118 8.713 8.770 9.423 10.362 11.089 11.341 11.308 11.448 12.054 12.947 13.577 13.485 12.754 12.035 12.090 13.179 14.794 15.986 16.044 15.006 13.596 12.636 12.430 12.597 12.482 11.761 10.727 10.024 10.083 10.753 11.454 11.683 11.418 11.078 + 9.329 9.705 10.156 10.338 10.156 9.847 9.797 10.252 11.152 12.197 13.055 13.531 13.619 13.450 13.228 13.174 13.461 14.108 14.913 15.521 15.629 15.196 14.471 13.796 13.337 12.973 12.470 11.760 11.074 10.773 11.014 11.559 11.937 11.825 11.326 10.879 + 10.457 10.540 10.623 10.587 10.364 10.013 9.743 9.830 10.465 11.596 12.895 13.893 14.252 13.989 13.501 13.317 13.736 14.600 15.386 15.570 15.008 14.046 13.255 12.992 13.138 13.223 12.842 12.025 11.235 10.998 11.445 12.176 12.559 12.240 11.436 10.771 + 11.696 11.894 12.193 12.461 12.618 12.700 12.842 13.191 13.782 14.475 14.997 15.106 14.762 14.205 13.838 13.983 14.642 15.462 15.941 15.757 14.987 14.050 13.396 13.172 13.137 12.889 12.239 11.423 10.954 11.199 12.032 12.840 12.940 12.100 10.762 9.765 + 12.208 12.408 12.685 12.928 13.160 13.542 14.218 15.162 16.153 16.898 17.211 17.095 16.706 16.258 15.950 15.927 16.233 16.754 17.209 17.267 16.749 15.779 14.718 13.902 13.393 12.967 12.374 11.643 11.122 11.185 11.825 12.534 12.637 11.833 10.507 9.504 + 12.047 12.360 12.723 12.891 12.921 13.172 13.991 15.357 16.820 17.785 17.936 17.436 16.777 16.426 16.556 17.036 17.611 18.075 18.315 18.266 17.882 17.176 16.261 15.313 14.469 13.764 13.191 12.798 12.709 12.979 13.417 13.578 13.024 11.696 10.077 8.965 + 11.716 12.070 12.564 12.958 13.211 13.544 14.267 15.489 16.939 18.065 18.380 17.812 16.802 16.038 16.017 16.722 17.671 18.282 18.267 17.768 17.159 16.691 16.302 15.729 14.809 13.699 12.805 12.485 12.766 13.296 13.571 13.253 12.349 11.159 10.088 9.467 + 12.332 12.725 13.232 13.567 13.719 13.998 14.759 16.038 17.423 18.279 18.202 17.326 16.265 15.707 15.966 16.815 17.693 18.116 17.973 17.519 17.096 16.840 16.587 16.042 15.066 13.854 12.864 12.543 13.023 13.992 14.822 14.896 13.944 12.213 10.369 9.190 + 12.272 12.854 13.552 13.912 13.969 14.244 15.219 16.791 18.226 18.709 18.025 16.775 15.925 16.067 17.008 17.995 18.345 17.937 17.195 16.653 16.518 16.561 16.371 15.690 14.581 13.362 12.423 12.081 12.458 13.396 14.426 14.911 14.367 12.824 10.926 9.627 + 12.297 13.054 13.957 14.421 14.509 14.868 16.019 17.694 18.912 18.809 17.458 15.909 15.367 16.202 17.675 18.586 18.261 17.014 15.768 15.246 15.453 15.841 15.841 15.264 14.268 13.095 11.951 11.095 10.896 11.601 12.957 14.102 14.044 12.436 10.019 8.238 + 12.792 13.369 14.163 14.818 15.329 15.995 17.020 18.163 18.845 18.647 17.745 16.841 16.598 17.076 17.665 17.601 16.601 15.094 13.864 13.448 13.797 14.403 14.702 14.393 13.483 12.184 10.852 9.968 10.021 11.189 13.027 14.523 14.659 13.160 10.825 9.100 + 13.201 13.494 14.127 15.112 16.318 17.437 18.097 18.072 17.477 16.755 16.421 16.703 17.341 17.733 17.342 16.088 14.404 12.944 12.154 12.060 12.371 12.763 13.051 13.141 12.906 12.210 11.121 10.088 9.792 10.666 12.423 14.068 14.502 13.341 11.291 9.727 + 12.905 13.415 14.402 15.712 17.008 17.839 17.874 17.140 16.087 15.353 15.350 15.957 16.564 16.498 15.506 13.939 12.483 11.641 11.405 11.382 11.231 11.002 11.039 11.532 12.183 12.362 11.694 10.554 9.934 10.678 12.660 14.677 15.246 13.767 11.105 9.057 + 12.476 13.359 14.827 16.358 17.378 17.498 16.727 15.516 14.546 14.340 14.920 15.768 16.136 15.542 14.092 12.391 11.107 10.518 10.396 10.311 10.065 9.877 10.121 10.869 11.670 11.847 11.105 9.933 9.361 10.185 12.234 14.342 15.122 14.020 11.803 10.062 + 12.298 13.330 14.910 16.327 17.013 16.801 15.963 15.013 14.426 14.397 14.766 15.127 15.061 14.380 13.234 12.001 11.040 10.459 10.098 9.749 9.405 9.312 9.724 10.546 11.250 11.195 10.201 8.863 8.260 9.170 11.379 13.671 14.629 13.678 11.571 9.888 + 12.244 13.304 14.818 15.967 16.226 15.624 14.633 13.815 13.494 13.651 14.026 14.303 14.247 13.770 12.937 11.926 10.949 10.143 9.535 9.094 8.847 8.904 9.328 9.931 10.247 9.799 8.542 7.104 6.500 7.431 9.652 11.981 13.050 12.288 10.389 8.845 + 11.843 13.137 14.856 15.909 15.746 14.645 13.362 12.521 12.277 12.431 12.758 13.186 13.665 13.984 13.795 12.891 11.458 10.022 9.106 8.890 9.167 9.573 9.843 9.832 9.396 8.371 6.789 5.138 4.279 4.909 6.931 9.311 10.697 10.391 8.910 7.606 + 11.589 12.967 14.760 15.768 15.416 14.074 12.630 11.762 11.512 11.477 11.345 11.229 11.501 12.323 13.345 13.890 13.479 12.249 10.892 10.171 10.383 11.173 11.800 11.618 10.439 8.588 6.695 5.388 5.042 5.660 6.885 8.168 9.017 9.240 9.017 8.747 + 11.586 12.781 14.337 15.214 14.913 13.764 12.568 11.914 11.760 11.593 10.993 10.085 9.486 9.788 11.030 12.595 13.644 13.724 13.080 12.425 12.362 12.911 13.489 13.347 12.117 10.090 8.042 6.760 6.604 7.360 8.435 9.216 9.379 8.984 8.366 7.928 + 11.248 12.227 13.508 14.243 14.015 13.065 12.003 11.298 10.981 10.763 10.400 9.949 9.685 9.812 10.256 10.745 11.077 11.325 11.771 12.626 13.781 14.806 15.188 14.634 13.235 11.406 9.688 8.536 8.171 8.526 9.277 9.973 10.249 10.008 9.478 9.060 + 10.767 12.075 13.644 14.232 13.383 11.704 10.261 9.691 9.792 9.891 9.556 8.971 8.674 8.971 9.633 10.132 10.165 9.939 9.978 10.645 11.850 13.154 14.117 14.535 14.410 13.804 12.797 11.607 10.647 10.336 10.759 11.491 11.854 11.442 10.487 9.702 + 10.961 12.022 13.290 13.757 13.053 11.680 10.515 10.070 10.146 10.136 9.647 8.850 8.277 8.298 8.786 9.262 9.362 9.166 9.119 9.620 10.682 11.914 12.815 13.096 12.793 12.161 11.504 11.074 11.038 11.428 12.068 12.598 12.650 12.112 11.264 10.633 + 12.062 13.073 14.174 14.323 13.224 11.542 10.271 9.894 10.055 10.014 9.392 8.512 8.047 8.351 9.117 9.677 9.633 9.217 9.067 9.645 10.824 12.002 12.586 12.410 11.772 11.135 10.824 10.931 11.408 12.155 12.989 13.615 13.724 13.229 12.410 11.793 + 12.694 13.483 14.349 14.477 13.621 12.278 11.218 10.837 10.890 10.812 10.281 9.505 8.984 9.024 9.460 9.841 9.874 9.695 9.738 10.327 11.384 12.477 13.151 13.233 12.891 12.475 12.311 12.596 13.368 14.474 15.548 16.092 15.719 14.462 12.872 11.774 + 13.249 13.730 14.235 14.255 13.656 12.758 12.011 11.579 11.236 10.655 9.788 8.977 8.677 9.055 9.836 10.538 10.870 10.952 11.158 11.767 12.719 13.670 14.259 14.345 14.055 13.663 13.464 13.689 14.447 15.625 16.830 17.478 17.110 15.742 13.987 12.770 + 13.291 13.879 14.518 14.590 13.905 12.821 11.894 11.400 11.166 10.828 10.240 9.636 9.389 9.633 10.107 10.391 10.307 10.112 10.303 11.188 12.609 14.017 14.850 14.877 14.311 13.632 13.332 13.704 14.756 16.196 17.495 18.062 17.534 16.036 14.229 13.006 + 13.746 14.237 14.771 14.815 14.172 13.107 12.101 11.468 11.167 10.941 10.613 10.258 10.093 10.222 10.500 10.654 10.562 10.409 10.585 11.371 12.681 14.064 14.967 15.072 14.489 13.693 13.273 13.636 14.808 16.396 17.731 18.163 17.383 15.631 13.651 12.352 + 13.811 14.246 14.734 14.811 14.288 13.378 12.503 11.956 11.717 11.537 11.203 10.730 10.328 10.198 10.347 10.602 10.789 10.913 11.172 11.781 12.755 13.828 14.589 14.737 14.297 13.636 13.285 13.651 14.776 16.272 17.475 17.756 16.852 15.042 13.066 11.789 + 13.607 14.111 14.709 14.910 14.510 13.716 12.927 12.394 12.052 11.655 11.067 10.431 10.053 10.131 10.555 10.998 11.194 11.178 11.273 11.811 12.833 13.999 14.786 14.847 14.250 13.461 13.064 13.424 14.473 15.743 16.596 16.535 15.449 13.678 11.879 10.756 + 13.280 13.867 14.641 15.090 14.928 14.242 13.349 12.529 11.870 11.319 10.850 10.558 10.576 10.905 11.341 11.599 11.546 11.338 11.341 11.864 12.906 14.113 14.973 15.127 14.593 13.769 13.224 13.390 14.325 15.647 16.684 16.795 15.708 13.708 11.566 10.191 + 12.702 13.506 14.596 15.298 15.226 14.463 13.389 12.370 11.568 10.990 10.642 10.585 10.833 11.243 11.549 11.566 11.361 11.240 11.520 12.280 13.299 14.213 14.742 14.803 14.477 13.931 13.391 13.140 13.433 14.293 15.342 15.883 15.308 13.579 11.407 9.907 + 12.493 13.390 14.640 15.513 15.546 14.754 13.514 12.264 11.278 10.641 10.351 10.389 10.684 11.073 11.351 11.407 11.339 11.402 11.821 12.614 13.576 14.421 14.952 15.122 14.971 14.562 14.000 13.485 13.286 13.559 14.158 14.630 14.482 13.576 12.305 11.390 + 12.047 13.190 14.724 15.691 15.575 14.543 13.170 11.978 11.208 10.895 11.047 11.635 12.429 12.958 12.782 11.899 10.890 10.560 11.320 12.828 14.245 14.900 14.781 14.428 14.362 14.606 14.757 14.495 13.985 13.748 14.093 14.712 14.877 14.113 12.722 11.625 + 11.953 13.155 14.700 15.558 15.303 14.313 13.305 12.689 12.355 11.996 11.562 11.337 11.586 12.167 12.587 12.467 11.963 11.695 12.186 13.361 14.565 15.119 14.876 14.278 13.880 13.838 13.859 13.619 13.193 13.025 13.451 14.283 14.896 14.787 14.071 13.406 + 10.513 11.668 13.238 14.321 14.490 13.980 13.314 12.814 12.441 12.034 11.618 11.398 11.487 11.704 11.737 11.528 11.444 11.976 13.197 14.541 15.188 14.780 13.789 13.138 13.378 14.174 14.605 14.031 12.728 11.678 11.704 12.738 13.912 14.362 13.991 13.459 + 9.963 11.404 13.344 14.625 14.714 13.945 13.059 12.533 12.318 12.113 11.809 11.589 11.648 11.886 11.975 11.755 11.513 11.778 12.777 14.084 14.881 14.642 13.627 12.674 12.468 12.945 13.403 13.210 12.438 11.806 12.001 13.025 14.196 14.783 14.659 14.322 + 9.704 11.141 13.167 14.660 14.943 14.123 12.868 11.880 11.492 11.610 11.933 12.188 12.220 11.988 11.578 11.220 11.232 11.818 12.848 13.851 14.294 13.975 13.195 12.534 12.394 12.706 13.058 13.124 12.980 13.023 13.565 14.500 15.361 15.730 15.599 15.345 + 10.503 11.808 13.572 14.740 14.787 13.980 13.020 12.443 12.304 12.329 12.278 12.127 11.966 11.808 11.578 11.310 11.266 11.766 12.838 14.038 14.697 14.447 13.557 12.739 12.564 13.003 13.497 13.511 13.035 12.589 12.739 13.583 14.686 15.493 15.794 15.799 + 10.756 12.138 13.965 15.086 14.966 13.952 12.832 12.161 11.943 11.865 11.733 11.634 11.726 11.946 12.033 11.845 11.618 11.822 12.695 13.908 14.748 14.691 13.867 12.954 12.593 12.865 13.307 13.434 13.239 13.172 13.641 14.537 15.281 15.364 14.841 14.299 + 12.111 13.126 14.397 15.017 14.620 13.564 12.525 11.916 11.667 11.484 11.247 11.110 11.238 11.529 11.655 11.431 11.104 11.218 12.120 13.568 14.845 15.317 14.944 14.266 13.899 14.014 14.278 14.276 13.970 13.734 13.944 14.558 15.120 15.190 14.784 14.356 + 12.180 13.363 14.846 15.564 15.066 13.769 12.514 11.860 11.750 11.753 11.564 11.264 11.130 11.266 11.472 11.491 11.352 11.428 12.102 13.347 14.643 15.334 15.134 14.342 13.577 13.308 13.559 14.022 14.377 14.526 14.545 14.493 14.316 13.952 13.485 13.146 + 12.991 13.963 15.132 15.569 14.918 13.606 12.422 11.857 11.791 11.732 11.342 10.729 10.279 10.239 10.481 10.677 10.674 10.708 11.210 12.389 13.974 15.344 15.953 15.690 14.905 14.139 13.776 13.898 14.341 14.850 15.185 15.166 14.713 13.916 13.053 12.489 + 13.454 14.239 15.138 15.357 14.598 13.250 12.022 11.378 11.249 11.228 10.999 10.589 10.256 10.181 10.303 10.432 10.512 10.726 11.347 12.458 13.836 15.075 15.840 16.029 15.752 15.212 14.638 14.282 14.364 14.919 15.627 15.874 15.105 13.290 11.106 9.616 + 13.604 14.221 14.907 15.008 14.266 12.992 11.778 11.035 10.751 10.623 10.397 10.084 9.886 9.951 10.221 10.511 10.722 10.968 11.484 12.414 13.654 14.889 15.766 16.061 15.759 15.040 14.238 13.750 13.880 14.632 15.588 16.050 15.447 13.766 11.695 10.275 + 13.681 14.057 14.434 14.368 13.698 12.663 11.691 11.071 10.785 10.607 10.353 10.041 9.837 9.870 10.113 10.427 10.722 11.064 11.624 12.516 13.665 14.801 15.570 15.703 15.138 14.075 12.946 12.276 12.441 13.421 14.711 15.517 15.214 13.775 11.880 10.556 + 13.856 14.053 14.191 13.975 13.317 12.409 11.570 11.006 10.701 10.489 10.237 9.953 9.758 9.757 9.961 10.313 10.773 11.367 12.143 13.084 14.063 14.860 15.245 15.053 14.261 13.048 11.809 11.064 11.222 12.293 13.761 14.774 14.631 13.266 11.370 10.024 + 13.853 13.878 13.828 13.573 13.043 12.294 11.488 10.812 10.365 10.110 9.927 9.730 9.553 9.540 9.832 10.438 11.214 11.963 12.574 13.080 13.576 14.045 14.278 13.976 12.994 11.559 10.253 9.738 10.358 11.884 13.577 14.570 14.342 13.016 11.307 10.136 + 13.592 13.478 13.315 13.119 12.778 12.138 11.201 10.214 9.528 9.321 9.451 9.601 9.590 9.557 9.818 10.519 11.424 12.080 12.215 12.002 11.905 12.213 12.688 12.700 11.770 10.073 8.459 7.905 8.835 10.799 12.763 13.750 13.380 11.996 10.380 9.332 + 13.383 13.202 12.999 12.859 12.623 12.002 10.922 9.712 8.914 8.827 9.243 9.643 9.702 9.592 9.786 10.506 11.402 11.802 11.359 10.467 9.994 10.505 11.667 12.422 11.851 9.991 7.921 6.996 7.855 9.987 12.143 13.204 12.823 11.454 9.928 8.971 + 12.923 12.888 12.833 12.703 12.347 11.636 10.637 9.658 9.049 8.931 9.109 9.285 9.383 9.635 10.307 11.305 12.089 12.053 11.102 9.866 9.283 9.830 11.050 11.836 11.298 9.514 7.550 6.705 7.584 9.700 11.851 12.937 12.580 11.192 9.604 8.591 + 12.793 12.858 12.894 12.756 12.320 11.579 10.683 9.870 9.320 9.047 8.937 8.917 9.071 9.577 10.466 11.440 11.963 11.645 10.609 9.512 9.112 9.676 10.715 11.295 10.741 9.190 7.562 6.943 7.848 9.880 11.994 13.159 12.924 11.586 9.946 8.859 + 12.696 12.877 13.063 13.006 12.539 11.702 10.730 9.917 9.433 9.231 9.145 9.087 9.170 9.614 10.488 11.514 12.165 12.027 11.179 10.220 9.876 10.430 11.440 12.001 11.409 9.740 7.895 7.045 7.860 10.043 12.490 13.939 13.687 11.958 9.737 8.227 + 12.783 12.993 13.220 13.194 12.742 11.906 10.934 10.127 9.645 9.426 9.281 9.104 9.017 9.291 10.086 11.217 12.177 12.464 11.973 11.133 10.627 10.868 11.639 12.192 11.794 10.329 8.491 7.402 7.879 9.855 12.346 14.007 13.927 12.175 9.764 8.077 + 12.903 13.097 13.318 13.314 12.894 12.061 11.042 10.168 9.658 9.477 9.388 9.192 8.952 8.991 9.613 10.782 12.032 12.756 12.663 12.035 11.532 11.666 12.347 12.905 12.591 11.206 9.359 8.128 8.341 9.985 12.151 13.569 13.373 11.628 9.293 7.673 + 12.737 13.107 13.523 13.563 13.002 11.964 10.835 10.003 9.607 9.487 9.350 9.035 8.664 8.573 9.057 10.119 11.420 12.469 12.938 12.863 12.593 12.495 12.648 12.754 12.361 11.255 9.732 8.505 8.279 9.244 10.867 12.152 12.257 11.047 9.225 7.903 + 12.783 13.062 13.351 13.301 12.722 11.718 10.624 9.783 9.332 9.138 8.943 8.602 8.230 8.146 8.629 9.690 11.013 12.142 12.777 12.957 12.975 13.106 13.331 13.312 12.653 11.274 9.604 8.416 8.364 9.532 11.301 12.667 12.837 11.726 10.028 8.797 + 12.781 12.957 13.124 13.023 12.483 11.548 10.487 9.635 9.185 9.057 8.977 8.716 8.306 8.045 8.267 9.056 10.157 11.164 11.837 12.266 12.727 13.338 13.842 13.723 12.632 10.773 8.920 8.005 8.537 10.242 12.197 13.350 13.106 11.639 9.764 8.489 + 12.376 12.661 12.888 12.664 11.886 10.817 9.872 9.295 9.017 8.792 8.447 8.033 7.753 7.771 8.099 8.631 9.258 9.948 10.715 11.549 12.371 13.044 13.381 13.164 12.217 10.578 8.678 7.314 7.295 8.868 11.367 13.425 13.772 12.118 9.454 7.478 + 11.875 12.168 12.431 12.261 11.485 10.302 9.152 8.430 8.234 8.340 8.400 8.209 7.841 7.569 7.657 8.172 8.973 9.837 10.630 11.357 12.074 12.724 13.070 12.802 11.770 10.189 8.641 7.825 8.166 9.532 11.239 12.398 12.396 11.264 9.670 8.544 + 11.873 12.136 12.400 12.288 11.550 10.280 8.937 8.090 8.015 8.454 8.779 8.491 7.662 6.928 6.980 7.973 9.366 10.362 10.588 10.389 10.480 11.224 12.231 12.637 11.871 10.223 8.701 8.282 9.180 10.735 11.960 12.260 11.735 10.909 10.254 9.938 + 12.047 12.706 13.396 13.354 12.301 10.680 9.343 8.900 9.257 9.710 9.541 8.643 7.649 7.439 8.401 10.054 11.374 11.581 10.762 9.791 9.611 10.443 11.596 12.023 11.191 9.538 8.149 7.937 8.987 10.562 11.702 11.895 11.302 10.458 9.809 9.500 + 13.290 13.211 12.971 12.469 11.689 10.770 9.979 9.538 9.436 9.404 9.136 8.620 8.255 8.574 9.728 11.199 12.061 11.694 10.359 9.104 8.969 10.111 11.595 12.091 10.955 8.782 6.980 6.694 7.974 9.837 11.109 11.292 10.754 10.201 10.014 10.061 + 14.187 13.523 12.631 12.017 11.862 11.925 11.814 11.335 10.620 9.969 9.605 9.583 9.861 10.374 10.980 11.376 11.182 10.247 8.924 7.980 8.069 9.159 10.421 10.794 9.822 8.076 6.770 6.850 8.292 10.179 11.443 11.638 11.107 10.516 10.248 10.228 + 12.850 13.141 13.601 14.003 14.081 13.686 12.910 12.057 11.457 11.242 11.306 11.460 11.618 11.810 12.000 11.936 11.284 9.984 8.509 7.670 8.009 9.260 10.407 10.397 9.007 7.095 5.996 6.501 8.259 10.099 10.976 10.737 10.075 9.793 10.088 10.501 + 13.841 13.490 13.159 13.211 13.614 13.947 13.787 13.114 12.353 12.005 12.238 12.790 13.227 13.273 12.901 12.184 11.160 9.907 8.726 8.125 8.479 9.602 10.706 10.900 9.894 8.297 7.180 7.233 8.223 9.240 9.500 9.001 8.430 8.463 9.115 9.757 + 13.620 13.277 13.037 13.319 14.055 14.701 14.728 14.117 13.369 13.038 13.232 13.558 13.529 12.996 12.199 11.431 10.735 9.965 9.125 8.571 8.749 9.701 10.837 11.313 10.723 9.486 8.490 8.311 8.705 8.903 8.421 7.624 7.449 8.504 10.375 11.838 + 13.619 13.076 12.659 13.026 14.131 15.225 15.538 14.991 14.229 13.975 14.330 14.711 14.451 13.443 12.193 11.274 10.773 10.304 9.559 8.764 8.531 9.202 10.378 11.166 10.962 10.024 9.226 9.215 9.771 10.038 9.417 8.257 7.613 8.260 9.883 11.247 + 13.456 12.908 12.455 12.753 13.816 14.985 15.531 15.314 14.852 14.752 15.071 15.250 14.655 13.224 11.556 10.389 9.967 9.912 9.689 9.180 8.790 9.004 9.856 10.843 11.379 11.302 10.947 10.730 10.688 10.473 9.794 8.835 8.189 8.315 9.064 9.751 + 13.024 12.508 12.024 12.171 13.070 14.271 15.166 15.489 15.439 15.353 15.283 14.928 13.967 12.460 10.900 9.843 9.474 9.507 9.504 9.287 9.060 9.148 9.654 10.365 10.969 11.323 11.484 11.501 11.248 10.541 9.453 8.472 8.244 9.040 10.430 11.496 + 12.486 12.220 11.956 12.037 12.641 13.653 14.745 15.566 15.916 15.780 15.251 14.425 13.373 12.178 10.989 10.006 9.393 9.177 9.218 9.288 9.214 8.999 8.838 8.991 9.599 10.528 11.369 11.623 10.984 9.575 7.957 6.871 6.835 7.820 9.233 10.237 + 12.518 12.221 11.924 12.009 12.660 13.739 14.876 15.709 16.088 16.090 15.866 15.472 14.828 13.834 12.536 11.189 10.125 9.544 9.378 9.354 9.223 8.958 8.783 8.988 9.677 10.642 11.456 11.731 11.339 10.466 9.476 8.697 8.276 8.169 8.227 8.299 + 12.542 12.208 11.821 11.777 12.341 13.457 14.752 15.750 16.170 16.096 15.867 15.765 15.747 15.472 14.598 13.130 11.485 10.218 9.622 9.547 9.604 9.545 9.486 9.755 10.513 11.511 12.220 12.227 11.558 10.629 9.892 9.489 9.229 8.862 8.374 8.004 + 12.157 12.007 11.781 11.685 12.020 12.971 14.370 15.690 16.382 16.297 15.815 15.507 15.600 15.747 15.334 14.077 12.339 10.862 10.144 10.050 10.014 9.654 9.170 9.133 9.862 11.000 11.741 11.524 10.537 9.552 9.212 9.452 9.607 9.095 8.025 7.141 + 11.930 11.871 11.679 11.446 11.547 12.388 13.932 15.531 16.339 16.022 15.099 14.529 14.856 15.689 16.035 15.191 13.382 11.552 10.518 10.318 10.353 10.142 9.877 10.189 11.348 12.754 13.304 12.379 10.498 8.957 8.717 9.558 10.309 9.958 8.617 7.409 + 11.671 11.739 11.693 11.503 11.513 12.200 13.623 15.157 15.887 15.402 14.242 13.497 13.868 15.025 15.881 15.544 14.075 12.361 11.273 10.936 10.812 10.437 10.009 10.173 11.221 12.546 13.017 11.983 9.962 8.281 7.922 8.653 9.265 8.727 7.185 5.845 + 11.505 11.580 11.586 11.521 11.701 12.518 13.945 15.328 15.805 15.055 13.688 12.822 13.162 14.393 15.449 15.438 14.349 12.940 11.952 11.461 10.993 10.225 9.485 9.482 10.493 11.873 12.471 11.641 9.902 8.529 8.411 9.213 9.682 8.839 6.959 5.399 + 11.550 11.333 10.940 10.512 10.277 10.404 10.820 11.190 11.154 10.642 9.984 9.669 9.950 10.632 11.250 11.443 11.191 10.705 10.134 9.435 8.560 7.736 7.469 8.151 9.588 10.955 11.338 10.469 8.990 7.958 7.961 8.617 8.927 8.191 6.684 5.463 + 11.883 11.774 11.569 11.333 11.181 11.197 11.325 11.368 11.121 10.552 9.865 9.357 9.201 9.332 9.541 9.655 9.633 9.490 9.187 8.660 7.990 7.522 7.707 8.713 10.134 11.129 11.004 9.789 8.297 7.524 7.849 8.705 9.039 8.220 6.619 5.344 + 11.802 11.637 11.402 11.234 11.222 11.342 11.454 11.387 11.058 10.536 10.008 9.655 9.547 9.627 9.780 9.918 9.988 9.939 9.709 9.300 8.881 8.770 9.234 10.221 11.258 11.686 11.122 9.796 8.451 7.832 8.119 8.782 8.995 8.312 7.051 6.064 + 12.061 11.885 11.632 11.526 11.847 12.723 13.904 14.798 14.828 13.894 12.537 11.610 11.689 12.686 13.980 14.925 15.289 15.279 15.198 15.139 14.975 14.614 14.157 13.776 13.438 12.864 11.837 10.608 9.898 10.347 11.827 13.276 13.370 11.584 8.768 6.665 + 11.870 11.876 11.864 11.908 12.233 13.041 14.218 15.252 15.515 14.763 13.408 12.293 12.104 12.898 14.120 15.069 15.391 15.198 14.808 14.415 14.019 13.597 13.244 13.079 13.020 12.749 12.006 10.972 10.283 10.540 11.664 12.726 12.548 10.676 7.915 5.888 + 11.865 11.758 11.647 11.734 12.254 13.297 14.643 15.772 16.139 15.535 14.274 13.021 12.380 12.547 13.265 14.070 14.593 14.694 14.402 13.820 13.101 12.484 12.227 12.417 12.822 12.983 12.565 11.696 10.941 10.845 11.397 11.902 11.465 9.762 7.442 5.778 + 12.103 11.852 11.589 11.663 12.322 13.520 14.883 15.863 16.037 15.355 14.168 13.018 12.338 12.275 12.712 13.418 14.156 14.693 14.800 14.335 13.399 12.391 11.829 11.980 12.613 13.117 12.961 12.138 11.189 10.731 10.876 11.044 10.418 8.678 6.415 4.811 + 12.417 12.049 11.692 11.832 12.692 14.043 15.307 15.894 15.539 14.431 13.070 11.986 11.491 11.606 12.147 12.850 13.450 13.719 13.513 12.850 11.969 11.265 11.080 11.468 12.123 12.559 12.444 11.833 11.104 10.632 10.448 10.193 9.413 7.994 6.357 5.252 + 12.300 12.291 12.365 12.651 13.220 13.985 14.669 14.910 14.460 13.376 12.048 11.019 10.698 11.132 12.003 12.825 13.207 13.024 12.419 11.684 11.107 10.862 10.943 11.171 11.271 11.017 10.400 9.670 9.193 9.178 9.462 9.561 8.997 7.691 6.113 5.034 + 12.157 12.459 12.617 12.210 11.315 10.487 10.243 10.543 10.777 10.321 9.154 7.954 7.565 8.280 9.567 10.489 10.435 9.546 8.519 8.000 8.107 8.438 8.492 8.070 7.357 6.699 6.336 6.305 6.532 6.921 7.345 7.616 7.532 7.043 6.357 5.861 + 12.119 12.373 12.534 12.210 11.326 10.237 9.488 9.386 9.736 9.977 9.637 8.762 7.928 7.809 8.601 9.807 10.577 10.368 9.380 8.394 8.120 8.596 9.158 9.020 7.969 6.593 5.815 6.137 7.227 8.204 8.348 7.644 6.693 6.141 6.144 6.348 + 12.179 12.197 12.121 11.813 11.242 10.561 10.052 9.914 10.064 10.124 9.704 8.781 7.836 7.552 8.243 9.505 10.450 10.397 9.473 8.541 8.477 9.352 10.293 10.177 8.620 6.402 4.913 5.073 6.614 8.341 9.098 8.626 7.589 6.857 6.750 6.927 + 12.022 12.028 11.931 11.605 11.034 10.386 9.935 9.861 10.052 10.127 9.711 8.803 7.888 7.628 8.323 9.577 10.526 10.507 9.629 8.724 8.651 9.524 10.535 10.587 9.231 7.115 5.529 5.420 6.681 8.291 9.153 8.892 7.973 7.145 6.790 6.760 + 12.004 11.895 11.703 11.421 10.998 10.445 9.926 9.690 9.810 10.007 9.804 8.980 7.913 7.404 8.013 9.461 10.709 10.770 9.595 8.218 7.912 9.053 10.684 11.260 9.966 7.471 5.433 5.158 6.575 8.392 9.244 8.780 7.765 7.202 7.394 7.813 + 12.213 12.062 11.803 11.466 11.031 10.504 10.001 9.710 9.712 9.836 9.753 9.295 8.709 8.537 9.134 10.240 11.061 10.889 9.769 8.579 8.357 9.383 10.837 11.393 10.296 8.030 5.987 5.396 6.417 8.119 9.295 9.382 8.703 7.975 7.627 7.579 + 13.150 12.536 11.823 11.593 12.001 12.683 13.106 13.013 12.557 12.051 11.651 11.292 10.922 10.720 11.007 11.902 13.066 13.865 13.855 13.159 12.372 12.047 12.212 12.373 12.004 11.064 10.086 9.732 10.234 11.196 11.910 11.886 11.145 10.099 9.199 8.710 + 12.538 11.971 11.458 11.687 12.800 14.233 15.141 15.025 14.048 12.810 11.858 11.352 11.129 11.005 10.986 11.203 11.701 12.341 12.907 13.309 13.618 13.914 14.110 13.967 13.340 12.408 11.645 11.504 12.062 12.932 13.513 13.387 12.557 11.378 10.308 9.691 + 12.547 12.134 11.762 11.967 12.913 14.228 15.233 15.394 14.646 13.379 12.137 11.292 10.910 10.847 10.934 11.087 11.298 11.580 11.949 12.435 13.086 13.886 14.675 15.157 15.060 14.361 13.390 12.694 12.701 13.402 14.281 14.595 13.837 12.096 10.077 8.733 + 12.391 12.143 11.966 12.259 13.178 14.462 15.535 15.833 15.152 13.770 12.279 11.227 10.825 10.902 11.115 11.234 11.280 11.451 11.929 12.731 13.702 14.620 15.281 15.536 15.298 14.607 13.706 13.027 12.992 13.696 14.714 15.249 14.623 12.797 10.523 8.959 + 12.349 12.210 12.178 12.566 13.495 14.730 15.743 15.995 15.274 13.853 12.337 11.288 10.905 10.981 11.156 11.233 11.294 11.549 12.091 12.801 13.479 14.037 14.524 14.963 15.197 14.977 14.275 13.518 13.404 14.339 15.924 17.000 16.402 13.888 10.533 8.162 + 12.372 12.209 12.190 12.666 13.705 14.954 15.808 15.785 14.831 13.359 11.979 11.126 10.846 10.868 10.875 10.751 10.614 10.667 11.021 11.633 12.396 13.225 14.047 14.720 15.014 14.764 14.096 13.494 13.549 14.484 15.839 16.622 15.945 13.721 10.890 8.926 + 12.398 12.274 12.306 12.807 13.811 14.954 15.648 15.447 14.347 12.796 11.412 10.607 10.387 10.442 10.444 10.294 10.148 10.237 10.667 11.364 12.179 13.012 13.817 14.508 14.899 14.826 14.360 13.907 13.997 14.854 16.077 16.760 16.079 13.949 11.254 9.387 + 12.403 12.409 12.602 13.156 14.022 14.862 15.220 14.799 13.669 12.228 10.970 10.204 9.924 9.902 9.897 9.813 9.722 9.757 10.012 10.519 11.277 12.266 13.391 14.421 15.049 15.073 14.610 14.119 14.135 14.867 15.941 16.553 15.995 14.210 11.952 10.391 + 12.342 12.448 12.759 13.324 13.993 14.423 14.273 13.440 12.150 10.836 9.875 9.401 9.292 9.333 9.371 9.380 9.401 9.468 9.603 9.875 10.418 11.337 12.558 13.762 14.513 14.550 14.022 13.464 13.456 14.193 15.264 15.865 15.327 13.623 11.488 10.020 + 11.335 11.808 12.528 13.170 13.472 13.331 12.796 11.993 11.054 10.102 9.264 8.656 8.344 8.297 8.383 8.443 8.390 8.282 8.310 8.710 9.629 11.003 12.531 13.763 14.308 14.057 13.307 12.644 12.614 13.353 14.428 15.053 14.585 12.995 10.983 9.594 + 9.524 9.356 9.241 9.380 9.703 9.893 9.655 8.986 8.172 7.530 7.143 6.853 6.493 6.118 5.971 6.221 6.744 7.194 7.340 7.323 7.578 8.434 9.750 10.935 11.379 10.945 10.100 9.572 9.810 10.672 11.556 11.847 11.304 10.164 8.951 8.190 + 8.242 8.487 8.571 8.114 7.196 6.355 6.136 6.586 7.177 7.247 6.558 5.492 4.713 4.622 5.074 5.572 5.724 5.534 5.322 5.386 5.771 6.308 6.821 7.266 7.669 7.980 8.051 7.782 7.289 6.886 6.861 7.253 7.826 8.278 8.478 8.511 + 6.922 7.334 7.819 8.003 7.777 7.312 6.802 6.233 5.447 4.431 3.499 3.122 3.515 4.378 5.082 5.174 4.737 4.280 4.247 4.623 5.000 5.034 4.829 4.851 5.449 6.444 7.218 7.235 6.537 5.731 5.493 6.029 6.977 7.781 8.167 8.248 + 4.501 5.114 6.062 6.968 7.560 7.757 7.594 7.100 6.281 5.215 4.140 3.417 3.331 3.877 4.718 5.365 5.471 5.029 4.347 3.826 3.722 4.014 4.461 4.765 4.742 4.418 4.013 3.832 4.091 4.763 5.535 5.942 5.641 4.657 3.427 2.585 + 4.828 5.237 5.906 6.634 7.256 7.637 7.634 7.110 6.075 4.811 3.815 3.518 3.969 4.758 5.301 5.269 4.812 4.388 4.354 4.679 5.018 5.065 4.817 4.531 4.427 4.477 4.487 4.384 4.361 4.696 5.387 5.982 5.861 4.776 3.184 2.016 + 4.474 4.873 5.555 6.334 7.006 7.403 7.419 7.056 6.456 5.875 5.566 5.625 5.916 6.164 6.170 5.969 5.796 5.866 6.165 6.446 6.462 6.222 6.024 6.203 6.815 7.531 7.889 7.667 7.071 6.546 6.370 6.409 6.261 5.657 4.763 4.094 + 7.257 7.368 7.422 7.319 7.237 7.522 8.334 9.397 10.131 10.114 9.465 8.778 8.653 9.221 10.081 10.673 10.749 10.512 10.349 10.467 10.768 11.059 11.325 11.749 12.468 13.316 13.881 13.826 13.204 12.429 11.928 11.798 11.778 11.565 11.137 10.777 + 5.625 6.682 8.173 9.334 9.808 9.827 9.900 10.322 10.934 11.327 11.249 10.849 10.542 10.652 11.150 11.719 12.043 12.048 11.920 11.906 12.132 12.568 13.131 13.774 14.471 15.133 15.592 15.686 15.386 14.831 14.229 13.716 13.305 12.947 12.637 12.445 + 9.830 10.463 11.426 12.272 12.643 12.438 11.825 11.109 10.543 10.214 10.057 9.960 9.865 9.776 9.694 9.561 9.293 8.886 8.492 8.374 8.741 9.577 10.626 11.546 12.142 12.490 12.850 13.440 14.249 15.024 15.441 15.315 14.710 13.881 13.134 12.702 + 12.180 12.550 13.235 14.061 14.705 14.809 14.192 12.998 11.640 10.549 9.911 9.587 9.274 8.779 8.172 7.720 7.671 8.068 8.736 9.413 9.909 10.172 10.243 10.197 10.125 10.156 10.455 11.143 12.181 13.322 14.174 14.394 13.872 12.818 11.680 10.953 + 12.516 12.819 13.398 14.163 14.912 15.342 15.153 14.232 12.791 11.320 10.325 9.989 10.039 9.969 9.474 8.763 8.441 9.023 10.451 12.041 12.940 12.742 11.757 10.736 10.274 10.436 10.861 11.203 11.453 11.831 12.394 12.797 12.502 11.296 9.636 8.438 + 11.907 12.290 12.934 13.672 14.353 14.818 14.857 14.284 13.123 11.730 10.657 10.275 10.467 10.710 10.550 10.058 9.826 10.436 11.842 13.266 13.768 13.031 11.648 10.638 10.584 11.185 11.620 11.380 10.757 10.522 11.080 11.941 12.068 10.840 8.749 7.133 + 11.006 11.469 12.317 13.386 14.406 15.033 14.959 14.094 12.698 11.317 10.488 10.387 10.701 10.893 10.671 10.284 10.328 11.189 12.599 13.730 13.826 12.842 11.525 10.824 11.117 11.939 12.449 12.214 11.591 11.324 11.742 12.327 12.105 10.563 8.265 6.559 + 11.021 11.414 12.058 12.736 13.234 13.384 13.086 12.359 11.389 10.506 10.024 10.037 10.329 10.557 10.562 10.556 10.949 11.930 13.159 13.923 13.687 12.586 11.396 10.938 11.403 12.207 12.522 12.032 11.217 10.882 11.324 11.946 11.706 10.077 7.665 5.879 + 7.854 7.481 7.201 7.486 8.312 9.077 9.049 7.965 6.274 4.805 4.150 4.263 4.613 4.720 4.603 4.737 5.564 7.002 8.391 8.951 8.392 7.167 6.158 6.045 6.847 7.986 8.780 8.952 8.745 8.599 8.702 8.804 8.463 7.494 6.223 5.321 + 9.483 8.547 7.353 6.702 6.883 7.476 7.733 7.198 6.032 4.819 4.072 3.881 3.979 4.092 4.222 4.595 5.366 6.379 7.221 7.524 7.246 6.690 6.272 6.240 6.573 7.088 7.614 8.081 8.457 8.663 8.554 8.012 7.057 5.891 4.839 4.217 + 6.997 6.529 5.956 5.723 6.007 6.571 6.936 6.740 6.009 5.145 4.627 4.685 5.171 5.720 6.058 6.183 6.299 6.566 6.924 7.128 6.981 6.531 6.059 5.843 5.924 6.076 6.022 5.699 5.320 5.173 5.320 5.489 5.276 4.513 3.473 2.725 + 3.467 4.456 5.992 7.434 8.286 8.435 8.152 7.875 7.933 8.380 9.028 9.630 10.054 10.341 10.605 10.901 11.159 11.241 11.056 10.635 10.107 9.602 9.172 8.798 8.451 8.138 7.900 7.745 7.612 7.402 7.050 6.588 6.130 5.787 5.598 5.528 + 4.318 5.091 6.222 7.150 7.517 7.358 7.014 6.847 6.984 7.274 7.477 7.499 7.489 7.696 8.234 8.947 9.518 9.710 9.554 9.296 9.164 9.168 9.119 8.857 8.465 8.265 8.545 9.272 10.046 10.369 10.037 9.312 8.718 8.623 8.962 9.320 + 5.859 6.113 6.558 7.078 7.540 7.850 7.993 8.024 7.996 7.909 7.703 7.350 6.924 6.606 6.563 6.819 7.220 7.543 7.670 7.675 7.741 7.983 8.336 8.607 8.658 8.546 8.499 8.732 9.261 9.875 10.274 10.270 9.893 9.336 8.830 8.540 + 8.074 7.816 7.493 7.342 7.469 7.785 8.101 8.282 8.327 8.314 8.292 8.220 8.036 7.770 7.598 7.741 8.291 9.099 9.839 10.220 10.188 9.953 9.830 10.001 10.395 10.767 10.909 10.808 10.643 10.605 10.725 10.828 10.686 10.220 9.604 9.168 + 9.047 9.271 9.490 9.465 9.190 8.935 9.037 9.614 10.444 11.108 11.288 10.983 10.498 10.224 10.397 10.982 11.740 12.387 12.731 12.734 12.490 12.168 11.929 11.852 11.899 11.948 11.887 11.710 11.523 11.449 11.503 11.551 11.402 10.986 10.444 10.060 + 12.058 11.799 11.318 10.722 10.198 9.954 10.105 10.573 11.104 11.411 11.357 11.065 10.840 10.966 11.502 12.230 12.799 12.953 12.698 12.270 11.958 11.901 12.015 12.091 11.972 11.671 11.347 11.172 11.204 11.356 11.476 11.452 11.278 11.031 10.810 10.684 + 13.742 13.879 13.982 13.840 13.368 12.690 12.066 11.716 11.650 11.670 11.536 11.189 10.846 10.861 11.442 12.443 13.408 13.861 13.627 12.941 12.256 11.917 11.945 12.089 12.085 11.860 11.557 11.356 11.305 11.298 11.215 11.059 10.959 11.029 11.238 11.419 + 14.758 15.635 16.588 16.712 15.772 14.354 13.303 12.971 12.975 12.655 11.766 10.762 10.408 11.093 12.474 13.751 14.291 14.059 13.508 13.119 13.033 13.068 13.025 12.915 12.907 13.082 13.298 13.307 12.998 12.507 12.085 11.868 11.783 11.673 11.487 11.328 + 14.727 14.946 15.031 14.599 13.603 12.403 11.501 11.147 11.179 11.210 10.996 10.661 10.588 11.080 12.078 13.171 13.879 13.965 13.551 12.983 12.573 12.434 12.489 12.600 12.685 12.746 12.815 12.901 12.967 12.947 12.778 12.426 11.909 11.310 10.771 10.449 + 13.218 13.723 14.313 14.451 13.864 12.719 11.474 10.550 10.079 9.916 9.868 9.922 10.254 11.020 12.128 13.196 13.788 13.724 13.206 12.651 12.348 12.246 12.043 11.514 10.773 10.226 10.241 10.799 11.449 11.631 11.113 10.173 9.381 9.143 9.402 9.728 + 11.517 11.929 12.642 13.469 14.202 14.663 14.749 14.463 13.929 13.370 13.035 13.099 13.569 14.267 14.907 15.234 15.134 14.656 13.942 13.119 12.239 11.306 10.353 9.495 8.898 8.679 8.817 9.130 9.363 9.318 8.952 8.377 7.779 7.312 7.030 6.910 + 13.647 13.610 13.721 14.136 14.765 15.258 15.239 14.602 13.625 12.805 12.537 12.893 13.624 14.372 14.878 15.043 14.849 14.271 13.274 11.912 10.403 9.074 8.208 7.885 7.950 8.126 8.180 8.026 7.715 7.336 6.935 6.498 6.001 5.474 5.011 4.736 + 14.366 14.340 14.292 14.213 14.075 13.836 13.467 12.987 12.482 12.088 11.936 12.083 12.475 12.941 13.262 13.249 12.814 11.990 10.892 9.662 8.427 7.293 6.371 5.778 5.603 5.834 6.310 6.752 6.884 6.578 5.938 5.243 4.780 4.674 4.824 4.994 + 13.882 12.994 11.687 10.585 10.065 10.056 10.154 9.958 9.358 8.579 7.969 7.731 7.790 7.893 7.824 7.548 7.187 6.866 6.579 6.209 5.655 4.965 4.336 3.978 3.957 4.152 4.352 4.418 4.362 4.298 4.307 4.353 4.319 4.133 3.855 3.646 + 9.599 8.813 7.729 6.944 6.717 6.806 6.707 6.096 5.104 4.225 3.944 4.386 5.248 6.028 6.355 6.170 5.664 5.079 4.552 4.101 3.711 3.412 3.268 3.309 3.479 3.661 3.752 3.726 3.633 3.536 3.456 3.362 3.207 2.986 2.756 2.608 + 7.429 6.910 6.220 5.791 5.815 6.108 6.258 5.959 5.250 4.506 4.160 4.399 5.031 5.635 5.852 5.605 5.094 4.600 4.278 4.086 3.896 3.653 3.438 3.386 3.537 3.778 3.914 3.823 3.547 3.248 3.074 3.046 3.067 3.031 2.923 2.827 + 5.858 5.140 4.406 4.434 5.383 6.626 7.244 6.752 5.448 4.128 3.474 3.630 4.254 4.892 5.299 5.459 5.417 5.161 4.692 4.152 3.804 3.823 4.118 4.369 4.302 3.940 3.586 3.537 3.805 4.097 4.092 3.730 3.254 2.964 2.946 3.037 + 5.310 5.131 4.983 5.086 5.450 5.828 5.884 5.454 4.676 3.904 3.478 3.534 3.961 4.522 4.994 5.256 5.281 5.105 4.793 4.432 4.109 3.872 3.717 3.609 3.534 3.531 3.646 3.869 4.098 4.199 4.109 3.896 3.717 3.688 3.793 3.905 + 5.459 5.540 5.702 5.919 6.111 6.158 5.956 5.490 4.876 4.326 4.055 4.171 4.619 5.205 5.686 5.873 5.702 5.243 4.661 4.162 3.918 4.000 4.330 4.698 4.854 4.648 4.145 3.616 3.383 3.605 4.147 4.641 4.728 4.307 3.622 3.112 + 7.091 6.787 6.509 6.570 6.924 7.173 6.931 6.200 5.386 4.957 5.051 5.421 5.719 5.840 5.980 6.381 7.045 7.714 8.125 8.252 8.288 8.387 8.473 8.345 7.968 7.644 7.796 8.554 9.524 10.038 9.708 8.784 7.970 7.832 8.318 8.840 + 14.326 14.421 14.603 14.794 14.818 14.511 13.884 13.184 12.738 12.700 12.896 12.945 12.561 11.782 10.935 10.376 10.239 10.407 10.682 10.970 11.289 11.627 11.858 11.822 11.520 11.199 11.177 11.558 12.085 12.315 12.001 11.320 10.744 10.644 10.973 11.326 + 18.691 18.381 17.958 17.618 17.354 16.975 16.334 15.529 14.876 14.637 14.759 14.868 14.550 13.679 12.524 11.549 11.087 11.174 11.625 12.242 12.931 13.651 14.284 14.613 14.457 13.822 12.930 12.067 11.401 10.916 10.524 10.202 10.026 10.064 10.261 10.438 + 16.487 16.061 15.502 15.126 15.003 14.917 14.602 13.998 13.291 12.696 12.232 11.698 10.905 9.912 9.037 8.615 8.728 9.158 9.616 10.005 10.469 11.183 12.087 12.838 13.032 12.528 11.558 10.563 9.885 9.582 9.488 9.418 9.308 9.206 9.160 9.157 + 11.306 11.573 11.907 12.004 11.621 10.713 9.489 8.323 7.571 7.386 7.640 8.015 8.196 8.043 7.652 7.259 7.102 7.304 7.868 8.721 9.761 10.853 11.806 12.388 12.416 11.872 10.959 10.040 9.470 9.422 9.811 10.366 10.801 10.971 10.926 10.835 + 10.182 10.880 11.884 12.641 12.746 12.153 11.158 10.198 9.592 9.398 9.447 9.505 9.431 9.236 9.030 8.918 8.936 9.070 9.305 9.659 10.161 10.790 11.451 11.999 12.322 12.394 12.278 12.079 11.872 11.673 11.460 11.213 10.945 10.693 10.502 10.401 + 12.161 12.532 13.089 13.520 13.517 12.930 11.876 10.700 9.793 9.363 9.337 9.452 9.467 9.330 9.174 9.177 9.431 9.924 10.613 11.481 12.487 13.468 14.123 14.165 13.550 12.584 11.785 11.567 11.972 12.651 13.106 13.005 12.351 11.420 10.571 10.080 + 12.202 12.721 13.437 13.884 13.707 12.848 11.575 10.327 9.487 9.198 9.338 9.639 9.859 9.900 9.813 9.722 9.736 9.928 10.357 11.075 12.087 13.265 14.319 14.886 14.730 13.923 12.881 12.174 12.203 12.933 13.877 14.357 13.910 12.594 10.997 9.917 + 12.180 12.699 13.397 13.781 13.487 12.491 11.124 9.885 9.162 9.035 9.283 9.570 9.668 9.548 9.323 9.121 9.031 9.149 9.635 10.662 12.226 13.998 15.365 15.739 14.938 13.369 11.842 11.111 11.440 12.483 13.535 13.961 13.531 12.479 11.319 10.580 + 11.214 11.915 12.869 13.431 13.120 11.908 10.248 8.824 8.162 8.335 8.972 9.534 9.674 9.421 9.093 9.035 9.410 10.173 11.191 12.352 13.526 14.467 14.797 14.185 12.637 10.640 9.011 8.470 9.218 10.800 12.353 13.076 12.642 11.319 9.785 8.784 + 13.249 13.135 12.862 12.373 11.652 10.759 9.838 9.057 8.537 8.291 8.236 8.258 8.284 8.321 8.427 8.663 9.070 9.672 10.471 11.401 12.266 12.721 12.392 11.104 9.081 6.955 5.529 5.376 6.517 8.381 10.070 10.805 10.291 8.832 7.155 6.061 + 12.209 11.360 10.093 8.964 8.298 8.039 7.904 7.667 7.320 7.022 6.911 6.992 7.158 7.296 7.351 7.305 7.134 6.833 6.477 6.225 6.213 6.394 6.515 6.273 5.587 4.730 4.189 4.332 5.128 6.164 6.928 7.136 6.852 6.360 5.935 5.710 + 10.578 10.224 9.653 9.016 8.361 7.676 7.023 6.609 6.644 7.100 7.613 7.699 7.157 6.327 5.927 6.526 8.066 9.824 10.882 10.777 9.807 8.776 8.389 8.756 9.397 9.676 9.322 8.624 8.188 8.477 9.492 10.802 11.867 12.382 12.423 12.309 + 9.587 9.347 8.965 8.522 8.008 7.374 6.689 6.211 6.240 6.837 7.670 8.182 8.004 7.304 6.737 6.983 8.212 9.893 11.138 11.337 10.589 9.621 9.229 9.705 10.653 11.330 11.224 10.422 9.521 9.174 9.637 10.639 11.634 12.206 12.322 12.248 + 8.401 8.199 7.908 7.612 7.259 6.747 6.128 5.710 5.865 6.682 7.775 8.488 8.389 7.653 6.976 7.045 7.989 9.256 10.035 9.882 9.037 8.211 8.021 8.559 9.382 9.902 9.817 9.264 8.641 8.300 8.353 8.686 9.107 9.470 9.714 9.832 + 13.839 13.134 12.191 11.552 11.397 11.452 11.301 10.801 10.214 9.954 10.185 10.670 10.984 10.885 10.517 10.248 10.337 10.720 11.107 11.268 11.230 11.220 11.423 11.812 12.184 12.356 12.329 12.257 12.294 12.455 12.625 12.673 12.564 12.368 12.183 12.078 + 16.897 15.935 14.827 14.457 14.981 15.740 15.918 15.319 14.508 14.211 14.567 14.975 14.668 13.465 11.976 11.067 11.107 11.681 12.028 11.732 11.037 10.522 10.518 10.830 11.009 10.843 10.551 10.515 10.849 11.268 11.374 11.061 10.608 10.390 10.500 10.697 + 16.459 16.244 16.063 16.121 16.307 16.253 15.696 14.778 13.975 13.680 13.832 13.958 13.595 12.720 11.764 11.224 11.219 11.415 11.370 10.947 10.420 10.180 10.359 10.736 10.985 11.011 11.000 11.176 11.506 11.685 11.425 10.754 10.020 9.594 9.554 9.666 + 17.363 16.832 16.114 15.586 15.341 15.167 14.827 14.341 13.979 13.960 14.171 14.194 13.660 12.587 11.394 10.558 10.231 10.156 9.954 9.481 8.947 8.693 8.887 9.413 10.024 10.577 11.078 11.526 11.768 11.561 10.826 9.820 9.021 8.771 9.003 9.306 + 14.685 14.627 14.707 15.050 15.483 15.625 15.258 14.588 14.115 14.179 14.590 14.732 14.050 12.528 10.702 9.231 8.415 8.070 7.844 7.604 7.529 7.859 8.600 9.493 10.270 10.889 11.475 12.045 12.328 11.963 10.913 9.684 9.046 9.427 10.508 11.416 + 14.541 13.903 13.297 13.399 14.218 15.064 15.199 14.535 13.710 13.457 13.876 14.306 13.917 12.464 10.508 8.920 8.151 7.945 7.715 7.154 6.514 6.304 6.779 7.716 8.669 9.373 9.886 10.352 10.704 10.682 10.176 9.502 9.253 9.799 10.882 11.749 + 11.363 11.507 11.826 12.305 12.814 13.143 13.132 12.821 12.461 12.341 12.541 12.799 12.646 11.748 10.205 8.559 7.452 7.181 7.495 7.815 7.716 7.274 6.997 7.371 8.418 9.640 10.416 10.506 10.241 10.210 10.735 11.579 12.156 12.059 11.432 10.859 + 11.226 10.731 10.026 9.446 9.111 8.889 8.602 8.253 8.049 8.170 8.515 8.679 8.248 7.155 5.810 4.841 4.644 5.105 5.720 6.013 5.908 5.744 5.943 6.620 7.455 7.955 7.866 7.394 7.052 7.245 7.929 8.620 8.757 8.143 7.120 6.350 + 9.389 9.012 8.452 7.953 7.640 7.448 7.208 6.795 6.221 5.601 5.048 4.591 4.200 3.870 3.673 3.705 3.983 4.386 4.715 4.852 4.870 4.996 5.421 6.112 6.779 7.055 6.766 6.078 5.411 5.147 5.374 5.838 6.148 6.077 5.722 5.406 + 8.584 8.075 7.415 7.005 6.947 6.960 6.649 5.880 4.931 4.289 4.243 4.643 5.017 4.962 4.478 3.955 3.841 4.256 4.894 5.288 5.211 4.873 4.746 5.150 5.965 6.683 6.797 6.180 5.192 4.411 4.228 4.607 5.189 5.603 5.731 5.708 + 8.528 8.228 7.730 7.229 6.962 7.088 7.573 8.151 8.450 8.217 7.500 6.646 6.105 6.167 6.799 7.702 8.507 8.995 9.171 9.199 9.261 9.453 9.774 10.171 10.592 10.994 11.336 11.561 11.610 11.443 11.057 10.494 9.832 9.178 8.650 8.355 + 9.964 9.742 9.325 8.845 8.566 8.746 9.412 10.243 10.722 10.491 9.640 8.679 8.204 8.484 9.304 10.161 10.631 10.630 10.386 10.208 10.264 10.537 10.934 11.408 11.970 12.620 13.287 13.852 14.219 14.359 14.290 14.023 13.563 12.963 12.374 12.003 + 8.875 9.766 10.999 11.882 12.051 11.617 10.933 10.254 9.617 8.985 8.448 8.204 8.338 8.649 8.753 8.413 7.768 7.244 7.190 7.589 8.113 8.471 8.690 9.061 9.800 10.788 11.649 12.111 12.273 12.490 12.970 13.498 13.580 12.928 11.817 10.960 + 13.400 13.223 13.017 12.932 12.937 12.790 12.204 11.128 9.911 9.173 9.404 10.566 12.009 12.829 12.453 11.029 9.316 8.156 7.912 8.325 8.839 9.113 9.253 9.608 10.341 11.209 11.759 11.749 11.384 11.132 11.276 11.631 11.703 11.170 10.229 9.494 + 13.078 12.522 11.820 11.443 11.517 11.682 11.376 10.314 8.821 7.683 7.621 8.731 10.338 11.402 11.199 9.784 7.898 6.414 5.749 5.690 5.719 5.519 5.235 5.283 5.913 6.940 7.860 8.251 8.087 7.706 7.479 7.508 7.598 7.512 7.235 6.983 + 9.754 9.901 9.936 9.564 8.713 7.612 6.633 6.044 5.873 5.974 6.191 6.457 6.734 6.903 6.746 6.089 5.006 3.877 3.204 3.298 4.050 4.990 5.590 5.604 5.184 4.719 4.523 4.621 4.781 4.736 4.419 4.010 3.785 3.887 4.211 4.484 + 10.903 10.563 9.983 9.270 8.461 7.551 6.620 5.898 5.672 6.068 6.870 7.573 7.664 6.942 5.648 4.306 3.385 3.052 3.148 3.386 3.574 3.696 3.834 4.028 4.220 4.306 4.245 4.107 4.027 4.101 4.325 4.600 4.815 4.912 4.913 4.886 + 10.638 10.318 9.803 9.231 8.644 8.004 7.318 6.722 6.417 6.502 6.842 7.130 7.092 6.669 6.019 5.360 4.805 4.345 3.965 3.737 3.779 4.105 4.533 4.779 4.677 4.324 4.003 3.943 4.130 4.339 4.357 4.184 4.020 4.061 4.294 4.513 + 11.233 10.573 9.657 8.949 8.603 8.386 7.966 7.275 6.624 6.430 6.815 7.429 7.669 7.131 5.918 4.574 3.700 3.566 4.006 4.626 5.107 5.368 5.504 5.607 5.662 5.580 5.317 4.944 4.600 4.394 4.326 4.307 4.238 4.085 3.898 3.770 + 10.500 9.944 8.979 7.886 6.998 6.546 6.510 6.628 6.592 6.279 5.834 5.504 5.375 5.277 4.951 4.342 3.724 3.508 3.886 4.642 5.300 5.513 5.315 5.040 4.966 5.057 5.025 4.664 4.101 3.718 3.806 4.277 4.728 4.800 4.504 4.185 + 10.048 9.410 8.412 7.442 6.782 6.488 6.423 6.398 6.298 6.108 5.865 5.588 5.276 4.953 4.691 4.575 4.622 4.737 4.761 4.593 4.289 4.037 4.019 4.250 4.539 4.624 4.372 3.906 3.531 3.519 3.896 4.418 4.747 4.702 4.390 4.109 + 10.213 9.660 8.637 7.332 6.042 5.070 4.587 4.543 4.718 4.889 4.969 5.028 5.165 5.367 5.486 5.363 4.981 4.525 4.263 4.356 4.736 5.144 5.304 5.086 4.564 3.950 3.467 3.248 3.310 3.572 3.894 4.132 4.187 4.054 3.833 3.668 + 13.512 13.473 13.428 13.374 13.218 12.818 12.106 11.183 10.302 9.724 9.548 9.662 9.829 9.848 9.668 9.383 9.141 9.048 9.123 9.299 9.461 9.491 9.327 9.017 8.732 8.686 8.997 9.575 10.143 10.407 10.257 9.848 9.480 9.371 9.502 9.665 + 17.231 17.277 17.309 17.203 16.812 16.066 15.060 14.041 13.270 12.836 12.594 12.286 11.762 11.102 10.550 10.305 10.366 10.555 10.672 10.631 10.454 10.177 9.791 9.317 8.904 8.818 9.247 10.086 10.908 11.232 10.886 10.169 9.631 9.644 10.106 10.548 + 17.009 16.445 15.611 14.875 14.425 14.155 13.796 13.137 12.189 11.166 10.329 9.831 9.662 9.693 9.765 9.758 9.610 9.334 8.996 8.684 8.445 8.256 8.059 7.850 7.743 7.922 8.484 9.303 10.040 10.344 10.101 9.524 9.005 8.825 8.963 9.156 + 12.867 12.555 12.030 11.456 10.988 10.702 10.539 10.332 9.895 9.156 8.229 7.377 6.861 6.771 6.959 7.130 7.053 6.720 6.358 6.253 6.527 7.034 7.462 7.573 7.387 7.170 7.234 7.694 8.378 8.956 9.168 8.993 8.619 8.280 8.092 8.031 + 8.295 9.328 10.795 11.943 12.382 12.269 12.032 11.946 11.903 11.574 10.740 9.502 8.194 7.127 6.406 5.948 5.623 5.359 5.138 4.950 4.807 4.789 5.032 5.595 6.332 6.923 7.117 6.996 6.985 7.518 8.611 9.737 10.168 9.568 8.332 7.352 + 9.264 10.268 11.673 12.734 13.089 12.930 12.715 12.705 12.738 12.413 11.467 10.021 8.497 7.325 6.692 6.506 6.526 6.515 6.320 5.920 5.454 5.214 5.507 6.425 7.684 8.745 9.184 9.059 8.904 9.299 10.329 11.412 11.714 10.850 9.291 8.085 + 8.755 9.968 11.635 12.812 13.049 12.637 12.258 12.374 12.871 13.206 12.868 11.748 10.152 8.525 7.169 6.182 5.556 5.282 5.344 5.645 6.022 6.361 6.708 7.231 8.045 9.055 9.985 10.581 10.807 10.846 10.913 11.053 11.130 11.006 10.716 10.471 + 9.004 10.299 12.077 13.302 13.436 12.746 12.010 11.883 12.431 13.154 13.411 12.881 11.736 10.451 9.469 8.971 8.857 8.879 8.809 8.551 8.189 7.966 8.179 9.006 10.346 11.801 12.851 13.139 12.668 11.776 10.899 10.319 10.062 9.991 9.972 9.958 + 11.629 12.175 12.993 13.674 13.874 13.499 12.742 11.978 11.555 11.612 12.028 12.533 12.887 13.005 12.944 12.774 12.459 11.875 10.946 9.815 8.872 8.587 9.223 10.627 12.250 13.409 13.637 12.908 11.606 10.279 9.345 8.927 8.892 9.013 9.127 9.181 + 12.584 13.063 13.791 14.413 14.618 14.277 13.495 12.536 11.687 11.123 10.879 10.911 11.179 11.680 12.383 13.156 13.757 13.947 13.649 13.039 12.470 12.275 12.569 13.180 13.756 13.967 13.659 12.884 11.826 10.687 9.611 8.681 7.934 7.384 7.031 6.860 + 12.487 13.041 13.886 14.602 14.797 14.300 13.252 12.028 11.018 10.407 10.109 9.915 9.717 9.632 9.905 10.673 11.793 12.902 13.657 13.977 14.066 14.211 14.524 14.841 14.866 14.425 13.624 12.773 12.157 11.819 11.540 11.010 10.059 8.798 7.583 6.835 + 12.296 13.075 14.058 14.543 14.197 13.226 12.101 11.152 10.389 9.656 8.908 8.313 8.086 8.272 8.701 9.163 9.613 10.180 11.002 12.049 13.138 14.078 14.778 15.173 15.103 14.351 12.905 11.209 10.061 10.093 11.207 12.479 12.752 11.526 9.429 7.829 + 12.468 12.939 13.461 13.529 12.939 11.893 10.783 9.866 9.128 8.431 7.753 7.267 7.193 7.572 8.200 8.786 9.179 9.466 9.861 10.509 11.384 12.317 13.109 13.579 13.590 13.089 12.221 11.386 11.095 11.633 12.752 13.711 13.723 12.556 10.791 9.494 + 12.218 12.580 12.936 12.857 12.193 11.158 10.119 9.296 8.660 8.079 7.542 7.203 7.218 7.546 7.929 8.111 8.073 8.086 8.492 9.432 10.724 11.996 12.927 13.388 13.425 13.153 12.700 12.230 11.934 11.921 12.078 12.053 11.479 10.289 8.879 7.918 + 12.114 12.225 12.341 12.286 11.890 11.082 9.963 8.785 7.850 7.355 7.306 7.533 7.809 7.969 7.974 7.881 7.801 7.866 8.217 8.971 10.139 11.537 12.787 13.463 13.325 12.495 11.438 10.723 10.702 11.300 12.060 12.414 12.023 10.970 9.729 8.903 + 12.010 12.083 12.127 11.994 11.578 10.880 10.025 9.198 8.552 8.133 7.887 7.720 7.588 7.518 7.572 7.782 8.126 8.576 9.162 9.972 11.062 12.324 13.443 14.009 13.769 12.843 11.733 11.082 11.303 12.299 13.481 14.085 13.626 12.199 10.465 9.296 + 11.546 11.670 11.733 11.533 11.022 10.336 9.650 9.031 8.429 7.802 7.254 6.994 7.163 7.675 8.245 8.613 8.772 9.008 9.692 10.982 12.660 14.212 15.080 14.933 13.807 12.096 10.429 9.449 9.545 10.616 12.025 12.856 12.420 10.717 8.530 7.016 + 10.367 10.786 11.080 10.659 9.435 7.942 6.930 6.783 7.266 7.769 7.814 7.376 6.793 6.411 6.330 6.443 6.668 7.106 7.943 9.205 10.607 11.645 11.864 11.105 9.574 7.749 6.218 5.498 5.851 7.105 8.609 9.456 8.962 7.142 4.817 3.210 + 10.681 10.173 9.293 8.235 7.185 6.289 5.685 5.486 5.718 6.231 6.715 6.845 6.473 5.722 4.894 4.259 3.909 3.782 3.807 4.009 4.457 5.102 5.687 5.855 5.409 4.504 3.588 3.122 3.275 3.819 4.312 4.385 3.954 3.212 2.479 2.037 + 9.730 9.300 8.540 7.645 6.864 6.402 6.308 6.433 6.518 6.357 5.943 5.457 5.113 4.974 4.894 4.650 4.161 3.630 3.451 3.937 5.051 6.356 7.230 7.231 6.354 5.017 3.805 3.128 3.041 3.286 3.516 3.508 3.249 2.870 2.531 2.340 + 9.330 8.705 7.789 6.990 6.496 6.191 5.827 5.292 4.718 4.360 4.360 4.624 4.899 4.971 4.799 4.496 4.215 4.061 4.097 4.375 4.915 5.611 6.183 6.267 5.650 4.463 3.179 2.359 2.322 2.947 3.762 4.231 4.062 3.342 2.457 1.865 + 6.370 6.408 6.471 6.506 6.408 6.070 5.475 4.761 4.175 3.945 4.129 4.576 5.010 5.199 5.082 4.774 4.473 4.331 4.401 4.645 4.989 5.337 5.573 5.557 5.186 4.480 3.633 2.960 2.732 2.999 3.528 3.920 3.852 3.283 2.500 1.947 + 5.737 5.360 4.885 4.642 4.750 5.009 5.052 4.656 3.952 3.380 3.381 4.053 5.046 5.772 5.808 5.180 4.326 3.774 3.792 4.250 4.789 5.098 5.085 4.827 4.406 3.833 3.118 2.408 1.984 2.072 2.608 3.194 3.341 2.843 1.967 1.296 + 8.057 7.799 7.395 6.994 6.691 6.485 6.319 6.160 6.053 6.091 6.329 6.708 7.069 7.249 7.209 7.064 7.008 7.165 7.493 7.808 7.927 7.807 7.574 7.427 7.482 7.698 7.924 8.026 7.979 7.864 7.773 7.728 7.679 7.573 7.425 7.314 + 16.067 16.123 16.034 15.658 15.134 14.819 14.950 15.367 15.580 15.164 14.127 12.918 12.073 11.816 11.966 12.180 12.278 12.315 12.393 12.446 12.263 11.736 11.058 10.623 10.686 11.109 11.455 11.366 10.891 10.429 10.355 10.671 11.022 11.049 10.738 10.415 + 18.044 17.808 17.359 16.788 16.265 15.957 15.892 15.899 15.709 15.149 14.277 13.349 12.637 12.272 12.218 12.368 12.629 12.924 13.121 13.040 12.582 11.865 11.227 11.007 11.278 11.753 11.985 11.716 11.079 10.477 10.235 10.348 10.516 10.454 10.152 9.871 + 17.697 17.205 16.327 15.283 14.359 13.781 13.574 13.530 13.346 12.833 12.029 11.127 10.303 9.620 9.073 8.715 8.674 9.020 9.601 10.066 10.111 9.751 9.360 9.379 9.932 10.687 11.118 10.955 10.426 10.050 10.171 10.642 10.961 10.747 10.103 9.546 + 15.735 14.621 12.863 11.130 9.921 9.333 9.098 8.852 8.412 7.880 7.488 7.349 7.340 7.216 6.876 6.507 6.474 7.004 7.947 8.846 9.273 9.178 8.920 8.965 9.473 10.156 10.525 10.316 9.726 9.241 9.228 9.633 10.063 10.160 9.911 9.630 + 10.733 10.197 9.292 8.288 7.450 6.935 6.742 6.752 6.824 6.879 6.905 6.894 6.797 6.554 6.193 5.888 5.877 6.288 7.001 7.695 8.070 8.077 7.954 8.024 8.418 8.965 9.346 9.378 9.173 9.029 9.148 9.449 9.645 9.516 9.131 8.799 + 8.865 8.480 7.923 7.449 7.168 6.999 6.793 6.483 6.126 5.812 5.546 5.258 4.927 4.696 4.826 5.494 6.595 7.739 8.487 8.640 8.372 8.085 8.114 8.493 8.975 9.250 9.177 8.875 8.604 8.575 8.828 9.241 9.640 9.913 10.045 10.087 + 10.252 9.846 9.251 8.718 8.343 8.045 7.726 7.421 7.282 7.399 7.636 7.697 7.373 6.782 6.341 6.472 7.259 8.356 9.221 9.511 9.299 8.975 8.914 9.199 9.606 9.823 9.708 9.377 9.080 9.007 9.165 9.417 9.603 9.651 9.599 9.537 + 11.922 11.554 10.992 10.441 9.993 9.619 9.287 9.066 9.091 9.384 9.732 9.765 9.239 8.299 7.471 7.344 8.137 9.501 10.720 11.182 10.788 9.987 9.437 9.538 10.186 10.902 11.203 10.936 10.336 9.818 9.672 9.905 10.302 10.628 10.783 10.820 + 9.796 9.768 9.679 9.518 9.340 9.223 9.182 9.123 8.916 8.506 7.974 7.480 7.144 7.003 7.060 7.354 7.922 8.677 9.340 9.571 9.249 8.664 8.367 8.750 9.672 10.498 10.585 9.837 8.848 8.446 9.010 10.134 10.952 10.865 10.049 9.289 + 9.394 9.592 9.987 10.549 11.192 11.755 12.038 11.880 11.252 10.295 9.267 8.436 7.968 7.901 8.181 8.711 9.367 9.987 10.398 10.507 10.402 10.338 10.564 11.097 11.631 11.715 11.100 9.996 8.978 8.580 8.867 9.355 9.369 8.593 7.359 6.432 + 11.962 11.692 11.439 11.566 12.240 13.278 14.230 14.649 14.356 13.522 12.515 11.654 11.075 10.785 10.817 11.277 12.198 13.339 14.179 14.210 13.345 12.085 11.212 11.201 11.827 12.336 12.094 11.176 10.349 10.411 11.404 12.431 12.297 10.523 7.874 5.923 + 12.830 12.268 11.598 11.443 12.185 13.665 15.218 16.048 15.724 14.450 12.890 11.706 11.148 11.044 11.138 11.420 12.099 13.233 14.409 14.874 14.111 12.366 10.609 9.855 10.382 11.545 12.355 12.350 11.948 11.947 12.628 13.314 12.879 10.808 7.871 5.727 + 13.143 12.694 12.070 11.723 12.053 13.115 14.467 15.353 15.191 14.013 12.465 11.329 10.943 11.023 11.054 10.863 10.797 11.328 12.443 13.471 13.600 12.637 11.295 10.666 11.300 12.727 13.876 14.025 13.387 12.792 12.764 12.909 12.242 10.206 7.420 5.394 + 13.217 12.980 12.589 12.287 12.429 13.227 14.442 15.393 15.400 14.335 12.789 11.633 11.319 11.561 11.701 11.408 11.033 11.243 12.269 13.525 14.027 13.265 11.722 10.507 10.427 11.350 12.436 12.998 13.113 13.386 14.102 14.675 14.033 11.682 8.446 6.102 + 13.316 13.071 12.672 12.350 12.427 13.086 14.119 14.933 14.911 13.902 12.404 11.218 10.841 11.108 11.406 11.272 10.836 10.677 11.258 12.440 13.557 13.963 13.555 12.812 12.343 12.401 12.805 13.258 13.681 14.174 14.682 14.775 13.894 11.911 9.492 7.821 + 13.190 12.908 12.473 12.137 12.187 12.750 13.620 14.285 14.229 13.316 11.939 10.766 10.268 10.389 10.650 10.586 10.152 9.750 9.857 10.618 11.720 12.656 13.112 13.151 13.071 13.131 13.384 13.740 14.098 14.390 14.499 14.204 13.299 11.836 10.254 9.216 + 13.083 12.466 11.654 11.194 11.379 12.068 12.807 13.131 12.829 12.011 10.984 10.071 9.477 9.246 9.272 9.362 9.330 9.120 8.884 8.927 9.517 10.666 12.056 13.193 13.718 13.623 13.238 12.975 13.034 13.288 13.402 13.090 12.306 11.264 10.302 9.734 + 12.769 12.192 11.421 10.924 10.915 11.238 11.557 11.620 11.390 10.957 10.393 9.720 9.004 8.432 8.227 8.458 8.937 9.340 9.473 9.445 9.546 9.956 10.535 10.924 10.868 10.472 10.139 10.229 10.755 11.385 11.740 11.708 11.492 11.377 11.456 11.586 + 13.027 12.441 11.668 11.171 11.119 11.313 11.436 11.337 11.085 10.780 10.382 9.770 8.972 8.276 8.056 8.427 9.092 9.567 9.609 9.428 9.442 9.804 10.151 9.899 8.818 7.385 6.501 6.806 8.151 9.727 10.720 10.915 10.742 10.762 11.125 11.500 + 12.835 12.355 11.717 11.298 11.237 11.385 11.501 11.462 11.299 11.044 10.628 9.965 9.145 8.487 8.325 8.696 9.258 9.566 9.479 9.306 9.479 10.059 10.530 10.180 8.764 6.866 5.592 5.775 7.354 9.436 10.970 11.462 11.163 10.675 10.397 10.335 + 12.586 12.164 11.622 11.288 11.235 11.273 11.194 10.991 10.814 10.732 10.580 10.106 9.289 8.472 8.124 8.416 9.031 9.435 9.386 9.170 9.304 9.944 10.580 10.387 8.973 6.870 5.272 5.193 6.714 8.959 10.768 11.500 11.314 10.807 10.445 10.315 + 12.020 11.644 11.164 10.870 10.814 10.828 10.756 10.640 10.622 10.692 10.576 9.960 8.853 7.703 7.074 7.160 7.603 7.847 7.714 7.627 8.196 9.515 10.858 11.148 9.861 7.579 5.648 5.188 6.284 8.028 9.329 9.753 9.678 9.736 10.142 10.557 + 11.404 11.106 10.770 10.638 10.673 10.619 10.303 9.848 9.534 9.445 9.284 8.626 7.391 6.061 5.369 5.691 6.716 7.733 8.279 8.531 9.034 10.021 11.008 11.110 9.851 7.718 5.900 5.397 6.267 7.677 8.667 8.930 8.908 9.197 9.890 10.500 + 11.610 11.038 10.316 9.920 10.007 10.341 10.567 10.504 10.191 9.689 8.946 7.906 6.763 6.009 6.125 7.137 8.492 9.452 9.704 9.604 9.806 10.566 11.395 11.443 10.293 8.442 6.987 6.748 7.600 8.619 8.898 8.287 7.414 7.014 7.246 7.630 + 10.458 10.392 10.409 10.626 10.957 11.147 10.983 10.468 9.780 9.094 8.456 7.879 7.515 7.676 8.581 10.044 11.440 12.088 11.766 10.917 10.297 10.344 10.804 10.972 10.335 9.055 7.858 7.427 7.847 8.589 9.004 8.866 8.474 8.268 8.390 8.601 + 9.730 9.698 9.758 10.012 10.397 10.710 10.773 10.568 10.196 9.732 9.142 8.389 7.634 7.275 7.706 8.962 10.564 11.758 12.021 11.417 10.516 9.932 9.874 10.068 10.072 9.699 9.148 8.795 8.848 9.211 9.632 9.955 10.224 10.553 10.936 11.210 + 8.520 8.452 8.460 8.651 8.942 9.111 9.013 8.730 8.480 8.360 8.205 7.742 6.926 6.115 5.877 6.534 7.852 9.169 9.876 9.850 9.475 9.253 9.381 9.657 9.763 9.615 9.437 9.510 9.885 10.342 10.643 10.792 11.034 11.571 12.299 12.836 + 7.951 7.665 7.470 7.695 8.228 8.554 8.230 7.328 6.405 6.009 6.196 6.517 6.499 6.139 5.926 6.362 7.439 8.589 9.157 8.967 8.450 8.234 8.588 9.244 9.710 9.762 9.618 9.677 10.113 10.730 11.204 11.425 11.579 11.912 12.418 12.815 + 7.312 7.358 7.458 7.595 7.719 7.767 7.725 7.652 7.642 7.736 7.874 7.930 7.828 7.630 7.522 7.685 8.144 8.727 9.168 9.284 9.093 8.792 8.601 8.624 8.800 8.999 9.149 9.310 9.622 10.185 10.967 11.802 12.491 12.917 13.097 13.140 + 6.467 6.749 7.095 7.263 7.203 7.091 7.156 7.455 7.811 7.962 7.791 7.433 7.171 7.218 7.572 8.050 8.446 8.678 8.795 8.888 8.996 9.095 9.153 9.178 9.214 9.309 9.490 9.783 10.229 10.863 11.651 12.464 13.127 13.523 13.669 13.686 + 7.695 7.373 6.980 6.814 6.994 7.397 7.804 8.077 8.230 8.331 8.382 8.321 8.131 7.938 7.954 8.300 8.877 9.412 9.671 9.638 9.508 9.492 9.628 9.772 9.768 9.633 9.571 9.800 10.370 11.129 11.873 12.513 13.105 13.721 14.309 14.685 + 9.921 9.732 9.491 9.354 9.372 9.449 9.435 9.237 8.880 8.460 8.062 7.731 7.513 7.501 7.817 8.502 9.418 10.268 10.737 10.694 10.280 9.824 9.631 9.808 10.234 10.679 10.984 11.154 11.323 11.635 12.135 12.750 13.342 13.801 14.083 14.209 + 10.285 10.655 11.230 11.785 12.162 12.299 12.184 11.788 11.094 10.174 9.252 8.628 8.523 8.936 9.641 10.325 10.755 10.872 10.763 10.576 10.456 10.508 10.767 11.154 11.476 11.519 11.213 10.755 10.535 10.888 11.821 12.954 13.762 13.942 13.634 13.288 + 11.724 11.586 11.684 12.382 13.618 14.857 15.454 15.138 14.185 13.150 12.421 11.984 11.588 11.108 10.734 10.792 11.359 12.072 12.338 11.828 10.808 10.003 10.056 10.999 12.180 12.709 12.114 10.687 9.274 8.666 9.063 9.986 10.685 10.708 10.195 9.699 + 12.588 12.115 11.738 12.093 13.322 14.902 16.024 16.169 15.437 14.366 13.480 12.949 12.642 12.425 12.378 12.693 13.366 14.024 14.118 13.367 12.073 10.983 10.759 11.446 12.390 12.690 11.865 10.221 8.634 7.917 8.247 9.079 9.597 9.341 8.529 7.836 + 12.864 12.384 11.920 12.051 12.965 14.312 15.470 15.993 15.846 15.300 14.638 13.985 13.371 12.909 12.838 13.328 14.249 15.133 15.450 14.986 14.020 13.123 12.743 12.894 13.189 13.171 12.664 11.872 11.181 10.845 10.815 10.804 10.536 9.952 9.259 8.791 + 12.651 12.181 11.719 11.838 12.757 14.170 15.470 16.167 16.151 15.641 14.921 14.139 13.342 12.651 12.354 12.749 13.852 15.238 16.221 16.288 15.466 14.310 13.507 13.379 13.679 13.835 13.442 12.601 11.831 11.619 11.989 12.447 12.360 11.474 10.166 9.208 + 12.218 11.931 11.633 11.708 12.394 13.613 14.980 16.000 16.328 15.917 14.986 13.857 12.805 12.031 11.712 11.996 12.882 14.077 15.034 15.241 14.594 13.533 12.764 12.715 13.182 13.490 13.096 12.121 11.322 11.457 12.546 13.706 13.770 12.253 9.862 8.074 + 12.098 11.980 11.895 12.074 12.711 13.816 15.148 16.288 16.826 16.578 15.676 14.489 13.441 12.863 12.914 13.574 14.624 15.650 16.141 15.735 14.483 12.922 11.798 11.598 12.205 12.992 13.321 13.041 12.578 12.500 12.933 13.357 13.006 11.565 9.573 8.135 + 12.038 11.893 11.788 11.983 12.644 13.737 15.012 16.110 16.708 16.646 15.980 14.958 13.941 13.285 13.226 13.780 14.717 15.632 16.111 15.922 15.126 14.031 13.018 12.336 12.011 11.912 11.909 11.989 12.220 12.603 12.957 12.957 12.349 11.182 9.870 9.002 + 11.919 11.721 11.528 11.619 12.181 13.200 14.466 15.658 16.453 16.622 16.111 15.089 13.943 13.151 13.078 13.765 14.872 15.843 16.221 15.912 15.215 14.589 14.324 14.359 14.373 14.075 13.466 12.861 12.643 12.945 13.486 13.727 13.232 11.998 10.520 9.520 + 11.558 11.467 11.416 11.606 12.205 13.241 14.552 15.801 16.594 16.650 15.946 14.776 13.649 13.070 13.287 14.150 15.177 15.806 15.703 14.948 13.956 13.204 12.919 12.947 12.916 12.552 11.938 11.493 11.654 12.484 13.510 13.940 13.176 11.269 8.997 7.465 + 11.437 11.417 11.438 11.621 12.127 13.063 14.372 15.764 16.794 17.055 16.417 15.151 13.834 13.078 13.210 14.105 15.263 16.102 16.273 15.833 15.153 14.645 14.485 14.516 14.397 13.892 13.089 12.370 12.154 12.556 13.245 13.606 13.137 11.823 10.209 9.108 + 11.390 11.418 11.496 11.699 12.172 13.050 14.315 15.699 16.734 16.984 16.316 15.039 13.778 13.139 13.370 14.228 15.153 15.624 15.471 14.926 14.410 14.212 14.287 14.320 13.991 13.249 12.390 11.876 12.009 12.688 13.420 13.582 12.807 11.236 9.485 8.340 + 11.729 11.738 11.807 12.032 12.528 13.376 14.536 15.789 16.758 17.063 16.540 15.411 14.239 13.638 13.905 14.813 15.754 16.144 15.819 15.125 14.614 14.596 14.888 14.966 14.411 13.287 12.147 11.665 12.142 13.274 14.312 14.515 13.580 11.804 9.915 8.715 + 11.586 11.484 11.449 11.687 12.310 13.273 14.421 15.542 16.393 16.720 16.360 15.400 14.262 13.545 13.670 14.556 15.626 16.182 15.912 15.102 14.373 14.163 14.365 14.461 14.010 13.079 12.232 12.080 12.772 13.837 14.506 14.215 12.944 11.160 9.516 8.553 + 11.404 11.335 11.324 11.539 12.087 12.973 14.100 15.287 16.268 16.736 16.477 15.553 14.389 13.606 13.660 14.509 15.595 16.210 15.986 15.136 14.251 13.804 13.781 13.740 13.236 12.259 11.297 10.971 11.535 12.644 13.554 13.588 12.544 10.776 8.987 7.880 + 10.962 11.059 11.225 11.460 11.849 12.551 13.671 15.093 16.414 17.086 16.755 15.570 14.200 13.463 13.777 14.847 15.843 16.007 15.208 14.017 13.233 13.219 13.613 13.649 12.829 11.378 10.109 9.809 10.641 12.032 13.100 13.238 12.433 11.145 9.952 9.264 + 11.040 11.178 11.400 11.671 12.056 12.721 13.801 15.211 16.543 17.220 16.860 15.629 14.264 13.660 14.246 15.630 16.828 16.968 15.936 14.450 13.475 13.439 13.904 13.961 13.025 11.374 9.967 9.702 10.722 12.310 13.419 13.375 12.226 10.568 9.090 8.256 + 11.250 11.405 11.641 11.908 12.273 12.912 13.956 15.289 16.491 17.030 16.631 15.561 14.564 14.400 15.288 16.674 17.563 17.218 15.711 13.890 12.744 12.664 13.168 13.331 12.554 11.070 9.775 9.532 10.517 12.086 13.240 13.279 12.176 10.464 8.860 7.921 + 11.080 11.308 11.610 11.874 12.212 12.902 14.104 15.596 16.800 17.144 16.512 15.400 14.619 14.742 15.688 16.781 17.225 16.665 15.404 14.157 13.528 13.603 13.940 13.920 13.194 11.910 10.589 9.774 9.698 10.168 10.713 10.868 10.423 9.512 8.520 7.882 + 10.742 10.952 11.250 11.551 11.958 12.710 13.935 15.411 16.589 16.920 16.284 15.158 14.345 14.419 15.284 16.206 16.328 15.298 13.548 11.988 11.348 11.662 12.268 12.336 11.492 10.089 8.926 8.663 9.370 10.514 11.356 11.416 10.699 9.585 8.550 7.949 + 10.535 10.754 11.048 11.332 11.750 12.585 13.945 15.505 16.602 16.687 15.787 14.583 13.966 14.383 15.474 16.299 16.011 14.478 12.377 10.717 10.142 10.527 11.132 11.173 10.372 9.121 8.175 8.134 9.063 10.476 11.632 11.947 11.272 9.921 8.492 7.591 + 10.990 11.181 11.461 11.796 12.343 13.327 14.733 16.131 16.873 16.574 15.490 14.422 14.150 14.830 15.840 16.222 15.396 13.586 11.657 10.488 10.394 10.985 11.521 11.445 10.714 9.758 9.155 9.285 10.136 11.325 12.277 12.474 11.704 10.190 8.536 7.465 + 11.354 11.423 11.572 11.887 12.530 13.604 14.947 16.094 16.528 16.065 15.078 14.294 14.279 14.992 15.782 15.858 14.881 13.210 11.630 10.772 10.689 10.890 10.765 10.045 8.974 8.105 7.919 8.540 9.701 10.909 11.675 11.706 10.988 9.788 8.566 7.801 + 10.952 11.049 11.233 11.571 12.230 13.311 14.624 15.658 15.889 15.219 14.160 13.530 13.819 14.764 15.492 15.183 13.703 11.720 10.195 9.687 10.006 10.463 10.438 9.802 8.898 8.202 7.991 8.260 8.842 9.543 10.162 10.469 10.275 9.583 8.687 8.060 + 10.438 10.550 10.795 11.269 12.131 13.415 14.830 15.788 15.768 14.779 13.494 12.841 13.308 14.505 15.398 15.076 13.448 11.324 9.805 9.489 10.111 10.850 10.985 10.370 9.401 8.616 8.326 8.516 9.004 9.587 10.080 10.269 9.972 9.194 8.230 7.564 + 10.697 10.802 11.092 11.695 12.683 13.940 15.092 15.641 15.283 14.198 13.043 12.570 13.095 14.219 15.059 14.858 13.526 11.709 10.335 9.983 10.531 11.327 11.681 11.310 10.441 9.569 9.117 9.228 9.760 10.405 10.822 10.744 10.076 8.972 7.815 7.075 + 9.518 9.923 10.704 11.800 13.092 14.352 15.248 15.454 14.863 13.746 12.691 12.295 12.776 13.792 14.631 14.668 13.764 12.337 11.048 10.368 10.321 10.564 10.684 10.472 9.986 9.433 9.002 8.779 8.770 8.933 9.198 9.462 9.612 9.595 9.462 9.342 + 8.024 8.045 8.383 9.358 10.972 12.759 13.972 14.014 12.842 11.057 9.602 9.217 10.011 11.409 12.516 12.653 11.731 10.230 8.854 8.094 7.997 8.243 8.430 8.332 7.985 7.576 7.270 7.112 7.050 7.035 7.083 7.266 7.635 8.145 8.651 8.967 + 7.790 8.252 9.147 10.370 11.693 12.768 13.228 12.862 11.783 10.447 9.478 9.343 10.088 11.297 12.319 12.634 12.110 11.008 9.760 8.705 7.955 7.454 7.111 6.894 6.801 6.801 6.802 6.727 6.591 6.525 6.697 7.195 7.956 8.797 9.501 9.896 + 4.367 4.253 4.369 5.136 6.692 8.659 10.242 10.634 9.531 7.403 5.309 4.325 4.918 6.670 8.549 9.537 9.207 7.895 6.386 5.396 5.189 5.544 6.007 6.204 5.996 5.463 4.792 4.180 3.792 3.734 4.022 4.561 5.180 5.710 6.058 6.220 + 4.380 4.426 4.570 4.937 5.682 6.825 8.085 8.915 8.802 7.679 6.090 4.923 4.852 5.875 7.326 8.343 8.437 7.748 6.832 6.209 6.034 6.105 6.115 5.888 5.437 4.873 4.304 3.833 3.573 3.617 3.931 4.308 4.469 4.267 3.827 3.472 + 5.338 4.889 4.389 4.382 5.191 6.673 8.242 9.178 9.049 7.976 6.580 5.611 5.513 6.185 7.091 7.624 7.482 6.800 5.996 5.463 5.336 5.462 5.556 5.397 4.942 4.312 3.701 3.276 3.115 3.181 3.347 3.442 3.339 3.032 2.650 2.387 + 3.677 3.419 3.228 3.536 4.575 6.169 7.772 8.737 8.677 7.693 6.332 5.277 4.978 5.425 6.216 6.837 6.965 6.610 6.029 5.505 5.176 4.992 4.818 4.561 4.234 3.923 3.711 3.621 3.608 3.601 3.540 3.400 3.194 2.962 2.760 2.642 + 4.269 3.922 3.509 3.463 4.129 5.516 7.184 8.413 8.602 7.667 6.133 4.832 4.383 4.839 5.730 6.450 6.656 6.390 5.906 5.396 4.886 4.338 3.794 3.394 3.240 3.271 3.312 3.243 3.131 3.153 3.380 3.641 3.627 3.174 2.459 1.920 + 2.173 2.630 3.386 4.289 5.318 6.494 7.657 8.372 8.164 6.935 5.184 3.776 3.377 3.996 5.023 5.718 5.752 5.353 4.992 4.938 5.073 5.092 4.834 4.409 4.041 3.822 3.653 3.419 3.173 3.100 3.287 3.537 3.478 2.900 2.013 1.345 + 5.205 4.624 3.893 3.597 4.098 5.293 6.666 7.593 7.704 7.072 6.128 5.380 5.127 5.353 5.823 6.267 6.518 6.525 6.295 5.852 5.263 4.656 4.191 3.958 3.897 3.832 3.611 3.253 2.945 2.891 3.106 3.362 3.349 2.929 2.283 1.802 + 5.144 5.096 5.035 5.102 5.528 6.423 7.540 8.280 8.081 6.920 5.458 4.634 4.966 6.142 7.269 7.578 6.989 6.060 5.430 5.277 5.280 5.055 4.582 4.190 4.155 4.350 4.343 3.864 3.149 2.763 3.048 3.721 4.060 3.555 2.429 1.502 + 4.297 4.255 4.123 3.976 4.089 4.730 5.812 6.791 7.027 6.352 5.317 4.812 5.336 6.555 7.570 7.668 6.898 5.950 5.484 5.568 5.727 5.521 5.021 4.709 4.899 5.314 5.290 4.451 3.174 2.341 2.552 3.536 4.356 4.242 3.301 2.416 + 5.484 5.912 6.607 7.386 8.174 8.973 9.721 10.219 10.247 9.799 9.189 8.875 9.121 9.782 10.417 10.655 10.484 10.207 10.124 10.232 10.244 9.884 9.190 8.517 8.238 8.426 8.807 9.015 8.912 8.667 8.557 8.694 8.944 9.093 9.067 8.981 + 7.118 7.364 7.758 8.223 8.787 9.504 10.273 10.785 10.716 10.038 9.150 8.644 8.872 9.669 10.489 10.855 10.717 10.414 10.294 10.367 10.314 9.840 9.021 8.292 8.081 8.439 9.000 9.311 9.222 8.969 8.918 9.216 9.688 10.045 10.160 10.139 + 4.934 5.284 5.831 6.384 6.844 7.223 7.548 7.773 7.794 7.573 7.252 7.118 7.412 8.121 8.947 9.494 9.548 9.226 8.879 8.805 9.027 9.286 9.271 8.881 8.325 7.963 8.044 8.527 9.131 9.567 9.752 9.845 10.095 10.607 11.234 11.669 + 6.010 5.908 5.849 5.971 6.265 6.582 6.795 6.948 7.234 7.806 8.609 9.382 9.861 9.993 9.968 10.052 10.359 10.770 11.054 11.066 10.839 10.518 10.220 9.971 9.755 9.605 9.609 9.830 10.227 10.674 11.080 11.478 11.986 12.652 13.347 13.802 + 7.903 7.152 6.287 6.061 6.739 7.932 8.959 9.403 9.365 9.261 9.401 9.758 10.100 10.291 10.436 10.733 11.210 11.647 11.759 11.471 11.002 10.667 10.608 10.699 10.718 10.595 10.486 10.615 11.037 11.589 12.048 12.339 12.582 12.921 13.339 13.642 + 6.743 6.865 7.267 8.046 9.022 9.794 10.025 9.732 9.291 9.144 9.452 10.004 10.443 10.589 10.573 10.669 11.003 11.417 11.608 11.403 10.917 10.455 10.272 10.401 10.684 10.946 11.130 11.293 11.498 11.751 12.023 12.320 12.691 13.156 13.630 13.938 + 7.619 7.914 8.351 8.722 8.890 8.883 8.863 9.016 9.417 9.970 10.463 10.711 10.687 10.536 10.474 10.633 10.967 11.288 11.404 11.257 10.954 10.693 10.621 10.746 10.951 11.098 11.125 11.091 11.124 11.341 11.775 12.368 13.007 13.575 13.989 14.204 + 8.097 8.143 8.303 8.645 9.155 9.722 10.202 10.512 10.675 10.777 10.868 10.913 10.824 10.577 10.281 10.148 10.329 10.777 11.234 11.388 11.100 10.513 9.958 9.720 9.847 10.155 10.424 10.599 10.842 11.362 12.188 13.086 13.706 13.849 13.627 13.375 + 8.363 7.844 7.331 7.408 8.217 9.359 10.260 10.635 10.629 10.557 10.538 10.426 10.071 9.621 9.489 9.991 10.974 11.841 11.996 11.332 10.334 9.693 9.765 10.343 10.904 11.086 10.952 10.866 11.125 11.716 12.381 12.877 13.147 13.293 13.409 13.491 + 6.758 6.818 7.037 7.512 8.241 9.090 9.870 10.439 10.748 10.813 10.662 10.331 9.920 9.628 9.683 10.179 10.946 11.579 11.679 11.145 10.291 9.677 9.726 10.409 11.249 11.662 11.401 10.759 10.375 10.753 11.871 13.176 13.969 13.916 13.275 12.693 + 8.844 9.252 10.038 11.073 12.084 12.748 12.864 12.465 11.759 10.965 10.186 9.455 8.879 8.690 9.087 9.988 10.933 11.301 10.743 9.490 8.257 7.775 8.296 9.429 10.443 10.793 10.461 9.903 9.671 10.028 10.827 11.672 12.215 12.348 12.214 12.058 + 11.268 11.179 11.375 12.193 13.496 14.647 14.944 14.151 12.675 11.249 10.412 10.224 10.396 10.645 10.900 11.195 11.418 11.246 10.376 8.890 7.361 6.561 6.950 8.340 10.001 11.133 11.339 10.784 9.973 9.381 9.199 9.328 9.550 9.702 9.750 9.747 + 11.521 11.485 11.717 12.509 13.783 15.017 15.552 15.038 13.683 12.119 11.001 10.651 10.978 11.662 12.385 12.907 13.002 12.423 11.032 9.044 7.120 6.129 6.639 8.477 10.736 12.288 12.497 11.610 10.529 10.121 10.583 11.327 11.493 10.668 9.247 8.158 + 11.901 11.887 12.109 12.814 13.955 15.129 15.791 15.600 14.626 13.282 12.068 11.326 11.161 11.511 12.215 13.013 13.525 13.333 12.233 10.479 8.801 8.059 8.711 10.445 12.302 13.266 12.930 11.768 10.781 10.765 11.722 12.869 13.237 12.419 10.904 9.732 + 11.530 11.554 11.793 12.444 13.503 14.677 15.508 15.631 14.974 13.793 12.532 11.611 11.283 11.584 12.363 13.311 14.017 14.076 13.286 11.831 10.301 9.441 9.722 11.004 12.562 13.507 13.364 12.386 11.360 11.034 11.568 12.442 12.878 12.462 11.475 10.669 + 11.245 11.049 11.037 11.625 12.879 14.387 15.514 15.802 15.217 14.095 12.881 11.913 11.381 11.387 11.955 12.941 13.944 14.416 13.979 12.732 11.302 10.499 10.794 11.986 13.323 13.995 13.673 12.686 11.750 11.450 11.853 12.526 12.898 12.684 12.080 11.578 + 11.357 11.113 11.021 11.527 12.725 14.233 15.419 15.802 15.304 14.216 12.963 11.907 11.290 11.263 11.861 12.896 13.910 14.331 13.816 12.541 11.185 10.536 10.972 12.190 13.408 13.889 13.433 12.468 11.707 11.624 12.147 12.750 12.865 12.301 11.375 10.684 + 11.522 11.399 11.424 11.901 12.886 14.112 15.143 15.631 15.451 14.695 13.583 12.422 11.588 11.437 12.093 13.265 14.289 14.487 13.634 12.173 10.968 10.733 11.548 12.833 13.788 13.952 13.451 12.797 12.452 12.504 12.693 12.678 12.307 11.685 11.064 10.687 + 11.277 11.160 11.179 11.618 12.542 13.716 14.749 15.315 15.284 14.718 13.803 12.824 12.144 12.115 12.857 14.081 15.132 15.340 14.475 12.961 11.646 11.249 11.891 13.051 13.967 14.162 13.696 13.004 12.510 12.333 12.299 12.162 11.814 11.337 10.900 10.648 + 10.979 10.702 10.522 10.880 11.922 13.361 14.655 15.333 15.217 14.443 13.337 12.287 11.667 11.746 12.541 13.697 14.562 14.507 13.340 11.500 9.847 9.133 9.543 10.626 11.649 12.109 11.996 11.666 11.480 11.513 11.551 11.306 10.666 9.769 8.914 8.398 + 11.096 10.914 10.849 11.252 12.236 13.572 14.823 15.591 15.680 15.123 14.135 13.070 12.356 12.361 13.161 14.387 15.337 15.373 14.363 12.825 11.608 11.322 11.938 12.871 13.449 13.393 12.929 12.494 12.337 12.351 12.248 11.855 11.259 10.692 10.324 10.168 + 11.455 11.341 11.359 11.780 12.667 13.812 14.872 15.556 15.715 15.321 14.457 13.373 12.516 12.367 13.116 14.393 15.373 15.282 13.980 12.136 10.802 10.676 11.617 12.808 13.410 13.164 12.467 11.924 11.811 11.916 11.833 11.383 10.753 10.272 10.087 10.083 + 11.324 11.337 11.466 11.850 12.563 13.540 14.570 15.346 15.584 15.159 14.210 13.141 12.472 12.562 13.373 14.421 15.020 14.685 13.453 11.874 10.667 10.280 10.633 11.248 11.617 11.541 11.191 10.891 10.822 10.893 10.849 10.486 9.805 8.993 8.294 7.899 + 11.095 10.971 10.963 11.356 12.240 13.429 14.561 15.283 15.387 14.863 13.896 12.858 12.231 12.400 13.375 14.654 15.408 14.970 13.319 11.160 9.502 8.998 9.545 10.436 10.931 10.769 10.251 9.868 9.848 10.011 9.997 9.616 8.992 8.408 8.051 7.914 + 11.298 11.159 11.132 11.523 12.439 13.693 14.892 15.639 15.703 15.092 14.049 13.006 12.455 12.733 13.785 15.084 15.852 15.517 14.116 12.323 11.031 10.770 11.385 12.214 12.607 12.360 11.753 11.199 10.877 10.645 10.268 9.706 9.163 8.878 8.886 8.993 + 11.578 11.474 11.487 11.874 12.716 13.835 14.886 15.538 15.610 15.123 14.278 13.415 12.928 13.097 13.890 14.892 15.474 15.171 14.022 12.577 11.555 11.351 11.803 12.377 12.602 12.406 12.063 11.860 11.802 11.628 11.103 10.283 9.498 9.069 9.031 9.140 + 11.529 11.468 11.494 11.796 12.467 13.420 14.412 15.141 15.376 15.055 14.331 13.538 13.063 13.155 13.763 14.511 14.882 14.530 13.519 12.323 11.539 11.517 12.148 12.956 13.425 13.306 12.709 11.940 11.256 10.728 10.281 9.830 9.375 8.985 8.721 8.596 + 11.278 11.034 10.798 10.899 11.516 12.564 13.736 14.661 15.066 14.880 14.253 13.516 13.056 13.137 13.728 14.463 14.823 14.457 13.443 12.277 11.566 11.626 12.299 13.090 13.529 13.443 12.959 12.286 11.516 10.623 9.636 8.758 8.285 8.359 8.799 9.190 + 10.833 10.778 10.679 10.634 10.862 11.577 12.756 14.031 14.850 14.841 14.110 13.209 12.771 13.077 13.873 14.582 14.713 14.177 13.280 12.473 12.073 12.141 12.555 13.125 13.658 13.955 13.825 13.158 12.031 10.725 9.614 8.990 8.923 9.257 9.711 10.017 + 11.304 10.922 10.341 9.911 10.029 10.901 12.318 13.675 14.299 13.912 12.852 11.870 11.608 12.172 13.117 13.822 13.939 13.548 12.969 12.454 12.063 11.775 11.657 11.847 12.367 12.960 13.174 12.678 11.544 10.232 9.283 8.960 9.141 9.495 9.764 9.881 + 10.370 10.598 10.746 10.588 10.326 10.454 11.242 12.351 13.021 12.737 11.750 10.934 11.064 12.144 13.407 13.967 13.543 12.590 11.792 11.440 11.286 10.973 10.530 10.406 10.974 12.015 12.743 12.399 10.910 8.994 7.629 7.350 7.969 8.876 9.564 9.883 + 9.378 9.957 10.498 10.423 9.825 9.424 9.844 10.939 11.852 11.802 10.847 9.891 9.891 10.983 12.352 12.940 12.340 11.055 9.944 9.438 9.268 8.927 8.321 7.925 8.284 9.362 10.415 10.557 9.507 7.838 6.525 6.208 6.817 7.795 8.603 9.011 + 9.465 9.707 9.769 9.323 8.607 8.296 8.852 9.991 10.845 10.726 9.796 8.956 9.050 10.078 11.180 11.399 10.511 9.164 8.231 8.016 8.077 7.789 7.066 6.495 6.758 7.892 9.127 9.474 8.549 6.884 5.499 5.130 5.793 6.940 7.962 8.517 + 7.976 8.225 8.348 8.013 7.333 6.827 6.948 7.641 8.366 8.580 8.221 7.739 7.642 8.019 8.490 8.601 8.262 7.787 7.517 7.446 7.248 6.692 5.997 5.726 6.272 7.404 8.357 8.417 7.505 6.240 5.435 5.481 6.145 6.890 7.352 7.517 + 7.192 7.101 6.673 5.779 4.734 4.202 4.691 6.084 7.656 8.602 8.637 8.155 7.827 8.017 8.518 8.812 8.559 7.872 7.147 6.684 6.463 6.269 5.995 5.790 5.899 6.384 7.008 7.412 7.410 7.124 6.843 6.763 6.855 6.964 6.987 6.959 + 6.252 6.188 5.870 5.230 4.569 4.427 5.122 6.378 7.446 7.666 7.001 6.063 5.617 5.975 6.808 7.483 7.590 7.185 6.595 6.056 5.564 5.045 4.600 4.519 5.008 5.916 6.772 7.138 6.962 6.601 6.479 6.720 7.082 7.242 7.123 6.940 + 3.617 3.685 3.844 4.133 4.585 5.185 5.834 6.370 6.643 6.609 6.380 6.161 6.119 6.274 6.481 6.543 6.353 5.973 5.589 5.372 5.364 5.456 5.484 5.360 5.128 4.940 4.941 5.180 5.584 6.013 6.337 6.501 6.525 6.473 6.406 6.364 + 3.818 4.037 4.409 4.845 5.277 5.686 6.072 6.402 6.583 6.498 6.101 5.504 4.949 4.685 4.788 5.094 5.296 5.176 4.772 4.372 4.300 4.663 5.259 5.719 5.781 5.475 5.089 4.942 5.161 5.618 6.053 6.272 6.245 6.080 5.907 5.807 + 3.956 4.216 4.637 5.111 5.590 6.054 6.412 6.483 6.113 5.370 4.591 4.203 4.432 5.124 5.865 6.283 6.299 6.105 5.938 5.864 5.780 5.595 5.374 5.283 5.391 5.556 5.529 5.218 4.821 4.680 4.957 5.437 5.680 5.397 4.739 4.195 + 5.568 5.327 5.072 5.088 5.507 6.192 6.797 6.973 6.570 5.727 4.796 4.170 4.102 4.608 5.481 6.398 7.052 7.271 7.074 6.641 6.215 5.968 5.913 5.918 5.806 5.505 5.126 4.911 5.083 5.672 6.466 7.110 7.315 7.037 6.513 6.116 + 4.804 4.634 4.431 4.378 4.579 4.990 5.442 5.724 5.682 5.290 4.682 4.131 3.967 4.436 5.540 6.963 8.171 8.657 8.234 7.157 5.996 5.298 5.278 5.712 6.137 6.185 5.830 5.385 5.249 5.616 6.329 6.990 7.231 6.955 6.401 5.974 + 5.267 4.900 4.448 4.251 4.440 4.864 5.234 5.353 5.227 5.005 4.827 4.758 4.832 5.116 5.688 6.515 7.363 7.877 7.808 7.207 6.412 5.817 5.595 5.602 5.543 5.245 4.821 4.586 4.797 5.442 6.228 6.767 6.821 6.428 5.860 5.462 + 4.909 4.576 4.133 3.878 3.992 4.428 4.946 5.265 5.228 4.884 4.451 4.196 4.288 4.712 5.277 5.714 5.829 5.617 5.268 5.045 5.107 5.392 5.654 5.634 5.252 4.665 4.159 3.952 4.052 4.283 4.428 4.384 4.198 3.990 3.849 3.789 + 5.853 5.677 5.527 5.608 5.929 6.287 6.458 6.391 6.224 6.117 6.095 6.056 5.940 5.863 6.050 6.608 7.354 7.904 7.958 7.539 6.978 6.633 6.621 6.772 6.846 6.777 6.710 6.820 7.096 7.322 7.270 6.915 6.458 6.145 6.058 6.086 + 7.661 7.914 8.370 8.908 9.363 9.598 9.597 9.482 9.416 9.463 9.545 9.537 9.430 9.394 9.655 10.279 11.048 11.570 11.545 10.982 10.188 9.545 9.263 9.303 9.498 9.729 9.991 10.308 10.625 10.799 10.719 10.419 10.073 9.855 9.810 9.844 + 5.834 6.289 6.951 7.478 7.647 7.477 7.192 7.040 7.111 7.275 7.309 7.100 6.780 6.666 7.030 7.877 8.893 9.616 9.713 9.178 8.306 7.495 7.022 6.945 7.152 7.491 7.851 8.162 8.360 8.387 8.229 7.952 7.679 7.511 7.464 7.474 + 5.327 6.355 7.767 8.674 8.510 7.392 6.050 5.341 5.669 6.722 7.712 7.962 7.416 6.667 6.487 7.220 8.511 9.573 9.787 9.136 8.165 7.520 7.479 7.822 8.112 8.085 7.823 7.602 7.603 7.753 7.831 7.681 7.337 6.963 6.695 6.572 + 5.952 6.298 6.804 7.240 7.491 7.601 7.689 7.825 7.981 8.084 8.102 8.073 8.070 8.150 8.346 8.678 9.131 9.604 9.880 9.727 9.074 8.145 7.387 7.192 7.608 8.284 8.721 8.644 8.188 7.746 7.617 7.755 7.848 7.633 7.167 6.780 + 4.898 5.450 6.370 7.352 8.086 8.382 8.245 7.875 7.560 7.528 7.825 8.301 8.723 8.934 8.964 8.990 9.187 9.566 9.943 10.057 9.770 9.181 8.571 8.205 8.160 8.296 8.398 8.359 8.255 8.247 8.413 8.657 8.783 8.670 8.388 8.155 + 5.728 6.474 7.451 8.028 7.937 7.449 7.115 7.304 7.921 8.514 8.671 8.361 7.963 7.958 8.563 9.568 10.494 10.929 10.773 10.253 9.718 9.402 9.307 9.262 9.087 8.738 8.342 8.116 8.225 8.666 9.251 9.698 9.791 9.511 9.052 8.715 + 6.545 6.270 6.105 6.428 7.210 8.006 8.349 8.188 7.946 8.117 8.790 9.540 9.796 9.382 8.708 8.453 8.988 10.055 10.968 11.153 10.578 9.724 9.158 9.106 9.352 9.515 9.409 9.185 9.156 9.487 10.033 10.431 10.375 9.838 9.102 8.585 + 4.568 5.232 6.409 7.775 8.883 9.351 9.097 8.447 7.958 8.045 8.681 9.407 9.694 9.372 8.792 8.570 9.107 10.249 11.370 11.823 11.391 10.423 9.544 9.191 9.342 9.624 9.681 9.477 9.295 9.442 9.932 10.424 10.474 9.913 9.018 8.349 + 5.128 5.557 6.384 7.467 8.504 9.140 9.194 8.807 8.382 8.291 8.598 9.006 9.118 8.792 8.307 8.175 8.737 9.855 10.968 11.480 11.175 10.360 9.605 9.315 9.467 9.698 9.665 9.350 9.069 9.178 9.739 10.429 10.776 10.544 9.927 9.417 + 4.635 5.523 6.874 8.089 8.727 8.716 8.328 7.953 7.852 8.023 8.248 8.274 8.012 7.629 7.482 7.904 8.962 10.345 11.485 11.881 11.421 10.481 9.683 9.477 9.837 10.316 10.423 10.021 9.430 9.140 9.384 9.932 10.285 10.110 9.531 9.030 + 5.886 6.164 6.752 7.603 8.506 9.158 9.365 9.206 8.995 9.023 9.308 9.558 9.420 8.821 8.110 7.854 8.420 9.667 10.988 11.700 11.498 10.628 9.693 9.221 9.350 9.811 10.202 10.301 10.180 10.080 10.163 10.380 10.538 10.489 10.272 10.078 + 6.100 5.931 5.980 6.581 7.592 8.442 8.645 8.279 7.954 8.243 9.112 9.898 9.894 9.027 8.008 7.785 8.764 10.455 11.858 12.222 11.569 10.566 9.945 9.979 10.406 10.783 10.872 10.750 10.626 10.609 10.644 10.636 10.563 10.484 10.452 10.455 + 6.209 5.713 5.408 5.977 7.379 8.810 9.397 8.979 8.233 8.038 8.659 9.524 9.791 9.177 8.266 8.012 8.889 10.456 11.717 11.932 11.176 10.190 9.723 9.960 10.504 10.819 10.702 10.374 10.196 10.327 10.637 10.879 10.914 10.779 10.603 10.493 + 5.784 5.568 5.534 6.108 7.321 8.704 9.585 9.578 8.859 8.012 7.590 7.736 8.167 8.493 8.585 8.662 9.045 9.808 10.649 11.106 10.937 10.335 9.775 9.634 9.891 10.183 10.150 9.783 9.445 9.552 10.176 10.924 11.227 10.802 9.917 9.211 + 5.424 5.283 5.234 5.555 6.336 7.380 8.309 8.810 8.830 8.573 8.323 8.228 8.233 8.214 8.157 8.226 8.616 9.329 10.091 10.519 10.428 10.005 9.674 9.739 10.108 10.368 10.162 9.557 9.049 9.160 9.952 10.888 11.214 10.566 9.319 8.340 + 4.674 4.631 4.860 5.677 7.049 8.521 9.492 9.631 9.086 8.337 7.823 7.672 7.722 7.783 7.877 8.213 8.948 9.944 10.783 11.052 10.667 9.959 9.447 9.450 9.878 10.341 10.498 10.333 10.143 10.243 10.651 11.027 10.936 10.223 9.196 8.449 + 5.329 6.027 7.135 8.235 8.993 9.304 9.279 9.111 8.921 8.686 8.306 7.741 7.122 6.741 6.903 7.724 9.004 10.290 11.098 11.187 10.702 10.077 9.758 9.910 10.337 10.654 10.595 10.224 9.881 9.904 10.343 10.904 11.168 10.926 10.356 9.892 + 4.714 5.433 6.543 7.605 8.333 8.720 8.939 9.124 9.225 9.043 8.423 7.448 6.481 6.006 6.373 7.581 9.254 10.801 11.712 11.803 11.298 10.681 10.402 10.605 11.066 11.368 11.226 10.696 10.136 9.920 10.144 10.541 10.698 10.392 9.784 9.302 + 3.815 4.095 4.847 6.156 7.726 8.979 9.469 9.234 8.737 8.427 8.349 8.178 7.648 6.955 6.695 7.365 8.870 10.503 11.459 11.438 10.827 10.316 10.323 10.719 11.055 11.036 10.769 10.612 10.794 11.196 11.479 11.391 10.965 10.436 10.030 9.832 + 4.941 5.223 5.749 6.430 7.145 7.776 8.271 8.640 8.908 9.040 8.946 8.570 8.007 7.532 7.466 7.973 8.924 9.948 10.657 10.867 10.675 10.343 10.098 10.011 10.028 10.087 10.204 10.450 10.849 11.311 11.655 11.711 11.434 10.930 10.408 10.082 + 5.673 5.582 5.550 5.771 6.349 7.222 8.188 8.992 9.420 9.361 8.847 8.076 7.374 7.096 7.452 8.368 9.483 10.324 10.569 10.226 9.612 9.127 9.005 9.206 9.511 9.733 9.858 10.029 10.388 10.924 11.441 11.677 11.477 10.907 10.232 9.783 + 4.561 4.994 5.759 6.684 7.572 8.266 8.685 8.837 8.775 8.552 8.197 7.741 7.287 7.043 7.263 8.092 9.415 10.823 11.772 11.886 11.192 10.135 9.326 9.171 9.646 10.358 10.855 10.939 10.759 10.632 10.753 11.039 11.229 11.132 10.812 10.534 + 4.795 5.329 6.157 6.988 7.680 8.259 8.778 9.174 9.295 9.065 8.609 8.189 8.026 8.160 8.514 9.038 9.766 10.686 11.569 11.994 11.637 10.607 9.475 8.912 9.178 9.926 10.500 10.504 10.130 9.942 10.323 11.082 11.614 11.456 10.739 10.093 + 8.898 8.422 7.838 7.609 7.967 8.777 9.669 10.302 10.541 10.433 10.088 9.599 9.076 8.718 8.773 9.378 10.391 11.395 11.927 11.780 11.145 10.469 10.137 10.216 10.467 10.591 10.506 10.420 10.638 11.272 12.079 12.581 12.385 11.482 10.303 9.484 + 8.075 7.877 7.611 7.479 7.657 8.198 8.986 9.766 10.247 10.240 9.747 8.978 8.269 7.945 8.191 8.981 10.082 11.156 11.892 12.137 11.945 11.530 11.126 10.865 10.734 10.649 10.580 10.617 10.898 11.458 12.112 12.510 12.353 11.625 10.665 9.993 + 3.816 4.866 6.462 7.954 8.955 9.466 9.683 9.714 9.496 8.957 8.202 7.523 7.198 7.319 7.807 8.576 9.625 10.925 12.225 13.046 12.974 12.030 10.759 9.885 9.774 10.192 10.577 10.595 10.456 10.674 11.485 12.502 12.965 12.414 11.171 10.157 + 5.326 5.234 5.367 6.049 7.263 8.579 9.428 9.502 8.940 8.171 7.560 7.190 6.934 6.731 6.771 7.378 8.680 10.361 11.762 12.290 11.840 10.886 10.132 10.022 10.454 10.944 11.077 10.863 10.710 11.036 11.854 12.693 12.942 12.350 11.270 10.437 + 5.405 5.221 5.263 5.961 7.330 8.852 9.800 9.740 8.812 7.594 6.668 6.271 6.277 6.474 6.837 7.548 8.733 10.204 11.463 12.006 11.701 10.901 10.200 10.001 10.253 10.561 10.567 10.272 10.028 10.209 10.844 11.536 11.752 11.256 10.340 9.629 + 6.412 6.304 6.464 7.256 8.598 9.893 10.425 9.889 8.637 7.417 6.825 6.917 7.284 7.490 7.489 7.654 8.399 9.736 11.163 11.995 11.864 10.987 9.980 9.390 9.321 9.466 9.468 9.281 9.205 9.571 10.357 11.102 11.228 10.513 9.335 8.447 + 5.725 5.219 4.972 5.782 7.659 9.668 10.590 9.865 8.030 6.296 5.624 6.084 6.971 7.533 7.629 7.770 8.560 10.047 11.589 12.334 11.898 10.662 9.458 8.917 9.047 9.334 9.273 8.817 8.403 8.523 9.259 10.157 10.570 10.181 9.277 8.545 + 4.182 4.363 5.038 6.418 8.203 9.619 9.926 8.995 7.424 6.102 5.560 5.684 5.979 6.132 6.321 7.013 8.430 10.199 11.529 11.786 10.986 9.788 8.991 8.948 9.372 9.659 9.431 8.861 8.508 8.836 9.816 10.921 11.509 11.301 10.580 9.971 + 6.046 5.985 6.280 7.295 8.851 10.197 10.526 9.584 7.874 6.266 5.371 5.195 5.340 5.496 5.762 6.501 7.895 9.642 11.078 11.642 11.272 10.406 9.616 9.193 9.033 8.860 8.566 8.340 8.499 9.183 10.179 11.027 11.324 10.992 10.331 9.825 + 6.453 6.287 6.467 7.433 8.984 10.288 10.530 9.590 8.148 7.092 6.799 6.927 6.879 6.478 6.177 6.623 7.981 9.688 10.855 10.978 10.301 9.545 9.266 9.433 9.577 9.311 8.732 8.341 8.597 9.515 10.643 11.404 11.476 10.959 10.240 9.750 + 5.893 6.075 6.707 7.926 9.371 10.289 10.082 8.828 7.265 6.222 5.984 6.151 6.114 5.693 5.347 5.767 7.210 9.186 10.772 11.284 10.726 9.691 8.829 8.401 8.235 8.067 7.884 7.945 8.513 9.552 10.680 11.407 11.451 10.901 10.136 9.609 + 6.051 6.246 6.784 7.700 8.695 9.239 8.961 7.977 6.847 6.151 6.053 6.252 6.340 6.237 6.285 6.909 8.161 9.578 10.489 10.525 9.868 9.060 8.548 8.378 8.276 8.010 7.666 7.596 8.099 9.109 10.174 10.735 10.480 9.534 8.389 7.626 + 8.877 7.988 7.000 6.818 7.679 8.935 9.567 9.001 7.545 6.115 5.520 5.909 6.797 7.581 8.031 8.371 8.915 9.658 10.210 10.124 9.316 8.186 7.338 7.137 7.481 7.951 8.197 8.219 8.308 8.733 9.444 10.057 10.136 9.552 8.628 7.943 + 9.635 9.051 8.380 8.159 8.474 8.871 8.756 7.928 6.763 5.909 5.758 6.178 6.710 7.025 7.206 7.603 8.414 9.391 9.972 9.729 8.748 7.608 6.966 7.087 7.698 8.262 8.423 8.262 8.174 8.497 9.206 9.913 10.166 9.804 9.090 8.535 + 6.697 6.475 6.513 7.235 8.454 9.387 9.253 7.955 6.205 4.983 4.782 5.309 5.861 6.010 5.968 6.318 7.399 8.909 10.089 10.302 9.508 8.243 7.184 6.687 6.675 6.872 7.116 7.458 8.015 8.765 9.509 9.996 10.105 9.911 9.608 9.399 + 6.164 6.111 6.279 6.894 7.809 8.501 8.443 7.525 6.163 4.995 4.422 4.387 4.552 4.694 4.921 5.532 6.646 7.963 8.908 9.040 8.398 7.476 6.846 6.748 6.965 7.078 6.870 6.527 6.492 7.081 8.194 9.343 9.987 9.905 9.355 8.870 + 7.515 7.292 7.166 7.409 7.900 8.153 7.747 6.747 5.710 5.226 5.414 5.832 5.908 5.510 5.134 5.496 6.886 8.817 10.318 10.620 9.704 8.262 7.156 6.808 7.003 7.209 7.078 6.730 6.601 7.041 8.000 9.050 9.696 9.725 9.338 8.971 + 8.121 7.446 6.668 6.412 6.804 7.363 7.449 6.841 5.927 5.338 5.372 5.754 5.947 5.721 5.441 5.779 7.076 8.926 10.368 10.575 9.487 7.862 6.711 6.563 7.148 7.705 7.651 7.039 6.469 6.545 7.350 8.358 8.842 8.454 7.506 6.734 + 9.304 8.636 7.681 6.940 6.692 6.828 6.970 6.770 6.170 5.421 4.864 4.675 4.772 4.968 5.204 5.620 6.394 7.469 8.453 8.832 8.360 7.306 6.315 5.954 6.301 6.924 7.265 7.124 6.804 6.808 7.340 8.073 8.398 7.964 7.019 6.254 + 6.670 6.353 6.121 6.335 6.879 7.195 6.785 5.712 4.609 4.163 4.529 5.233 5.640 5.549 5.371 5.714 6.769 8.072 8.851 8.659 7.720 6.715 6.220 6.303 6.588 6.668 6.465 6.237 6.282 6.652 7.121 7.389 7.315 6.981 6.596 6.353 + 6.520 6.545 6.686 6.952 7.139 6.930 6.182 5.130 4.287 4.055 4.390 4.828 4.880 4.485 4.109 4.379 5.547 7.217 8.573 8.939 8.231 6.973 5.891 5.430 5.537 5.827 5.938 5.783 5.535 5.426 5.544 5.789 5.981 6.010 5.909 5.805 + 6.277 5.524 4.753 4.712 5.414 6.096 5.931 4.831 3.568 3.088 3.650 4.598 4.981 4.452 3.625 3.547 4.770 6.826 8.568 9.036 8.130 6.563 5.229 4.576 4.468 4.527 4.548 4.617 4.906 5.424 5.977 6.345 6.451 6.385 6.284 6.224 + 11.541 11.625 11.828 12.152 12.505 12.717 12.652 12.292 11.742 11.133 10.519 9.870 9.151 8.417 7.815 7.486 7.451 7.586 7.714 7.736 7.672 7.598 7.526 7.361 6.972 6.335 5.601 5.040 4.875 5.142 5.657 6.136 6.355 6.272 6.023 5.823 + 13.484 13.552 13.727 14.028 14.391 14.664 14.673 14.321 13.646 12.790 11.916 11.121 10.421 9.792 9.241 8.820 8.590 8.564 8.683 8.851 8.998 9.101 9.158 9.126 8.905 8.397 7.612 6.714 5.974 5.619 5.694 6.038 6.390 6.567 6.559 6.493 + 8.726 8.865 9.432 10.614 12.130 13.293 13.510 12.751 11.553 10.543 9.903 9.288 8.255 6.781 5.375 4.662 4.829 5.443 5.816 5.574 4.930 4.432 4.448 4.863 5.224 5.169 4.731 4.259 4.094 4.302 4.687 5.011 5.182 5.254 5.304 5.344 + 9.914 9.476 8.937 8.734 9.111 9.936 10.779 11.169 10.858 9.923 8.657 7.356 6.177 5.153 4.310 3.752 3.617 3.928 4.498 4.983 5.095 4.799 4.340 4.072 4.205 4.671 5.204 5.551 5.640 5.584 5.533 5.536 5.527 5.424 5.243 5.098 + 9.414 9.126 8.775 8.623 8.747 8.968 8.982 8.606 7.913 7.172 6.610 6.226 5.792 5.078 4.100 3.180 2.745 3.010 3.781 4.569 4.918 4.714 4.237 3.926 4.046 4.521 5.043 5.338 5.364 5.288 5.296 5.420 5.535 5.510 5.350 5.200 + 7.631 7.179 6.593 6.288 6.480 7.022 7.491 7.459 6.769 5.625 4.446 3.595 3.188 3.104 3.151 3.238 3.410 3.723 4.116 4.399 4.397 4.112 3.760 3.619 3.822 4.251 4.645 4.806 4.751 4.667 4.730 4.954 5.198 5.309 5.266 5.184 + 6.913 6.889 6.784 6.557 6.244 5.941 5.714 5.540 5.334 5.050 4.741 4.511 4.409 4.361 4.243 4.009 3.763 3.678 3.827 4.077 4.181 3.970 3.515 3.079 2.921 3.106 3.490 3.872 4.152 4.362 4.556 4.694 4.656 4.378 3.964 3.657 + 6.503 6.817 6.925 6.352 5.240 4.304 4.201 4.901 5.675 5.735 4.931 3.863 3.314 3.563 4.198 4.577 4.449 4.119 4.061 4.382 4.713 4.608 4.033 3.435 3.315 3.747 4.311 4.524 4.306 4.018 4.051 4.376 4.557 4.206 3.422 2.767 + 7.600 7.582 7.411 6.999 6.454 6.019 5.833 5.771 5.545 5.004 4.329 3.903 3.967 4.376 4.707 4.637 4.243 3.923 4.022 4.503 4.980 5.066 4.710 4.206 3.891 3.844 3.891 3.871 3.863 4.107 4.683 5.299 5.455 4.878 3.845 3.041 + 6.330 6.272 6.111 5.842 5.565 5.418 5.440 5.513 5.464 5.246 4.996 4.885 4.916 4.880 4.567 4.034 3.644 3.783 4.478 5.289 5.620 5.211 4.375 3.733 3.696 4.133 4.547 4.574 4.329 4.264 4.671 5.333 5.671 5.282 4.361 3.598 + 6.428 6.086 5.692 5.576 5.823 6.190 6.307 5.974 5.330 4.732 4.460 4.500 4.575 4.406 3.973 3.551 3.492 3.933 4.665 5.276 5.443 5.147 4.652 4.277 4.172 4.257 4.363 4.411 4.476 4.675 4.996 5.251 5.201 4.765 4.139 3.683 + 5.665 5.643 5.678 5.831 6.055 6.196 6.119 5.834 5.505 5.326 5.352 5.441 5.366 5.017 4.520 4.177 4.239 4.704 5.294 5.625 5.470 4.899 4.227 3.791 3.749 4.010 4.345 4.553 4.581 4.507 4.440 4.430 4.449 4.448 4.412 4.376 + 8.152 7.664 7.153 7.117 7.617 8.223 8.389 7.926 7.119 6.416 6.018 5.753 5.340 4.754 4.295 4.314 4.840 5.509 5.846 5.653 5.135 4.672 4.470 4.433 4.339 4.122 3.949 4.031 4.377 4.750 4.887 4.746 4.540 4.515 4.704 4.905 + 6.725 7.134 7.738 8.265 8.557 8.623 8.540 8.321 7.881 7.141 6.158 5.160 4.431 4.147 4.282 4.653 5.046 5.315 5.412 5.347 5.164 4.937 4.754 4.682 4.703 4.724 4.643 4.459 4.293 4.297 4.511 4.794 4.917 4.756 4.405 4.121 + 7.984 7.836 7.722 7.828 8.148 8.450 8.447 8.017 7.306 6.601 6.109 5.817 5.560 5.221 4.877 4.747 4.987 5.503 5.970 6.056 5.668 5.030 4.511 4.338 4.447 4.567 4.484 4.243 4.111 4.334 4.886 5.435 5.574 5.148 4.402 3.834 + 11.146 10.780 10.394 10.344 10.655 10.973 10.878 10.257 9.406 8.777 8.612 8.790 9.007 9.073 9.041 9.058 9.122 9.008 8.456 7.455 6.325 5.503 5.208 5.285 5.362 5.182 4.825 4.626 4.880 5.577 6.385 6.874 6.792 6.215 5.477 4.978 + 11.281 11.047 10.625 10.110 9.623 9.253 8.993 8.740 8.364 7.829 7.253 6.857 6.820 7.137 7.596 7.892 7.794 7.277 6.514 5.781 5.313 5.205 5.387 5.665 5.823 5.725 5.393 5.011 4.816 4.938 5.298 5.630 5.657 5.295 4.733 4.318 + 3.911 4.800 6.032 6.940 7.228 7.089 6.908 6.847 6.715 6.224 5.357 4.478 4.064 4.299 4.914 5.399 5.416 5.029 4.597 4.438 4.603 4.902 5.128 5.228 5.290 5.397 5.534 5.628 5.657 5.674 5.726 5.753 5.618 5.246 4.751 4.394 + 4.260 5.180 6.530 7.660 8.164 8.066 7.682 7.311 7.027 6.715 6.282 5.805 5.506 5.559 5.937 6.409 6.715 6.739 6.569 6.398 6.376 6.521 6.750 6.962 7.109 7.201 7.270 7.340 7.415 7.479 7.504 7.450 7.295 7.055 6.804 6.641 + 6.567 6.969 7.576 8.105 8.347 8.258 7.945 7.560 7.200 6.871 6.548 6.247 6.054 6.071 6.325 6.719 7.080 7.269 7.273 7.204 7.202 7.334 7.558 7.780 7.948 8.093 8.285 8.547 8.803 8.926 8.832 8.549 8.203 7.924 7.768 7.711 + 6.899 6.628 6.417 6.631 7.331 8.172 8.631 8.380 7.517 6.481 5.755 5.583 5.887 6.406 6.888 7.204 7.334 7.310 7.186 7.050 7.017 7.168 7.469 7.759 7.847 7.654 7.296 7.018 7.036 7.373 7.840 8.150 8.101 7.704 7.174 6.807 + 5.912 6.180 6.831 7.874 9.004 9.665 9.405 8.246 6.742 5.649 5.417 5.913 6.573 6.856 6.643 6.260 6.148 6.473 6.995 7.295 7.147 6.715 6.417 6.579 7.167 7.823 8.146 8.001 7.598 7.299 7.326 7.614 7.903 7.975 7.835 7.673 + 9.036 9.270 9.736 10.338 10.826 10.873 10.285 9.162 7.877 6.860 6.344 6.269 6.396 6.521 6.602 6.722 6.944 7.227 7.458 7.570 7.608 7.689 7.893 8.194 8.491 8.705 8.840 8.954 9.085 9.202 9.232 9.125 8.904 8.647 8.438 8.326 + 8.146 8.550 9.067 9.339 9.200 8.753 8.232 7.802 7.475 7.191 6.950 6.843 6.957 7.264 7.621 7.882 8.004 8.037 8.022 7.926 7.701 7.417 7.302 7.612 8.395 9.390 10.167 10.423 10.195 9.794 9.529 9.468 9.437 9.244 8.899 8.621 + 10.254 10.259 10.226 10.092 9.819 9.422 8.972 8.544 8.156 7.768 7.337 6.927 6.729 6.959 7.669 8.625 9.381 9.538 9.019 8.142 7.417 7.221 7.575 8.190 8.718 8.992 9.079 9.141 9.252 9.351 9.337 9.200 9.043 8.983 9.039 9.117 + 9.861 9.973 10.178 10.373 10.343 9.895 9.047 8.096 7.450 7.322 7.571 7.832 7.862 7.767 7.901 8.496 9.363 9.952 9.764 8.761 7.439 6.485 6.303 6.787 7.474 7.930 8.022 7.893 7.753 7.687 7.647 7.575 7.489 7.452 7.485 7.536 + 8.208 8.626 9.165 9.418 9.122 8.324 7.345 6.573 6.229 6.262 6.451 6.610 6.740 6.995 7.486 8.103 8.514 8.373 7.599 6.486 5.546 5.185 5.429 5.926 6.195 5.961 5.320 4.642 4.295 4.402 4.783 5.107 5.117 4.782 4.299 3.957 + 9.392 9.885 10.247 9.787 8.371 6.590 5.327 5.093 5.688 6.430 6.732 6.524 6.190 6.152 6.472 6.824 6.799 6.263 5.455 4.769 4.456 4.476 4.594 4.591 4.409 4.132 3.888 3.754 3.746 3.837 3.980 4.110 4.162 4.107 3.986 3.889 + 6.208 6.042 5.647 4.993 4.176 3.410 2.909 2.754 2.838 2.962 2.982 2.901 2.845 2.942 3.217 3.574 3.870 4.007 3.983 3.874 3.775 3.751 3.816 3.931 4.026 4.033 3.923 3.737 3.571 3.522 3.627 3.830 4.023 4.124 4.130 4.102 + 3.654 4.120 4.619 4.643 4.017 3.038 2.227 1.931 2.098 2.401 2.556 2.550 2.594 2.871 3.330 3.722 3.832 3.684 3.518 3.571 3.847 4.104 4.068 3.693 3.248 3.124 3.529 4.309 5.033 5.290 4.964 4.292 3.669 3.369 3.384 3.495 + 4.333 4.431 4.515 4.434 4.115 3.630 3.180 2.975 3.088 3.398 3.663 3.703 3.524 3.312 3.266 3.440 3.705 3.879 3.898 3.864 3.931 4.134 4.340 4.365 4.175 3.946 3.931 4.226 4.656 4.895 4.732 4.247 3.741 3.486 3.513 3.627 + 3.787 3.895 3.997 3.947 3.679 3.261 2.866 2.661 2.705 2.916 3.137 3.248 3.243 3.214 3.265 3.422 3.625 3.786 3.866 3.897 3.932 3.967 3.928 3.729 3.375 2.997 2.795 2.908 3.313 3.830 4.228 4.353 4.201 3.886 3.568 3.376 + 6.442 6.147 5.714 5.329 5.070 4.873 4.631 4.311 3.997 3.800 3.744 3.741 3.671 3.507 3.352 3.352 3.562 3.884 4.138 4.208 4.126 4.034 4.050 4.169 4.275 4.243 4.058 3.824 3.675 3.661 3.695 3.617 3.312 2.805 2.264 1.916 + 4.693 4.822 4.957 4.921 4.599 4.028 3.403 2.981 2.911 3.135 3.403 3.448 3.184 2.777 2.536 2.676 3.142 3.641 3.856 3.691 3.357 3.210 3.480 4.080 4.657 4.849 4.545 3.965 3.489 3.377 3.578 3.774 3.628 3.046 2.267 1.716 + 5.907 5.413 4.770 4.347 4.202 4.061 3.626 2.923 2.343 2.314 2.896 3.673 4.070 3.828 3.216 2.800 2.961 3.569 4.105 4.113 3.588 2.977 2.807 3.245 3.977 4.469 4.399 3.895 3.403 3.318 3.667 4.103 4.191 3.755 3.026 2.475 + 6.789 5.698 4.207 3.173 3.001 3.423 3.814 3.725 3.200 2.631 2.365 2.431 2.609 2.714 2.787 3.009 3.443 3.896 4.042 3.728 3.150 2.741 2.836 3.407 4.085 4.445 4.321 3.898 3.536 3.486 3.730 4.029 4.131 3.951 3.615 3.358 + 5.489 5.361 5.090 4.690 4.246 3.890 3.726 3.751 3.845 3.849 3.681 3.398 3.157 3.110 3.289 3.589 3.830 3.880 3.733 3.505 3.359 3.391 3.572 3.767 3.826 3.692 3.460 3.324 3.454 3.862 4.355 4.629 4.456 3.848 3.081 2.555 + 5.285 4.907 4.421 4.157 4.253 4.567 4.815 4.799 4.548 4.259 4.124 4.189 4.361 4.520 4.622 4.690 4.730 4.672 4.417 3.949 3.411 3.047 3.040 3.375 3.834 4.146 4.171 3.980 3.777 3.726 3.817 3.882 3.733 3.325 2.812 2.456 + 4.811 4.661 4.467 4.359 4.395 4.499 4.511 4.314 3.954 3.641 3.619 3.967 4.509 4.911 4.918 4.547 4.080 3.838 3.939 4.217 4.381 4.273 3.993 3.804 3.886 4.187 4.483 4.586 4.499 4.378 4.341 4.329 4.156 3.716 3.134 2.714 + 4.749 4.854 4.991 5.082 5.111 5.115 5.121 5.098 4.985 4.773 4.534 4.374 4.335 4.367 4.400 4.448 4.609 4.955 5.389 5.641 5.454 4.812 4.002 3.430 3.329 3.593 3.900 4.000 3.909 3.849 3.984 4.227 4.308 4.037 3.521 3.110 + 6.439 6.075 5.650 5.488 5.651 5.901 5.939 5.687 5.326 5.083 4.984 4.838 4.466 3.953 3.650 3.888 4.663 5.578 6.118 6.022 5.449 4.802 4.399 4.272 4.244 4.162 4.064 4.108 4.385 4.791 5.089 5.086 4.767 4.286 3.846 3.593 + 6.050 5.598 5.057 4.855 5.138 5.647 5.916 5.627 4.845 3.949 3.357 3.245 3.503 3.898 4.295 4.729 5.294 5.966 6.537 6.734 6.419 5.707 4.902 4.307 4.051 4.061 4.186 4.326 4.483 4.688 4.898 4.970 4.761 4.263 3.663 3.253 + 5.868 5.167 4.423 4.352 5.075 5.991 6.300 5.682 4.543 3.637 3.423 3.742 4.074 4.084 3.935 4.099 4.854 5.963 6.825 6.956 6.358 5.479 4.830 4.606 4.631 4.610 4.420 4.188 4.127 4.313 4.618 4.823 4.788 4.539 4.225 4.017 + 6.145 5.807 5.382 5.187 5.383 5.863 6.330 6.505 6.290 5.795 5.212 4.682 4.253 3.955 3.891 4.222 5.028 6.153 7.193 7.690 7.414 6.523 5.477 4.741 4.507 4.631 4.812 4.859 4.815 4.848 5.034 5.240 5.224 4.861 4.299 3.878 + 6.701 6.405 6.024 5.804 5.825 5.948 5.951 5.723 5.351 5.024 4.857 4.806 4.750 4.660 4.691 5.084 5.947 7.093 8.091 8.504 8.162 7.252 6.186 5.342 4.869 4.685 4.618 4.572 4.568 4.666 4.849 4.991 4.943 4.660 4.266 3.982 + 6.397 5.945 5.382 5.117 5.301 5.726 6.009 5.908 5.491 5.045 4.802 4.764 4.759 4.685 4.689 5.095 6.104 7.524 8.783 9.257 8.700 7.424 6.095 5.284 5.115 5.267 5.300 5.025 4.620 4.417 4.568 4.884 4.995 4.679 4.079 3.605 + 5.240 4.943 4.618 4.579 4.918 5.438 5.821 5.883 5.689 5.458 5.353 5.363 5.374 5.338 5.381 5.714 6.443 7.419 8.280 8.649 8.346 7.480 6.362 5.348 4.688 4.476 4.651 5.052 5.469 5.715 5.688 5.408 4.991 4.583 4.285 4.135 + 4.298 4.400 4.677 5.141 5.625 5.859 5.686 5.220 4.779 4.610 4.671 4.672 4.377 3.902 3.712 4.290 5.713 7.501 8.873 9.239 8.551 7.273 6.032 5.232 4.895 4.803 4.753 4.704 4.745 4.948 5.262 5.535 5.629 5.515 5.295 5.128 + 4.491 4.015 3.535 3.586 4.295 5.228 5.704 5.324 4.294 3.277 2.908 3.341 4.202 4.947 5.338 5.613 6.235 7.422 8.858 9.851 9.804 8.661 6.958 5.469 4.709 4.679 4.993 5.240 5.278 5.240 5.315 5.534 5.750 5.802 5.684 5.547 + 4.348 3.737 3.052 2.919 3.521 4.434 4.958 4.664 3.720 2.743 2.329 2.642 3.385 4.117 4.633 5.080 5.748 6.744 7.831 8.568 8.615 7.970 6.965 6.043 5.506 5.385 5.504 5.640 5.664 5.583 5.488 5.474 5.580 5.772 5.973 6.099 + 4.512 4.269 3.982 3.872 3.984 4.134 4.047 3.600 2.955 2.470 2.459 2.967 3.757 4.496 5.020 5.433 5.991 6.835 7.813 8.525 8.586 7.906 6.776 5.709 5.129 5.152 5.567 6.028 6.282 6.288 6.172 6.097 6.141 6.284 6.444 6.545 + 5.388 4.618 3.667 3.236 3.579 4.326 4.810 4.631 3.966 3.392 3.378 3.904 4.522 4.806 4.781 4.943 5.823 7.465 9.242 10.225 9.817 8.200 6.225 4.857 4.574 5.148 5.928 6.352 6.294 6.019 5.869 5.965 6.167 6.269 6.212 6.113 + 4.821 4.209 3.490 3.251 3.671 4.387 4.820 4.669 4.153 3.794 3.958 4.546 5.109 5.276 5.114 5.104 5.747 7.112 8.699 9.744 9.713 8.653 7.141 5.906 5.404 5.616 6.156 6.572 6.607 6.292 5.848 5.522 5.445 5.592 5.828 5.997 + 5.044 4.662 4.139 3.779 3.726 3.876 3.983 3.877 3.611 3.418 3.509 3.887 4.347 4.669 4.848 5.146 5.886 7.138 8.552 9.510 9.517 8.549 7.083 5.788 5.111 5.048 5.273 5.452 5.503 5.573 5.827 6.245 6.629 6.788 6.718 6.595 + 5.066 4.599 3.817 3.017 2.558 2.704 3.437 4.423 5.179 5.372 5.031 4.513 4.257 4.509 5.229 6.199 7.203 8.114 8.832 9.202 9.041 8.287 7.147 6.057 5.464 5.557 6.160 6.858 7.269 7.243 6.887 6.430 6.056 5.833 5.733 5.702 + 5.460 4.854 4.018 3.473 3.579 4.323 5.341 6.153 6.438 6.193 5.673 5.196 4.961 5.005 5.294 5.826 6.630 7.652 8.659 9.273 9.179 8.346 7.107 5.997 5.447 5.557 6.085 6.649 6.966 6.978 6.792 6.549 6.319 6.115 5.944 5.841 + 4.213 3.946 3.608 3.424 3.468 3.630 3.748 3.777 3.821 4.016 4.375 4.767 5.060 5.279 5.631 6.329 7.364 8.422 9.049 8.945 8.179 7.147 6.329 6.009 6.150 6.493 6.751 6.775 6.588 6.309 6.058 5.899 5.837 5.842 5.875 5.901 + 6.956 6.517 5.793 5.020 4.418 4.096 4.033 4.125 4.279 4.466 4.710 5.016 5.330 5.578 5.765 6.026 6.560 7.445 8.496 9.293 9.410 8.703 7.446 6.195 5.470 5.463 5.975 6.594 6.968 6.979 6.726 6.386 6.088 5.873 5.734 5.664 + 4.991 4.900 4.784 4.727 4.760 4.841 4.885 4.834 4.707 4.588 4.570 4.692 4.934 5.272 5.734 6.393 7.280 8.277 9.091 9.377 8.940 7.892 6.639 5.672 5.311 5.543 6.078 6.551 6.735 6.634 6.403 6.215 6.151 6.191 6.267 6.319 + 5.280 4.966 4.646 4.645 5.001 5.433 5.596 5.390 5.016 4.744 4.642 4.535 4.243 3.857 3.770 4.386 5.753 7.442 8.779 9.264 8.842 7.861 6.802 6.017 5.638 5.632 5.881 6.209 6.412 6.337 6.008 5.661 5.602 5.968 6.581 7.048 + 5.982 5.939 5.889 5.853 5.794 5.621 5.271 4.779 4.291 3.966 3.848 3.821 3.708 3.475 3.351 3.731 4.877 6.626 8.359 9.318 9.085 7.882 6.444 5.536 5.461 5.920 6.314 6.223 5.698 5.140 4.923 5.088 5.362 5.451 5.301 5.116 + 5.718 5.734 5.797 5.897 5.931 5.744 5.271 4.633 4.095 3.888 4.019 4.257 4.335 4.205 4.150 4.609 5.819 7.550 9.144 9.890 9.469 8.167 6.694 5.735 5.564 5.947 6.399 6.544 6.334 5.982 5.721 5.614 5.549 5.396 5.159 4.974 + 5.379 5.358 5.254 5.061 4.918 5.025 5.435 5.926 6.106 5.704 4.803 3.813 3.214 3.271 3.958 5.082 6.430 7.798 8.913 9.429 9.092 7.988 6.604 5.583 5.314 5.685 6.210 6.436 6.276 5.991 5.878 5.963 6.001 5.755 5.274 4.882 + 5.596 5.445 5.376 5.620 6.155 6.679 6.844 6.527 5.908 5.293 4.867 4.604 4.395 4.255 4.381 4.989 6.078 7.343 8.325 8.676 8.350 7.574 6.691 5.986 5.620 5.631 5.948 6.387 6.691 6.650 6.252 5.720 5.378 5.412 5.726 6.014 + 10.692 9.960 8.956 8.257 8.129 8.325 8.276 7.514 6.030 4.305 2.997 2.532 2.883 3.682 4.546 5.335 6.150 7.105 8.082 8.707 8.583 7.610 6.132 4.775 4.098 4.278 5.046 5.899 6.407 6.424 6.082 5.638 5.295 5.126 5.086 5.095 + 10.844 9.706 8.151 7.073 6.878 7.232 7.388 6.790 5.478 4.004 2.993 2.736 3.105 3.787 4.565 5.398 6.292 7.139 7.704 7.783 7.373 6.693 6.043 5.628 5.483 5.527 5.672 5.875 6.104 6.298 6.357 6.205 5.842 5.369 4.934 4.676 + 6.441 6.307 6.101 5.923 5.854 5.889 5.926 5.810 5.453 4.899 4.301 3.810 3.483 3.319 3.370 3.816 4.855 6.464 8.235 9.489 9.663 8.709 7.179 5.891 5.406 5.691 6.236 6.481 6.227 5.697 5.268 5.143 5.235 5.330 5.316 5.255 + 5.224 5.032 4.856 4.905 5.191 5.514 5.663 5.620 5.567 5.673 5.874 5.873 5.402 4.528 3.732 3.628 4.539 6.225 7.989 9.082 9.115 8.229 6.934 5.795 5.159 5.068 5.335 5.688 5.905 5.890 5.697 5.485 5.416 5.550 5.802 5.997 + 3.400 3.871 4.565 5.139 5.361 5.240 5.000 4.913 5.103 5.456 5.691 5.561 5.040 4.374 3.963 4.128 4.930 6.119 7.266 7.967 8.028 7.524 6.728 5.969 5.493 5.383 5.563 5.854 6.073 6.111 5.970 5.741 5.541 5.437 5.426 5.446 + 2.931 3.284 3.852 4.417 4.773 4.818 4.601 4.288 4.075 4.077 4.261 4.476 4.561 4.474 4.349 4.446 5.001 6.053 7.363 8.470 8.896 8.388 7.075 5.447 4.133 3.597 3.918 4.765 5.611 6.027 5.907 5.471 5.069 4.930 5.035 5.180 + 3.421 3.447 3.637 4.102 4.748 5.285 5.432 5.150 4.684 4.378 4.396 4.608 4.736 4.646 4.526 4.774 5.666 7.069 8.436 9.116 8.764 7.554 6.052 4.861 4.290 4.263 4.490 4.723 4.889 5.050 5.247 5.413 5.417 5.198 4.856 4.599 + 3.893 3.912 4.110 4.599 5.242 5.685 5.620 5.065 4.385 4.022 4.146 4.538 4.808 4.772 4.646 4.879 5.745 7.041 8.150 8.445 7.734 6.395 5.120 4.461 4.508 4.921 5.237 5.200 4.889 4.572 4.465 4.578 4.755 4.837 4.795 4.723 + 3.705 3.897 4.227 4.623 5.018 5.349 5.538 5.503 5.204 4.704 4.162 3.759 3.601 3.689 3.974 4.435 5.088 5.893 6.669 7.112 6.969 6.240 5.236 4.413 4.090 4.263 4.652 4.929 4.948 4.790 4.620 4.520 4.439 4.293 4.086 3.927 + 4.657 4.348 4.046 4.103 4.591 5.223 5.590 5.469 4.972 4.394 3.947 3.619 3.281 2.916 2.733 3.028 3.912 5.132 6.171 6.564 6.185 5.317 4.448 3.977 4.018 4.410 4.876 5.183 5.222 5.000 4.587 4.078 3.568 3.135 2.830 2.676 + 3.489 3.718 4.200 4.853 5.417 5.584 5.256 4.692 4.343 4.476 4.918 5.176 4.861 4.060 3.309 3.176 3.795 4.751 5.415 5.430 4.949 4.445 4.300 4.533 4.863 5.011 4.932 4.793 4.767 4.851 4.876 4.675 4.223 3.653 3.154 2.871 + 5.798 5.363 4.799 4.518 4.772 5.480 6.277 6.730 6.603 5.979 5.176 4.532 4.222 4.227 4.442 4.799 5.282 5.840 6.310 6.456 6.144 5.480 4.801 4.461 4.594 5.030 5.443 5.605 5.530 5.398 5.340 5.293 5.069 4.565 3.924 3.468 + 5.498 5.506 5.419 5.161 4.805 4.555 4.584 4.873 5.196 5.277 4.989 4.438 3.883 3.571 3.627 4.036 4.687 5.405 5.965 6.148 5.853 5.201 4.521 4.166 4.293 4.753 5.216 5.417 5.333 5.138 5.003 4.921 4.738 4.343 3.826 3.453 + 4.605 4.613 4.661 4.810 5.121 5.567 5.977 6.077 5.661 4.756 3.663 2.784 2.397 2.525 3.018 3.725 4.583 5.527 6.353 6.726 6.392 5.439 4.341 3.678 3.741 4.323 4.909 5.089 4.850 4.510 4.363 4.393 4.315 3.896 3.237 2.730 + 5.057 4.918 4.735 4.562 4.307 3.798 2.986 2.087 1.484 1.437 1.857 2.350 2.546 2.425 2.357 2.804 3.908 5.322 6.416 6.699 6.138 5.138 4.248 3.823 3.891 4.242 4.630 4.896 4.982 4.883 4.616 4.226 3.796 3.419 3.160 3.034 + 5.492 5.083 4.564 4.257 4.217 4.196 3.900 3.298 2.686 2.441 2.681 3.148 3.427 3.315 3.018 2.985 3.518 4.483 5.381 5.703 5.302 4.483 3.757 3.473 3.619 3.910 4.057 3.978 3.808 3.716 3.730 3.698 3.435 2.895 2.256 1.822 + 5.918 5.780 5.374 4.649 3.819 3.277 3.291 3.749 4.216 4.270 3.827 3.170 2.683 2.558 2.728 3.040 3.438 3.943 4.488 4.829 4.694 4.063 3.277 2.809 2.871 3.215 3.365 3.065 2.539 2.283 2.556 3.074 3.209 2.567 1.408 0.497 + 4.113 4.110 4.050 3.903 3.730 3.657 3.774 4.027 4.222 4.141 3.699 3.017 2.367 2.026 2.138 2.656 3.371 4.004 4.307 4.165 3.653 3.015 2.555 2.470 2.734 3.122 3.364 3.327 3.080 2.792 2.559 2.312 1.897 1.257 0.546 0.070 + 5.189 5.087 4.980 4.995 5.189 5.495 5.744 5.733 5.325 4.513 3.437 2.355 1.570 1.333 1.737 2.655 3.762 4.663 5.064 4.911 4.401 3.847 3.494 3.383 3.368 3.257 2.971 2.609 2.362 2.356 2.528 2.662 2.538 2.105 1.539 1.142 + 3.949 3.484 3.095 3.322 4.146 4.960 5.096 4.413 3.393 2.672 2.473 2.491 2.307 1.893 1.698 2.202 3.391 4.665 5.297 5.020 4.211 3.519 3.300 3.387 3.362 3.025 2.598 2.479 2.831 3.405 3.763 3.658 3.208 2.731 2.445 2.348 + 5.364 5.564 5.841 6.005 5.900 5.499 4.934 4.412 4.076 3.901 3.733 3.447 3.095 2.884 3.003 3.425 3.882 4.057 3.850 3.473 3.283 3.481 3.946 4.336 4.392 4.160 3.947 4.050 4.501 5.044 5.351 5.276 4.934 4.562 4.321 4.225 + 3.329 3.276 3.400 3.910 4.742 5.534 5.877 5.626 4.993 4.357 3.961 3.767 3.577 3.290 3.035 3.068 3.508 4.190 4.747 4.884 4.600 4.181 3.987 4.198 4.727 5.322 5.765 5.994 6.086 6.155 6.256 6.370 6.450 6.471 6.449 6.423 + 5.012 4.734 4.504 4.669 5.264 5.922 6.138 5.646 4.638 3.625 3.080 3.131 3.531 3.882 3.937 3.725 3.470 3.392 3.558 3.882 4.224 4.490 4.676 4.841 5.059 5.376 5.791 6.243 6.626 6.827 6.784 6.518 6.134 5.755 5.475 5.333 + 7.116 6.559 5.827 5.401 5.505 5.939 6.238 6.038 5.375 4.671 4.411 4.753 5.396 5.823 5.727 5.275 4.961 5.184 5.885 6.578 6.752 6.312 5.665 5.380 5.714 6.420 6.995 7.143 7.016 7.027 7.413 7.959 8.169 7.732 6.858 6.158 + 8.684 8.502 8.151 7.711 7.346 7.222 7.367 7.620 7.736 7.579 7.242 6.967 6.933 7.107 7.286 7.294 7.132 6.956 6.897 6.929 6.905 6.730 6.485 6.368 6.506 6.822 7.119 7.277 7.384 7.640 8.112 8.602 8.762 8.410 7.736 7.205 + 6.937 6.809 6.760 6.975 7.391 7.689 7.547 6.928 6.147 5.633 5.602 5.899 6.159 6.127 5.868 5.667 5.749 6.047 6.262 6.139 5.725 5.361 5.399 5.892 6.519 6.834 6.637 6.163 5.915 6.271 7.154 8.057 8.400 7.966 7.076 6.378 + 5.960 5.973 6.073 6.310 6.607 6.749 6.503 5.795 4.798 3.855 3.270 3.123 3.242 3.358 3.330 3.247 3.338 3.749 4.393 4.992 5.293 5.268 5.140 5.195 5.560 6.111 6.606 6.893 7.019 7.144 7.339 7.487 7.372 6.904 6.256 5.788 + 5.472 5.584 5.720 5.761 5.619 5.283 4.817 4.321 3.889 3.576 3.379 3.241 3.081 2.863 2.642 2.557 2.753 3.259 3.931 4.511 4.787 4.731 4.523 4.417 4.571 4.953 5.411 5.812 6.135 6.444 6.763 7.009 7.043 6.810 6.429 6.141 + 4.391 4.540 4.899 5.476 6.116 6.546 6.544 6.108 5.466 4.898 4.539 4.310 4.054 3.730 3.484 3.529 3.934 4.521 4.971 5.068 4.866 4.648 4.696 5.065 5.553 5.874 5.903 5.780 5.788 6.119 6.697 7.215 7.355 7.027 6.450 6.013 + 4.396 4.575 4.903 5.338 5.830 6.294 6.599 6.595 6.213 5.548 4.838 4.335 4.147 4.188 4.281 4.314 4.326 4.425 4.650 4.899 5.027 4.992 4.925 5.017 5.330 5.720 5.957 5.941 5.816 5.845 6.161 6.615 6.885 6.758 6.337 5.973 + 6.591 6.874 7.152 7.127 6.758 6.284 5.975 5.881 5.834 5.660 5.380 5.154 5.063 4.964 4.634 4.044 3.490 3.366 3.786 4.414 4.722 4.467 3.945 3.746 4.221 5.160 5.990 6.322 6.318 6.509 7.227 8.210 8.776 8.456 7.477 6.637 + 6.288 6.409 6.509 6.424 6.107 5.671 5.308 5.159 5.241 5.467 5.719 5.903 5.963 5.868 5.637 5.348 5.129 5.089 5.248 5.522 5.799 6.027 6.234 6.459 6.663 6.731 6.595 6.353 6.265 6.565 7.247 8.004 8.425 8.302 7.810 7.384 + 6.922 6.843 6.808 6.938 7.226 7.533 7.705 7.693 7.577 7.468 7.403 7.348 7.273 7.217 7.248 7.358 7.423 7.285 6.922 6.515 6.344 6.562 7.063 7.550 7.766 7.674 7.447 7.280 7.222 7.181 7.082 6.999 7.114 7.527 8.100 8.519 + 4.701 4.726 4.983 5.672 6.766 7.969 8.903 9.346 9.323 9.012 8.575 8.091 7.612 7.237 7.074 7.111 7.150 6.910 6.261 5.388 4.709 4.581 5.030 5.726 6.226 6.293 6.030 5.735 5.646 5.766 5.918 5.916 5.717 5.413 5.139 4.986 + 4.969 5.478 6.327 7.265 8.081 8.704 9.185 9.589 9.859 9.797 9.219 8.188 7.114 6.576 6.934 8.003 9.081 9.366 8.496 6.817 5.165 4.307 4.462 5.231 5.956 6.201 5.986 5.656 5.536 5.687 5.908 5.947 5.698 5.249 4.795 4.519 + 4.216 4.780 5.869 7.329 8.858 10.102 10.822 10.993 10.721 10.098 9.152 7.987 6.936 6.517 7.092 8.490 9.942 10.516 9.757 8.068 6.469 5.886 6.515 7.732 8.600 8.556 7.736 6.750 6.157 6.085 6.253 6.284 6.003 5.502 5.006 4.710 + 4.521 4.767 5.455 6.760 8.568 10.416 11.672 11.881 11.011 9.477 7.937 6.985 6.917 7.642 8.752 9.715 10.109 9.819 9.087 8.372 8.080 8.318 8.848 9.268 9.288 8.911 8.377 7.948 7.707 7.546 7.308 6.949 6.574 6.319 6.228 6.228 + 4.395 5.092 6.374 7.974 9.486 10.490 10.740 10.290 9.435 8.525 7.799 7.360 7.258 7.547 8.219 9.080 9.741 9.815 9.209 8.267 7.587 7.616 8.310 9.148 9.495 9.053 8.056 7.075 6.602 6.730 7.145 7.385 7.157 6.501 5.724 5.211 + 5.890 6.132 6.836 8.086 9.524 10.467 10.411 9.444 8.177 7.228 6.750 6.459 6.094 5.825 6.151 7.333 8.945 10.027 9.814 8.421 6.841 6.203 6.883 8.216 9.046 8.652 7.275 5.874 5.354 5.922 7.034 7.875 7.934 7.260 6.321 5.676 + 6.148 6.210 6.546 7.305 8.315 9.125 9.344 8.936 8.208 7.493 6.870 6.196 5.421 4.816 4.841 5.706 7.060 8.139 8.328 7.655 6.785 6.472 6.935 7.686 7.948 7.311 6.066 4.964 4.641 5.168 6.068 6.710 6.728 6.193 5.475 4.989 + 6.404 6.398 6.437 6.557 6.722 6.852 6.905 6.908 6.893 6.795 6.460 5.801 4.971 4.366 4.376 5.070 6.071 6.784 6.820 6.274 5.634 5.376 5.587 5.932 5.965 5.521 4.849 4.395 4.445 4.924 5.486 5.795 5.735 5.424 5.074 4.859 + 6.614 5.810 4.726 4.038 4.111 4.807 5.647 6.159 6.122 5.593 4.784 3.964 3.418 3.407 4.030 5.085 6.077 6.483 6.107 5.257 4.545 4.434 4.896 5.443 5.537 5.012 4.191 3.604 3.573 4.010 4.540 4.817 4.745 4.460 4.165 3.994 + 5.825 5.784 5.660 5.453 5.275 5.308 5.649 6.166 6.513 6.337 5.552 4.460 3.609 3.449 4.021 4.923 5.570 5.595 5.079 4.471 4.241 4.544 5.125 5.520 5.402 4.796 4.042 3.538 3.483 3.782 4.159 4.358 4.282 4.008 3.698 3.501 + 5.187 5.285 5.429 5.581 5.763 6.038 6.408 6.736 6.781 6.355 5.495 4.506 3.812 3.697 4.115 4.719 5.093 5.027 4.646 4.301 4.301 4.702 5.271 5.663 5.658 5.287 4.780 4.390 4.240 4.279 4.360 4.365 4.266 4.114 3.975 3.898 + 5.385 5.107 4.892 5.074 5.625 6.149 6.220 5.769 5.131 4.729 4.697 4.801 4.719 4.403 4.137 4.249 4.750 5.268 5.363 4.949 4.407 4.285 4.816 5.695 6.299 6.171 5.367 4.390 3.803 3.842 4.314 4.800 4.971 4.771 4.393 4.110 + 1.618 2.687 4.299 5.730 6.492 6.556 6.254 5.965 5.837 5.739 5.435 4.827 4.076 3.521 3.456 3.940 4.732 5.421 5.668 5.425 4.989 4.836 5.299 6.310 7.372 7.851 7.391 6.190 4.886 4.138 4.173 4.663 5.009 4.825 4.228 3.713 + 4.926 4.789 4.548 4.286 4.133 4.213 4.550 5.009 5.343 5.333 4.933 4.330 3.846 3.745 4.065 4.594 4.999 5.040 4.719 4.288 4.102 4.411 5.209 6.227 7.069 7.414 7.170 6.505 5.737 5.158 4.894 4.881 4.954 4.977 4.923 4.861 + 4.384 3.975 3.710 4.174 5.408 6.785 7.470 7.057 5.867 4.666 4.070 4.136 4.444 4.527 4.262 3.898 3.767 3.988 4.419 4.855 5.241 5.684 6.278 6.926 7.353 7.305 6.760 5.965 5.281 4.955 5.007 5.277 5.565 5.752 5.825 5.838 + 5.607 5.320 5.237 5.857 7.153 8.485 9.040 8.448 7.048 5.605 4.734 4.515 4.580 4.531 4.290 4.091 4.189 4.589 5.060 5.395 5.641 6.064 6.877 7.968 8.901 9.201 8.688 7.619 6.511 5.810 5.641 5.804 5.978 5.962 5.779 5.609 + 4.217 4.644 5.589 7.009 8.537 9.575 9.658 8.808 7.539 6.499 6.006 5.878 5.677 5.141 4.436 3.998 4.145 4.793 5.545 6.046 6.304 6.655 7.427 8.574 9.624 10.001 9.461 8.303 7.184 6.665 6.840 7.322 7.568 7.294 6.671 6.166 + 2.595 2.909 3.831 5.538 7.690 9.450 9.992 9.108 7.396 5.852 5.176 5.343 5.751 5.787 5.328 4.785 4.699 5.275 6.252 7.172 7.782 8.209 8.759 9.562 10.383 10.779 10.463 9.564 8.557 7.928 7.827 7.994 8.004 7.620 6.985 6.499 + 3.968 4.365 5.374 7.055 8.981 10.309 10.304 8.915 6.885 5.288 4.798 5.278 5.987 6.201 5.752 5.080 4.810 5.254 6.237 7.329 8.233 8.965 9.711 10.530 11.204 11.377 10.863 9.846 8.787 8.119 7.961 8.069 8.065 7.739 7.207 6.802 + 5.405 5.640 6.410 7.863 9.565 10.587 10.135 8.216 5.751 3.984 3.631 4.438 5.485 5.937 5.640 5.105 4.987 5.549 6.545 7.545 8.345 9.081 9.972 10.990 11.774 11.885 11.172 9.941 8.765 8.105 8.026 8.215 8.255 7.943 7.414 7.011 + 4.487 5.184 6.519 8.240 9.815 10.576 10.078 8.420 6.272 4.523 3.779 4.059 4.883 5.668 6.113 6.298 6.481 6.818 7.259 7.680 8.090 8.677 9.607 10.773 11.729 11.942 11.198 9.829 8.550 7.987 8.247 8.857 9.137 8.727 7.859 7.163 + 4.100 5.056 6.739 8.682 10.243 10.805 10.078 8.304 6.200 4.600 4.009 4.343 5.053 5.540 5.563 5.345 5.315 5.719 6.438 7.139 7.621 8.014 8.642 9.647 10.740 11.339 11.019 9.913 8.690 8.080 8.303 8.896 9.087 8.446 7.260 6.331 + 4.840 5.482 6.687 8.217 9.632 10.391 10.108 8.804 6.979 5.372 4.551 4.584 5.036 5.304 5.051 4.434 3.955 4.065 4.843 5.985 7.091 7.965 8.688 9.406 10.068 10.380 10.047 9.092 7.935 7.136 6.984 7.290 7.563 7.435 6.957 6.533 + 9.175 9.517 10.051 10.526 10.675 10.301 9.362 8.009 6.563 5.398 4.762 4.638 4.752 4.753 4.460 3.998 3.709 3.883 4.550 5.469 6.344 7.053 7.678 8.322 8.888 9.076 8.626 7.615 6.506 5.866 5.943 6.478 6.912 6.847 6.360 5.907 + 11.456 11.409 11.284 11.045 10.668 10.118 9.335 8.275 6.997 5.711 4.707 4.172 4.052 4.092 4.056 3.929 3.920 4.232 4.832 5.434 5.754 5.786 5.821 6.158 6.755 7.185 6.990 6.135 5.139 4.709 5.142 6.044 6.628 6.373 5.476 4.695 + 10.000 9.894 9.669 9.298 8.747 7.976 6.971 5.797 4.624 3.700 3.226 3.216 3.452 3.605 3.465 3.103 2.830 2.970 3.612 4.551 5.453 6.093 6.468 6.690 6.804 6.714 6.325 5.731 5.252 5.220 5.679 6.282 6.523 6.137 5.347 4.717 + 6.366 7.126 8.138 8.723 8.462 7.415 6.022 4.808 4.119 4.014 4.314 4.698 4.829 4.493 3.736 2.904 2.485 2.806 3.789 4.972 5.834 6.157 6.141 6.160 6.383 6.611 6.495 5.927 5.227 4.907 5.214 5.869 6.267 6.000 5.233 4.577 + 7.857 8.004 8.068 7.790 7.108 6.219 5.445 5.011 4.935 5.069 5.230 5.290 5.181 4.879 4.413 3.909 3.568 3.568 3.930 4.487 5.011 5.381 5.655 5.956 6.288 6.467 6.274 5.682 4.961 4.508 4.538 4.902 5.210 5.162 4.804 4.469 + 7.067 7.455 7.968 8.273 8.202 7.830 7.363 6.954 6.621 6.301 5.972 5.697 5.554 5.533 5.521 5.393 5.138 4.879 4.780 4.919 5.237 5.609 5.942 6.222 6.465 6.643 6.690 6.568 6.333 6.118 6.033 6.072 6.129 6.100 5.983 5.875 + 12.684 13.006 13.394 13.519 13.209 12.547 11.789 11.167 10.747 10.434 10.091 9.657 9.175 8.722 8.325 7.942 7.513 7.046 6.629 6.383 6.373 6.552 6.780 6.899 6.820 6.569 6.280 6.118 6.195 6.491 6.857 7.082 7.013 6.656 6.188 5.863 + 11.448 11.793 12.074 11.843 11.010 9.916 9.034 8.588 8.433 8.274 7.960 7.576 7.267 7.016 6.647 6.038 5.330 4.869 4.916 5.388 5.907 6.116 5.979 5.775 5.806 6.097 6.381 6.384 6.105 5.819 5.803 6.054 6.295 6.250 5.930 5.627 + 6.938 7.461 8.136 8.540 8.543 8.365 8.332 8.549 8.817 8.827 8.439 7.774 7.062 6.433 5.868 5.319 4.851 4.607 4.652 4.855 4.992 4.972 4.956 5.213 5.823 6.532 6.920 6.771 6.301 5.988 6.164 6.708 7.155 7.124 6.670 6.236 + 6.862 6.860 6.790 6.598 6.324 6.104 6.080 6.289 6.622 6.887 6.931 6.726 6.378 6.049 5.873 5.894 6.059 6.248 6.341 6.276 6.095 5.935 5.945 6.185 6.560 6.876 6.977 6.867 6.715 6.721 6.949 7.262 7.427 7.312 7.003 6.745 + 8.331 8.153 7.994 8.058 8.337 8.565 8.398 7.698 6.687 5.817 5.452 5.596 5.913 6.025 5.856 5.701 5.948 6.674 7.486 7.789 7.290 6.304 5.573 5.686 6.578 7.548 7.811 7.131 6.020 5.304 5.428 6.098 6.557 6.266 5.382 4.619 + 7.996 8.381 9.100 9.957 10.582 10.571 9.772 8.459 7.209 6.525 6.479 6.684 6.637 6.171 5.620 5.550 6.236 7.356 8.171 8.082 7.137 6.047 5.669 6.352 7.648 8.633 8.596 7.565 6.252 5.492 5.609 6.207 6.549 6.176 5.286 4.551 + 9.498 9.346 9.388 9.906 10.707 11.176 10.768 9.510 8.035 7.085 6.927 7.213 7.385 7.232 7.078 7.410 8.312 9.258 9.486 8.644 7.143 5.884 5.586 6.260 7.250 7.777 7.525 6.805 6.233 6.208 6.627 7.006 6.881 6.156 5.172 4.480 + 8.343 8.780 9.572 10.465 11.031 10.879 9.966 8.718 7.779 7.534 7.823 8.098 7.937 7.437 7.134 7.489 8.400 9.193 9.139 8.068 6.547 5.472 5.398 6.164 7.083 7.508 7.286 6.775 6.474 6.609 7.006 7.283 7.164 6.661 6.033 5.611 + 9.437 9.870 10.518 11.039 11.124 10.650 9.753 8.761 8.021 7.706 7.733 7.857 7.875 7.783 7.764 7.994 8.432 8.764 8.591 7.745 6.471 5.343 4.900 5.287 6.143 6.848 6.950 6.461 5.811 5.490 5.673 6.103 6.331 6.090 5.520 5.053 + 7.831 8.067 8.470 8.893 9.137 9.036 8.569 7.895 7.274 6.894 6.744 6.645 6.431 6.126 5.963 6.202 6.872 7.657 8.061 7.744 6.794 5.703 5.048 5.100 5.642 6.143 6.151 5.603 4.843 4.321 4.251 4.467 4.603 4.411 3.970 3.605 + 7.633 7.686 7.784 7.892 7.946 7.861 7.574 7.089 6.494 5.926 5.509 5.294 5.251 5.325 5.481 5.712 5.994 6.231 6.279 6.051 5.620 5.218 5.094 5.318 5.697 5.893 5.683 5.154 4.657 4.533 4.823 5.207 5.244 4.733 3.906 3.283 + 7.023 7.618 8.350 8.663 8.320 7.549 6.815 6.438 6.389 6.393 6.223 5.901 5.646 5.643 5.860 6.067 6.029 5.688 5.184 4.745 4.526 4.548 4.721 4.916 5.014 4.935 4.668 4.306 4.016 3.940 4.081 4.268 4.272 3.983 3.525 3.180 + 9.077 8.957 8.698 8.273 7.687 7.016 6.422 6.092 6.133 6.472 6.877 7.084 6.970 6.629 6.289 6.122 6.113 6.083 5.858 5.431 4.985 4.753 4.825 5.070 5.229 5.106 4.702 4.199 3.818 3.668 3.694 3.742 3.680 3.482 3.232 3.061 + 8.658 9.464 10.390 10.612 9.813 8.407 7.179 6.675 6.826 7.088 6.915 6.167 5.154 4.357 4.084 4.326 4.840 5.331 5.583 5.509 5.161 4.717 4.419 4.431 4.707 4.976 4.926 4.454 3.776 3.280 3.220 3.517 3.837 3.887 3.663 3.424 + 10.871 10.948 10.882 10.429 9.556 8.505 7.632 7.161 7.037 6.989 6.739 6.184 5.444 4.745 4.279 4.107 4.168 4.340 4.510 4.609 4.637 4.643 4.693 4.799 4.882 4.807 4.474 3.925 3.348 2.970 2.905 3.071 3.262 3.311 3.213 3.098 + 7.767 7.588 7.428 7.502 7.839 8.205 8.246 7.750 6.824 5.856 5.250 5.150 5.358 5.524 5.444 5.226 5.172 5.475 6.009 6.399 6.334 5.854 5.337 5.195 5.510 5.944 6.018 5.507 4.638 3.896 3.615 3.719 3.826 3.616 3.128 2.716 + 8.454 8.107 7.898 8.328 9.380 10.416 10.622 9.658 7.986 6.564 6.142 6.701 7.507 7.723 7.098 6.156 5.734 6.266 7.401 8.288 8.291 7.515 6.709 6.619 7.351 8.276 8.562 7.875 6.642 5.662 5.420 5.698 5.815 5.276 4.244 3.417 + 7.568 6.928 6.381 6.758 8.247 10.155 11.382 11.235 9.938 8.411 7.526 7.445 7.589 7.259 6.336 5.460 5.489 6.703 8.461 9.651 9.580 8.570 7.701 7.904 9.155 10.474 10.745 9.667 8.014 6.969 7.097 7.858 8.094 7.078 5.208 3.735 + 6.610 6.568 6.882 7.936 9.635 11.285 11.985 11.267 9.493 7.652 6.675 6.772 7.339 7.519 6.971 6.204 6.144 7.295 9.205 10.748 11.019 10.096 8.988 8.773 9.664 10.816 11.065 9.965 8.208 7.029 7.130 8.057 8.620 7.967 6.380 5.054 + 6.992 6.551 6.436 7.430 9.506 11.649 12.545 11.586 9.368 7.248 6.323 6.640 7.293 7.289 6.445 5.570 5.762 7.433 9.881 11.775 12.163 11.165 9.815 9.184 9.548 10.268 10.432 9.687 8.524 7.806 7.966 8.607 8.855 8.150 6.783 5.693 + 5.909 6.040 6.641 8.011 9.973 11.769 12.461 11.577 9.524 7.397 6.255 6.382 7.137 7.523 7.062 6.231 6.065 7.224 9.326 11.149 11.587 10.578 9.177 8.688 9.564 11.039 11.804 11.135 9.507 8.133 7.886 8.552 9.096 8.662 7.389 6.282 + 6.829 6.490 6.386 7.148 8.844 10.787 11.952 11.705 10.274 8.577 7.532 7.390 7.633 7.513 6.779 5.955 5.909 7.066 8.940 10.435 10.695 9.805 8.727 8.509 9.409 10.695 11.277 10.638 9.255 8.157 8.021 8.614 9.053 8.646 7.542 6.596 + 6.531 6.570 6.773 7.328 8.344 9.657 10.782 11.136 10.450 9.060 7.740 7.149 7.316 7.643 7.488 6.812 6.285 6.684 8.113 9.770 10.558 10.020 8.761 7.928 8.204 9.205 9.867 9.442 8.207 7.199 7.242 8.177 9.026 8.922 7.935 6.995 + 7.432 6.918 6.484 6.813 8.077 9.711 10.772 10.604 9.309 7.654 6.481 6.114 6.200 6.135 5.660 5.135 5.231 6.289 7.929 9.259 9.544 8.788 7.729 7.227 7.580 8.317 8.662 8.232 7.371 6.823 7.056 7.842 8.463 8.367 7.660 7.001 + 8.195 8.032 7.946 8.235 8.998 9.979 10.666 10.604 9.750 8.563 7.713 7.587 7.995 8.325 8.080 7.324 6.656 6.677 7.427 8.297 8.530 7.889 6.885 6.348 6.691 7.548 8.107 7.840 6.977 6.275 6.314 6.959 7.505 7.354 6.581 5.870 + 7.476 7.622 8.043 8.815 9.772 10.487 10.516 9.719 8.428 7.267 6.736 6.853 7.156 7.094 6.510 5.801 5.599 6.207 7.270 7.997 7.783 6.726 5.583 5.173 5.712 6.651 7.154 6.809 5.963 5.385 5.573 6.317 6.902 6.771 6.032 5.353 + 8.391 8.704 9.105 9.294 9.090 8.525 7.804 7.179 6.825 6.778 6.925 7.045 6.909 6.410 5.679 5.061 4.917 5.360 6.126 6.719 6.771 6.320 5.782 5.601 5.871 6.264 6.338 5.959 5.459 5.354 5.863 6.672 7.160 6.928 6.166 5.508 + 8.136 8.286 8.576 8.947 9.259 9.322 8.990 8.259 7.300 6.373 5.681 5.251 4.949 4.620 4.242 3.969 4.022 4.494 5.241 5.951 6.347 6.370 6.196 6.075 6.128 6.267 6.307 6.149 5.874 5.672 5.666 5.796 5.874 5.764 5.506 5.291 + 7.325 7.037 6.866 7.220 8.076 8.897 9.012 8.158 6.715 5.442 4.888 4.986 5.161 4.866 4.097 3.439 3.581 4.692 6.199 7.170 7.018 5.957 4.842 4.504 5.128 6.158 6.788 6.622 5.947 5.429 5.518 6.081 6.570 6.535 6.033 5.552 + 9.768 9.204 8.450 7.957 7.903 8.073 8.059 7.619 6.873 6.188 5.849 5.797 5.690 5.218 4.439 3.795 3.791 4.567 5.727 6.591 6.682 6.079 5.341 5.072 5.464 6.197 6.737 6.784 6.483 6.253 6.385 6.799 7.135 7.101 6.745 6.409 + 11.066 10.967 10.731 10.325 9.758 9.099 8.443 7.895 7.552 7.482 7.686 8.047 8.353 8.405 8.171 7.839 7.699 7.904 8.322 8.611 8.495 8.011 7.495 7.299 7.467 7.679 7.521 6.877 6.071 5.632 5.853 6.535 7.152 7.289 6.977 6.626 + 11.768 11.729 11.523 11.022 10.238 9.358 8.649 8.321 8.432 8.884 9.468 9.924 10.021 9.673 9.028 8.443 8.279 8.637 9.225 9.535 9.226 8.427 7.666 7.453 7.839 8.337 8.319 7.560 6.459 5.745 5.881 6.695 7.548 7.881 7.659 7.326 + 9.858 9.475 9.079 9.048 9.394 9.729 9.615 8.969 8.139 7.593 7.496 7.573 7.374 6.683 5.712 4.911 4.595 4.734 5.056 5.333 5.557 5.852 6.254 6.595 6.632 6.292 5.790 5.496 5.663 6.248 6.962 7.488 7.679 7.596 7.409 7.274 + 9.931 10.039 10.052 9.756 9.133 8.397 7.836 7.606 7.645 7.757 7.760 7.564 7.145 6.505 5.689 4.849 4.240 4.095 4.447 5.075 5.644 5.939 6.002 6.038 6.189 6.390 6.457 6.313 6.129 6.205 6.705 7.467 8.110 8.336 8.178 7.950 + 8.175 7.963 7.719 7.632 7.717 7.778 7.579 7.054 6.385 5.863 5.651 5.651 5.600 5.316 4.883 4.600 4.728 5.249 5.852 6.166 6.070 5.792 5.716 6.048 6.618 7.008 6.910 6.410 5.959 6.024 6.702 7.617 8.195 8.115 7.557 7.052 + 7.625 7.622 7.565 7.406 7.152 6.867 6.625 6.452 6.316 6.163 5.977 5.782 5.611 5.472 5.341 5.210 5.113 5.111 5.233 5.424 5.567 5.559 5.403 5.212 5.148 5.311 5.684 6.159 6.616 6.992 7.297 7.572 7.842 8.094 8.293 8.402 + 6.728 7.184 7.834 8.299 8.284 7.741 6.889 6.075 5.565 5.400 5.415 5.411 5.318 5.241 5.335 5.639 6.011 6.229 6.176 5.939 5.737 5.734 5.912 6.102 6.144 6.031 5.900 5.911 6.116 6.444 6.809 7.200 7.679 8.268 8.857 9.236 + 6.108 6.543 7.060 7.249 6.977 6.477 6.122 6.094 6.246 6.245 5.866 5.164 4.426 3.952 3.894 4.228 4.844 5.611 6.379 6.967 7.209 7.069 6.689 6.320 6.144 6.159 6.221 6.218 6.197 6.324 6.703 7.240 7.690 7.853 7.752 7.599 + 10.550 10.774 10.953 10.820 10.380 9.925 9.768 9.952 10.197 10.144 9.645 8.859 8.091 7.567 7.349 7.438 7.883 8.739 9.891 10.974 11.537 11.366 10.696 10.064 9.901 10.183 10.451 10.196 9.291 8.108 7.254 7.148 7.777 8.778 9.704 10.237 + 12.595 12.750 12.762 12.332 11.490 10.629 10.219 10.435 11.024 11.498 11.494 10.991 10.254 9.613 9.275 9.304 9.677 10.317 11.051 11.604 11.712 11.316 10.653 10.129 10.013 10.210 10.314 9.919 8.961 7.794 6.968 6.872 7.515 8.567 9.577 10.176 + 13.067 13.373 13.567 13.203 12.239 11.130 10.491 10.632 11.327 12.007 12.180 11.732 10.921 10.127 9.620 9.490 9.721 10.252 10.950 11.565 11.786 11.407 10.472 9.262 8.110 7.209 6.560 6.091 5.803 5.790 6.108 6.654 7.190 7.502 7.561 7.514 + 13.475 13.842 14.088 13.695 12.618 11.388 10.718 10.944 11.781 12.554 12.700 12.115 11.124 10.181 9.598 9.481 9.826 10.578 11.572 12.457 12.778 12.216 10.825 9.047 7.464 6.476 6.145 6.283 6.666 7.152 7.648 8.026 8.126 7.886 7.451 7.114 + 14.291 14.146 13.901 13.634 13.440 13.381 13.454 13.583 13.654 13.574 13.303 12.860 12.299 11.705 11.209 10.974 11.137 11.696 12.446 13.022 13.075 12.464 11.351 10.114 9.134 8.607 8.497 8.625 8.811 8.957 9.029 9.009 8.873 8.628 8.351 8.165 + 15.061 14.973 14.924 15.062 15.420 15.872 16.202 16.249 16.001 15.575 15.111 14.664 14.201 13.688 13.193 12.893 12.950 13.355 13.856 14.067 13.688 12.696 11.369 10.122 9.276 8.909 8.886 9.000 9.113 9.197 9.268 9.317 9.298 9.182 9.010 8.882 + 15.237 14.649 14.232 14.743 16.171 17.672 18.311 17.887 17.069 16.721 17.054 17.423 16.952 15.419 13.547 12.441 12.655 13.730 14.579 14.348 13.008 11.225 9.726 8.772 8.155 7.600 7.113 6.935 7.220 7.790 8.226 8.189 7.659 6.899 6.231 5.860 + 16.164 15.693 15.416 15.972 17.273 18.514 18.896 18.367 17.660 17.556 18.093 18.479 17.836 16.083 14.129 13.161 13.648 14.942 15.796 15.331 13.614 11.437 9.596 8.363 7.550 6.969 6.745 7.164 8.259 9.584 10.429 10.294 9.210 7.665 6.270 5.472 + 16.545 15.946 15.504 15.959 17.267 18.590 19.079 18.657 18.047 18.000 18.501 18.755 17.980 16.257 14.567 13.964 14.620 15.636 15.794 14.550 12.390 10.286 8.846 7.955 7.169 6.373 5.988 6.517 7.918 9.448 10.172 9.665 8.273 6.749 5.667 5.169 + 16.731 16.043 15.490 15.889 17.219 18.601 19.115 18.643 17.924 17.764 18.217 18.550 18.022 16.689 15.426 15.095 15.686 16.257 15.754 13.941 11.568 9.663 8.652 8.155 7.583 6.878 6.612 7.355 8.952 10.472 10.922 10.045 8.474 7.130 6.475 6.328 + 16.761 16.147 15.660 16.051 17.324 18.681 19.229 18.766 17.924 17.530 17.835 18.327 18.284 17.512 16.524 16.022 16.178 16.429 15.979 14.519 12.497 10.700 9.586 9.003 8.504 7.908 7.523 7.811 8.856 10.155 10.946 10.767 9.746 8.419 7.326 6.746 + 16.673 16.121 15.702 16.117 17.385 18.762 19.359 18.900 17.918 17.249 17.307 17.804 18.122 17.932 17.453 17.141 17.145 17.101 16.449 14.972 13.015 11.193 9.876 8.953 8.083 7.150 6.477 6.552 7.536 9.000 10.130 10.242 9.195 7.431 5.683 4.621 + 16.467 16.048 15.751 16.145 17.270 18.527 19.133 18.740 17.701 16.757 16.458 16.790 17.308 17.577 17.510 17.319 17.175 16.952 16.295 14.966 13.107 11.200 9.723 8.831 8.323 7.908 7.519 7.381 7.780 8.722 9.793 10.352 9.942 8.625 7.002 5.901 + 16.108 15.911 15.859 16.302 17.229 18.192 18.603 18.176 17.142 16.092 15.563 15.724 16.349 17.060 17.591 17.867 17.883 17.561 16.752 15.377 13.576 11.697 10.117 9.049 8.463 8.200 8.142 8.292 8.700 9.304 9.857 10.015 9.554 8.554 7.413 6.659 + 15.693 15.687 15.813 16.188 16.729 17.136 17.063 16.372 15.257 14.161 13.532 13.598 14.304 15.397 16.570 17.552 18.107 18.022 17.154 15.526 13.396 11.211 9.438 8.372 8.035 8.223 8.655 9.110 9.466 9.648 9.564 9.113 8.266 7.158 6.094 5.438 + 14.507 14.630 14.900 15.277 15.587 15.579 15.085 14.166 13.110 12.278 11.916 12.076 12.681 13.638 14.859 16.190 17.320 17.818 17.322 15.763 13.458 10.996 8.979 7.786 7.474 7.839 8.552 9.279 9.757 9.843 9.533 8.958 8.320 7.794 7.462 7.315 + 12.902 13.119 13.389 13.506 13.365 13.022 12.621 12.264 11.932 11.527 11.017 10.543 10.415 10.942 12.219 13.985 15.664 16.596 16.330 14.842 12.554 10.155 8.298 7.345 7.272 7.759 8.399 8.898 9.145 9.165 9.006 8.678 8.175 7.548 6.948 6.574 + 11.928 12.018 12.092 11.987 11.569 10.839 9.974 9.257 8.906 8.915 9.044 9.010 8.756 8.589 9.024 10.391 12.480 14.503 15.479 14.814 12.697 10.024 7.884 6.947 7.148 7.861 8.398 8.443 8.154 7.891 7.844 7.877 7.682 7.098 6.309 5.740 + 12.103 11.986 11.885 11.899 11.926 11.709 11.065 10.092 9.139 8.545 8.355 8.311 8.132 7.866 7.960 8.935 10.888 13.229 14.916 15.069 13.539 11.014 8.593 7.132 6.820 7.230 7.752 8.028 8.088 8.143 8.274 8.302 7.955 7.151 6.160 5.474 + 12.535 12.615 12.819 13.106 13.263 12.989 12.145 10.944 9.895 9.480 9.800 10.491 10.995 11.006 10.738 10.787 11.669 13.375 15.281 16.488 16.362 14.903 12.727 10.692 9.458 9.222 9.755 10.628 11.443 11.947 12.028 11.667 10.933 9.996 9.120 8.588 + 13.937 14.235 14.765 15.374 15.816 15.820 15.229 14.133 12.875 11.897 11.487 11.597 11.904 12.091 12.144 12.420 13.368 15.090 17.093 18.459 18.392 16.747 14.168 11.721 10.284 10.125 10.917 12.092 13.198 14.009 14.389 14.171 13.222 11.661 9.982 8.885 + 14.745 14.440 14.186 14.398 15.176 16.163 16.744 16.467 15.374 13.976 12.895 12.449 12.498 12.679 12.816 13.127 14.018 15.625 17.491 18.719 18.536 16.857 14.397 12.226 11.113 11.132 11.809 12.588 13.200 13.652 13.927 13.786 12.909 11.274 9.397 8.131 + 15.029 14.677 14.327 14.406 15.054 15.971 16.587 16.452 15.546 14.286 13.223 12.665 12.550 12.636 12.839 13.366 14.499 16.183 17.822 18.523 17.694 15.516 12.902 10.928 10.157 10.381 10.940 11.315 11.464 11.647 11.957 12.060 11.427 9.881 7.936 6.575 + 13.655 12.877 12.033 11.928 12.768 13.992 14.746 14.562 13.640 12.551 11.702 11.085 10.506 10.009 10.001 10.907 12.659 14.531 15.539 15.137 13.613 11.871 10.763 10.514 10.681 10.623 10.056 9.246 8.720 8.782 9.241 9.546 9.205 8.160 6.852 5.954 + 13.334 12.839 12.305 12.200 12.551 12.931 12.885 12.359 11.707 11.286 11.081 10.770 10.187 9.682 9.922 11.236 13.099 14.321 13.909 11.918 9.545 8.306 8.908 10.721 12.252 12.255 10.598 8.274 6.613 6.351 7.230 8.318 8.730 8.196 7.145 6.338 + 13.153 12.847 12.488 12.348 12.474 12.664 12.672 12.420 12.021 11.605 11.184 10.713 10.292 10.251 10.931 12.285 13.681 14.188 13.229 11.115 8.973 8.041 8.798 10.595 12.076 12.107 10.535 8.245 6.517 6.159 7.033 8.254 8.861 8.466 7.450 6.625 + 13.240 12.902 12.435 12.119 12.125 12.406 12.727 12.823 12.567 12.040 11.472 11.109 11.092 11.428 12.008 12.640 13.060 12.984 12.250 10.990 9.699 9.033 9.403 10.601 11.801 12.018 10.785 8.551 6.447 5.540 6.097 7.419 8.385 8.305 7.402 6.564 + 13.389 12.898 12.267 11.939 12.128 12.661 13.106 13.096 12.598 11.933 11.522 11.570 11.932 12.270 12.329 12.117 11.812 11.531 11.205 10.707 10.103 9.749 10.047 11.015 12.072 12.328 11.234 9.103 7.010 6.061 6.567 7.805 8.570 8.136 6.820 5.697 + 13.577 13.130 12.555 12.264 12.464 13.007 13.501 13.596 13.251 12.754 12.488 12.622 12.988 13.239 13.152 12.797 12.430 12.202 11.997 11.575 10.900 10.315 10.316 11.068 12.094 12.498 11.648 9.767 7.902 7.190 7.980 9.526 10.558 10.286 9.024 7.902 + 14.220 13.504 12.652 12.343 12.809 13.663 14.255 14.211 13.710 13.273 13.283 13.664 14.000 13.950 13.570 13.235 13.246 13.489 13.498 12.877 11.721 10.632 10.259 10.742 11.520 11.722 10.851 9.218 7.752 7.312 8.024 9.176 9.767 9.272 8.049 7.046 + 14.253 13.685 13.000 12.726 13.056 13.720 14.243 14.344 14.115 13.865 13.788 13.785 13.594 13.097 12.490 12.150 12.306 12.807 13.207 13.115 12.506 11.741 11.270 11.265 11.487 11.473 10.905 9.850 8.708 7.925 7.690 7.854 8.087 8.139 7.998 7.842 + 13.620 12.922 12.083 11.750 12.139 12.914 13.523 13.674 13.488 13.264 13.124 12.910 12.428 11.747 11.232 11.232 11.738 12.351 12.624 12.464 12.215 12.319 12.881 13.511 13.624 12.916 11.618 10.315 9.516 9.320 9.442 9.491 9.262 8.809 8.340 8.052 + 13.470 12.694 11.772 11.442 11.972 12.986 13.825 14.071 13.783 13.294 12.845 12.417 11.900 11.355 11.061 11.268 11.911 12.600 12.929 12.816 12.554 12.514 12.768 13.003 12.798 12.005 10.887 9.904 9.348 9.166 9.093 8.925 8.673 8.475 8.408 8.421 + 13.163 12.532 11.739 11.392 11.827 12.909 14.151 15.034 15.261 14.838 13.972 12.947 12.040 11.474 11.356 11.621 12.040 12.347 12.412 12.317 12.258 12.346 12.475 12.381 11.853 10.902 9.746 8.638 7.697 6.904 6.236 5.776 5.677 5.986 6.517 6.921 + 12.825 12.371 11.816 11.639 12.138 13.249 14.588 15.666 16.134 15.907 15.140 14.107 13.091 12.311 11.893 11.854 12.093 12.423 12.652 12.688 12.571 12.414 12.265 12.011 11.407 10.256 8.593 6.754 5.233 4.414 4.349 4.753 5.199 5.394 5.326 5.195 + 12.567 12.074 11.447 11.193 11.673 12.886 14.469 15.877 16.647 16.582 15.790 14.582 13.328 12.333 11.776 11.689 11.957 12.361 12.665 12.729 12.586 12.380 12.221 12.020 11.493 10.355 8.588 6.577 4.955 4.229 4.444 5.150 5.710 5.734 5.322 4.920 + 12.625 12.046 11.325 11.024 11.449 12.493 13.758 14.841 15.511 15.707 15.430 14.709 13.664 12.578 11.824 11.659 12.033 12.604 12.984 13.005 12.809 12.656 12.643 12.556 12.017 10.788 8.997 7.112 5.665 4.955 4.919 5.237 5.558 5.691 5.651 5.573 + 12.671 12.146 11.505 11.262 11.680 12.633 13.765 14.758 15.461 15.825 15.770 15.194 14.120 12.844 11.854 11.551 11.959 12.697 13.253 13.352 13.107 12.848 12.772 12.730 12.330 11.263 9.581 7.708 6.173 5.295 5.031 5.067 5.069 4.879 4.570 4.338 + 12.471 12.021 11.470 11.260 11.625 12.466 13.473 14.354 14.965 15.267 15.217 14.752 13.884 12.820 11.935 11.576 11.840 12.500 13.160 13.508 13.467 13.147 12.666 12.021 11.114 9.898 8.495 7.167 6.176 5.627 5.436 5.410 5.379 5.276 5.134 5.035 + 12.596 11.777 10.830 10.585 11.369 12.816 14.220 15.097 15.450 15.585 15.711 15.728 15.371 14.520 13.357 12.251 11.528 11.336 11.674 12.445 13.418 14.163 14.148 13.069 11.180 9.293 8.308 8.590 9.680 10.637 10.754 10.064 9.211 8.841 9.050 9.391 + 12.193 11.638 10.961 10.745 11.346 12.664 14.218 15.438 15.996 15.941 15.592 15.278 15.105 14.916 14.448 13.586 12.521 11.688 11.513 12.102 13.102 13.856 13.776 12.722 11.120 9.719 9.135 9.489 10.360 11.106 11.281 10.877 10.229 9.712 9.475 9.427 + 9.554 9.571 9.911 10.856 12.318 13.817 14.803 15.054 14.798 14.475 14.377 14.469 14.517 14.329 13.896 13.316 12.667 11.975 11.307 10.828 10.696 10.864 11.012 10.745 9.943 8.946 8.354 8.587 9.529 10.593 11.135 10.896 10.106 9.230 8.609 8.325 + 10.222 9.597 8.939 8.904 9.622 10.574 11.034 10.669 9.785 9.032 8.872 9.272 9.837 10.193 10.247 10.134 9.991 9.829 9.602 9.354 9.207 9.190 9.104 8.622 7.597 6.290 5.278 5.059 5.676 6.686 7.486 7.736 7.511 7.128 6.844 6.724 + 8.895 8.784 8.621 8.501 8.511 8.676 8.916 9.083 9.041 8.773 8.417 8.197 8.287 8.708 9.319 9.909 10.321 10.515 10.539 10.456 10.286 10.004 9.585 9.030 8.387 7.730 7.157 6.778 6.696 6.964 7.534 8.258 8.947 9.455 9.743 9.858 + 7.223 7.142 7.273 7.884 8.895 9.862 10.314 10.128 9.621 9.281 9.378 9.810 10.274 10.581 10.796 11.106 11.576 12.042 12.259 12.121 11.746 11.334 10.955 10.499 9.830 9.001 8.296 8.049 8.390 9.145 9.976 10.614 10.995 11.209 11.349 11.433 + 6.220 6.184 6.264 6.604 7.172 7.757 8.123 8.175 7.989 7.706 7.424 7.200 7.120 7.327 7.902 8.718 9.428 9.680 9.395 8.865 8.546 8.697 9.178 9.590 9.644 9.412 9.251 9.462 10.023 10.638 11.042 11.270 11.601 12.245 13.077 13.677 + 5.768 6.231 6.884 7.378 7.523 7.380 7.149 6.981 6.874 6.732 6.519 6.348 6.422 6.876 7.664 8.567 9.336 9.829 10.047 10.082 10.022 9.914 9.793 9.723 9.797 10.088 10.600 11.262 11.969 12.642 13.254 13.814 14.329 14.782 15.126 15.313 + 8.293 7.740 7.012 6.597 6.753 7.342 7.950 8.191 7.964 7.490 7.127 7.121 7.480 8.028 8.574 9.031 9.418 9.765 10.035 10.155 10.090 9.915 9.775 9.781 9.933 10.142 10.347 10.611 11.095 11.930 13.069 14.263 15.198 15.694 15.809 15.769 + 6.893 6.522 6.031 5.720 5.726 5.985 6.363 6.809 7.347 7.939 8.393 8.462 8.091 7.553 7.325 7.738 8.694 9.714 10.284 10.241 9.867 9.625 9.780 10.212 10.575 10.628 10.449 10.366 10.689 11.482 12.541 13.566 14.345 14.830 15.083 15.185 + 3.269 3.899 4.757 5.393 5.691 5.915 6.399 7.172 7.887 8.107 7.679 6.872 6.159 5.886 6.092 6.616 7.288 8.014 8.685 9.098 9.031 8.453 7.635 7.016 6.889 7.204 7.670 8.079 8.527 9.303 10.544 11.987 13.106 13.524 13.333 13.018 + 6.338 6.348 6.252 5.994 5.723 5.716 6.124 6.755 7.158 6.949 6.146 5.186 4.612 4.673 5.170 5.664 5.851 5.784 5.771 6.070 6.654 7.232 7.485 7.293 6.789 6.233 5.849 5.748 5.951 6.424 7.091 7.813 8.427 8.815 8.977 9.011 + 7.201 6.644 5.893 5.439 5.580 6.236 7.005 7.423 7.247 6.585 5.806 5.297 5.250 5.579 6.028 6.348 6.442 6.385 6.332 6.387 6.528 6.635 6.575 6.302 5.880 5.441 5.104 4.916 4.859 4.896 5.020 5.259 5.637 6.112 6.567 6.848 + 6.774 6.449 6.102 6.068 6.405 6.835 6.974 6.653 6.047 5.527 5.361 5.557 5.929 6.306 6.665 7.078 7.543 7.915 7.996 7.723 7.253 6.854 6.683 6.651 6.507 6.062 5.390 4.805 4.659 5.090 5.927 6.798 7.366 7.511 7.369 7.199 + 5.954 6.694 7.706 8.426 8.610 8.452 8.333 8.480 8.826 9.163 9.368 9.477 9.567 9.628 9.596 9.503 9.548 9.940 10.646 11.313 11.503 11.056 10.252 9.578 9.301 9.268 9.126 8.770 8.549 8.981 10.207 11.701 12.595 12.371 11.340 10.427 + 6.956 7.463 8.360 9.415 10.326 10.833 10.855 10.553 10.234 10.158 10.362 10.647 10.751 10.568 10.248 10.087 10.300 10.839 11.416 11.710 11.589 11.184 10.767 10.546 10.541 10.639 10.760 10.970 11.432 12.233 13.235 14.096 14.475 14.279 13.749 13.319 + 9.435 8.631 7.839 7.941 9.094 10.596 11.519 11.482 10.860 10.303 10.090 9.963 9.561 8.950 8.662 9.182 10.384 11.521 11.810 11.103 9.997 9.313 9.427 10.058 10.670 11.015 11.290 11.796 12.505 13.018 12.978 12.485 12.067 12.197 12.821 13.396 + 13.349 13.027 12.794 13.044 13.724 14.334 14.373 13.778 12.959 12.386 12.182 12.098 11.885 11.636 11.721 12.358 13.275 13.836 13.574 12.623 11.629 11.194 11.373 11.687 11.624 11.136 10.650 10.594 10.932 11.168 10.827 9.927 8.982 8.526 8.634 8.903 + 13.341 13.077 12.912 13.204 13.914 14.578 14.671 14.042 13.024 12.151 11.738 11.721 11.842 11.975 12.228 12.749 13.447 13.947 13.869 13.177 12.272 11.702 11.727 12.095 12.244 11.729 10.543 9.089 7.861 7.124 6.814 6.684 6.522 6.273 6.009 5.841 + 12.635 12.422 12.211 12.249 12.587 13.009 13.164 12.819 12.031 11.125 10.491 10.364 10.715 11.314 11.890 12.262 12.379 12.283 12.054 11.783 11.559 11.439 11.411 11.357 11.095 10.473 9.484 8.300 7.207 6.454 6.128 6.128 6.256 6.346 6.350 6.319 + 12.258 12.339 12.278 11.880 11.200 10.511 10.036 9.722 9.322 8.697 8.037 7.749 8.080 8.849 9.549 9.769 9.536 9.259 9.342 9.814 10.336 10.542 10.363 10.024 9.738 9.437 8.849 7.845 6.698 5.946 5.941 6.516 7.097 7.190 6.798 6.377 + 12.418 12.360 12.133 11.686 11.160 10.764 10.528 10.192 9.439 8.277 7.191 6.827 7.459 8.696 9.758 10.096 9.805 9.475 9.611 10.181 10.702 10.746 10.345 9.900 9.699 9.565 9.038 7.910 6.581 5.809 6.037 6.936 7.631 7.449 6.526 5.685 + 12.100 12.167 12.139 11.877 11.435 10.991 10.625 10.186 9.443 8.398 7.440 7.121 7.704 8.883 9.970 10.418 10.229 9.895 9.924 10.391 10.904 10.998 10.555 9.863 9.294 8.928 8.522 7.815 6.868 6.062 5.770 6.005 6.409 6.584 6.440 6.227 + 11.940 12.153 12.283 12.046 11.463 10.834 10.410 10.126 9.675 8.894 8.042 7.664 8.114 9.176 10.176 10.519 10.185 9.725 9.755 10.392 11.151 11.364 10.752 9.626 8.579 7.974 7.709 7.419 6.881 6.219 5.754 5.679 5.901 6.167 6.305 6.331 + 12.741 12.471 12.207 12.238 12.597 13.013 13.123 12.747 11.993 11.143 10.464 10.136 10.269 10.921 12.020 13.266 14.192 14.420 13.942 13.139 12.482 12.133 11.810 11.075 9.804 8.392 7.481 7.429 7.985 8.495 8.457 7.938 7.467 7.514 8.041 8.546 + 13.382 12.738 12.151 12.352 13.393 14.557 14.975 14.349 13.139 12.075 11.523 11.298 11.062 10.837 11.067 12.151 13.912 15.565 16.277 15.811 14.668 13.614 13.026 12.670 12.063 11.028 9.895 9.175 9.057 9.231 9.185 8.668 7.867 7.175 6.814 6.715 + 13.438 12.696 12.005 12.223 13.474 14.993 15.740 15.231 13.863 12.494 11.708 11.440 11.248 10.898 10.674 11.109 12.418 14.187 15.610 16.082 15.594 14.642 13.754 13.096 12.475 11.667 10.716 9.928 9.592 9.711 9.986 10.046 9.706 9.061 8.384 7.962 + 13.342 12.796 12.314 12.573 13.696 15.088 15.862 15.503 14.225 12.749 11.734 11.329 11.215 11.028 10.757 10.770 11.454 12.819 14.404 15.562 15.891 15.440 14.582 13.687 12.885 12.109 11.306 10.599 10.238 10.366 10.833 11.229 11.150 10.493 9.567 8.902 + 13.228 12.939 12.760 13.130 14.105 15.229 15.818 15.445 14.247 12.824 11.802 11.411 11.409 11.381 11.144 10.927 11.159 12.074 13.449 14.720 15.360 15.219 14.555 13.762 13.047 12.348 11.532 10.659 10.030 9.954 10.422 11.022 11.197 10.686 9.756 9.036 + 13.076 13.005 13.073 13.481 14.169 14.767 14.812 14.088 12.820 11.540 10.720 10.449 10.411 10.199 9.701 9.251 9.372 10.336 11.884 13.362 14.169 14.162 13.687 13.227 12.993 12.811 12.387 11.690 11.061 10.932 11.391 12.012 12.149 11.473 10.301 9.399 + 11.469 11.496 11.726 12.309 13.131 13.777 13.755 12.842 11.287 9.694 8.634 8.270 8.289 8.197 7.761 7.231 7.156 7.928 9.427 11.055 12.143 12.412 12.103 11.713 11.567 11.604 11.544 11.225 10.805 10.607 10.778 11.091 11.109 10.579 9.707 9.040 + 10.456 10.616 11.041 11.733 12.413 12.614 12.025 10.777 9.403 8.477 8.217 8.387 8.571 8.534 8.379 8.378 8.683 9.197 9.705 10.099 10.455 10.900 11.406 11.758 11.725 11.276 10.628 10.066 9.729 9.537 9.335 9.081 8.885 8.877 9.039 9.203 + 6.942 6.984 7.160 7.522 7.965 8.254 8.197 7.806 7.294 6.909 6.752 6.743 6.745 6.723 6.770 6.994 7.383 7.798 8.099 8.280 8.465 8.764 9.121 9.318 9.138 8.552 7.764 7.073 6.676 6.578 6.658 6.805 6.989 7.221 7.467 7.633 + 4.516 4.991 5.673 6.254 6.617 6.838 6.981 6.924 6.423 5.387 4.086 3.054 2.739 3.182 4.020 4.793 5.284 5.590 5.899 6.232 6.396 6.205 5.702 5.171 4.897 4.935 5.102 5.205 5.254 5.437 5.886 6.465 6.840 6.768 6.348 5.966 + 5.920 5.605 5.358 5.588 6.339 7.206 7.632 7.339 6.515 5.635 5.095 4.972 5.087 5.253 5.460 5.822 6.390 7.029 7.511 7.708 7.713 7.741 7.911 8.111 8.081 7.654 6.945 6.313 6.132 6.526 7.295 8.045 8.442 8.403 8.106 7.848 + 7.589 7.612 7.821 8.335 9.039 9.591 9.668 9.227 8.566 8.105 8.088 8.453 8.944 9.367 9.726 10.154 10.723 11.337 11.813 12.060 12.184 12.387 12.767 13.182 13.338 13.011 12.252 11.379 10.778 10.662 10.950 11.357 11.596 11.554 11.329 11.136 + 8.334 8.548 9.111 10.058 11.104 11.727 11.525 10.560 9.371 8.607 8.582 9.107 9.723 10.113 10.319 10.602 11.112 11.696 12.028 11.938 11.612 11.471 11.812 12.531 13.164 13.240 12.645 11.722 11.023 10.919 11.358 11.937 12.211 12.001 11.496 11.089 + 11.622 12.038 12.746 13.514 14.055 14.107 13.544 12.442 11.067 9.766 8.805 8.257 8.013 7.904 7.855 7.951 8.355 9.156 10.252 11.373 12.225 12.642 12.635 12.323 11.828 11.235 10.644 10.214 10.120 10.406 10.870 11.115 10.786 9.846 8.672 7.862 + 13.201 13.320 13.735 14.555 15.580 16.306 16.241 15.268 13.770 12.379 11.546 11.266 11.172 10.910 10.466 10.173 10.408 11.235 12.302 13.074 13.205 12.740 12.006 11.321 10.790 10.368 10.077 10.141 10.839 12.156 13.568 14.204 13.380 11.153 8.449 6.611 + 13.174 12.964 13.015 13.773 15.142 16.425 16.819 16.044 14.554 13.165 12.428 12.271 12.217 11.916 11.509 11.500 12.257 13.618 14.932 15.515 15.106 13.982 12.653 11.467 10.452 9.502 8.678 8.297 8.696 9.863 11.261 12.053 11.614 9.984 7.923 6.508 + 12.555 12.300 12.295 13.042 14.483 15.921 16.501 15.859 14.390 12.905 12.004 11.689 11.534 11.201 10.825 10.900 11.784 13.269 14.629 15.110 14.469 13.112 11.736 10.791 10.217 9.648 8.866 8.089 7.818 8.370 9.504 10.469 10.508 9.422 7.781 6.581 + 10.947 10.880 11.243 12.429 14.153 15.502 15.629 14.468 12.780 11.508 11.011 10.900 10.586 9.972 9.604 10.110 11.485 12.926 13.419 12.582 10.985 9.661 9.252 9.514 9.632 8.997 7.780 6.800 6.841 8.003 9.604 10.664 10.556 9.370 7.805 6.733 + 10.685 10.628 10.608 10.677 10.729 10.552 10.009 9.190 8.367 7.780 7.462 7.257 7.014 6.764 6.693 6.936 7.401 7.804 7.899 7.689 7.409 7.296 7.358 7.365 7.074 6.481 5.856 5.542 5.683 6.123 6.555 6.760 6.728 6.599 6.498 6.458 + 9.491 9.219 8.920 8.847 9.007 9.138 8.933 8.315 7.509 6.852 6.521 6.419 6.314 6.067 5.765 5.632 5.839 6.377 7.087 7.772 8.278 8.496 8.350 7.842 7.136 6.554 6.433 6.890 7.709 8.446 8.722 8.454 7.868 7.291 6.924 6.774 + 7.866 7.750 7.792 8.268 9.159 10.106 10.663 10.641 10.251 9.916 9.912 10.152 10.285 10.028 9.459 9.012 9.186 10.175 11.701 13.158 13.955 13.815 12.873 11.549 10.315 9.504 9.232 9.421 9.868 10.321 10.560 10.455 10.010 9.363 8.737 8.354 + 10.402 10.475 10.661 10.983 11.374 11.692 11.801 11.675 11.418 11.184 11.044 10.931 10.717 10.369 10.064 10.126 10.808 12.063 13.496 14.547 14.804 14.230 13.146 11.996 11.096 10.528 10.234 10.175 10.384 10.867 11.459 11.820 11.629 10.843 9.806 9.077 + 13.699 12.910 11.778 10.859 10.435 10.405 10.508 10.613 10.800 11.183 11.689 12.059 12.093 11.893 11.836 12.270 13.176 14.123 14.560 14.211 13.240 12.069 11.048 10.267 9.645 9.147 8.903 9.078 9.665 10.387 10.842 10.752 10.133 9.250 8.445 7.980 + 12.263 11.507 10.390 9.423 8.918 8.880 9.152 9.635 10.352 11.319 12.389 13.266 13.699 13.690 13.497 13.422 13.566 13.764 13.759 13.436 12.910 12.403 12.058 11.857 11.715 11.615 11.638 11.845 12.167 12.410 12.411 12.187 11.921 11.802 11.861 11.962 + 11.455 10.686 9.718 9.184 9.249 9.556 9.666 9.551 9.632 10.345 11.654 13.007 13.770 13.717 13.148 12.552 12.192 12.008 11.863 11.795 11.951 12.301 12.476 12.032 10.926 9.727 9.263 9.927 11.278 12.344 12.413 11.615 10.764 10.604 11.159 11.766 + 14.673 14.464 14.085 13.542 12.787 11.827 10.870 10.318 10.527 11.485 12.715 13.542 13.553 12.880 12.057 11.581 11.555 11.709 11.730 11.575 11.448 11.507 11.616 11.430 10.747 9.781 9.065 9.030 9.637 10.393 10.751 10.523 9.960 9.469 9.255 9.231 + 14.773 14.116 13.068 11.978 11.090 10.487 10.180 10.192 10.529 11.097 11.698 12.161 12.482 12.797 13.176 13.459 13.346 12.729 11.940 11.590 12.052 13.015 13.604 13.064 11.489 9.894 9.492 10.694 12.699 14.067 13.832 12.223 10.395 9.431 9.501 9.908 + 10.770 10.189 9.442 9.027 9.151 9.648 10.211 10.674 11.099 11.609 12.210 12.782 13.214 13.493 13.624 13.525 13.067 12.316 11.685 11.739 12.689 14.020 14.717 14.046 12.280 10.672 10.544 12.182 14.477 15.717 14.917 12.588 10.281 9.298 9.693 10.412 + 10.860 10.978 10.942 10.503 9.751 9.127 9.099 9.772 10.792 11.627 11.996 12.058 12.199 12.608 13.040 13.014 12.282 11.167 10.411 10.626 11.754 13.025 13.486 12.718 11.197 9.978 9.943 11.162 12.845 13.907 13.708 12.419 10.786 9.541 8.945 8.791 + 11.652 12.304 12.931 12.787 11.744 10.449 9.823 10.340 11.682 13.047 13.782 13.799 13.466 13.151 12.875 12.390 11.546 10.567 9.936 9.995 10.606 11.206 11.208 10.432 9.235 8.265 8.042 8.671 9.827 10.964 11.582 11.407 10.469 9.077 7.716 6.880 + 13.849 13.732 13.478 13.124 12.829 12.800 13.124 13.655 14.085 14.163 13.882 13.474 13.186 13.048 12.834 12.262 11.282 10.185 9.434 9.334 9.794 10.361 10.517 10.004 8.977 7.889 7.219 7.214 7.787 8.583 9.159 9.175 8.541 7.457 6.335 5.627 + 13.309 12.985 12.707 12.897 13.674 14.753 15.681 16.192 16.362 16.465 16.668 16.857 16.719 16.016 14.787 13.335 12.028 11.091 10.530 10.202 9.922 9.536 8.953 8.174 7.333 6.680 6.475 6.812 7.516 8.199 8.471 8.153 7.356 6.384 5.557 5.095 + 12.890 12.802 12.786 13.071 13.810 14.929 16.103 16.915 17.134 16.891 16.587 16.554 16.739 16.713 16.041 14.726 13.328 12.591 12.836 13.611 13.932 12.965 10.639 7.738 5.397 4.418 4.870 6.196 7.638 8.622 8.880 8.379 7.232 5.706 4.237 3.329 + 12.706 12.462 12.285 12.575 13.518 14.904 16.210 16.922 16.883 16.413 16.070 16.218 16.714 16.996 16.527 15.272 13.796 12.879 12.909 13.534 13.854 13.046 10.956 8.230 5.915 4.833 5.157 6.420 7.872 8.867 9.073 8.469 7.253 5.762 4.413 3.611 + 12.558 12.207 11.940 12.286 13.433 15.042 16.439 17.071 16.877 16.306 15.965 16.160 16.677 16.964 16.577 15.540 14.344 13.571 13.440 13.613 13.413 12.311 10.310 7.989 6.162 5.429 5.873 7.090 8.442 9.366 9.552 8.983 7.858 6.510 5.321 4.626 + 12.711 12.325 12.068 12.514 13.788 15.413 16.657 17.059 16.729 16.192 15.958 16.170 16.587 16.843 16.726 16.279 15.699 15.159 14.696 14.199 13.457 12.256 10.526 8.479 6.641 5.659 5.929 7.277 8.960 10.057 10.010 8.929 7.441 6.209 5.529 5.293 + 12.955 12.412 12.009 12.475 13.901 15.622 16.759 16.917 16.420 15.941 15.902 16.215 16.523 16.619 16.609 16.676 16.762 16.536 15.694 14.270 12.621 11.089 9.703 8.263 6.720 5.453 5.081 5.921 7.571 9.076 9.554 8.804 7.360 6.000 5.177 4.864 + 12.367 11.898 11.572 12.058 13.467 15.199 16.397 16.586 15.988 15.270 15.004 15.298 15.858 16.327 16.549 16.554 16.358 15.845 14.868 13.428 11.742 10.094 8.639 7.365 6.250 5.441 5.233 5.817 7.015 8.277 8.954 8.684 7.576 6.093 4.777 4.026 + 11.739 11.327 11.073 11.613 13.063 14.864 16.171 16.460 15.856 14.972 14.429 14.484 14.995 15.654 16.220 16.556 16.541 16.020 14.900 13.273 11.429 9.701 8.278 7.170 6.345 5.883 5.962 6.672 7.820 8.939 9.528 9.345 8.522 7.445 6.518 6.002 + 11.910 11.474 11.259 11.955 13.606 15.491 16.670 16.696 15.884 14.965 14.501 14.576 14.965 15.484 16.113 16.802 17.241 16.931 15.570 13.380 11.036 9.195 8.057 7.353 6.751 6.271 6.281 7.074 8.442 9.690 10.100 9.459 8.161 6.859 5.989 5.608 + 11.914 11.547 11.404 12.101 13.669 15.443 16.559 16.598 15.834 14.938 14.453 14.514 14.963 15.633 16.438 17.223 17.618 17.165 15.675 13.476 11.251 9.574 8.540 7.841 7.193 6.699 6.755 7.591 8.890 9.903 9.982 9.081 7.756 6.686 6.175 6.057 + 11.633 11.242 11.065 11.739 13.307 15.105 16.255 16.312 15.530 14.566 13.970 13.906 14.263 14.916 15.798 16.734 17.301 16.994 15.604 13.474 11.321 9.725 8.745 8.007 7.186 6.411 6.171 6.818 8.112 9.289 9.597 8.854 7.523 6.291 5.554 5.278 + 11.286 10.870 10.687 11.414 13.088 14.987 16.164 16.147 15.218 14.095 13.377 13.251 13.620 14.376 15.461 16.673 17.519 17.390 16.016 13.750 11.390 9.616 8.541 7.788 6.991 6.234 5.980 6.555 7.703 8.662 8.741 7.862 6.584 5.598 5.189 5.144 + 11.323 11.090 11.139 11.981 13.570 15.234 16.159 15.987 15.025 13.940 13.258 13.131 13.478 14.245 15.428 16.854 18.007 18.202 17.056 14.837 12.351 10.403 9.278 8.693 8.199 7.658 7.323 7.493 8.110 8.709 8.785 8.216 7.336 6.620 6.291 6.229 + 11.319 11.134 11.262 12.174 13.773 15.360 16.153 15.878 14.909 13.892 13.242 13.002 13.086 13.572 14.642 16.215 17.699 18.227 17.263 15.062 12.523 10.549 9.435 8.835 8.276 7.689 7.451 7.910 8.900 9.753 9.817 8.996 7.801 6.887 6.520 6.493 + 10.928 10.793 10.949 11.808 13.297 14.812 15.628 15.425 14.473 13.362 12.565 12.228 12.300 12.775 13.736 15.140 16.600 17.454 17.137 15.573 13.236 10.838 8.923 7.674 7.047 6.991 7.492 8.420 9.393 9.888 9.575 8.571 7.371 6.484 6.088 6.008 + 10.622 10.535 10.794 11.794 13.399 14.913 15.568 15.096 13.895 12.674 11.932 11.731 11.901 12.384 13.314 14.758 16.392 17.509 17.421 15.945 13.542 11.016 9.017 7.773 7.191 7.131 7.538 8.327 9.218 9.760 9.602 8.761 7.617 6.639 6.067 5.850 + 11.135 11.079 11.410 12.496 14.112 15.474 15.832 15.073 13.787 12.744 12.307 12.293 12.385 12.592 13.270 14.665 16.449 17.763 17.784 16.327 13.951 11.505 9.559 8.215 7.382 7.102 7.546 8.663 9.920 10.515 9.956 8.495 6.963 6.117 6.070 6.315 + 11.262 11.320 11.744 12.757 14.110 15.147 15.291 14.517 13.366 12.491 12.159 12.172 12.235 12.372 12.941 14.219 15.967 17.417 17.748 16.643 14.471 11.985 9.845 8.380 7.687 7.813 8.737 10.166 11.441 11.804 10.903 9.093 7.230 6.054 5.706 5.762 + 11.055 11.107 11.506 12.455 13.698 14.585 14.561 13.637 12.398 11.525 11.275 11.379 11.447 11.455 11.819 12.983 14.874 16.760 17.666 17.022 15.021 12.452 10.187 8.763 8.286 8.595 9.412 10.369 11.012 10.934 10.025 8.607 7.270 6.483 6.288 6.358 + 10.388 10.710 11.456 12.600 13.798 14.496 14.300 13.303 12.046 11.133 10.810 10.876 10.995 11.092 11.474 12.528 14.277 16.176 17.360 17.156 15.493 12.931 10.347 8.509 7.806 8.179 9.219 10.326 10.914 10.644 9.591 8.217 7.111 6.625 6.678 6.879 + 10.639 11.198 12.121 13.075 13.698 13.741 13.195 12.299 11.417 10.837 10.618 10.607 10.618 10.649 10.942 11.813 13.340 15.155 16.512 16.675 15.356 12.949 10.354 8.505 7.899 8.403 9.434 10.343 10.743 10.584 10.018 9.216 8.288 7.332 6.505 6.015 + 8.895 9.007 9.190 9.367 9.440 9.309 8.926 8.353 7.769 7.407 7.404 7.692 8.043 8.271 8.458 8.961 10.136 11.935 13.732 14.593 13.869 11.687 8.939 6.737 5.733 5.803 6.321 6.729 6.916 7.111 7.455 7.708 7.410 6.350 4.902 3.855 + 8.330 8.481 8.599 8.472 8.053 7.508 7.104 7.020 7.238 7.585 7.871 8.010 8.053 8.133 8.391 8.927 9.752 10.766 11.747 12.415 12.551 12.125 11.325 10.454 9.760 9.328 9.103 9.003 9.004 9.122 9.308 9.412 9.255 8.788 8.184 7.759 + 9.480 9.007 8.400 8.015 7.906 7.810 7.455 6.879 6.436 6.476 6.986 7.565 7.767 7.512 7.189 7.348 8.236 9.580 10.773 11.291 10.996 10.119 9.018 7.965 7.105 6.539 6.363 6.595 7.097 7.611 7.928 8.041 8.125 8.348 8.691 8.959 + 9.336 8.723 7.996 7.699 7.930 8.270 8.188 7.533 6.677 6.170 6.260 6.706 7.049 7.056 6.930 7.097 7.785 8.787 9.597 9.775 9.219 8.157 6.939 5.864 5.142 4.942 5.357 6.295 7.419 8.280 8.591 8.425 8.137 8.059 8.238 8.449 + 8.460 8.537 8.676 8.845 8.995 9.082 9.088 9.039 8.993 9.009 9.103 9.246 9.387 9.507 9.643 9.871 10.242 10.724 11.197 11.512 11.578 11.414 11.126 10.834 10.601 10.421 10.265 10.133 10.063 10.083 10.156 10.177 10.038 9.721 9.339 9.078 + 7.809 8.458 9.461 10.409 11.024 11.293 11.420 11.648 12.075 12.590 12.953 12.960 12.580 11.987 11.482 11.331 11.632 12.255 12.914 13.324 13.360 13.109 12.793 12.599 12.556 12.537 12.388 12.086 11.768 11.639 11.794 12.144 12.476 12.623 12.584 12.497 + 8.783 9.170 9.828 10.560 11.158 11.496 11.588 11.561 11.540 11.530 11.400 11.003 10.344 9.656 9.298 9.533 10.341 11.417 12.341 12.817 12.802 12.472 12.085 11.837 11.800 11.924 12.069 12.066 11.789 11.259 10.685 10.395 10.650 11.439 12.422 13.097 + 10.514 10.562 10.531 10.280 9.788 9.233 8.925 9.134 9.897 10.951 11.836 12.146 11.773 11.002 10.374 10.392 11.229 12.618 13.981 14.735 14.595 13.705 12.543 11.650 11.343 11.570 11.969 12.099 11.706 10.878 10.008 9.573 9.856 10.771 11.881 12.629 + 10.006 9.699 9.326 9.158 9.286 9.586 9.887 10.158 10.512 11.032 11.592 11.891 11.705 11.142 10.655 10.766 11.689 13.159 14.582 15.399 15.384 14.696 13.695 12.713 11.918 11.321 10.848 10.401 9.902 9.336 8.796 8.466 8.515 8.949 9.554 9.985 + 11.056 10.324 9.413 8.973 9.241 9.915 10.487 10.703 10.725 10.887 11.310 11.766 11.919 11.690 11.389 11.473 12.150 13.193 14.116 14.541 14.429 14.008 13.515 13.015 12.442 11.768 11.090 10.554 10.200 9.917 9.564 9.124 8.728 8.525 8.528 8.600 + 11.987 11.051 9.721 8.761 8.702 9.538 10.761 11.715 12.030 11.818 11.506 11.447 11.641 11.811 11.751 11.617 11.855 12.783 14.187 15.336 15.464 14.363 12.590 11.083 10.486 10.725 11.165 11.184 10.661 9.968 9.559 9.534 9.608 9.446 9.026 8.657 + 9.216 9.000 8.775 8.800 9.186 9.797 10.345 10.606 10.602 10.571 10.744 11.108 11.391 11.326 10.976 10.794 11.295 12.550 13.969 14.627 13.968 12.308 10.687 10.120 10.811 12.002 12.594 12.039 10.750 9.702 9.577 10.197 10.749 10.556 9.698 8.918 + 9.574 9.753 9.889 9.731 9.241 8.655 8.334 8.504 9.094 9.771 10.160 10.071 9.626 9.193 9.199 9.900 11.208 12.686 13.727 13.868 13.066 11.764 10.643 10.208 10.476 11.000 11.220 10.884 10.206 9.652 9.535 9.771 9.985 9.870 9.464 9.103 + 11.972 12.289 12.323 11.469 9.770 8.017 7.179 7.655 8.964 10.128 10.412 9.807 8.935 8.527 8.927 9.977 11.240 12.287 12.839 12.760 12.052 10.908 9.720 8.936 8.790 9.143 9.582 9.744 9.580 9.336 9.264 9.366 9.394 9.129 8.634 8.235 + 8.840 8.762 8.638 8.513 8.426 8.397 8.435 8.550 8.764 9.091 9.495 9.878 10.126 10.202 10.221 10.408 10.943 11.784 12.616 13.011 12.702 11.777 10.643 9.759 9.356 9.339 9.448 9.511 9.558 9.719 10.001 10.191 9.995 9.314 8.406 7.758 + 9.368 9.338 9.140 8.675 8.059 7.602 7.597 8.089 8.835 9.487 9.835 9.912 9.916 10.053 10.428 11.048 11.848 12.674 13.257 13.286 12.601 11.375 10.102 9.323 9.275 9.730 10.187 10.266 9.973 9.627 9.531 9.685 9.817 9.673 9.282 8.943 + 10.211 9.487 8.575 8.086 8.196 8.559 8.682 8.408 8.041 8.016 8.446 8.994 9.204 8.983 8.758 9.131 10.325 11.894 12.997 12.998 11.922 10.399 9.176 8.610 8.528 8.513 8.318 8.055 8.043 8.484 9.251 9.962 10.250 10.020 9.504 9.099 + 10.079 9.090 7.892 7.387 7.847 8.746 9.267 9.035 8.399 8.055 8.370 9.050 9.437 9.157 8.506 8.222 8.839 10.194 11.504 11.949 11.272 9.912 8.620 7.911 7.789 7.904 7.943 7.885 7.949 8.317 8.920 9.450 9.592 9.265 8.693 8.262 + 10.407 9.938 9.189 8.396 7.703 7.168 6.879 7.002 7.661 8.712 9.682 10.009 9.477 8.475 7.827 8.227 9.710 11.553 12.735 12.617 11.337 9.650 8.366 7.825 7.794 7.787 7.517 7.101 6.911 7.212 7.925 8.667 9.029 8.866 8.386 7.992 + 9.474 9.597 9.793 9.956 9.956 9.734 9.388 9.142 9.174 9.430 9.601 9.356 8.667 7.953 7.858 8.779 10.493 12.203 13.018 12.536 11.102 9.547 8.603 8.441 8.643 8.614 8.071 7.259 6.728 6.898 7.728 8.749 9.401 9.421 8.999 8.600 + 10.083 10.154 10.299 10.514 10.764 10.979 11.059 10.925 10.558 10.007 9.351 8.658 8.001 7.528 7.478 8.070 9.276 10.669 11.539 11.317 10.017 8.341 7.262 7.340 8.283 9.154 9.105 8.074 6.860 6.480 7.307 8.740 9.670 9.398 8.223 7.183 + 6.213 6.533 7.001 7.422 7.722 7.933 8.063 7.999 7.592 6.831 5.934 5.235 4.950 5.065 5.420 5.898 6.472 7.072 7.440 7.212 6.255 4.941 4.020 4.085 5.035 6.061 6.246 5.340 4.012 3.325 3.832 5.084 6.002 5.810 4.714 3.714 + 8.347 8.228 8.071 7.956 7.890 7.810 7.670 7.507 7.411 7.419 7.437 7.290 6.876 6.296 5.820 5.709 6.005 6.478 6.772 6.651 6.138 5.472 4.914 4.573 4.383 4.219 4.035 3.906 3.944 4.166 4.447 4.576 4.406 3.955 3.418 3.058 + 7.725 7.009 6.205 6.009 6.578 7.429 7.905 7.756 7.292 7.003 7.062 7.188 7.002 6.467 5.977 5.966 6.443 6.919 6.812 5.977 4.849 4.078 3.990 4.358 4.674 4.627 4.341 4.193 4.415 4.884 5.259 5.304 5.066 4.770 4.590 4.532 + 5.923 5.784 5.523 5.187 4.867 4.686 4.748 5.068 5.537 5.956 6.160 6.131 6.024 6.051 6.293 6.613 6.734 6.465 5.870 5.246 4.896 4.892 5.016 4.956 4.583 4.076 3.783 3.933 4.438 4.961 5.180 5.019 4.662 4.361 4.235 4.223 + 5.450 5.255 5.044 5.026 5.282 5.700 6.069 6.221 6.134 5.909 5.690 5.588 5.658 5.909 6.302 6.732 7.043 7.097 6.858 6.424 5.960 5.583 5.288 4.993 4.645 4.306 4.108 4.133 4.328 4.525 4.573 4.454 4.275 4.165 4.163 4.201 + 5.176 5.039 4.934 5.044 5.393 5.795 5.981 5.801 5.350 4.914 4.782 5.063 5.641 6.276 6.760 7.017 7.080 7.003 6.796 6.431 5.906 5.296 4.738 4.363 4.227 4.288 4.449 4.618 4.747 4.818 4.819 4.729 4.532 4.257 3.982 3.808 + 6.493 6.711 7.184 7.904 8.742 9.490 9.978 10.180 10.197 10.140 10.052 9.925 9.800 9.817 10.124 10.718 11.373 11.758 11.666 11.172 10.567 10.126 9.909 9.749 9.439 8.912 8.274 7.672 7.153 6.661 6.168 5.780 5.678 5.947 6.432 6.807 + 10.799 10.277 9.752 9.826 10.695 12.006 13.145 13.689 13.625 13.213 12.703 12.193 11.727 11.457 11.628 12.349 13.388 14.230 14.411 13.868 12.996 12.348 12.237 12.555 12.914 12.966 12.597 11.895 11.000 10.032 9.141 8.562 8.528 9.073 9.901 10.510 + 12.147 11.534 10.752 10.346 10.561 11.214 11.907 12.365 12.595 12.760 12.936 13.018 12.880 12.593 12.480 12.870 13.773 14.763 15.217 14.774 13.623 12.408 11.785 11.975 12.640 13.152 13.044 12.307 11.348 10.680 10.598 11.042 11.717 12.316 12.689 12.846 + 12.923 13.035 13.192 13.267 13.127 12.728 12.201 11.828 11.873 12.371 13.058 13.512 13.452 12.956 12.434 12.339 12.844 13.724 14.512 14.828 14.603 14.077 13.575 13.287 13.188 13.134 13.027 12.898 12.857 12.991 13.278 13.612 13.870 13.996 14.014 13.995 + 14.757 14.943 15.054 14.831 14.289 13.737 13.513 13.695 14.041 14.210 14.038 13.643 13.267 13.075 13.077 13.236 13.579 14.164 14.930 15.601 15.818 15.407 14.544 13.648 13.066 12.837 12.750 12.619 12.507 12.660 13.222 14.012 14.616 14.723 14.408 14.069 + 15.428 14.685 13.597 12.680 12.222 12.132 12.088 11.850 11.469 11.237 11.420 12.015 12.726 13.200 13.303 13.206 13.219 13.502 13.928 14.197 14.116 13.768 13.425 13.280 13.243 13.022 12.431 11.652 11.181 11.466 12.499 13.741 14.474 14.330 13.577 12.912 + 12.567 11.960 11.065 10.309 9.948 9.919 9.939 9.765 9.431 9.260 9.634 10.679 12.124 13.444 14.209 14.345 14.134 13.952 13.974 14.094 14.097 13.900 13.624 13.443 13.364 13.188 12.710 11.983 11.368 11.284 11.839 12.678 13.225 13.127 12.546 12.021 + 11.078 10.267 9.133 8.334 8.280 8.898 9.724 10.257 10.301 10.081 10.055 10.580 11.674 13.026 14.216 14.968 15.259 15.250 15.116 14.942 14.728 14.453 14.116 13.718 13.225 12.597 11.876 11.240 10.943 11.143 11.739 12.383 12.679 12.465 11.933 11.500 + 8.187 7.451 6.543 6.236 7.022 8.771 10.772 12.137 12.338 11.520 10.400 9.805 10.176 11.366 12.828 14.022 14.712 14.988 15.045 14.979 14.755 14.343 13.825 13.369 13.070 12.855 12.552 12.081 11.570 11.279 11.367 11.746 12.130 12.272 12.162 12.005 + 8.911 8.069 6.971 6.436 7.010 8.609 10.544 11.917 12.164 11.383 10.241 9.524 9.664 10.562 11.792 12.967 13.953 14.787 15.442 15.710 15.360 14.408 13.237 12.391 12.192 12.496 12.819 12.729 12.179 11.519 11.184 11.357 11.873 12.410 12.756 12.893 + 8.898 7.539 5.875 5.230 6.233 8.389 10.481 11.444 11.051 9.931 9.013 8.877 9.504 10.507 11.556 12.577 13.633 14.649 15.321 15.310 14.562 13.434 12.510 12.204 12.483 12.922 13.038 12.641 11.946 11.380 11.261 11.598 12.143 12.608 12.861 12.944 + 8.498 8.026 7.436 7.224 7.714 8.819 10.052 10.787 10.646 9.758 8.700 8.152 8.505 9.669 11.205 12.625 13.625 14.117 14.115 13.655 12.836 11.915 11.270 11.188 11.633 12.214 12.439 12.089 11.394 10.857 10.859 11.371 12.019 12.415 12.466 12.374 + 9.775 9.230 8.487 8.047 8.272 9.144 10.235 10.931 10.796 9.867 8.668 7.920 8.119 9.265 10.894 12.384 13.299 13.556 13.346 12.934 12.506 12.141 11.868 11.708 11.657 11.647 11.568 11.357 11.069 10.865 10.906 11.235 11.756 12.292 12.698 12.908 + 9.200 8.527 7.628 7.131 7.464 8.587 9.993 10.982 11.066 10.262 9.101 8.340 8.536 9.730 11.432 12.913 13.629 13.501 12.898 12.336 12.132 12.234 12.336 12.167 11.720 11.245 11.028 11.159 11.463 11.670 11.647 11.513 11.519 11.815 12.294 12.659 + 7.815 7.239 6.500 6.204 6.793 8.241 9.992 11.230 11.366 10.424 9.060 8.160 8.286 9.362 10.813 12.010 12.674 12.936 13.083 13.245 13.324 13.158 12.743 12.266 11.931 11.770 11.630 11.362 11.008 10.801 10.965 11.507 12.196 12.750 13.039 13.128 + 9.655 8.587 7.183 6.406 6.805 8.165 9.691 10.546 10.375 9.471 8.525 8.170 8.638 9.694 10.859 11.715 12.119 12.219 12.295 12.536 12.910 13.184 13.101 12.588 11.836 11.191 10.913 10.994 11.179 11.192 10.983 10.792 10.953 11.595 12.471 13.100 + 7.644 6.623 5.396 4.985 5.865 7.654 9.423 10.358 10.261 9.556 8.899 8.745 9.168 9.968 10.887 11.740 12.421 12.879 13.112 13.174 13.133 12.998 12.688 12.118 11.336 10.576 10.136 10.163 10.535 10.964 11.246 11.429 11.738 12.321 13.047 13.562 + 8.384 7.497 6.384 5.905 6.532 8.031 9.633 10.542 10.424 9.567 8.640 8.258 8.656 9.634 10.771 11.696 12.262 12.540 12.689 12.810 12.884 12.804 12.470 11.879 11.154 10.493 10.076 9.981 10.162 10.505 10.904 11.316 11.744 12.180 12.563 12.793 + 8.096 7.147 5.949 5.414 6.054 7.644 9.394 10.465 10.483 9.713 8.834 8.503 8.992 10.087 11.274 12.054 12.220 11.941 11.623 11.629 12.027 12.535 12.709 12.266 11.316 10.314 9.768 9.894 10.495 11.141 11.505 11.582 11.615 11.831 12.210 12.515 + 6.291 6.326 6.534 7.106 8.117 9.384 10.449 10.794 10.179 8.906 7.728 7.422 8.279 9.891 11.428 12.218 12.187 11.838 11.795 12.289 13.002 13.355 12.990 12.040 11.003 10.360 10.260 10.504 10.781 10.930 11.017 11.216 11.629 12.201 12.752 13.088 + 6.353 6.632 7.039 7.475 8.029 8.841 9.796 10.434 10.273 9.307 8.189 7.814 8.612 10.163 11.544 12.120 12.078 12.194 13.043 14.374 15.266 14.925 13.403 11.585 10.459 10.339 10.736 10.932 10.672 10.327 10.430 11.093 11.888 12.286 12.173 11.911 + 6.076 6.318 6.761 7.376 8.158 9.054 9.864 10.271 10.033 9.224 8.281 7.775 8.049 9.015 10.271 11.436 12.393 13.242 14.035 14.594 14.604 13.914 12.743 11.576 10.820 10.524 10.428 10.270 10.063 10.064 10.484 11.224 11.912 12.215 12.123 11.929 + 7.320 7.365 7.482 7.726 8.147 8.728 9.341 9.775 9.853 9.563 9.100 8.771 8.826 9.338 10.209 11.266 12.337 13.261 13.856 13.950 13.480 12.599 11.646 10.962 10.670 10.610 10.496 10.178 9.780 9.598 9.837 10.420 11.047 11.431 11.516 11.467 + 7.798 7.900 8.075 8.287 8.526 8.822 9.218 9.711 10.197 10.487 10.414 9.985 9.446 9.204 9.595 10.670 12.126 13.464 14.263 14.383 13.978 13.332 12.662 12.033 11.414 10.792 10.227 9.813 9.607 9.596 9.740 10.014 10.414 10.906 11.379 11.675 + 6.464 6.483 6.663 7.155 7.971 8.923 9.718 10.130 10.127 9.867 9.585 9.456 9.530 9.768 10.111 10.534 11.036 11.586 12.100 12.459 12.572 12.426 12.100 11.718 11.382 11.129 10.920 10.690 10.403 10.101 9.895 9.912 10.208 10.715 11.251 11.593 + 7.011 7.399 7.879 8.149 8.190 8.276 8.683 9.377 9.981 10.082 9.608 8.937 8.641 9.070 10.115 11.320 12.209 12.563 12.457 12.113 11.729 11.428 11.266 11.239 11.260 11.155 10.781 10.170 9.581 9.355 9.660 10.340 11.017 11.373 11.378 11.264 + 6.380 7.120 8.188 9.053 9.424 9.390 9.269 9.319 9.552 9.780 9.823 9.664 9.462 9.412 9.624 10.077 10.676 11.297 11.818 12.115 12.106 11.806 11.351 10.930 10.666 10.536 10.422 10.239 10.025 9.919 10.019 10.281 10.542 10.651 10.602 10.515 + 6.564 7.275 8.376 9.410 10.027 10.137 9.890 9.533 9.259 9.131 9.105 9.114 9.130 9.200 9.421 9.888 10.620 11.506 12.314 12.784 12.769 12.324 11.682 11.110 10.739 10.515 10.279 9.937 9.557 9.325 9.397 9.768 10.281 10.740 11.031 11.156 + 6.974 7.522 8.447 9.452 10.212 10.504 10.309 9.818 9.318 9.023 8.964 9.020 9.064 9.109 9.326 9.896 10.830 11.879 12.648 12.830 12.399 11.624 10.888 10.447 10.300 10.252 10.098 9.794 9.468 9.307 9.397 9.658 9.916 10.035 10.012 9.950 + 6.533 7.240 8.360 9.451 10.132 10.253 9.943 9.498 9.190 9.119 9.202 9.284 9.306 9.372 9.673 10.318 11.201 12.025 12.464 12.365 11.843 11.198 10.719 10.514 10.472 10.382 10.098 9.637 9.164 8.864 8.835 9.034 9.333 9.601 9.773 9.849 + 7.810 8.098 8.573 9.090 9.519 9.771 9.794 9.582 9.210 8.844 8.687 8.851 9.270 9.731 10.051 10.222 10.423 10.835 11.444 11.999 12.196 11.928 11.377 10.850 10.514 10.260 9.846 9.187 8.501 8.174 8.436 9.141 9.867 10.246 10.236 10.097 + 7.754 8.176 8.830 9.450 9.844 9.965 9.885 9.707 9.509 9.327 9.183 9.094 9.075 9.145 9.342 9.716 10.289 10.983 11.600 11.903 11.770 11.303 10.771 10.419 10.271 10.122 9.728 9.052 8.352 8.012 8.244 8.915 9.649 10.109 10.225 10.183 + 7.508 7.791 8.335 9.038 9.690 10.051 10.001 9.645 9.257 9.091 9.201 9.425 9.540 9.474 9.376 9.505 10.005 10.780 11.526 11.932 11.850 11.361 10.686 10.044 9.557 9.233 9.006 8.799 8.575 8.367 8.286 8.470 8.996 9.784 10.591 11.103 + 6.762 7.220 8.012 8.919 9.692 10.137 10.184 9.917 9.525 9.202 9.062 9.105 9.264 9.474 9.725 10.049 10.463 10.924 11.327 11.551 11.530 11.279 10.884 10.440 10.006 9.580 9.134 8.657 8.197 7.871 7.817 8.130 8.794 9.656 10.462 10.948 + 7.878 7.834 7.931 8.363 9.137 10.002 10.586 10.632 10.154 9.428 8.804 8.519 8.604 8.945 9.404 9.904 10.423 10.933 11.354 11.575 11.517 11.187 10.672 10.092 9.539 9.051 8.635 8.300 8.081 8.025 8.164 8.487 8.931 9.399 9.784 10.001 + 6.356 6.378 6.622 7.266 8.243 9.212 9.782 9.798 9.441 9.062 8.893 8.895 8.860 8.685 8.527 8.711 9.430 10.508 11.443 11.737 11.245 10.288 9.421 9.038 9.119 9.307 9.227 8.795 8.267 8.011 8.197 8.671 9.088 9.196 9.024 8.822 + 7.702 7.640 7.684 8.004 8.590 9.221 9.621 9.658 9.420 9.102 8.827 8.563 8.227 7.864 7.716 8.081 9.059 10.378 11.487 11.875 11.389 10.333 9.270 8.660 8.600 8.830 8.961 8.764 8.307 7.874 7.756 8.070 8.717 9.469 10.095 10.441 + 9.855 9.741 9.622 9.625 9.781 9.986 10.084 9.987 9.749 9.522 9.416 9.401 9.334 9.117 8.836 8.745 9.074 9.794 10.561 10.910 10.596 9.796 8.998 8.645 8.801 9.120 9.145 8.700 8.045 7.663 7.870 8.568 9.341 9.804 9.883 9.800 + 12.414 12.052 11.583 11.277 11.185 11.113 10.855 10.430 10.090 10.074 10.331 10.509 10.247 9.540 8.831 8.712 9.442 10.684 11.691 11.822 10.994 9.717 8.710 8.388 8.619 8.910 8.827 8.332 7.770 7.568 7.895 8.554 9.154 9.418 9.359 9.218 + 7.531 7.318 7.094 7.114 7.508 8.189 8.924 9.491 9.800 9.895 9.855 9.703 9.421 9.048 8.757 8.804 9.342 10.242 11.088 11.400 10.943 9.915 8.834 8.206 8.196 8.547 8.802 8.646 8.125 7.576 7.359 7.610 8.190 8.825 9.301 9.538 + 4.222 4.509 5.095 5.966 7.039 8.140 9.041 9.547 9.582 9.232 8.697 8.201 7.900 7.859 8.080 8.530 9.144 9.786 10.252 10.351 10.022 9.417 8.833 8.537 8.587 8.797 8.878 8.661 8.217 7.798 7.644 7.818 8.189 8.557 8.798 8.900 + 5.397 5.404 5.506 5.838 6.497 7.446 8.467 9.239 9.508 9.246 8.660 8.055 7.649 7.498 7.578 7.890 8.467 9.254 9.990 10.292 9.911 8.981 7.988 7.446 7.506 7.837 7.912 7.468 6.744 6.287 6.489 7.256 8.101 8.561 8.561 8.400 + 5.548 5.104 4.588 4.496 5.125 6.379 7.816 8.907 9.317 9.053 8.406 7.765 7.430 7.513 7.954 8.597 9.247 9.729 9.915 9.765 9.350 8.826 8.362 8.052 7.873 7.725 7.530 7.308 7.170 7.240 7.550 8.005 8.442 8.735 8.861 8.888 + 5.792 5.275 4.672 4.568 5.329 6.872 8.696 10.159 10.801 10.542 9.663 8.624 7.840 7.535 7.703 8.169 8.687 9.046 9.131 8.958 8.642 8.337 8.163 8.150 8.243 8.339 8.348 8.242 8.055 7.868 7.761 7.785 7.939 8.170 8.397 8.537 + 6.119 5.602 5.041 5.074 6.071 7.874 9.847 11.232 11.559 10.871 9.634 8.427 7.642 7.368 7.492 7.868 8.392 8.961 9.397 9.486 9.124 8.451 7.818 7.566 7.773 8.185 8.406 8.197 7.664 7.162 7.024 7.322 7.853 8.336 8.615 8.714 + 5.349 4.963 4.615 4.868 6.026 7.872 9.724 10.797 10.665 9.513 8.009 6.887 6.528 6.833 7.424 7.994 8.485 8.989 9.509 9.841 9.712 9.057 8.153 7.463 7.295 7.566 7.878 7.851 7.426 6.893 6.640 6.847 7.391 7.987 8.415 8.615 + 6.107 5.576 4.985 4.968 5.898 7.617 9.493 10.776 11.014 10.277 9.062 7.962 7.349 7.269 7.567 8.076 8.706 9.374 9.899 10.019 9.568 8.648 7.636 6.967 6.838 7.086 7.333 7.297 6.998 6.709 6.706 7.036 7.506 7.867 8.019 8.039 + 9.817 9.006 7.863 7.085 7.191 8.207 9.626 10.694 10.861 10.104 8.908 7.909 7.494 7.636 8.060 8.538 9.032 9.574 10.045 10.134 9.572 8.441 7.243 6.592 6.754 7.427 7.973 7.930 7.357 6.744 6.563 6.879 7.348 7.576 7.473 7.283 + 10.166 8.995 7.479 6.682 7.156 8.584 10.049 10.684 10.220 9.064 7.907 7.241 7.127 7.345 7.692 8.151 8.788 9.531 10.073 10.048 9.333 8.212 7.240 6.873 7.158 7.718 8.045 7.869 7.323 6.786 6.577 6.727 7.016 7.197 7.197 7.128 + 5.915 5.655 5.360 5.337 5.791 6.706 7.854 8.921 9.637 9.871 9.655 9.153 8.606 8.263 8.288 8.684 9.275 9.767 9.892 9.536 8.802 7.951 7.274 6.951 6.997 7.274 7.578 7.731 7.651 7.375 7.038 6.803 6.784 6.978 7.264 7.469 + 6.031 5.703 5.230 4.921 5.090 5.898 7.233 8.711 9.830 10.211 9.797 8.883 7.962 7.475 7.610 8.239 9.020 9.565 9.613 9.132 8.322 7.522 7.055 7.074 7.480 7.977 8.240 8.101 7.629 7.066 6.658 6.517 6.590 6.741 6.865 6.924 + 5.785 5.984 6.252 6.473 6.677 7.036 7.697 8.579 9.340 9.563 9.046 7.992 6.928 6.407 6.686 7.594 8.663 9.413 9.601 9.283 8.707 8.134 7.727 7.531 7.519 7.636 7.809 7.940 7.933 7.743 7.414 7.074 6.858 6.826 6.921 7.019 + 3.964 4.670 5.580 6.116 6.122 5.980 6.258 7.185 8.389 9.156 8.981 7.983 6.847 6.345 6.803 7.924 9.042 9.606 9.496 8.999 8.517 8.265 8.189 8.100 7.880 7.577 7.344 7.295 7.416 7.586 7.678 7.637 7.502 7.348 7.236 7.181 + 6.418 7.097 7.751 7.650 6.763 5.842 5.781 6.810 8.265 9.127 8.851 7.776 6.798 6.630 7.303 8.273 8.941 9.094 8.914 8.668 8.438 8.139 7.725 7.318 7.101 7.117 7.211 7.192 7.043 6.948 7.082 7.402 7.651 7.598 7.280 6.983 + 12.654 12.267 11.678 11.112 10.664 10.263 9.780 9.175 8.534 7.995 7.627 7.408 7.290 7.286 7.461 7.839 8.318 8.701 8.826 8.695 8.465 8.311 8.290 8.313 8.256 8.088 7.906 7.836 7.912 8.045 8.107 8.048 7.924 7.833 7.817 7.836 + 11.713 11.229 10.467 9.723 9.234 9.067 9.111 9.157 9.019 8.621 8.031 7.433 7.047 7.026 7.377 7.947 8.489 8.782 8.746 8.467 8.127 7.886 7.795 7.804 7.828 7.831 7.842 7.910 8.048 8.215 8.354 8.437 8.482 8.522 8.569 8.604 + 7.629 7.618 7.656 7.826 8.157 8.574 8.905 8.971 8.723 8.305 7.990 8.002 8.364 8.897 9.368 9.667 9.851 10.021 10.164 10.122 9.750 9.098 8.457 8.164 8.345 8.802 9.174 9.235 9.061 8.928 9.025 9.264 9.355 9.093 8.580 8.168 + 6.862 6.880 7.074 7.583 8.345 9.084 9.496 9.473 9.172 8.872 8.759 8.819 8.917 8.962 8.997 9.125 9.367 9.600 9.644 9.427 9.074 8.822 8.840 9.096 9.391 9.512 9.388 9.122 8.896 8.833 8.933 9.101 9.234 9.283 9.268 9.241 + 8.805 8.821 8.908 9.100 9.352 9.538 9.542 9.356 9.104 8.955 9.005 9.207 9.413 9.494 9.431 9.318 9.268 9.319 9.409 9.441 9.378 9.282 9.263 9.385 9.614 9.838 9.962 9.977 9.966 10.028 10.197 10.412 10.568 10.599 10.532 10.459 + 8.145 8.968 10.118 10.964 11.164 10.830 10.332 9.972 9.794 9.677 9.546 9.477 9.605 9.950 10.353 10.596 10.575 10.367 10.124 9.928 9.754 9.566 9.430 9.497 9.858 10.415 10.913 11.128 11.037 10.823 10.696 10.713 10.754 10.676 10.475 10.300 + 7.970 8.446 9.179 9.859 10.258 10.336 10.218 10.082 10.035 10.065 10.086 10.042 9.965 9.963 10.135 10.478 10.865 11.105 11.055 10.714 10.238 9.860 9.761 9.973 10.368 10.733 10.902 10.835 10.627 10.430 10.356 10.419 10.558 10.690 10.770 10.802 + 8.898 8.936 8.974 8.988 9.029 9.201 9.574 10.076 10.489 10.564 10.198 9.556 9.013 8.931 9.420 10.234 10.894 10.984 10.411 9.470 8.666 8.413 8.802 9.584 10.349 10.777 10.794 10.554 10.296 10.185 10.238 10.356 10.428 10.401 10.310 10.234 + 7.668 8.090 8.592 8.808 8.686 8.521 8.672 9.209 9.839 10.159 10.018 9.643 9.444 9.672 10.237 10.807 11.072 10.923 10.445 9.794 9.126 8.604 8.412 8.672 9.303 9.990 10.352 10.218 9.777 9.444 9.528 9.985 10.477 10.684 10.573 10.389 + 7.215 7.569 8.146 8.750 9.220 9.483 9.572 9.575 9.582 9.635 9.715 9.759 9.722 9.637 9.633 9.868 10.395 11.063 11.541 11.506 10.879 9.920 9.099 8.783 9.001 9.441 9.717 9.675 9.499 9.526 9.925 10.539 11.002 11.057 10.773 10.481 + 8.567 8.610 8.716 8.867 8.970 8.929 8.754 8.611 8.713 9.139 9.730 10.205 10.386 10.364 10.415 10.748 11.287 11.698 11.649 11.092 10.324 9.782 9.736 10.132 10.677 11.070 11.178 11.043 10.779 10.473 10.187 9.993 9.974 10.153 10.437 10.651 + 5.432 6.534 8.127 9.407 9.890 9.685 9.331 9.363 9.930 10.740 11.322 11.391 11.032 10.602 10.450 10.678 11.098 11.391 11.328 10.905 10.329 9.875 9.738 9.945 10.366 10.800 11.076 11.123 10.983 10.774 10.623 10.601 10.709 10.889 11.064 11.170 + 5.282 5.560 5.995 6.461 6.945 7.539 8.317 9.210 10.009 10.492 10.583 10.393 10.135 9.989 10.032 10.249 10.569 10.881 11.032 10.883 10.417 9.818 9.419 9.485 10.006 10.660 11.037 10.943 10.552 10.256 10.340 10.760 11.207 11.390 11.282 11.112 + 6.559 6.903 7.477 8.108 8.643 9.017 9.265 9.474 9.692 9.870 9.893 9.684 9.310 8.999 9.024 9.513 10.312 11.033 11.267 10.848 9.978 9.120 8.718 8.929 9.539 10.125 10.339 10.115 9.681 9.362 9.360 9.640 10.004 10.260 10.351 10.352 + 7.671 7.361 7.084 7.238 7.942 8.937 9.771 10.111 9.928 9.433 8.889 8.468 8.259 8.339 8.768 9.495 10.271 10.721 10.573 9.874 9.010 8.470 8.529 9.080 9.742 10.138 10.136 9.878 9.629 9.584 9.769 10.093 10.436 10.723 10.922 11.022 + 8.002 8.024 8.134 8.409 8.880 9.500 10.165 10.733 11.032 10.902 10.270 9.256 8.191 7.495 7.432 7.924 8.580 8.953 8.859 8.496 8.278 8.497 9.095 9.722 10.020 9.890 9.529 9.240 9.195 9.361 9.612 9.888 10.233 10.689 11.176 11.503 + 9.948 9.912 9.770 9.522 9.346 9.490 10.019 10.652 10.905 10.462 9.469 8.482 8.074 8.424 9.207 9.868 10.030 9.695 9.143 8.645 8.308 8.111 8.058 8.223 8.641 9.184 9.582 9.616 9.316 8.962 8.875 9.178 9.730 10.272 10.627 10.779 + 5.870 5.994 6.247 6.673 7.364 8.361 9.514 10.457 10.768 10.246 9.089 7.824 7.014 6.953 7.551 8.444 9.222 9.597 9.456 8.858 8.025 7.306 7.061 7.459 8.320 9.172 9.539 9.283 8.715 8.372 8.606 9.330 10.121 10.578 10.633 10.528 + 4.557 5.036 5.792 6.609 7.429 8.330 9.323 10.187 10.537 10.105 9.008 7.744 6.911 6.857 7.519 8.530 9.466 10.025 10.068 9.602 8.786 7.947 7.486 7.658 8.359 9.125 9.430 9.078 8.377 7.911 8.093 8.847 9.703 10.205 10.262 10.141 + 5.524 5.961 6.604 7.212 7.741 8.335 9.094 9.863 10.272 10.024 9.177 8.158 7.496 7.480 8.023 8.793 9.457 9.821 9.819 9.450 8.797 8.091 7.686 7.858 8.558 9.364 9.735 9.422 8.680 8.090 8.108 8.730 9.535 10.067 10.195 10.130 + 6.446 6.311 6.159 6.187 6.589 7.435 8.582 9.692 10.373 10.378 9.738 8.760 7.870 7.428 7.593 8.288 9.243 10.088 10.482 10.264 9.559 8.756 8.322 8.520 9.229 10.007 10.392 10.219 9.722 9.328 9.318 9.619 9.912 9.924 9.671 9.416 + 9.031 8.381 7.305 6.226 5.659 5.983 7.194 8.830 10.182 10.679 10.207 9.145 8.098 7.544 7.622 8.153 8.810 9.284 9.375 9.042 8.436 7.888 7.777 8.299 9.282 10.230 10.620 10.271 9.479 8.793 8.610 8.895 9.271 9.379 9.180 8.941 + 8.153 7.828 7.293 6.777 6.580 6.945 7.892 9.139 10.188 10.570 10.107 9.022 7.829 7.073 7.056 7.710 8.661 9.430 9.678 9.365 8.764 8.306 8.332 8.879 9.639 10.138 10.039 9.362 8.475 7.841 7.704 7.954 8.256 8.333 8.174 7.989 + 7.136 6.797 6.361 6.177 6.506 7.377 8.561 9.674 10.340 10.334 9.657 8.527 7.301 6.366 6.013 6.337 7.200 8.283 9.221 9.776 9.929 9.857 9.797 9.879 10.046 10.117 9.934 9.493 8.951 8.520 8.322 8.318 8.365 8.342 8.239 8.143 + 7.429 6.919 6.164 5.611 5.699 6.608 8.080 9.485 10.148 9.758 8.566 7.207 6.292 6.053 6.306 6.706 7.028 7.259 7.470 7.659 7.740 7.683 7.622 7.773 8.224 8.798 9.158 9.079 8.645 8.179 7.957 7.975 7.983 7.752 7.321 6.971 + 13.209 13.333 13.387 13.193 12.805 12.489 12.493 12.802 13.135 13.164 12.788 12.190 11.674 11.435 11.479 11.711 12.062 12.497 12.928 13.164 13.023 12.498 11.819 11.283 11.009 10.839 10.524 10.022 9.604 9.623 10.129 10.700 10.721 9.901 8.597 7.615 + 15.601 15.107 14.411 13.922 13.907 14.330 14.879 15.175 15.025 14.525 13.948 13.512 13.235 12.994 12.737 12.606 12.840 13.512 14.347 14.851 14.671 13.891 12.986 12.432 12.312 12.281 11.943 11.295 10.804 10.998 11.896 12.839 12.931 11.785 9.940 8.551 + 14.649 13.602 12.345 11.889 12.634 14.070 15.197 15.287 14.387 13.176 12.364 12.164 12.249 12.183 11.893 11.748 12.177 13.203 14.318 14.839 14.446 13.436 12.469 12.018 12.014 11.972 11.503 10.727 10.226 10.522 11.549 12.571 12.697 11.591 9.815 8.487 + 10.781 10.290 9.669 9.386 9.696 10.468 11.269 11.635 11.337 10.467 9.340 8.297 7.584 7.318 7.533 8.184 9.106 10.001 10.511 10.393 9.677 8.674 7.788 7.270 7.092 7.040 6.962 6.937 7.213 7.941 8.941 9.716 9.771 8.991 7.803 6.932 + 6.986 6.821 6.641 6.685 7.151 8.057 9.171 10.074 10.352 9.828 8.668 7.313 6.262 5.857 6.166 7.009 8.053 8.931 9.351 9.205 8.632 7.979 7.611 7.681 8.006 8.190 7.933 7.298 6.703 6.602 7.111 7.877 8.336 8.160 7.526 6.977 + 4.986 5.110 5.445 6.089 7.039 8.146 9.148 9.775 9.866 9.423 8.599 7.649 6.866 6.520 6.778 7.614 8.759 9.753 10.148 9.753 8.786 7.773 7.235 7.348 7.828 8.144 7.925 7.252 6.604 6.491 7.049 7.928 8.555 8.581 8.139 7.709 + 7.355 6.746 6.131 6.190 7.089 8.360 9.317 9.605 9.399 9.102 8.909 8.657 8.114 7.365 6.885 7.161 8.221 9.503 10.234 10.001 9.046 8.042 7.554 7.668 8.030 8.217 8.074 7.754 7.513 7.482 7.621 7.836 8.083 8.363 8.643 8.827 + 6.770 6.245 5.796 6.056 7.087 8.331 9.127 9.299 9.234 9.390 9.744 9.758 8.929 7.420 6.120 6.011 7.349 9.383 10.872 10.987 9.870 8.422 7.561 7.579 8.074 8.414 8.264 7.766 7.314 7.211 7.499 8.036 8.655 9.244 9.719 9.990 + 6.459 6.155 5.961 6.307 7.216 8.272 8.984 9.209 9.218 9.350 9.613 9.632 9.029 7.874 6.778 6.479 7.265 8.718 9.995 10.425 9.930 8.976 8.156 7.770 7.738 7.804 7.817 7.819 7.938 8.223 8.606 8.973 9.266 9.489 9.655 9.752 + 5.239 5.469 5.958 6.661 7.396 7.945 8.246 8.471 8.863 9.440 9.877 9.716 8.801 7.543 6.730 6.981 8.249 9.803 10.712 10.492 9.389 8.136 7.400 7.364 7.729 8.059 8.136 8.058 8.067 8.314 8.765 9.274 9.711 10.026 10.227 10.326 + 3.705 4.142 4.923 5.837 6.607 7.062 7.306 7.665 8.389 9.309 9.825 9.333 7.803 6.007 5.099 5.802 7.825 9.997 11.071 10.575 9.077 7.688 7.226 7.701 8.469 8.821 8.518 7.865 7.376 7.377 7.846 8.542 9.220 9.756 10.119 10.304 + 5.219 5.548 6.016 6.351 6.373 6.159 6.053 6.457 7.496 8.806 9.677 9.527 8.371 6.920 6.148 6.631 8.129 9.756 10.597 10.304 9.246 8.143 7.541 7.519 7.811 8.116 8.321 8.463 8.574 8.610 8.533 8.427 8.479 8.803 9.293 9.661 + 5.384 5.872 6.500 6.823 6.654 6.245 6.152 6.816 8.161 9.517 10.017 9.225 7.536 6.000 5.639 6.748 8.692 10.369 10.978 10.503 9.576 8.895 8.708 8.758 8.657 8.280 7.842 7.618 7.653 7.754 7.752 7.743 8.025 8.772 9.770 10.490 + 6.295 6.290 6.270 6.211 6.110 6.059 6.265 6.934 8.038 9.178 9.739 9.306 8.061 6.778 6.357 7.179 8.821 10.340 10.948 10.520 9.575 8.782 8.455 8.432 8.379 8.167 7.956 7.963 8.183 8.393 8.412 8.340 8.502 9.111 9.991 10.646 + 6.134 6.708 7.354 7.509 7.060 6.484 6.487 7.410 8.892 10.062 10.146 9.028 7.357 6.123 6.020 7.034 8.529 9.706 10.090 9.738 9.071 8.527 8.297 8.300 8.335 8.266 8.103 7.944 7.886 7.966 8.171 8.473 8.848 9.254 9.612 9.826 + 3.804 5.158 6.832 7.607 7.065 5.903 5.339 6.105 7.849 9.430 9.803 8.796 7.185 6.083 6.153 7.253 8.668 9.668 9.929 9.577 8.946 8.318 7.830 7.518 7.394 7.440 7.576 7.676 7.646 7.514 7.434 7.590 8.062 8.761 9.457 9.889 + 3.823 4.690 5.733 6.178 5.854 5.353 5.512 6.664 8.288 9.375 9.200 7.895 6.357 5.605 6.088 7.450 8.879 9.686 9.684 9.152 8.506 8.008 7.695 7.499 7.382 7.353 7.391 7.402 7.279 7.031 6.832 6.952 7.562 8.579 9.659 10.353 + 4.948 5.470 6.041 6.192 5.945 5.845 6.461 7.795 9.150 9.611 8.765 7.072 5.580 5.211 6.167 7.870 9.418 10.159 9.981 9.207 8.288 7.558 7.169 7.136 7.370 7.696 7.888 7.785 7.412 7.000 6.856 7.175 7.924 8.867 9.701 10.182 + 4.659 5.508 6.456 6.702 6.143 5.518 5.769 7.184 9.048 10.134 9.634 7.788 5.731 4.696 5.216 6.880 8.729 9.918 10.137 9.600 8.748 7.958 7.429 7.211 7.253 7.421 7.529 7.429 7.125 6.800 6.719 7.063 7.808 8.740 9.569 10.049 + 5.973 6.262 6.645 6.921 7.091 7.388 8.062 9.093 10.062 10.353 9.584 7.963 6.281 5.484 6.081 7.799 9.728 10.875 10.751 9.599 8.147 7.099 6.730 6.848 7.058 7.084 6.906 6.674 6.541 6.579 6.821 7.317 8.111 9.133 10.134 10.764 + 6.624 6.489 6.315 6.239 6.386 6.850 7.666 8.734 9.726 10.130 9.515 7.916 6.022 4.896 5.315 7.179 9.466 10.871 10.672 9.199 7.521 6.626 6.749 7.343 7.653 7.351 6.716 6.283 6.340 6.761 7.234 7.622 8.053 8.689 9.447 9.985 + 7.094 6.802 6.384 6.107 6.230 6.873 7.929 9.058 9.788 9.740 8.852 7.493 6.333 6.015 6.775 8.281 9.793 10.588 10.362 9.351 8.112 7.146 6.633 6.445 6.368 6.312 6.337 6.522 6.833 7.134 7.326 7.452 7.664 8.060 8.549 8.895 + 4.498 4.608 4.660 4.581 4.599 5.123 6.335 7.875 8.972 8.977 7.897 6.454 5.602 5.873 7.070 8.496 9.478 9.759 9.477 8.881 8.106 7.190 6.258 5.587 5.460 5.913 6.646 7.212 7.332 7.086 6.821 6.874 7.349 8.084 8.790 9.211 + 4.972 5.469 6.117 6.554 6.728 6.910 7.361 7.994 8.371 8.069 7.092 5.960 5.354 5.643 6.654 7.859 8.772 9.203 9.219 8.925 8.340 7.478 6.505 5.749 5.500 5.773 6.268 6.595 6.573 6.358 6.294 6.632 7.355 8.225 8.958 9.362 + 6.673 6.921 7.097 6.895 6.369 5.939 6.029 6.664 7.406 7.694 7.290 6.466 5.780 5.655 6.134 6.948 7.783 8.453 8.866 8.908 8.438 7.449 6.223 5.267 5.011 5.494 6.314 6.907 6.951 6.574 6.231 6.355 7.080 8.183 9.251 9.896 + 8.421 7.976 7.452 7.289 7.657 8.329 8.854 8.875 8.348 7.510 6.686 6.108 5.865 5.965 6.387 7.060 7.809 8.373 8.513 8.158 7.458 6.695 6.127 5.869 5.880 6.037 6.208 6.298 6.268 6.166 6.143 6.408 7.100 8.152 9.246 9.949 + 8.608 8.499 8.502 8.774 9.156 9.238 8.731 7.783 6.925 6.645 6.976 7.474 7.611 7.241 6.714 6.543 6.940 7.633 8.113 8.067 7.602 7.100 6.866 6.908 7.016 7.011 6.894 6.790 6.782 6.840 6.916 7.067 7.437 8.089 8.852 9.376 + 7.775 7.650 7.734 8.293 9.136 9.652 9.300 8.112 6.739 5.968 6.114 6.822 7.413 7.475 7.162 6.969 7.231 7.808 8.215 8.063 7.391 6.624 6.227 6.378 6.904 7.484 7.877 8.011 7.924 7.684 7.386 7.178 7.219 7.559 8.050 8.410 + 7.386 7.513 7.809 8.233 8.563 8.495 7.894 6.967 6.184 5.959 6.366 7.110 7.780 8.152 8.292 8.394 8.535 8.595 8.390 7.883 7.255 6.777 6.613 6.733 6.991 7.259 7.471 7.573 7.471 7.093 6.521 6.039 5.981 6.466 7.246 7.830 + 7.461 7.380 7.440 7.800 8.288 8.466 8.006 7.046 6.160 5.938 6.513 7.441 8.060 8.001 7.440 6.898 6.792 7.122 7.531 7.623 7.253 6.568 5.843 5.289 5.004 5.017 5.311 5.794 6.272 6.521 6.455 6.211 6.069 6.220 6.592 6.903 + 8.462 7.689 6.883 6.828 7.605 8.502 8.645 7.782 6.490 5.638 5.621 6.055 6.211 5.735 4.988 4.707 5.314 6.512 7.514 7.670 6.925 5.772 4.788 4.238 4.026 3.962 3.992 4.200 4.624 5.141 5.556 5.783 5.915 6.097 6.356 6.559 + 8.672 8.266 7.660 7.113 6.782 6.661 6.665 6.729 6.816 6.850 6.683 6.187 5.419 4.692 4.429 4.867 5.830 6.783 7.155 6.716 5.710 4.660 4.008 3.848 3.959 4.050 4.011 3.973 4.155 4.657 5.362 6.014 6.390 6.434 6.274 6.118 + 8.001 6.972 5.779 5.381 5.994 6.955 7.370 6.914 6.047 5.493 5.537 5.826 5.831 5.456 5.162 5.470 6.354 7.158 7.143 6.177 4.894 4.167 4.382 5.161 5.758 5.725 5.239 4.830 4.845 5.174 5.444 5.433 5.260 5.192 5.327 5.500 + 7.231 7.282 7.417 7.629 7.817 7.821 7.531 6.989 6.371 5.875 5.599 5.516 5.556 5.698 5.975 6.391 6.833 7.092 6.988 6.505 5.821 5.201 4.836 4.754 4.859 5.033 5.208 5.369 5.492 5.527 5.424 5.186 4.887 4.619 4.444 4.365 + 9.213 8.523 7.671 7.256 7.457 7.906 8.042 7.595 6.780 6.063 5.745 5.756 5.807 5.725 5.608 5.685 6.031 6.442 6.592 6.326 5.796 5.332 5.165 5.275 5.466 5.580 5.609 5.642 5.716 5.757 5.677 5.495 5.352 5.379 5.558 5.727 + 8.596 8.143 7.587 7.313 7.404 7.590 7.516 7.067 6.454 5.997 5.836 5.853 5.855 5.813 5.893 6.241 6.753 7.071 6.864 6.128 5.238 4.673 4.649 4.977 5.261 5.232 4.951 4.703 4.720 4.983 5.266 5.335 5.122 4.741 4.373 4.158 + 8.541 7.924 7.170 6.828 7.068 7.565 7.814 7.558 6.960 6.397 6.099 5.993 5.860 5.621 5.441 5.554 5.974 6.403 6.444 5.931 5.085 4.357 4.090 4.298 4.722 5.069 5.218 5.226 5.190 5.127 4.983 4.733 4.437 4.197 4.069 4.028 + 9.994 9.823 9.569 9.293 8.942 8.371 7.504 6.459 5.525 4.991 4.955 5.287 5.745 6.144 6.424 6.592 6.625 6.459 6.072 5.564 5.128 4.918 4.937 5.051 5.125 5.153 5.251 5.524 5.933 6.283 6.364 6.112 5.642 5.160 4.816 4.652 + 8.106 8.000 7.966 8.141 8.412 8.443 7.948 6.978 5.958 5.412 5.597 6.328 7.125 7.550 7.459 7.008 6.460 5.991 5.640 5.375 5.175 5.037 4.932 4.803 4.624 4.463 4.462 4.716 5.165 5.596 5.769 5.578 5.106 4.553 4.107 3.870 + 5.954 5.951 6.206 6.883 7.725 8.147 7.711 6.560 5.385 4.896 5.273 6.056 6.571 6.497 6.064 5.748 5.790 5.989 5.951 5.505 4.879 4.473 4.476 4.705 4.817 4.667 4.459 4.544 5.063 5.784 6.263 6.191 5.593 4.766 4.050 3.654 + 5.301 4.938 4.460 4.191 4.313 4.747 5.208 5.382 5.112 4.479 3.759 3.283 3.277 3.750 4.475 5.094 5.304 5.034 4.489 4.017 3.871 4.030 4.219 4.136 3.694 3.109 2.735 2.794 3.206 3.661 3.855 3.701 3.352 3.034 2.865 2.818 + 3.486 3.585 3.854 4.318 4.849 5.186 5.103 4.590 3.902 3.400 3.316 3.601 3.994 4.229 4.236 4.163 4.228 4.521 4.923 5.199 5.182 4.884 4.471 4.114 3.871 3.677 3.441 3.158 2.920 2.830 2.888 2.968 2.906 2.637 2.261 1.990 + 2.887 2.984 3.454 4.452 5.669 6.446 6.298 5.360 4.301 3.761 3.841 4.115 4.129 3.886 3.820 4.301 5.185 5.882 5.899 5.319 4.726 4.639 4.986 5.165 4.625 3.429 2.236 1.722 1.986 2.497 2.622 2.201 1.637 1.434 1.689 2.024 + 4.276 3.781 3.205 3.035 3.447 4.175 4.737 4.796 4.378 3.796 3.408 3.403 3.746 4.253 4.681 4.809 4.525 3.938 3.393 3.329 3.961 5.049 5.955 6.040 5.131 3.672 2.419 1.890 2.031 2.343 2.359 2.030 1.697 1.710 2.067 2.419 + 4.847 4.340 3.761 3.631 4.132 4.950 5.504 5.381 4.653 3.812 3.408 3.653 4.304 4.883 5.049 4.814 4.472 4.325 4.452 4.711 4.922 5.063 5.269 5.662 6.170 6.512 6.401 5.778 4.889 4.123 3.737 3.695 3.748 3.669 3.441 3.238 + 5.174 4.508 3.757 3.619 4.355 5.572 6.509 6.591 5.821 4.716 3.881 3.589 3.674 3.792 3.770 3.740 3.955 4.491 5.120 5.490 5.458 5.253 5.317 5.929 6.933 7.814 8.077 7.626 6.824 6.192 5.990 6.038 5.911 5.349 4.517 3.896 + 4.849 4.631 4.335 4.190 4.391 4.949 5.617 5.984 5.728 4.860 3.751 2.898 2.597 2.777 3.134 3.419 3.633 3.946 4.458 5.050 5.482 5.646 5.711 5.990 6.632 7.440 7.992 7.989 7.507 6.916 6.554 6.442 6.318 5.941 5.365 4.922 + 6.532 5.672 4.521 3.812 3.926 4.649 5.360 5.479 4.852 3.806 2.885 2.498 2.708 3.276 3.866 4.236 4.320 4.197 4.023 3.978 4.208 4.782 5.635 6.568 7.321 7.687 7.614 7.216 6.702 6.263 6.000 5.909 5.925 5.978 6.024 6.047 + 4.940 4.299 3.591 3.471 4.125 5.115 5.753 5.641 4.938 4.156 3.713 3.658 3.747 3.759 3.699 3.733 3.969 4.326 4.637 4.858 5.145 5.707 6.569 7.477 8.058 8.088 7.649 7.038 6.538 6.257 6.140 6.101 6.116 6.203 6.343 6.454 + 4.919 4.773 4.594 4.524 4.628 4.847 5.060 5.190 5.267 5.397 5.635 5.890 5.945 5.621 4.954 4.249 3.929 4.269 5.210 6.391 7.383 7.952 8.153 8.199 8.244 8.252 8.078 7.644 7.064 6.577 6.366 6.417 6.548 6.577 6.473 6.357 + 4.517 4.713 4.960 5.081 5.004 4.832 4.784 5.051 5.658 6.422 7.026 7.177 6.758 5.904 4.958 4.321 4.274 4.844 5.797 6.770 7.467 7.793 7.862 7.865 7.918 7.981 7.919 7.638 7.176 6.694 6.365 6.263 6.339 6.479 6.593 6.649 + 6.161 5.592 4.869 4.469 4.554 4.906 5.217 5.410 5.672 6.173 6.777 7.061 6.689 5.784 4.938 4.790 5.534 6.747 7.728 8.026 7.746 7.382 7.368 7.744 8.178 8.289 7.952 7.347 6.757 6.341 6.071 5.829 5.546 5.248 5.006 4.876 + 4.854 4.903 4.952 4.999 5.153 5.567 6.278 7.107 7.737 7.925 7.670 7.188 6.746 6.504 6.503 6.753 7.283 8.067 8.906 9.450 9.415 8.834 8.102 7.709 7.851 8.267 8.444 8.052 7.212 6.377 5.921 5.825 5.736 5.343 4.700 4.196 + 5.340 4.994 4.530 4.272 4.449 5.067 5.923 6.745 7.356 7.746 7.999 8.160 8.192 8.052 7.839 7.823 8.265 9.157 10.106 10.533 10.085 8.950 7.782 7.261 7.587 8.335 8.784 8.458 7.451 6.283 5.448 5.038 4.774 4.349 3.763 3.318 + 4.741 4.099 3.466 3.573 4.589 5.974 6.938 7.103 6.786 6.671 7.190 8.162 8.999 9.267 9.082 8.993 9.451 10.360 11.102 11.029 10.007 8.553 7.464 7.235 7.738 8.377 8.563 8.115 7.302 6.546 6.063 5.730 5.265 4.526 3.678 3.101 + 5.276 4.870 4.455 4.507 5.197 6.258 7.187 7.623 7.588 7.416 7.450 7.791 8.288 8.762 9.215 9.816 10.656 11.517 11.907 11.403 10.047 8.445 7.438 7.533 8.535 9.665 10.092 9.491 8.200 6.888 6.024 5.571 5.141 4.429 3.531 2.886 + 5.054 4.748 4.560 4.928 5.872 6.925 7.520 7.473 7.126 7.039 7.506 8.329 9.057 9.437 9.650 10.111 10.997 11.957 12.296 11.525 9.821 8.012 7.052 7.389 8.675 10.035 10.646 10.223 9.071 7.755 6.677 5.870 5.134 4.313 3.497 2.969 + 5.647 5.186 4.733 4.827 5.609 6.707 7.545 7.817 7.706 7.685 8.091 8.864 9.649 10.166 10.467 10.846 11.482 12.152 12.315 11.531 9.892 8.086 7.006 7.170 8.371 9.818 10.648 10.431 9.347 7.945 6.734 5.895 5.312 4.802 4.328 4.020 + 4.104 4.413 4.995 5.757 6.543 7.183 7.581 7.782 7.955 8.280 8.823 9.488 10.101 10.553 10.886 11.226 11.616 11.885 11.707 10.843 9.400 7.886 6.972 7.087 8.125 9.486 10.437 10.537 9.845 8.785 7.809 7.118 6.644 6.232 5.843 5.585 + 5.250 4.804 4.362 4.452 5.247 6.439 7.515 8.159 8.451 8.708 9.161 9.769 10.319 10.680 10.935 11.261 11.676 11.925 11.627 10.604 9.096 7.684 6.956 7.170 8.134 9.351 10.298 10.649 10.354 9.575 8.592 7.694 7.087 6.829 6.824 6.890 + 5.360 5.024 4.711 4.839 5.540 6.553 7.437 7.918 8.073 8.220 8.641 9.359 10.160 10.790 11.147 11.290 11.305 11.163 10.723 9.876 8.710 7.543 6.798 6.787 7.552 8.826 10.141 11.007 11.106 10.413 9.209 7.949 7.048 6.677 6.710 6.847 + 5.429 5.127 4.790 4.776 5.288 6.215 7.188 7.824 8.001 7.963 8.135 8.793 9.814 10.741 11.119 10.827 10.144 9.485 9.043 8.658 8.041 7.150 6.358 6.242 7.125 8.752 10.396 11.301 11.143 10.164 8.913 7.858 7.165 6.753 6.500 6.364 + 5.628 5.336 4.986 4.897 5.264 6.029 6.903 7.566 7.880 7.983 8.165 8.631 9.321 9.946 10.209 10.036 9.599 9.138 8.733 8.253 7.548 6.698 6.080 6.148 7.071 8.536 9.896 10.562 10.348 9.519 8.539 7.749 7.223 6.866 6.596 6.432 + 6.718 6.390 6.004 5.897 6.227 6.860 7.478 7.815 7.837 7.732 7.741 7.965 8.303 8.566 8.638 8.550 8.394 8.192 7.842 7.231 6.418 5.708 5.510 6.056 7.194 8.430 9.224 9.318 8.858 8.232 7.758 7.484 7.238 6.859 6.388 6.050 + 6.115 5.893 5.657 5.663 6.025 6.642 7.294 7.796 8.091 8.225 8.247 8.157 7.944 7.656 7.426 7.388 7.577 7.889 8.149 8.241 8.181 8.082 8.045 8.076 8.090 7.996 7.775 7.493 7.234 7.030 6.836 6.576 6.211 5.778 5.384 5.148 + 6.682 6.676 6.749 6.985 7.377 7.820 8.188 8.407 8.463 8.355 8.070 7.636 7.184 6.942 7.100 7.643 8.312 8.749 8.747 8.397 8.000 7.822 7.893 8.009 7.939 7.618 7.185 6.826 6.604 6.422 6.143 5.749 5.358 5.114 5.050 5.071 + 6.746 6.856 7.073 7.386 7.761 8.143 8.465 8.655 8.650 8.414 7.974 7.447 7.027 6.901 7.145 7.653 8.168 8.426 8.313 7.924 7.491 7.216 7.136 7.125 7.011 6.718 6.317 5.965 5.770 5.711 5.649 5.434 5.005 4.435 3.893 3.565 + 7.191 7.207 7.095 6.752 6.296 6.034 6.228 6.855 7.591 8.039 8.007 7.614 7.149 6.841 6.732 6.738 6.785 6.872 7.008 7.133 7.135 6.957 6.682 6.474 6.419 6.415 6.248 5.787 5.130 4.538 4.218 4.147 4.104 3.891 3.530 3.243 + 11.848 11.422 10.815 10.353 10.227 10.380 10.558 10.488 10.054 9.356 8.627 8.085 7.820 7.775 7.822 7.845 7.797 7.687 7.541 7.367 7.156 6.899 6.609 6.324 6.090 5.930 5.833 5.750 5.620 5.389 5.038 4.588 4.097 3.639 3.288 3.097 + 12.445 11.616 10.485 9.716 9.636 10.044 10.415 10.313 9.666 8.734 7.871 7.289 7.018 6.993 7.153 7.439 7.744 7.910 7.825 7.505 7.097 6.751 6.499 6.251 5.915 5.529 5.257 5.250 5.490 5.772 5.836 5.554 5.004 4.390 3.906 3.652 + 7.958 8.039 7.977 7.530 6.676 5.680 4.934 4.687 4.884 5.234 5.434 5.391 5.271 5.354 5.828 6.663 7.631 8.449 8.919 9.003 8.799 8.454 8.079 7.699 7.281 6.790 6.258 5.794 5.517 5.458 5.489 5.375 4.923 4.139 3.277 2.709 + 6.625 6.682 6.809 6.985 7.122 7.077 6.747 6.164 5.525 5.092 5.030 5.294 5.660 5.913 6.028 6.205 6.700 7.575 8.581 9.295 9.418 8.998 8.386 7.952 7.791 7.671 7.268 6.482 5.552 4.858 4.593 4.582 4.443 3.930 3.181 2.621 + 7.617 7.072 6.524 6.567 7.310 8.231 8.586 7.999 6.757 5.568 5.001 5.093 5.427 5.581 5.532 5.660 6.369 7.663 9.064 9.936 9.949 9.296 8.499 7.990 7.807 7.653 7.223 6.500 5.771 5.356 5.301 5.310 4.981 4.160 3.115 2.382 + 8.897 7.844 6.746 6.704 7.907 9.433 10.029 9.172 7.474 6.100 5.771 6.219 6.567 6.220 5.450 5.157 6.047 7.971 9.990 11.077 10.841 9.707 8.474 7.701 7.409 7.259 6.947 6.441 5.912 5.507 5.204 4.860 4.363 3.745 3.165 2.813 + 5.522 5.056 4.850 5.624 7.312 8.975 9.516 8.566 6.770 5.239 4.664 4.879 5.198 5.171 5.037 5.483 6.961 9.191 11.280 12.332 12.024 10.718 9.103 7.736 6.833 6.350 6.168 6.169 6.201 6.069 5.636 4.940 4.197 3.646 3.375 3.299 + 6.558 6.114 5.846 6.380 7.690 9.033 9.544 8.932 7.675 6.547 5.970 5.773 5.558 5.241 5.225 6.024 7.697 9.667 11.077 11.397 10.732 9.606 8.499 7.556 6.699 5.923 5.418 5.383 5.747 6.118 6.058 5.422 4.456 3.569 3.017 2.793 + 6.080 5.564 5.323 6.143 7.969 9.830 10.607 9.946 8.481 7.215 6.662 6.543 6.272 5.694 5.323 5.857 7.434 9.367 10.610 10.540 9.368 7.852 6.659 5.956 5.529 5.203 5.065 5.293 5.829 6.289 6.247 5.606 4.687 3.942 3.586 3.507 + 2.469 3.438 5.153 7.163 8.868 9.750 9.642 8.835 7.891 7.267 7.031 6.900 6.561 6.007 5.592 5.754 6.637 7.934 9.052 9.488 9.100 8.123 6.961 5.962 5.308 5.037 5.090 5.327 5.534 5.497 5.111 4.460 3.772 3.261 3.002 2.920 + 5.584 5.297 5.359 6.332 8.009 9.435 9.684 8.671 7.231 6.386 6.477 6.953 6.994 6.334 5.526 5.414 6.341 7.828 8.993 9.268 8.748 7.932 7.189 6.519 5.777 5.045 4.675 4.940 5.644 6.166 5.938 4.937 3.697 2.841 2.573 2.616 + 6.209 6.470 7.071 7.980 8.893 9.322 8.924 7.785 6.417 5.414 5.056 5.173 5.369 5.409 5.421 5.752 6.630 7.916 9.154 9.868 9.851 9.240 8.370 7.551 6.947 6.585 6.424 6.397 6.414 6.371 6.201 5.918 5.615 5.394 5.290 5.264 + 7.181 7.453 8.009 8.732 9.290 9.263 8.451 7.096 5.786 5.073 5.096 5.515 5.829 5.810 5.694 5.973 6.960 8.487 9.973 10.796 10.679 9.814 8.688 7.774 7.310 7.264 7.448 7.645 7.696 7.539 7.218 6.859 6.608 6.538 6.611 6.700 + 7.231 7.354 7.806 8.673 9.628 10.056 9.521 8.186 6.738 5.869 5.744 5.947 5.942 5.617 5.407 5.881 7.175 8.800 9.985 10.261 9.767 9.049 8.587 8.462 8.425 8.221 7.826 7.407 7.106 6.900 6.675 6.403 6.196 6.184 6.351 6.521 + 6.973 6.903 7.017 7.539 8.361 9.036 9.089 8.390 7.269 6.273 5.767 5.733 5.883 5.980 6.048 6.308 6.929 7.831 8.715 9.285 9.454 9.357 9.205 9.104 9.006 8.798 8.423 7.920 7.383 6.893 6.491 6.199 6.035 6.000 6.051 6.107 + 5.624 5.582 5.855 6.756 8.121 9.295 9.566 8.700 7.123 5.610 4.752 4.642 4.980 5.422 5.839 6.304 6.890 7.541 8.133 8.608 9.016 9.400 9.665 9.608 9.109 8.289 7.475 6.957 6.763 6.666 6.415 5.971 5.531 5.317 5.359 5.476 + 6.840 6.407 6.007 6.163 6.988 8.055 8.708 8.548 7.678 6.557 5.629 5.055 4.736 4.548 4.507 4.736 5.286 6.031 6.740 7.266 7.642 8.015 8.463 8.892 9.103 8.954 8.474 7.829 7.192 6.650 6.211 5.875 5.675 5.633 5.707 5.790 + 6.112 6.171 6.386 6.866 7.602 8.369 8.781 8.502 7.514 6.213 5.200 4.883 5.174 5.577 5.613 5.250 4.949 5.260 6.303 7.604 8.455 8.500 8.034 7.736 8.054 8.799 9.299 8.980 7.862 6.541 5.695 5.572 5.892 6.189 6.239 6.160 + 5.188 5.341 5.635 6.090 6.742 7.534 8.217 8.432 7.962 6.978 5.979 5.428 5.368 5.397 5.083 4.450 4.072 4.595 6.106 7.922 9.071 9.070 8.324 7.761 8.011 8.867 9.503 9.254 8.223 7.170 6.798 7.129 7.539 7.403 6.714 6.069 + 5.249 5.522 6.110 7.018 8.112 9.083 9.540 9.224 8.192 6.839 5.678 5.027 4.839 4.826 4.778 4.790 5.177 6.120 7.384 8.384 8.621 8.098 7.354 7.036 7.355 7.921 8.116 7.676 6.957 6.631 7.058 7.928 8.501 8.259 7.381 6.611 + 5.442 5.593 6.019 6.807 7.821 8.674 8.916 8.329 7.105 5.755 4.792 4.408 4.406 4.434 4.333 4.294 4.676 5.628 6.852 7.735 7.795 7.071 6.117 5.599 5.796 6.428 6.942 6.997 6.728 6.567 6.810 7.318 7.646 7.461 6.875 6.367 + 6.098 6.571 7.277 7.882 8.136 7.965 7.441 6.720 5.990 5.431 5.148 5.084 5.023 4.746 4.267 3.928 4.191 5.232 6.658 7.668 7.602 6.476 5.045 4.277 4.632 5.746 6.754 7.008 6.547 5.962 5.801 6.080 6.329 6.106 5.455 4.885 + 5.796 5.973 6.337 6.852 7.374 7.665 7.496 6.818 5.840 4.952 4.494 4.519 4.759 4.834 4.569 4.156 4.005 4.379 5.118 5.711 5.689 5.024 4.188 3.808 4.171 5.011 5.733 5.895 5.528 5.040 4.819 4.902 4.999 4.822 4.391 4.022 + 4.768 5.057 5.581 6.196 6.657 6.713 6.269 5.492 4.741 4.339 4.355 4.552 4.586 4.293 3.853 3.660 4.002 4.797 5.593 5.881 5.461 4.603 3.857 3.657 4.023 4.584 4.878 4.710 4.255 3.874 3.798 3.954 4.062 3.911 3.551 3.250 + 4.441 5.195 6.375 7.465 7.979 7.678 6.678 5.379 4.259 3.626 3.487 3.598 3.675 3.598 3.487 3.577 4.014 4.703 5.347 5.642 5.479 5.021 4.586 4.421 4.549 4.772 4.831 4.588 4.118 3.636 3.349 3.333 3.519 3.769 3.970 4.075 + 4.544 5.286 6.313 7.039 7.126 6.622 5.802 4.915 4.082 3.376 2.922 2.855 3.167 3.632 3.956 4.037 4.069 4.360 4.992 5.665 5.904 5.485 4.679 4.068 4.065 4.567 5.053 5.049 4.532 3.922 3.677 3.895 4.268 4.417 4.259 4.040 + 4.649 5.394 6.515 7.465 7.801 7.381 6.397 5.243 4.307 3.808 3.734 3.901 4.084 4.158 4.159 4.237 4.519 4.979 5.418 5.579 5.344 4.842 4.378 4.224 4.412 4.716 4.833 4.620 4.205 3.866 3.805 3.985 4.190 4.222 4.077 3.920 + 4.255 5.015 6.107 7.002 7.427 7.459 7.307 7.040 6.533 5.669 4.573 3.623 3.191 3.370 3.922 4.493 4.879 5.101 5.257 5.339 5.236 4.907 4.529 4.407 4.716 5.303 5.769 5.788 5.377 4.871 4.623 4.706 4.896 4.918 4.725 4.518 + 4.955 5.146 5.441 5.770 6.149 6.616 7.081 7.275 6.903 5.919 4.659 3.683 3.400 3.790 4.448 4.919 5.036 4.982 5.057 5.378 5.798 6.089 6.182 6.224 6.408 6.742 7.012 6.963 6.534 5.919 5.406 5.151 5.092 5.068 4.993 4.915 + 5.095 5.414 5.935 6.510 7.024 7.379 7.432 7.019 6.092 4.873 3.821 3.381 3.667 4.366 4.968 5.157 5.033 4.966 5.229 5.744 6.178 6.291 6.186 6.225 6.668 7.386 7.928 7.898 7.294 6.507 5.990 5.905 6.054 6.133 6.030 5.886 + 4.823 5.191 5.763 6.323 6.729 6.936 6.933 6.683 6.165 5.471 4.856 4.630 4.949 5.680 6.456 6.895 6.833 6.369 5.753 5.195 4.798 4.596 4.633 4.955 5.528 6.175 6.650 6.800 6.680 6.512 6.502 6.680 6.905 7.013 6.971 6.889 + 3.869 4.439 5.418 6.530 7.463 7.970 7.950 7.464 6.686 5.823 5.059 4.546 4.404 4.697 5.365 6.181 6.802 6.917 6.443 5.596 4.795 4.434 4.663 5.332 6.115 6.722 7.044 7.156 7.203 7.277 7.372 7.421 7.373 7.238 7.080 6.975 + 4.834 5.070 5.668 6.628 7.621 8.102 7.705 6.584 5.354 4.663 4.744 5.320 5.918 6.273 6.459 6.672 6.921 6.967 6.582 5.849 5.194 5.077 5.618 6.501 7.230 7.517 7.450 7.326 7.344 7.451 7.452 7.250 6.938 6.700 6.621 6.634 + 5.022 5.438 6.243 7.283 8.221 8.646 8.312 7.344 6.206 5.435 5.323 5.777 6.439 6.952 7.157 7.092 6.866 6.536 6.114 5.656 5.311 5.256 5.568 6.145 6.753 7.172 7.313 7.234 7.062 6.892 6.755 6.640 6.541 6.463 6.415 6.396 + 4.288 4.935 5.910 6.743 7.048 6.709 5.913 5.028 4.399 4.189 4.348 4.694 5.050 5.326 5.512 5.607 5.573 5.353 4.939 4.441 4.062 3.993 4.296 4.848 5.397 5.704 5.669 5.367 4.984 4.690 4.553 4.523 4.501 4.424 4.307 4.218 + 4.591 4.878 5.425 6.124 6.750 7.018 6.726 5.888 4.747 3.645 2.846 2.430 2.335 2.486 2.876 3.531 4.384 5.197 5.639 5.485 4.800 3.946 3.372 3.330 3.720 4.181 4.354 4.126 3.673 3.279 3.101 3.057 2.933 2.595 2.129 1.790 + 4.010 4.467 5.229 6.055 6.706 7.018 6.937 6.504 5.832 5.056 4.300 3.665 3.246 3.157 3.522 4.385 5.591 6.741 7.325 7.009 5.895 4.539 3.646 3.619 4.282 5.020 5.242 4.823 4.168 3.838 4.050 4.478 4.531 3.882 2.796 1.965 + 2.478 3.475 4.912 6.105 6.729 6.948 7.126 7.427 7.664 7.506 6.816 5.796 4.861 4.393 4.587 5.443 6.770 8.156 9.001 8.754 7.311 5.270 3.691 3.425 4.465 5.899 6.591 6.067 4.871 4.052 4.212 4.957 5.251 4.393 2.715 1.369 + 2.420 3.149 4.292 5.430 6.297 6.887 7.350 7.798 8.178 8.307 8.005 7.248 6.234 5.357 5.076 5.695 7.124 8.783 9.796 9.467 7.776 5.520 3.888 3.705 4.860 6.399 7.233 6.940 6.013 5.363 5.501 6.098 6.314 5.589 4.207 3.108 + 0.729 2.160 4.180 5.714 6.189 5.855 5.486 5.734 6.659 7.745 8.338 8.123 7.327 6.551 6.390 7.098 8.436 9.769 10.365 9.775 8.126 6.115 4.648 4.300 4.948 5.888 6.370 6.161 5.672 5.537 5.988 6.589 6.583 5.581 3.993 2.796 + 1.407 2.638 4.358 5.644 6.065 5.914 5.869 6.394 7.396 8.346 8.732 8.429 7.750 7.216 7.248 7.967 9.139 10.236 10.625 9.877 8.088 5.960 4.476 4.292 5.262 6.514 7.100 6.719 5.926 5.598 6.117 6.966 7.153 6.108 4.277 2.858 + 2.843 3.583 4.669 5.576 5.983 5.962 5.890 6.161 6.893 7.833 8.517 8.597 8.095 7.449 7.260 7.902 9.213 10.508 10.948 10.070 8.134 6.029 4.742 4.742 5.701 6.766 7.196 6.875 6.315 6.150 6.549 7.034 6.878 5.761 4.126 2.925 + 2.911 3.234 3.822 4.532 5.167 5.582 5.810 6.078 6.637 7.517 8.429 8.938 8.816 8.288 7.937 8.271 9.282 10.354 10.646 9.694 7.796 5.865 4.853 5.146 6.355 7.634 8.263 8.061 7.380 6.728 6.350 6.096 5.632 4.800 3.812 3.132 + 2.656 3.211 3.998 4.602 4.806 4.730 4.733 5.162 6.109 7.343 8.434 8.991 8.895 8.392 7.986 8.145 8.968 10.026 10.554 9.928 8.154 5.992 4.546 4.557 5.886 7.594 8.596 8.390 7.324 6.211 5.630 5.498 5.267 4.510 3.384 2.534 + 3.035 3.291 3.645 3.893 3.926 3.828 3.853 4.299 5.321 6.793 8.299 9.305 9.465 8.891 8.163 8.003 8.753 10.028 10.866 10.375 8.432 5.912 4.170 4.107 5.516 7.240 8.046 7.545 6.407 5.711 5.977 6.718 6.889 5.856 4.031 2.610 + 3.982 3.925 3.925 4.099 4.464 4.916 5.344 5.755 6.290 7.081 8.066 8.939 9.340 9.165 8.734 8.605 9.135 10.094 10.723 10.256 8.552 6.333 4.751 4.585 5.669 7.029 7.642 7.212 6.336 5.908 6.297 6.989 7.033 5.907 4.068 2.668 + 1.115 1.953 3.216 4.350 4.991 5.147 5.120 5.279 5.849 6.816 7.953 8.924 9.441 9.433 9.139 9.000 9.340 10.046 10.523 10.082 8.517 6.424 4.891 4.734 5.853 7.265 7.861 7.281 6.170 5.580 6.006 6.918 7.211 6.209 4.340 2.867 + 1.946 2.323 2.953 3.664 4.324 4.880 5.334 5.736 6.181 6.795 7.640 8.611 9.427 9.811 9.725 9.463 9.434 9.771 10.123 9.875 8.693 6.928 5.481 5.150 5.970 7.147 7.667 7.126 6.037 5.341 5.540 6.219 6.413 5.497 3.827 2.512 + 1.151 1.862 2.956 4.024 4.860 5.518 6.157 6.842 7.506 8.067 8.533 8.965 9.352 9.578 9.556 9.380 9.292 9.428 9.581 9.282 8.221 6.653 5.365 5.126 6.042 7.400 8.203 7.963 7.072 6.396 6.435 6.836 6.707 5.489 3.586 2.143 + -1.014 0.144 1.935 3.694 5.049 6.031 6.834 7.531 8.021 8.234 8.292 8.430 8.748 9.089 9.205 9.063 8.924 9.057 9.372 9.379 8.633 7.259 6.031 5.795 6.708 8.000 8.562 7.890 6.539 5.622 5.777 6.541 6.743 5.602 3.534 1.905 + 1.104 1.557 2.368 3.429 4.670 5.992 7.173 7.911 8.035 7.707 7.369 7.410 7.833 8.259 8.311 8.025 7.861 8.249 9.074 9.651 9.292 7.985 6.519 5.864 6.315 7.205 7.493 6.734 5.526 4.962 5.562 6.673 6.966 5.633 3.230 1.348 + 0.696 1.327 2.402 3.674 4.953 6.107 6.994 7.453 7.438 7.145 6.953 7.165 7.746 8.350 8.641 8.633 8.680 9.091 9.714 9.951 9.254 7.704 6.076 5.269 5.553 6.331 6.675 6.186 5.360 5.106 5.806 6.820 6.956 5.547 3.179 1.361 + 1.937 2.208 2.718 3.428 4.293 5.249 6.182 6.968 7.535 7.915 8.209 8.475 8.679 8.754 8.733 8.791 9.086 9.528 9.703 9.136 7.728 5.993 4.810 4.788 5.763 6.861 7.175 6.492 5.462 5.017 5.514 6.364 6.507 5.354 3.390 1.880 + 4.006 3.975 3.915 3.909 4.139 4.774 5.790 6.919 7.803 8.252 8.363 8.375 8.431 8.472 8.389 8.235 8.232 8.509 8.827 8.643 7.558 5.782 4.149 3.552 4.235 5.543 6.429 6.285 5.408 4.662 4.656 5.181 5.426 4.778 3.458 2.383 + 4.412 4.283 4.134 4.121 4.364 4.867 5.508 6.101 6.503 6.673 6.665 6.556 6.396 6.226 6.121 6.187 6.453 6.759 6.768 6.166 4.943 3.506 2.489 2.330 2.950 3.798 4.266 4.145 3.750 3.606 3.949 4.492 4.667 4.142 3.159 2.385 + 4.074 3.949 3.894 4.125 4.681 5.379 5.955 6.263 6.361 6.409 6.495 6.547 6.434 6.138 5.838 5.786 6.063 6.431 6.445 5.782 4.533 3.214 2.449 2.548 3.288 4.079 4.380 4.070 3.476 3.073 3.100 3.396 3.575 3.376 2.894 2.493 + 3.455 3.646 3.836 3.889 3.948 4.350 5.283 6.507 7.446 7.606 6.972 6.025 5.368 5.293 5.645 6.051 6.247 6.205 5.993 5.611 4.995 4.201 3.513 3.278 3.603 4.185 4.522 4.333 3.813 3.453 3.562 3.950 4.077 3.568 2.608 1.844 + 4.820 4.542 4.058 3.565 3.378 3.782 4.805 6.105 7.108 7.348 6.770 5.769 4.935 4.697 5.101 5.852 6.513 6.728 6.337 5.403 4.194 3.113 2.550 2.685 3.345 4.066 4.375 4.104 3.491 2.976 2.839 2.989 3.072 2.817 2.298 1.874 + 5.434 4.709 3.742 3.188 3.444 4.397 5.497 6.119 5.962 5.217 4.394 3.964 4.063 4.481 4.896 5.129 5.221 5.281 5.294 5.094 4.534 3.700 2.929 2.586 2.779 3.256 3.600 3.562 3.231 2.912 2.807 2.821 2.654 2.116 1.358 0.800 + 5.330 4.900 4.250 3.674 3.377 3.380 3.553 3.744 3.913 4.152 4.599 5.295 6.106 6.780 7.086 6.951 6.496 5.943 5.481 5.188 5.048 5.027 5.131 5.387 5.773 6.168 6.392 6.305 5.903 5.339 4.838 4.583 4.624 4.877 5.181 5.380 + 6.991 6.393 5.658 5.336 5.648 6.328 6.863 6.922 6.616 6.406 6.741 7.719 9.023 10.127 10.622 10.403 9.659 8.719 7.898 7.421 7.403 7.845 8.630 9.535 10.292 10.689 10.641 10.204 9.533 8.824 8.256 7.963 7.992 8.276 8.649 8.906 + 6.287 6.548 7.002 7.513 7.903 8.033 7.894 7.633 7.472 7.580 7.972 8.534 9.127 9.672 10.146 10.500 10.613 10.359 9.743 9.002 8.528 8.651 9.410 10.498 11.424 11.788 11.481 10.705 9.810 9.097 8.705 8.607 8.696 8.856 9.004 9.090 + 7.949 7.262 6.472 6.257 6.842 7.843 8.613 8.775 8.477 8.201 8.336 8.903 9.630 10.229 10.596 10.774 10.786 10.563 10.061 9.427 8.997 9.085 9.729 10.628 11.342 11.579 11.341 10.832 10.257 9.703 9.198 8.815 8.679 8.850 9.211 9.500 + 8.993 8.449 7.782 7.508 7.837 8.523 9.064 9.088 8.625 8.073 7.904 8.347 9.264 10.260 10.922 11.015 10.539 9.690 8.768 8.091 7.903 8.282 9.092 10.025 10.731 10.978 10.755 10.242 9.690 9.294 9.122 9.139 9.261 9.410 9.534 9.603 + 8.319 8.296 8.387 8.721 9.253 9.749 9.937 9.720 9.269 8.917 8.939 9.369 10.003 10.554 10.830 10.800 10.542 10.132 9.618 9.071 8.654 8.585 9.007 9.833 10.737 11.309 11.303 10.793 10.116 9.639 9.523 9.645 9.737 9.615 9.326 9.084 + 9.131 8.704 8.269 8.297 8.889 9.686 10.152 9.997 9.371 8.705 8.377 8.505 8.981 9.647 10.393 11.098 11.553 11.512 10.897 9.960 9.200 9.056 9.593 10.454 11.124 11.288 11.010 10.604 10.347 10.294 10.303 10.222 10.021 9.784 9.604 9.519 + 9.665 8.972 8.086 7.624 7.859 8.562 9.240 9.533 9.439 9.224 9.155 9.318 9.640 10.033 10.470 10.922 11.258 11.275 10.863 10.163 9.539 9.352 9.709 10.399 11.055 11.400 11.376 11.081 10.635 10.112 9.591 9.224 9.181 9.512 10.040 10.435 + 10.470 9.936 9.270 8.965 9.241 9.910 10.551 10.826 10.678 10.290 9.900 9.661 9.629 9.809 10.178 10.624 10.932 10.878 10.397 9.688 9.115 8.970 9.273 9.779 10.177 10.306 10.208 10.010 9.769 9.454 9.058 8.699 8.573 8.782 9.203 9.537 + 10.006 9.623 9.214 9.157 9.481 9.834 9.800 9.277 8.573 8.143 8.218 8.667 9.168 9.496 9.644 9.686 9.597 9.232 8.524 7.672 7.092 7.115 7.702 8.433 8.817 8.664 8.198 7.840 7.854 8.170 8.505 8.626 8.511 8.303 8.142 8.071 + 8.114 7.555 6.877 6.624 7.034 7.865 8.579 8.735 8.292 7.604 7.151 7.220 7.757 8.460 8.998 9.177 8.984 8.512 7.892 7.258 6.753 6.505 6.570 6.883 7.279 7.583 7.720 7.750 7.798 7.937 8.111 8.160 7.948 7.477 6.926 6.556 + 8.367 7.615 6.634 6.090 6.331 7.163 8.036 8.435 8.196 7.532 6.823 6.352 6.198 6.279 6.473 6.674 6.805 6.809 6.673 6.465 6.307 6.299 6.442 6.636 6.766 6.803 6.823 6.933 7.161 7.422 7.582 7.560 7.381 7.146 6.951 6.847 + 7.284 6.888 6.243 5.587 5.156 5.092 5.385 5.866 6.271 6.364 6.070 5.538 5.076 4.968 5.280 5.805 6.193 6.200 5.863 5.457 5.271 5.383 5.615 5.719 5.610 5.455 5.522 5.918 6.466 6.819 6.735 6.263 5.696 5.325 5.225 5.256 + 5.950 5.293 4.517 4.235 4.622 5.289 5.636 5.355 4.649 4.007 3.781 3.948 4.226 4.376 4.384 4.374 4.410 4.400 4.227 3.934 3.745 3.879 4.338 4.873 5.192 5.201 5.054 4.980 5.051 5.134 5.050 4.780 4.494 4.383 4.471 4.599 + 3.925 3.559 3.265 3.485 4.206 4.944 5.158 4.726 4.008 3.485 3.328 3.325 3.211 3.017 3.070 3.618 4.467 5.040 4.845 3.940 2.947 2.571 3.046 3.991 4.777 5.066 5.020 5.044 5.353 5.768 5.913 5.586 4.922 4.250 3.808 3.623 + 4.607 3.846 2.927 2.551 2.953 3.744 4.274 4.180 3.638 3.146 3.072 3.373 3.718 3.828 3.720 3.637 3.780 4.124 4.472 4.666 4.724 4.780 4.909 5.040 5.048 4.920 4.802 4.877 5.177 5.521 5.639 5.379 4.810 4.154 3.628 3.349 + 5.093 5.065 4.992 4.861 4.684 4.495 4.332 4.201 4.075 3.923 3.748 3.610 3.597 3.760 4.065 4.393 4.601 4.611 4.460 4.275 4.197 4.288 4.502 4.730 4.873 4.915 4.911 4.941 5.032 5.133 5.141 4.966 4.594 4.106 3.648 3.371 + 5.798 5.512 5.152 4.963 5.018 5.174 5.197 4.952 4.492 3.989 3.603 3.411 3.441 3.717 4.245 4.935 5.550 5.798 5.517 4.821 4.062 3.619 3.669 4.104 4.653 5.083 5.321 5.427 5.473 5.467 5.375 5.195 4.990 4.840 4.778 4.770 + 5.582 5.418 5.006 4.348 3.663 3.316 3.537 4.204 4.891 5.176 4.964 4.544 4.342 4.585 5.152 5.705 5.965 5.871 5.543 5.132 4.739 4.437 4.333 4.539 5.049 5.679 6.147 6.279 6.137 5.954 5.904 5.938 5.839 5.455 4.893 4.473 + 6.107 5.778 5.271 4.804 4.544 4.531 4.681 4.857 4.953 4.934 4.832 4.696 4.561 4.449 4.383 4.401 4.534 4.776 5.062 5.292 5.381 5.307 5.131 4.961 4.894 4.976 5.190 5.477 5.765 5.980 6.059 5.959 5.681 5.290 4.907 4.670 + 4.506 4.436 4.468 4.782 5.382 6.050 6.483 6.491 6.106 5.522 4.948 4.504 4.213 4.081 4.131 4.375 4.753 5.122 5.337 5.350 5.247 5.172 5.213 5.340 5.451 5.482 5.471 5.527 5.724 6.015 6.242 6.233 5.917 5.379 4.823 4.472 + 5.170 5.681 6.308 6.591 6.377 5.905 5.575 5.602 5.871 6.096 6.086 5.877 5.637 5.471 5.342 5.167 4.951 4.813 4.848 5.007 5.116 5.050 4.878 4.824 5.055 5.509 5.929 6.082 5.955 5.746 5.653 5.673 5.623 5.344 4.899 4.555 + 11.161 10.337 9.080 7.900 7.109 6.703 6.506 6.402 6.432 6.687 7.117 7.474 7.474 7.025 6.330 5.748 5.528 5.648 5.869 5.961 5.886 5.794 5.854 6.085 6.338 6.431 6.310 6.101 5.995 6.091 6.307 6.442 6.325 5.946 5.471 5.145 + 8.923 8.582 7.938 7.142 6.469 6.175 6.280 6.503 6.463 5.997 5.323 4.859 4.857 5.179 5.432 5.336 4.983 4.724 4.813 5.148 5.372 5.244 4.894 4.716 4.984 5.575 6.075 6.181 5.990 5.884 6.108 6.470 6.479 5.823 4.740 3.908 + 3.815 3.933 4.151 4.466 4.914 5.504 6.142 6.620 6.736 6.457 5.973 5.570 5.406 5.387 5.262 4.879 4.366 4.065 4.262 4.932 5.719 6.184 6.124 5.697 5.282 5.192 5.477 5.941 6.320 6.448 6.307 5.965 5.500 4.994 4.549 4.283 + 5.567 5.351 5.130 5.130 5.387 5.728 5.936 5.944 5.849 5.775 5.721 5.579 5.290 4.966 4.835 5.024 5.412 5.705 5.683 5.410 5.183 5.264 5.638 6.026 6.135 5.933 5.669 5.651 5.962 6.383 6.573 6.345 5.781 5.135 4.638 4.385 + 6.450 6.191 5.800 5.452 5.267 5.252 5.321 5.373 5.370 5.345 5.359 5.431 5.508 5.507 5.378 5.158 4.946 4.831 4.831 4.886 4.913 4.882 4.837 4.858 4.995 5.226 5.479 5.679 5.796 5.833 5.790 5.646 5.378 5.010 4.641 4.407 + 6.980 7.034 6.946 6.555 5.941 5.409 5.225 5.380 5.595 5.581 5.297 4.968 4.849 4.979 5.173 5.227 5.135 5.084 5.233 5.514 5.680 5.549 5.218 5.003 5.154 5.616 6.062 6.185 5.964 5.645 5.479 5.462 5.353 4.950 4.342 3.879 + 10.021 9.590 8.910 8.243 7.790 7.592 7.522 7.359 6.899 6.070 5.004 4.016 3.484 3.643 4.416 5.404 6.079 6.097 5.515 4.750 4.296 4.389 4.883 5.401 5.644 5.593 5.462 5.463 5.607 5.711 5.586 5.214 4.770 4.457 4.344 4.343 + 7.305 7.501 7.815 8.096 8.150 7.837 7.150 6.243 5.353 4.682 4.331 4.314 4.613 5.170 5.827 6.300 6.286 5.677 4.719 3.923 3.750 4.275 5.105 5.660 5.597 5.047 4.482 4.315 4.583 4.964 5.078 4.803 4.329 3.945 3.785 3.771 + 6.640 6.965 7.467 7.944 8.249 8.365 8.371 8.371 8.420 8.499 8.553 8.543 8.476 8.404 8.390 8.470 8.620 8.756 8.764 8.555 8.120 7.547 6.977 6.520 6.202 5.967 5.745 5.534 5.405 5.441 5.642 5.900 6.059 6.034 5.877 5.736 + 8.672 8.737 8.842 8.950 9.030 9.070 9.077 9.076 9.096 9.157 9.248 9.327 9.343 9.281 9.196 9.191 9.334 9.579 9.751 9.636 9.127 8.322 7.479 6.855 6.545 6.444 6.364 6.206 6.038 6.027 6.271 6.703 7.128 7.376 7.426 7.391 + 7.185 7.375 7.540 7.429 6.972 6.318 5.700 5.224 4.799 4.258 3.562 2.892 2.530 2.627 3.048 3.443 3.499 3.175 2.726 2.517 2.745 3.304 3.877 4.171 4.113 3.875 3.719 3.802 4.082 4.377 4.503 4.395 4.119 3.805 3.561 3.434 + 7.024 7.224 7.366 7.168 6.588 5.843 5.205 4.776 4.456 4.123 3.804 3.661 3.788 4.057 4.182 3.965 3.493 3.065 2.933 3.078 3.265 3.294 3.204 3.218 3.481 3.875 4.107 4.003 3.708 3.566 3.784 4.193 4.370 4.025 3.308 2.728 + 7.667 7.538 7.129 6.351 5.377 4.591 4.312 4.533 4.923 5.099 4.926 4.575 4.310 4.230 4.195 4.006 3.623 3.215 2.993 3.011 3.139 3.222 3.243 3.320 3.537 3.815 3.961 3.879 3.705 3.709 4.024 4.475 4.689 4.428 3.833 3.344 + 6.008 5.831 5.543 5.261 5.124 5.204 5.443 5.652 5.621 5.270 4.715 4.206 3.945 3.953 4.067 4.083 3.919 3.673 3.531 3.617 3.902 4.239 4.467 4.510 4.392 4.195 4.005 3.890 3.894 4.018 4.200 4.320 4.265 4.011 3.668 3.425 + 5.432 5.582 5.767 5.835 5.695 5.389 5.072 4.926 5.048 5.384 5.767 6.017 6.051 5.916 5.739 5.627 5.609 5.632 5.634 5.597 5.550 5.528 5.519 5.475 5.360 5.209 5.134 5.259 5.629 6.161 6.673 6.978 6.983 6.735 6.399 6.167 + 4.767 4.697 4.658 4.740 4.903 4.976 4.793 4.338 3.791 3.406 3.330 3.511 3.758 3.902 3.917 3.901 3.956 4.077 4.150 4.066 3.833 3.584 3.471 3.529 3.637 3.611 3.355 2.949 2.599 2.483 2.622 2.861 2.993 2.910 2.681 2.491 + 5.884 5.475 4.815 4.143 3.660 3.447 3.446 3.526 3.575 3.553 3.491 3.437 3.409 3.395 3.384 3.404 3.505 3.704 3.943 4.108 4.099 3.909 3.629 3.378 3.221 3.132 3.044 2.933 2.841 2.831 2.898 2.939 2.821 2.501 2.091 1.803 + 5.347 5.320 5.262 5.168 5.031 4.864 4.698 4.566 4.474 4.378 4.217 3.972 3.706 3.539 3.558 3.736 3.937 4.008 3.896 3.681 3.500 3.422 3.390 3.288 3.061 2.784 2.614 2.648 2.833 3.003 3.010 2.840 2.610 2.454 2.415 2.434 + 5.306 5.193 5.017 4.823 4.609 4.350 4.064 3.843 3.794 3.937 4.156 4.272 4.193 3.993 3.852 3.894 4.083 4.252 4.267 4.137 3.991 3.932 3.916 3.785 3.430 2.928 2.520 2.430 2.683 3.077 3.331 3.281 2.964 2.552 2.214 2.036 + 3.356 3.697 4.290 4.969 5.519 5.754 5.604 5.165 4.661 4.334 4.309 4.530 4.802 4.916 4.777 4.440 4.059 3.780 3.663 3.673 3.736 3.793 3.824 3.822 3.779 3.680 3.534 3.391 3.321 3.359 3.460 3.513 3.413 3.145 2.813 2.584 + 2.669 3.327 4.221 4.849 5.003 4.852 4.698 4.661 4.599 4.321 3.844 3.426 3.344 3.626 4.025 4.243 4.197 4.054 4.025 4.129 4.172 3.963 3.525 3.103 2.931 3.015 3.141 3.106 2.930 2.821 2.938 3.179 3.240 2.909 2.306 1.829 + 5.483 4.792 3.944 3.558 3.838 4.438 4.800 4.643 4.179 3.890 4.078 4.607 5.040 5.024 4.576 4.027 3.723 3.746 3.911 3.978 3.879 3.742 3.724 3.838 3.928 3.820 3.475 3.028 2.679 2.547 2.611 2.759 2.885 2.946 2.956 2.950 + 4.274 4.301 4.401 4.579 4.723 4.673 4.374 3.979 3.769 3.928 4.358 4.725 4.711 4.274 3.694 3.357 3.456 3.852 4.213 4.288 4.094 3.857 3.787 3.882 3.941 3.753 3.297 2.777 2.468 2.514 2.817 3.115 3.170 2.923 2.527 2.236 + 4.708 4.419 4.103 4.054 4.358 4.833 5.199 5.297 5.169 4.954 4.739 4.516 4.274 4.076 4.027 4.147 4.309 4.324 4.131 3.875 3.787 3.954 4.198 4.224 3.889 3.365 3.006 3.031 3.321 3.521 3.373 2.959 2.633 2.685 3.065 3.420 + 3.039 3.488 4.184 4.848 5.285 5.446 5.381 5.154 4.816 4.442 4.159 4.106 4.335 4.751 5.160 5.405 5.474 5.489 5.586 5.798 6.049 6.244 6.372 6.506 6.719 6.996 7.249 7.408 7.495 7.598 7.770 7.943 7.977 7.794 7.475 7.228 + 4.177 4.598 5.234 5.783 6.018 5.887 5.513 5.096 4.789 4.630 4.553 4.463 4.309 4.108 3.929 3.835 3.847 3.943 4.077 4.223 4.385 4.585 4.842 5.139 5.431 5.666 5.818 5.905 5.974 6.065 6.178 6.276 6.312 6.271 6.185 6.118 + 5.437 5.226 5.116 5.390 5.958 6.368 6.180 5.371 4.377 3.744 3.674 3.891 3.928 3.553 2.965 2.591 2.700 3.196 3.734 4.037 4.088 4.065 4.121 4.243 4.315 4.270 4.152 4.032 3.888 3.604 3.121 2.556 2.162 2.117 2.353 2.595 + 5.037 5.349 5.776 6.039 5.936 5.454 4.774 4.153 3.781 3.681 3.729 3.756 3.664 3.473 3.272 3.140 3.084 3.059 3.026 2.989 2.982 3.021 3.065 3.044 2.916 2.717 2.545 2.491 2.577 2.743 2.900 2.988 3.008 2.994 2.980 2.976 + 4.737 4.618 4.391 4.081 3.738 3.437 3.266 3.286 3.486 3.769 3.988 4.036 3.911 3.721 3.605 3.624 3.718 3.749 3.625 3.377 3.155 3.116 3.308 3.633 3.913 4.005 3.885 3.643 3.404 3.252 3.197 3.196 3.201 3.191 3.169 3.151 + 3.014 3.477 4.035 4.282 4.116 3.779 3.570 3.540 3.471 3.160 2.696 2.437 2.675 3.320 3.913 3.993 3.489 2.786 2.398 2.561 3.083 3.569 3.760 3.691 3.549 3.441 3.316 3.108 2.898 2.891 3.201 3.670 3.947 3.791 3.305 2.886 + 1.739 2.383 3.222 3.723 3.666 3.249 2.835 2.618 2.515 2.352 2.111 1.976 2.125 2.514 2.870 2.942 2.736 2.509 2.524 2.796 3.086 3.153 2.986 2.799 2.787 2.902 2.887 2.550 1.998 1.586 1.616 2.056 2.567 2.806 2.719 2.545 + 2.224 2.433 2.612 2.545 2.286 2.127 2.302 2.725 3.037 2.939 2.491 2.078 2.068 2.466 2.922 3.059 2.829 2.551 2.602 3.054 3.607 3.863 3.669 3.223 2.850 2.709 2.712 2.692 2.631 2.669 2.905 3.204 3.261 2.879 2.211 1.690 + 2.924 2.622 2.330 2.362 2.713 3.038 2.969 2.463 1.863 1.608 1.857 2.368 2.731 2.729 2.503 2.386 2.581 2.992 3.342 3.441 3.338 3.236 3.259 3.331 3.267 2.976 2.580 2.320 2.354 2.624 2.917 3.033 2.922 2.678 2.440 2.304 + 2.242 2.750 3.360 3.596 3.304 2.757 2.410 2.513 2.929 3.280 3.271 2.916 2.484 2.254 2.309 2.530 2.756 2.935 3.125 3.385 3.669 3.837 3.767 3.453 3.008 2.587 2.310 2.234 2.361 2.638 2.942 3.098 2.954 2.506 1.938 1.543 + 2.856 3.236 3.687 3.837 3.531 2.922 2.322 1.958 1.843 1.855 1.893 1.955 2.086 2.255 2.348 2.266 2.055 1.905 2.009 2.383 2.834 3.096 3.035 2.742 2.447 2.337 2.432 2.613 2.737 2.744 2.658 2.522 2.354 2.157 1.962 1.836 + 3.201 3.250 3.215 2.943 2.415 1.805 1.401 1.420 1.842 2.396 2.724 2.618 2.163 1.677 1.490 1.717 2.209 2.682 2.939 2.976 2.927 2.907 2.904 2.820 2.596 2.306 2.102 2.084 2.206 2.313 2.287 2.152 2.049 2.095 2.270 2.426 + 3.738 3.543 3.061 2.286 1.449 0.937 1.012 1.582 2.260 2.654 2.661 2.473 2.341 2.321 2.267 2.049 1.766 1.706 2.077 2.777 3.431 3.686 3.492 3.113 2.860 2.810 2.782 2.574 2.202 1.914 1.945 2.276 2.634 2.748 2.592 2.395 + 2.997 2.891 2.734 2.618 2.631 2.788 3.000 3.115 3.032 2.797 2.583 2.562 2.747 2.969 3.006 2.772 2.393 2.104 2.051 2.180 2.307 2.304 2.212 2.180 2.294 2.476 2.557 2.453 2.272 2.220 2.389 2.631 2.664 2.325 1.753 1.314 + 3.130 3.095 3.008 2.857 2.659 2.461 2.322 2.275 2.309 2.377 2.424 2.419 2.369 2.307 2.267 2.259 2.261 2.226 2.119 1.950 1.784 1.718 1.824 2.098 2.443 2.714 2.797 2.676 2.438 2.210 2.081 2.055 2.072 2.070 2.033 1.996 + 2.052 2.511 3.036 3.192 2.873 2.374 2.108 2.247 2.605 2.847 2.797 2.551 2.317 2.195 2.107 1.947 1.755 1.700 1.896 2.235 2.442 2.325 1.967 1.671 1.686 1.990 2.338 2.530 2.624 2.877 3.442 4.154 4.617 4.554 4.084 3.650 + 3.780 3.735 3.577 3.292 3.013 2.944 3.160 3.493 3.649 3.470 3.099 2.866 2.978 3.299 3.451 3.146 2.472 1.832 1.609 1.833 2.166 2.205 1.839 1.325 1.059 1.243 1.774 2.392 2.932 3.406 3.882 4.312 4.523 4.395 4.030 3.720 + 4.145 3.891 3.558 3.377 3.477 3.802 4.158 4.342 4.268 3.998 3.671 3.406 3.233 3.114 3.002 2.883 2.771 2.667 2.542 2.357 2.121 1.907 1.816 1.898 2.099 2.290 2.354 2.275 2.135 2.040 2.016 1.982 1.819 1.489 1.092 0.819 + 2.593 3.059 3.568 3.656 3.226 2.634 2.388 2.719 3.416 4.037 4.273 4.144 3.878 3.650 3.433 3.100 2.640 2.234 2.112 2.326 2.675 2.864 2.747 2.446 2.217 2.218 2.382 2.499 2.413 2.151 1.864 1.682 1.620 1.603 1.575 1.544 + 3.748 3.741 3.632 3.391 3.174 3.237 3.691 4.331 4.749 4.651 4.104 3.466 3.062 2.902 2.709 2.233 1.539 0.991 0.930 1.347 1.867 2.059 1.801 1.360 1.138 1.314 1.721 2.025 2.031 1.812 1.586 1.478 1.435 1.328 1.133 0.969 + 1.277 1.737 2.433 3.083 3.538 3.836 4.084 4.296 4.325 3.983 3.225 2.255 1.437 1.080 1.254 1.771 2.321 2.668 2.753 2.672 2.564 2.509 2.504 2.501 2.453 2.345 2.195 2.035 1.902 1.822 1.798 1.811 1.827 1.820 1.792 1.767 + 4.389 4.689 4.912 4.719 4.196 3.825 4.020 4.683 5.229 5.067 4.111 2.850 1.915 1.575 1.615 1.660 1.596 1.652 2.085 2.822 3.454 3.595 3.264 2.876 2.853 3.228 3.620 3.621 3.203 2.737 2.627 2.914 3.250 3.261 2.922 2.576 + 5.126 5.455 5.870 6.080 5.967 5.660 5.406 5.369 5.514 5.671 5.679 5.491 5.153 4.720 4.215 3.664 3.168 2.890 2.956 3.332 3.803 4.096 4.058 3.750 3.391 3.187 3.192 3.293 3.323 3.186 2.917 2.637 2.458 2.415 2.461 2.515 + 3.125 3.539 4.191 4.852 5.375 5.743 6.003 6.171 6.209 6.069 5.753 5.309 4.782 4.189 3.556 2.976 2.618 2.619 2.969 3.483 3.925 4.172 4.287 4.411 4.589 4.689 4.523 4.053 3.485 3.136 3.179 3.488 3.734 3.672 3.346 3.049 + 3.596 4.295 5.177 5.647 5.518 5.120 4.958 5.247 5.744 5.996 5.748 5.132 4.481 4.006 3.632 3.160 2.548 2.025 1.922 2.384 3.233 4.108 4.723 5.013 5.062 4.943 4.656 4.207 3.721 3.405 3.380 3.538 3.611 3.400 2.974 2.629 + 4.828 4.782 4.784 4.936 5.253 5.615 5.838 5.796 5.518 5.177 4.974 4.991 5.126 5.166 4.951 4.493 3.979 3.639 3.593 3.789 4.060 4.257 4.323 4.284 4.167 3.952 3.598 3.110 2.573 2.102 1.742 1.434 1.061 0.577 0.075 -0.253 + 4.569 4.964 5.474 5.745 5.605 5.176 4.758 4.591 4.667 4.744 4.549 4.001 3.285 2.726 2.554 2.739 3.020 3.107 2.885 2.496 2.227 2.298 2.710 3.242 3.595 3.575 3.185 2.596 2.024 1.602 1.342 1.164 0.982 0.766 0.555 0.422 + 4.649 4.715 4.829 4.974 5.142 5.325 5.483 5.549 5.474 5.278 5.056 4.912 4.877 4.868 4.749 4.442 3.991 3.541 3.237 3.139 3.204 3.347 3.493 3.583 3.541 3.287 2.785 2.120 1.492 1.102 1.017 1.105 1.138 0.970 0.658 0.410 + 5.048 5.210 5.407 5.466 5.283 4.917 4.582 4.528 4.867 5.463 5.974 6.043 5.531 4.616 3.696 3.132 3.029 3.201 3.336 3.237 2.953 2.713 2.719 2.974 3.265 3.322 3.018 2.451 1.867 1.482 1.333 1.284 1.146 0.835 0.444 0.170 + 4.016 4.261 4.628 4.955 5.144 5.217 5.270 5.383 5.535 5.610 5.481 5.110 4.592 4.088 3.716 3.478 3.277 3.023 2.726 2.509 2.511 2.765 3.147 3.440 3.469 3.210 2.789 2.385 2.108 1.942 1.781 1.525 1.147 0.709 0.325 0.102 + 4.864 5.123 5.483 5.747 5.837 5.846 5.949 6.241 6.633 6.889 6.791 6.303 5.604 4.970 4.589 4.440 4.347 4.129 3.752 3.352 3.116 3.137 3.341 3.549 3.600 3.446 3.137 2.747 2.306 1.811 1.283 0.805 0.486 0.383 0.439 0.522 + 5.959 6.311 6.727 6.871 6.634 6.191 5.816 5.646 5.605 5.536 5.386 5.243 5.198 5.204 5.076 4.664 4.027 3.427 3.145 3.280 3.708 4.209 4.624 4.889 4.949 4.694 4.032 3.040 2.016 1.323 1.116 1.204 1.189 0.808 0.169 -0.327 + 5.869 5.908 5.978 6.048 6.067 5.977 5.757 5.440 5.101 4.799 4.531 4.233 3.836 3.339 2.837 2.472 2.348 2.462 2.727 3.048 3.395 3.788 4.223 4.587 4.679 4.345 3.623 2.788 2.208 2.101 2.366 2.627 2.496 1.855 0.976 0.349 + 5.750 5.914 6.223 6.581 6.804 6.720 6.319 5.808 5.467 5.418 5.488 5.346 4.788 3.948 3.216 2.923 3.057 3.276 3.212 2.812 2.412 2.461 3.132 4.137 4.907 4.990 4.345 3.338 2.446 1.941 1.760 1.632 1.314 0.770 0.173 -0.217 + 5.530 5.152 4.826 4.953 5.461 5.835 5.606 4.837 4.097 3.933 4.331 4.697 4.399 3.369 2.217 1.733 2.234 3.342 4.344 4.791 4.782 4.730 4.892 5.134 5.118 4.672 3.960 3.287 2.794 2.343 1.729 0.956 0.279 -0.033 0.027 0.193 + 6.789 6.654 6.512 6.502 6.639 6.762 6.627 6.094 5.266 4.467 4.044 4.131 4.548 4.931 4.995 4.740 4.424 4.334 4.553 4.900 5.100 5.022 4.765 4.533 4.414 4.285 3.926 3.259 2.460 1.846 1.623 1.711 1.828 1.735 1.442 1.184 + 6.788 7.027 7.322 7.491 7.500 7.415 7.212 6.707 5.738 4.463 3.412 3.161 3.847 4.973 5.739 5.658 4.928 4.212 4.045 4.392 4.763 4.749 4.434 4.281 4.612 5.214 5.478 4.979 3.917 2.992 2.790 3.272 3.833 3.883 3.394 2.886 + 6.343 6.426 6.590 6.847 7.189 7.535 7.685 7.403 6.608 5.523 4.610 4.287 4.608 4.061 4.150 4.225 4.370 4.562 4.709 4.766 4.788 4.878 5.069 5.264 5.306 5.109 4.758 4.461 4.406 4.620 4.941 5.124 5.002 4.595 4.094 3.756 + 6.491 6.857 7.363 7.748 7.914 7.922 7.826 7.544 6.925 5.980 5.011 4.468 4.592 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 6.566 6.834 7.228 7.588 7.835 7.959 7.915 7.577 6.848 5.838 4.909 4.471 4.674 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 6.887 7.320 7.914 8.354 8.499 8.403 8.132 7.623 6.767 5.641 4.622 4.184 4.501 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 5.993 6.695 7.621 8.216 8.272 7.986 7.655 7.347 6.898 6.210 5.506 5.211 5.543 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 7.139 7.545 8.077 8.373 8.222 7.651 6.841 6.004 5.331 5.005 5.169 5.806 6.629 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 7.237 7.351 7.614 7.997 8.315 8.271 7.636 6.456 5.103 4.104 3.843 4.324 5.162 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 9.092 9.450 9.644 9.145 7.969 6.737 6.177 6.516 7.305 7.812 7.615 6.876 6.090 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 10.085 10.506 10.804 10.393 9.196 7.746 6.750 6.516 6.745 6.839 6.424 5.621 4.860 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 7.736 7.387 7.006 6.928 7.189 7.488 7.449 6.958 6.248 5.689 5.466 5.462 5.405 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 5.513 5.759 6.196 6.674 6.949 6.777 6.082 5.044 4.038 3.413 3.291 3.527 3.849 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.655 4.977 5.609 6.413 7.055 7.141 6.484 5.299 4.111 3.426 3.408 3.826 4.293 4.570 4.688 4.813 5.031 5.267 5.408 5.468 5.612 5.986 6.531 6.970 7.008 6.573 5.888 5.300 5.036 5.071 5.216 5.306 5.308 5.291 5.305 5.334 + 7.449 7.303 7.194 7.328 7.744 8.246 8.511 8.307 7.642 6.765 6.016 5.635 5.655 5.921 6.201 6.311 6.193 5.930 5.711 5.747 6.173 6.956 7.875 8.592 8.814 8.453 7.690 6.891 6.403 6.365 6.641 6.919 6.923 6.584 6.082 5.718 + 11.527 11.035 10.390 10.044 10.259 10.913 11.542 11.625 10.918 9.633 8.321 7.539 7.517 8.041 8.628 8.847 8.562 7.953 7.350 7.020 7.063 7.435 8.017 8.663 9.204 9.485 9.443 9.171 8.885 8.781 8.863 8.915 8.661 8.011 7.188 6.611 + 10.360 10.151 9.786 9.364 8.989 8.713 8.487 8.194 7.735 7.135 6.553 6.184 6.119 6.267 6.428 6.432 6.258 6.036 5.952 6.147 6.668 7.477 8.444 9.336 9.839 9.689 8.858 7.661 6.642 6.257 6.563 7.163 7.495 7.246 6.591 6.046 + 11.718 11.606 11.360 10.981 10.530 10.112 9.804 9.607 9.464 9.322 9.183 9.083 9.026 8.955 8.782 8.475 8.093 7.756 7.567 7.572 7.775 8.172 8.732 9.329 9.717 9.633 9.008 8.094 7.377 7.257 7.733 8.359 8.554 8.044 7.107 6.379 + 13.311 13.016 12.508 11.909 11.323 10.799 10.343 9.966 9.713 9.650 9.792 10.046 10.218 10.116 9.674 9.000 8.310 7.790 7.506 7.429 7.540 7.891 8.534 9.375 10.109 10.347 9.894 8.941 8.003 7.578 7.788 8.284 8.519 8.183 7.457 6.871 + 9.857 9.294 8.431 7.627 7.120 6.917 6.858 6.773 6.610 6.432 6.300 6.181 5.957 5.542 4.996 4.507 4.267 4.330 4.602 4.979 5.484 6.264 7.394 8.657 9.533 9.490 8.404 6.767 5.460 5.196 6.018 7.255 8.004 7.786 6.886 6.103 + 5.773 5.706 5.803 6.257 6.961 7.510 7.506 6.888 6.000 5.322 5.102 5.196 5.251 5.025 4.576 4.148 3.918 3.856 3.835 3.866 4.192 5.103 6.609 8.269 9.368 9.358 8.248 6.626 5.313 4.863 5.266 6.040 6.601 6.648 6.311 5.980 + 5.436 5.399 5.533 6.027 6.793 7.432 7.488 6.790 5.619 4.547 4.041 4.155 4.534 4.720 4.505 4.052 3.695 3.634 3.799 4.009 4.251 4.771 5.847 7.401 8.842 9.355 8.492 6.598 4.695 3.825 4.341 5.679 6.821 7.068 6.530 5.931 + 5.580 6.142 7.019 7.834 8.248 8.090 7.409 6.418 5.404 4.609 4.160 4.036 4.104 4.198 4.199 4.082 3.893 3.709 3.616 3.730 4.199 5.145 6.531 8.043 9.151 9.355 8.522 7.045 5.664 5.031 5.295 6.028 6.564 6.492 5.946 5.446 + 4.496 5.686 7.394 8.736 9.172 8.741 7.853 6.894 5.996 5.120 4.300 3.747 3.696 4.169 4.870 5.361 5.359 4.925 4.408 4.232 4.678 5.784 7.345 8.957 10.101 10.338 9.552 8.109 6.736 6.104 6.395 7.171 7.706 7.543 6.841 6.219 + 3.451 5.202 7.661 9.477 9.877 9.033 7.710 6.599 5.889 5.383 4.884 4.452 4.285 4.426 4.642 4.603 4.196 3.654 3.389 3.711 4.666 6.091 7.737 9.306 10.409 10.622 9.739 8.043 6.304 5.361 5.558 6.477 7.263 7.294 6.663 6.038 + 4.953 6.091 7.611 8.596 8.650 8.084 7.505 7.238 7.110 6.731 5.953 5.039 4.399 4.194 4.207 4.088 3.722 3.353 3.366 3.982 5.139 6.621 8.213 9.696 10.730 10.871 9.871 8.030 6.214 5.375 5.863 7.123 8.100 8.064 7.185 6.347 + 3.468 4.351 5.686 6.932 7.801 8.316 8.592 8.579 8.081 7.016 5.642 4.467 3.888 3.878 4.028 3.912 3.466 3.038 3.096 3.877 5.266 6.954 8.638 10.060 10.923 10.890 9.815 8.019 6.300 5.503 5.934 7.103 8.075 8.186 7.550 6.897 + 3.880 4.379 5.208 6.138 6.992 7.677 8.126 8.240 7.928 7.207 6.266 5.399 4.839 4.616 4.564 4.464 4.216 3.910 3.770 4.038 4.865 6.247 7.982 9.655 10.723 10.735 9.617 7.813 6.131 5.303 5.552 6.471 7.340 7.646 7.414 7.088 + 3.593 4.265 5.381 6.595 7.594 8.193 8.343 8.082 7.497 6.715 5.907 5.256 4.882 4.777 4.801 4.759 4.533 4.173 3.908 4.048 4.833 6.277 8.099 9.771 10.720 10.586 9.430 7.744 6.227 5.429 5.478 6.059 6.663 6.935 6.864 6.705 + 4.491 5.287 6.505 7.625 8.273 8.380 8.125 7.733 7.300 6.771 6.049 5.150 4.248 3.606 3.416 3.677 4.184 4.652 4.903 5.002 5.238 5.927 7.143 8.547 9.502 9.427 8.216 6.386 4.836 4.303 4.901 6.076 7.007 7.194 6.765 6.296 + 4.527 5.253 6.292 7.091 7.304 6.958 6.354 5.818 5.489 5.302 5.112 4.838 4.507 4.193 3.931 3.688 3.406 3.075 2.794 2.765 3.217 4.278 5.830 7.454 8.546 8.610 7.577 5.931 4.492 3.949 4.441 5.492 6.362 6.580 6.236 5.838 + 7.141 7.218 7.211 6.991 6.633 6.383 6.422 6.648 6.711 6.288 5.375 4.329 3.617 3.478 3.774 4.129 4.229 4.033 3.764 3.726 4.122 4.962 6.062 7.086 7.638 7.422 6.446 5.115 4.085 3.883 4.536 5.516 6.095 5.875 5.093 4.418 + 8.229 7.874 7.320 6.788 6.432 6.263 6.154 5.955 5.610 5.198 4.870 4.719 4.697 4.660 4.499 4.240 4.033 4.029 4.249 4.580 4.889 5.146 5.434 5.821 6.223 6.409 6.176 5.550 4.836 4.430 4.538 5.023 5.529 5.758 5.689 5.543 + 7.843 7.611 7.205 6.728 6.296 5.981 5.778 5.601 5.353 4.999 4.608 4.310 4.210 4.305 4.490 4.632 4.661 4.608 4.576 4.666 4.914 5.275 5.641 5.884 5.898 5.651 5.216 4.769 4.521 4.602 4.979 5.459 5.810 5.903 5.795 5.665 + 6.045 6.061 6.099 6.165 6.237 6.252 6.111 5.745 5.183 4.581 4.157 4.049 4.205 4.400 4.399 4.140 3.793 3.640 3.857 4.371 4.908 5.197 5.152 4.913 4.700 4.647 4.718 4.787 4.759 4.646 4.529 4.466 4.451 4.438 4.403 4.369 + 7.171 7.121 7.043 6.939 6.769 6.479 6.066 5.614 5.246 5.025 4.899 4.748 4.499 4.204 4.006 4.006 4.159 4.301 4.302 4.200 4.198 4.502 5.126 5.830 6.252 6.147 5.551 4.756 4.115 3.827 3.846 3.954 3.936 3.719 3.403 3.176 + 8.408 8.089 7.594 7.111 6.742 6.450 6.124 5.679 5.141 4.632 4.282 4.150 4.199 4.338 4.476 4.556 4.552 4.462 4.315 4.191 4.204 4.437 4.863 5.319 5.580 5.502 5.142 4.742 4.584 4.780 5.175 5.423 5.226 4.549 3.684 3.085 + 6.952 6.428 5.721 5.240 5.157 5.315 5.400 5.229 4.881 4.596 4.546 4.703 4.895 4.965 4.890 4.738 4.559 4.335 4.045 3.772 3.714 4.048 4.764 5.607 6.218 6.355 6.045 5.540 5.137 4.985 5.039 5.141 5.157 5.053 4.894 4.781 + 5.790 6.120 6.493 6.592 6.342 5.954 5.696 5.645 5.629 5.425 4.994 4.526 4.261 4.269 4.394 4.416 4.255 4.029 3.934 4.088 4.485 5.078 5.829 6.662 7.361 7.590 7.114 6.052 4.912 4.300 4.479 5.164 5.739 5.756 5.286 4.823 + 5.323 5.767 6.355 6.720 6.693 6.372 5.963 5.574 5.152 4.613 4.004 3.517 3.340 3.481 3.747 3.900 3.845 3.691 3.645 3.867 4.404 5.218 6.223 7.253 8.027 8.209 7.625 6.463 5.265 4.620 4.777 5.462 6.095 6.245 5.942 5.596 + 4.988 5.399 6.024 6.616 7.015 7.172 7.047 6.560 5.662 4.494 3.420 2.851 2.949 3.473 3.932 3.939 3.489 2.942 2.741 3.122 4.027 5.236 6.529 7.711 8.545 8.752 8.188 7.061 5.931 5.402 5.689 6.433 6.965 6.838 6.189 5.603 + 6.032 6.268 6.633 7.033 7.471 7.955 8.334 8.271 7.476 6.024 4.442 3.405 3.235 3.653 4.009 3.847 3.299 2.970 3.414 4.670 6.246 7.547 8.309 8.678 8.897 8.982 8.720 7.980 6.990 6.249 6.123 6.512 6.924 6.918 6.496 6.078 + 4.613 5.110 5.822 6.410 6.716 6.807 6.809 6.739 6.508 6.073 5.545 5.125 4.903 4.772 4.559 4.264 4.153 4.548 5.513 6.721 7.680 8.129 8.223 8.333 8.623 8.842 8.556 7.618 6.426 5.672 5.778 6.517 7.196 7.249 6.719 6.180 + 5.202 5.294 5.214 4.799 4.277 4.137 4.646 5.510 6.072 5.902 5.201 4.609 4.585 4.966 5.163 4.810 4.218 4.140 5.049 6.629 8.000 8.479 8.160 7.744 7.786 8.129 8.089 7.231 5.933 5.148 5.526 6.751 7.759 7.680 6.641 5.649 + 5.335 5.647 5.868 5.657 5.157 4.898 5.240 5.937 6.308 5.879 4.879 4.065 4.026 4.637 5.216 5.233 4.864 4.819 5.603 6.949 8.005 8.121 7.469 6.863 6.945 7.548 7.858 7.266 6.037 5.138 5.342 6.471 7.534 7.634 6.805 5.950 + 5.357 5.682 6.072 6.268 6.258 6.232 6.312 6.355 6.084 5.423 4.670 4.292 4.494 5.011 5.349 5.290 5.135 5.428 6.387 7.612 8.379 8.293 7.656 7.186 7.320 7.778 7.826 7.021 5.718 4.825 5.005 6.064 7.107 7.338 6.757 6.103 + 5.426 5.273 5.056 4.949 5.142 5.685 6.377 6.840 6.794 6.303 5.748 5.496 5.575 5.659 5.441 5.025 4.926 5.602 6.938 8.197 8.578 7.917 6.869 6.353 6.723 7.426 7.511 6.547 5.101 4.299 4.828 6.285 7.497 7.540 6.552 5.572 + 3.182 3.606 4.153 4.533 4.764 5.133 5.856 6.797 7.543 7.767 7.492 7.016 6.581 6.180 5.720 5.332 5.428 6.323 7.779 8.968 9.052 7.921 6.383 5.535 5.824 6.637 6.863 5.946 4.460 3.641 4.253 5.844 7.090 6.972 5.686 4.471 + 12.078 12.077 12.097 12.152 12.211 12.189 11.997 11.616 11.140 10.739 10.539 10.506 10.459 10.215 9.766 9.321 9.152 9.336 9.634 9.641 9.111 8.198 7.370 7.045 7.238 7.535 7.439 6.807 5.994 5.563 5.796 6.444 6.926 6.829 6.258 5.736 + 14.303 13.570 12.676 12.266 12.499 12.936 12.957 12.319 11.358 10.662 10.541 10.775 10.852 10.457 9.757 9.232 9.228 9.640 10.014 9.947 9.420 8.782 8.418 8.417 8.527 8.406 7.924 7.269 6.777 6.662 6.864 7.123 7.186 6.977 6.627 6.368 + 11.160 10.591 9.704 8.880 8.429 8.424 8.671 8.856 8.782 8.489 8.163 7.905 7.597 7.025 6.188 5.463 5.411 6.299 7.750 8.884 8.940 7.875 6.438 5.591 5.741 6.438 6.799 6.301 5.230 4.415 4.464 5.230 5.960 6.001 5.382 4.757 + 7.800 6.844 5.494 4.516 4.400 5.100 6.136 6.953 7.265 7.127 6.744 6.230 5.554 4.727 4.003 3.841 4.573 6.027 7.475 8.056 7.407 5.986 4.793 4.627 5.476 6.534 6.861 6.159 5.001 4.342 4.705 5.749 6.581 6.541 5.758 5.011 + 5.362 5.445 5.423 5.165 4.819 4.736 5.156 5.950 6.688 6.968 6.697 6.076 5.356 4.672 4.116 3.918 4.420 5.750 7.479 8.703 8.632 7.256 5.479 4.484 4.816 5.958 6.795 6.592 5.603 4.789 4.888 5.725 6.389 6.114 5.026 4.050 + 4.123 4.622 5.231 5.556 5.573 5.611 5.978 6.608 7.109 7.140 6.730 6.207 5.835 5.576 5.244 4.875 4.854 5.572 6.912 8.122 8.332 7.314 5.778 4.836 5.059 5.987 6.557 6.098 4.964 4.199 4.521 5.600 6.320 5.821 4.341 3.064 + 6.362 6.456 6.493 6.368 6.190 6.219 6.603 7.195 7.625 7.597 7.108 6.402 5.740 5.235 4.921 4.925 5.465 6.598 7.938 8.726 8.336 6.831 5.056 4.074 4.360 5.427 6.237 6.070 5.092 4.138 3.924 4.406 4.886 4.713 3.921 3.194 + 7.487 7.820 8.356 8.917 9.368 9.665 9.823 9.863 9.788 9.601 9.326 9.006 8.683 8.374 8.089 7.852 7.694 7.626 7.613 7.593 7.545 7.518 7.590 7.759 7.892 7.796 7.402 6.890 6.626 6.903 7.679 8.544 8.984 8.759 8.101 7.551 + 9.923 9.235 8.389 8.024 8.399 9.227 9.941 10.138 9.823 9.294 8.825 8.465 8.097 7.659 7.254 7.062 7.142 7.351 7.485 7.494 7.558 7.923 8.627 9.385 9.761 9.494 8.733 7.963 7.674 8.033 8.781 9.424 9.568 9.155 8.479 7.984 + 10.258 10.020 9.729 9.585 9.640 9.772 9.824 9.741 9.585 9.412 9.177 8.779 8.226 7.721 7.549 7.836 8.393 8.826 8.857 8.577 8.400 8.720 9.548 10.458 10.886 10.579 9.811 9.202 9.273 10.079 11.167 11.893 11.826 11.011 9.918 9.162 + 10.625 9.598 8.159 7.103 6.858 7.243 7.678 7.637 6.988 5.996 5.047 4.379 4.009 3.864 3.934 4.276 4.892 5.621 6.194 6.415 6.315 6.122 6.065 6.180 6.282 6.142 5.717 5.230 5.020 5.273 5.852 6.357 6.397 5.876 5.079 4.497 + 7.860 8.012 8.013 7.614 6.953 6.494 6.593 7.117 7.496 7.206 6.221 5.038 4.239 4.010 4.075 4.055 3.882 3.851 4.257 5.015 5.657 5.729 5.214 4.555 4.266 4.480 4.886 5.063 4.895 4.643 4.634 4.905 5.159 5.082 4.687 4.318 + 6.441 6.703 6.989 7.026 6.723 6.225 5.773 5.503 5.382 5.289 5.141 4.936 4.695 4.412 4.091 3.827 3.800 4.141 4.764 5.351 5.556 5.275 4.745 4.358 4.329 4.530 4.638 4.457 4.128 3.999 4.279 4.803 5.148 5.010 4.492 4.035 + 6.859 7.165 7.435 7.328 6.846 6.345 6.199 6.452 6.789 6.835 6.489 5.966 5.527 5.210 4.846 4.331 3.853 3.786 4.326 5.217 5.879 5.870 5.261 4.584 4.370 4.697 5.155 5.241 4.814 4.197 3.855 3.985 4.394 4.732 4.831 4.795 + 8.054 8.179 8.282 8.197 7.869 7.384 6.865 6.385 5.956 5.599 5.371 5.305 5.313 5.194 4.792 4.174 3.652 3.569 4.015 4.722 5.261 5.372 5.158 4.952 4.997 5.225 5.354 5.188 4.840 4.631 4.782 5.169 5.420 5.250 4.748 4.315 + 6.060 7.005 8.139 8.590 8.063 7.000 6.096 5.694 5.602 5.449 5.142 4.941 5.098 5.469 5.568 5.037 4.068 3.322 3.373 4.184 5.124 5.515 5.213 4.671 4.467 4.765 5.223 5.405 5.242 5.067 5.218 5.612 5.785 5.358 4.476 3.755 + 5.202 5.814 6.675 7.318 7.483 7.224 6.774 6.328 5.934 5.564 5.231 5.002 4.901 4.835 4.644 4.278 3.898 3.787 4.114 4.762 5.389 5.679 5.570 5.257 4.988 4.850 4.743 4.554 4.317 4.211 4.376 4.743 5.066 5.133 4.958 4.763 + 5.070 5.401 5.864 6.209 6.307 6.209 6.047 5.893 5.684 5.304 4.718 4.057 3.546 3.355 3.481 3.761 4.008 4.147 4.249 4.444 4.787 5.197 5.503 5.566 5.365 5.017 4.693 4.526 4.544 4.676 4.806 4.833 4.722 4.510 4.285 4.142 + 4.786 5.567 6.494 6.849 6.443 5.730 5.360 5.583 6.044 6.150 5.610 4.685 3.920 3.659 3.796 3.964 3.938 3.850 4.018 4.587 5.345 5.879 5.918 5.526 5.003 4.609 4.398 4.286 4.222 4.264 4.468 4.755 4.914 4.786 4.441 4.147 + 6.489 6.550 6.736 7.079 7.480 7.715 7.568 7.005 6.244 5.645 5.472 5.698 6.009 6.021 5.555 4.783 4.103 3.864 4.128 4.650 5.082 5.219 5.108 4.942 4.870 4.889 4.900 4.860 4.852 5.002 5.326 5.655 5.742 5.472 4.988 4.614 + 5.511 6.072 6.796 7.186 7.007 6.415 5.786 5.439 5.467 5.770 6.173 6.498 6.566 6.224 5.458 4.506 3.802 3.716 4.263 5.046 5.535 5.466 5.030 4.662 4.635 4.818 4.842 4.500 3.995 3.779 4.108 4.759 5.176 4.965 4.266 3.657 + 7.564 7.282 6.825 6.383 6.172 6.306 6.699 7.075 7.131 6.746 6.086 5.492 5.233 5.303 5.439 5.345 4.938 4.424 4.143 4.317 4.885 5.556 6.002 6.046 5.725 5.218 4.736 4.436 4.391 4.576 4.871 5.099 5.103 4.853 4.480 4.208 + 10.231 9.841 9.064 8.028 7.052 6.508 6.547 6.935 7.204 7.015 6.441 5.897 5.756 6.002 6.220 5.959 5.151 4.207 3.709 3.953 4.725 5.490 5.800 5.591 5.146 4.808 4.727 4.816 4.915 4.949 4.962 5.026 5.150 5.279 5.362 5.394 + 8.363 7.624 6.660 6.073 6.086 6.415 6.580 6.344 5.889 5.596 5.670 5.959 6.113 5.915 5.456 5.018 4.808 4.805 4.843 4.823 4.809 4.928 5.187 5.419 5.423 5.164 4.832 4.694 4.870 5.242 5.573 5.700 5.642 5.528 5.459 5.443 + 4.805 5.226 5.696 5.826 5.572 5.262 5.259 5.598 5.951 5.947 5.519 4.951 4.583 4.489 4.441 4.199 3.809 3.599 3.860 4.521 5.163 5.360 5.055 4.595 4.412 4.646 5.060 5.311 5.278 5.152 5.199 5.468 5.746 5.785 5.570 5.340 + 4.532 4.976 5.476 5.597 5.235 4.704 4.457 4.696 5.221 5.607 5.558 5.098 4.483 3.957 3.588 3.324 3.159 3.205 3.583 4.246 4.931 5.316 5.262 4.919 4.603 4.557 4.782 5.081 5.242 5.197 5.035 4.890 4.834 4.851 4.890 4.914 + 4.856 5.347 5.860 5.874 5.285 4.519 4.176 4.519 5.242 5.705 5.446 4.539 3.519 2.962 3.070 3.590 4.078 4.261 4.203 4.163 4.325 4.637 4.879 4.873 4.639 4.377 4.296 4.464 4.772 5.037 5.136 5.075 4.948 4.850 4.816 4.818 + 4.343 4.854 5.535 5.945 5.843 5.340 4.788 4.521 4.629 4.930 5.130 5.036 4.669 4.218 3.893 3.799 3.908 4.116 4.330 4.505 4.638 4.728 4.760 4.720 4.618 4.507 4.467 4.565 4.813 5.148 5.447 5.580 5.481 5.188 4.839 4.605 + 4.934 5.143 5.381 5.454 5.332 5.177 5.174 5.347 5.507 5.405 4.943 4.281 3.722 3.497 3.614 3.892 4.122 4.221 4.248 4.308 4.439 4.588 4.676 4.683 4.661 4.688 4.800 4.970 5.140 5.268 5.337 5.349 5.311 5.232 5.140 5.078 + 3.866 4.144 4.482 4.665 4.694 4.766 5.033 5.407 5.618 5.475 5.077 4.736 4.683 4.854 4.968 4.830 4.548 4.430 4.654 5.046 5.214 4.923 4.352 3.957 4.061 4.542 4.953 4.944 4.611 4.411 4.723 5.476 6.201 6.458 6.232 5.920 + 5.434 5.346 5.217 5.108 5.051 5.034 5.012 4.942 4.808 4.612 4.357 4.031 3.628 3.181 2.781 2.544 2.553 2.799 3.178 3.548 3.816 3.976 4.091 4.222 4.368 4.479 4.510 4.484 4.493 4.624 4.888 5.193 5.405 5.449 5.365 5.272 + 5.454 5.148 4.681 4.271 4.099 4.227 4.569 4.941 5.141 5.037 4.614 3.972 3.280 2.713 2.388 2.334 2.494 2.765 3.040 3.253 3.391 3.482 3.566 3.676 3.819 3.986 4.156 4.308 4.430 4.522 4.594 4.664 4.741 4.826 4.902 4.948 + 4.332 5.034 5.835 6.038 5.434 4.450 3.778 3.806 4.360 4.921 5.084 4.839 4.466 4.208 4.051 3.816 3.411 2.977 2.778 2.952 3.379 3.787 3.978 3.964 3.896 3.889 3.936 3.973 4.002 4.106 4.342 4.628 4.772 4.642 4.314 4.040 + 5.755 5.336 4.659 4.009 3.677 3.810 4.284 4.744 4.807 4.332 3.536 2.857 2.650 2.926 3.364 3.561 3.335 2.853 2.478 2.497 2.925 3.529 4.015 4.213 4.141 3.938 3.758 3.705 3.819 4.074 4.378 4.591 4.587 4.344 3.989 3.731 + 4.602 4.952 5.266 5.146 4.561 3.888 3.554 3.642 3.818 3.649 3.015 2.217 1.702 1.665 1.903 2.046 1.923 1.713 1.756 2.214 2.908 3.472 3.658 3.510 3.274 3.157 3.186 3.265 3.329 3.409 3.545 3.665 3.608 3.278 2.788 2.423 + 5.328 5.166 4.986 4.936 5.029 5.125 5.060 4.781 4.368 3.933 3.517 3.084 2.628 2.249 2.101 2.248 2.564 2.797 2.772 2.537 2.340 2.416 2.789 3.259 3.572 3.633 3.565 3.577 3.767 4.042 4.214 4.157 3.902 3.588 3.342 3.217 + 4.963 4.795 4.603 4.563 4.739 5.017 5.177 5.038 4.591 4.009 3.533 3.310 3.300 3.311 3.146 2.750 2.265 1.944 1.986 2.402 2.998 3.488 3.664 3.511 3.198 2.958 2.941 3.136 3.401 3.577 3.592 3.495 3.396 3.377 3.434 3.496 + 1.962 2.823 3.950 4.634 4.586 4.095 3.694 3.685 3.931 4.077 3.934 3.655 3.546 3.736 4.028 4.087 3.758 3.219 2.815 2.758 2.960 3.153 3.143 2.965 2.800 2.782 2.891 3.024 3.133 3.265 3.460 3.642 3.638 3.348 2.883 2.529 + 2.094 3.007 4.168 4.782 4.543 3.812 3.246 3.220 3.553 3.750 3.481 2.876 2.383 2.348 2.730 3.168 3.327 3.168 2.935 2.887 3.064 3.276 3.308 3.110 2.827 2.651 2.665 2.809 2.972 3.085 3.131 3.106 2.983 2.758 2.492 2.309 + 4.130 4.470 4.817 4.781 4.247 3.467 2.857 2.679 2.869 3.144 3.261 3.199 3.121 3.179 3.361 3.511 3.490 3.321 3.172 3.213 3.465 3.779 3.953 3.876 3.597 3.263 3.012 2.895 2.880 2.895 2.880 2.803 2.659 2.473 2.294 2.183 + 3.156 3.815 4.712 5.275 5.140 4.362 3.344 2.561 2.265 2.378 2.606 2.675 2.510 2.245 2.087 2.163 2.450 2.830 3.178 3.424 3.545 3.534 3.388 3.143 2.898 2.779 2.861 3.092 3.304 3.322 3.084 2.690 2.330 2.145 2.133 2.182 + 5.495 4.499 3.117 2.123 1.926 2.363 2.922 3.161 2.968 2.509 2.003 1.567 1.236 1.059 1.106 1.370 1.701 1.891 1.864 1.774 1.875 2.260 2.722 2.901 2.608 2.030 1.599 1.629 2.042 2.443 2.479 2.149 1.781 1.705 1.943 2.208 + 4.924 4.477 3.728 2.910 2.258 1.938 2.010 2.407 2.942 3.345 3.372 2.931 2.160 1.370 0.881 0.843 1.168 1.624 2.004 2.240 2.379 2.471 2.489 2.364 2.090 1.789 1.645 1.757 2.049 2.312 2.366 2.194 1.935 1.753 1.703 1.722 + 3.308 3.801 4.238 4.017 3.047 1.879 1.289 1.667 2.716 3.696 3.985 3.502 2.667 2.012 1.792 1.901 2.092 2.240 2.417 2.730 3.141 3.441 3.415 3.022 2.445 1.958 1.743 1.801 1.998 2.188 2.292 2.307 2.262 2.186 2.110 2.062 + 3.777 3.812 3.721 3.366 2.815 2.346 2.243 2.561 3.057 3.371 3.289 2.887 2.436 2.166 2.099 2.083 1.975 1.800 1.735 1.945 2.414 2.925 3.198 3.086 2.663 2.162 1.815 1.724 1.842 2.039 2.203 2.287 2.307 2.298 2.286 2.281 + 2.319 2.749 3.309 3.620 3.496 3.046 2.551 2.252 2.214 2.345 2.505 2.582 2.499 2.202 1.698 1.122 0.726 0.760 1.276 2.051 2.700 2.925 2.713 2.311 2.020 1.976 2.102 2.234 2.290 2.309 2.353 2.391 2.310 2.034 1.647 1.362 + 3.260 3.906 4.733 5.133 4.772 3.803 2.744 2.131 2.189 2.741 3.357 3.633 3.399 2.758 1.991 1.391 1.140 1.253 1.604 1.997 2.267 2.347 2.274 2.132 1.979 1.825 1.659 1.510 1.454 1.558 1.795 2.029 2.090 1.909 1.589 1.343 + 3.815 4.230 4.643 4.601 4.014 3.217 2.648 2.470 2.483 2.384 2.095 1.820 1.793 1.993 2.135 1.951 1.489 1.107 1.159 1.653 2.227 2.462 2.241 1.829 1.604 1.718 1.996 2.155 2.093 1.959 1.959 2.108 2.205 2.051 1.681 1.366 + 2.612 3.105 3.718 3.983 3.667 2.897 2.013 1.316 0.926 0.814 0.921 1.200 1.558 1.806 1.743 1.328 0.792 0.527 0.815 1.598 2.495 3.067 3.110 2.756 2.313 2.010 1.871 1.788 1.692 1.628 1.689 1.891 2.134 2.287 2.313 2.282 + 3.085 2.992 2.803 2.540 2.274 2.108 2.106 2.235 2.360 2.323 2.042 1.575 1.086 0.752 0.662 0.785 1.027 1.308 1.618 1.994 2.452 2.938 3.328 3.498 3.406 3.122 2.798 2.581 2.544 2.650 2.795 2.868 2.816 2.658 2.472 2.350 + 3.988 4.068 4.056 3.819 3.464 3.297 3.545 4.104 4.553 4.464 3.747 2.735 1.938 1.678 1.898 2.282 2.533 2.570 2.502 2.471 2.527 2.637 2.760 2.883 2.979 2.979 2.826 2.580 2.441 2.609 3.078 3.567 3.689 3.266 2.520 1.945 + 5.879 5.639 5.263 4.918 4.754 4.813 4.988 5.080 4.932 4.546 4.086 3.740 3.557 3.401 3.080 2.534 1.927 1.544 1.575 1.969 2.477 2.854 3.028 3.109 3.238 3.442 3.616 3.642 3.512 3.325 3.177 3.045 2.820 2.431 1.967 1.644 + 7.800 7.680 7.482 7.269 7.082 6.918 6.727 6.452 6.075 5.636 5.198 4.792 4.382 3.899 3.319 2.728 2.304 2.225 2.553 3.201 3.990 4.747 5.375 5.835 6.098 6.131 5.942 5.631 5.372 5.303 5.409 5.505 5.366 4.915 4.318 3.894 + 7.410 7.087 6.656 6.388 6.406 6.594 6.673 6.398 5.728 4.854 4.066 3.567 3.368 3.327 3.287 3.199 3.147 3.258 3.607 4.167 4.849 5.563 6.238 6.799 7.140 7.153 6.810 6.225 5.622 5.209 5.042 4.995 4.867 4.551 4.134 3.835 + 7.559 7.125 6.597 6.361 6.522 6.799 6.762 6.177 5.202 4.265 3.743 3.699 3.890 3.994 3.870 3.640 3.547 3.760 4.266 4.929 5.623 6.308 6.988 7.609 8.035 8.111 7.793 7.206 6.584 6.119 5.843 5.630 5.320 4.855 4.351 4.017 + 6.413 6.756 7.217 7.548 7.664 7.649 7.579 7.377 6.874 6.030 5.082 4.420 4.290 4.566 4.845 4.800 4.464 4.212 4.430 5.180 6.152 6.928 7.300 7.357 7.311 7.256 7.117 6.810 6.412 6.129 6.084 6.147 6.019 5.509 4.770 4.220 + 10.141 9.753 9.029 8.149 7.435 7.195 7.479 7.970 8.154 7.690 6.664 5.530 4.759 4.508 4.571 4.636 4.589 4.593 4.893 5.552 6.382 7.104 7.569 7.823 7.969 8.002 7.805 7.310 6.649 6.108 5.909 6.016 6.172 6.131 5.886 5.653 + 11.641 11.247 10.752 10.464 10.413 10.319 9.865 9.019 8.110 7.570 7.563 7.827 7.867 7.348 6.355 5.318 4.682 4.608 4.918 5.308 5.604 5.851 6.195 6.686 7.195 7.495 7.428 7.020 6.450 5.938 5.626 5.536 5.607 5.749 5.883 5.962 + 10.881 10.669 10.400 10.237 10.187 10.089 9.758 9.176 8.532 8.088 7.959 8.013 7.972 7.641 7.070 6.509 6.206 6.209 6.358 6.453 6.450 6.503 6.811 7.394 8.013 8.318 8.115 7.540 6.974 6.761 6.938 7.202 7.155 6.627 5.839 5.259 + 10.571 10.449 10.389 10.528 10.734 10.669 10.102 9.168 8.317 7.950 8.084 8.349 8.338 7.977 7.584 7.543 7.914 8.341 8.369 7.868 7.186 6.871 7.202 7.939 8.502 8.428 7.723 6.832 6.285 6.315 6.744 7.159 7.228 6.900 6.395 6.031 + 11.813 11.892 12.043 12.173 12.071 11.524 10.522 9.351 8.448 8.101 8.244 8.530 8.636 8.512 8.365 8.398 8.563 8.581 8.226 7.590 7.074 7.071 7.614 8.295 8.567 8.160 7.294 6.514 6.280 6.657 7.306 7.747 7.685 7.161 6.482 6.022 + 6.816 7.152 7.733 8.369 8.805 8.834 8.421 7.743 7.083 6.640 6.401 6.199 5.903 5.574 5.449 5.739 6.419 7.195 7.683 7.681 7.298 6.863 6.675 6.803 7.081 7.270 7.252 7.099 6.981 7.019 7.190 7.357 7.384 7.237 7.004 6.833 + 6.891 6.769 6.685 6.809 7.158 7.564 7.800 7.755 7.503 7.227 7.069 7.049 7.097 7.160 7.253 7.421 7.654 7.872 7.995 8.042 8.145 8.441 8.919 9.377 9.529 9.218 8.563 7.918 7.656 7.933 8.586 9.245 9.568 9.454 9.081 8.772 + 7.038 6.832 6.647 6.721 7.065 7.437 7.541 7.269 6.769 6.292 5.980 5.802 5.666 5.579 5.665 6.019 6.556 7.023 7.195 7.078 6.923 7.018 7.433 7.944 8.216 8.075 7.650 7.271 7.213 7.509 7.959 8.303 8.396 8.266 8.051 7.900 + 6.931 6.876 6.942 7.204 7.413 7.117 6.078 4.592 3.368 3.006 3.521 4.341 4.797 4.686 4.398 4.516 5.261 6.280 6.952 6.932 6.422 5.966 5.976 6.420 6.928 7.170 7.141 7.121 7.369 7.881 8.391 8.597 8.391 7.902 7.383 7.064 + 8.841 8.188 7.360 6.894 6.935 7.152 7.077 6.538 5.796 5.273 5.172 5.340 5.476 5.445 5.389 5.535 5.934 6.399 6.700 6.809 6.915 7.200 7.615 7.898 7.835 7.516 7.305 7.531 8.192 8.934 9.351 9.305 9.000 8.751 8.701 8.753 + 7.851 7.969 8.009 7.776 7.273 6.733 6.433 6.453 6.606 6.586 6.221 5.616 5.071 4.848 4.992 5.332 5.634 5.780 5.807 5.829 5.910 6.023 6.097 6.105 6.104 6.201 6.477 6.940 7.519 8.092 8.523 8.702 8.591 8.256 7.859 7.593 + 5.884 6.455 7.198 7.624 7.514 7.024 6.496 6.154 5.966 5.760 5.440 5.080 4.830 4.750 4.766 4.775 4.787 4.926 5.288 5.801 6.238 6.397 6.272 6.061 6.001 6.183 6.531 6.922 7.322 7.770 8.238 8.548 8.462 7.905 7.116 6.544 + 6.187 6.495 6.871 6.987 6.639 5.873 4.964 4.251 3.948 4.046 4.335 4.546 4.504 4.218 3.851 3.610 3.623 3.871 4.221 4.538 4.773 4.984 5.259 5.616 5.960 6.161 6.173 6.110 6.182 6.523 7.057 7.505 7.573 7.178 6.544 6.073 + 5.178 5.274 5.419 5.532 5.534 5.370 5.040 4.597 4.132 3.740 3.481 3.357 3.326 3.344 3.398 3.510 3.710 3.980 4.242 4.394 4.376 4.226 4.066 4.028 4.172 4.453 4.768 5.024 5.196 5.305 5.373 5.381 5.293 5.102 4.874 4.717 + 8.643 8.255 7.549 6.643 5.671 4.765 4.048 3.624 3.546 3.785 4.204 4.601 4.798 4.743 4.533 4.356 4.347 4.485 4.604 4.513 4.157 3.688 3.373 3.422 3.836 4.410 4.877 5.087 5.085 5.033 5.064 5.175 5.260 5.227 5.092 4.971 + 6.617 6.721 6.675 6.229 5.409 4.539 3.994 3.908 4.085 4.197 4.067 3.786 3.585 3.602 3.777 3.938 3.978 3.938 3.925 3.980 4.046 4.052 4.016 4.037 4.178 4.379 4.501 4.483 4.429 4.530 4.858 5.250 5.407 5.156 4.634 4.215 + 4.211 5.148 6.120 6.137 5.012 3.531 2.763 3.142 4.135 4.758 4.444 3.489 2.714 2.715 3.389 4.110 4.335 4.048 3.677 3.636 3.966 4.372 4.564 4.524 4.455 4.523 4.686 4.778 4.720 4.619 4.641 4.808 4.957 4.907 4.666 4.442 + 5.311 6.248 7.456 8.146 8.007 7.367 6.795 6.571 6.503 6.221 5.613 4.971 4.710 4.961 5.441 5.721 5.608 5.276 5.035 5.000 4.997 4.786 4.358 3.986 3.970 4.334 4.790 5.003 4.899 4.703 4.685 4.874 5.034 4.922 4.558 4.234 + 8.974 8.925 8.928 9.076 9.340 9.529 9.390 8.776 7.772 6.672 5.815 5.387 5.334 5.426 5.439 5.286 5.030 4.776 4.557 4.322 4.021 3.698 3.496 3.538 3.809 4.138 4.316 4.267 4.099 4.017 4.138 4.392 4.586 4.576 4.395 4.222 + 6.493 5.769 4.864 4.405 4.577 4.993 5.045 4.425 3.378 2.482 2.180 2.471 2.981 3.318 3.352 3.231 3.156 3.178 3.194 3.101 2.939 2.861 2.987 3.291 3.628 3.872 4.013 4.134 4.309 4.531 4.740 4.906 5.062 5.251 5.458 5.601 + 3.218 2.984 2.798 2.987 3.624 4.420 4.897 4.733 4.012 3.195 2.800 3.031 3.640 4.122 4.099 3.597 3.003 2.743 2.954 3.406 3.726 3.722 3.523 3.434 3.649 4.077 4.431 4.489 4.286 4.066 4.053 4.255 4.479 4.529 4.392 4.236 + 4.397 3.996 3.527 3.386 3.724 4.321 4.762 4.750 4.313 3.751 3.390 3.340 3.451 3.485 3.323 3.061 2.899 2.968 3.210 3.444 3.523 3.457 3.405 3.534 3.881 4.315 4.628 4.681 4.490 4.202 3.990 3.952 4.073 4.270 4.450 4.552 + 4.355 3.643 2.758 2.361 2.731 3.552 4.167 4.073 3.289 2.315 1.751 1.867 2.458 3.050 3.271 3.097 2.800 2.697 2.902 3.274 3.570 3.644 3.528 3.375 3.307 3.337 3.393 3.415 3.413 3.454 3.579 3.758 3.904 3.951 3.910 3.854 + 4.664 4.307 3.838 3.555 3.585 3.804 3.957 3.862 3.535 3.145 2.864 2.736 2.685 2.615 2.506 2.423 2.449 2.610 2.862 3.137 3.391 3.610 3.786 3.895 3.907 3.830 3.713 3.627 3.617 3.684 3.797 3.934 4.088 4.257 4.415 4.513 + 4.119 4.125 4.173 4.266 4.319 4.197 3.826 3.277 2.744 2.418 2.361 2.480 2.623 2.698 2.717 2.748 2.826 2.936 3.049 3.175 3.353 3.587 3.812 3.927 3.889 3.763 3.684 3.739 3.891 4.017 4.029 3.965 3.956 4.099 4.349 4.546 + 5.333 5.158 5.015 5.084 5.284 5.291 4.824 3.938 3.040 2.592 2.738 3.182 3.427 3.181 2.580 2.058 1.978 2.351 2.861 3.156 3.130 2.967 2.930 3.110 3.348 3.391 3.132 2.717 2.436 2.491 2.837 3.215 3.345 3.128 2.716 2.398 + 3.806 4.136 4.515 4.645 4.465 4.159 3.922 3.754 3.500 3.090 2.700 2.617 2.927 3.346 3.421 2.945 2.203 1.767 2.001 2.726 3.362 3.444 3.035 2.647 2.750 3.339 3.942 4.073 3.675 3.145 2.932 3.113 3.361 3.304 2.919 2.548 + 5.456 4.592 3.440 2.702 2.680 3.117 3.494 3.504 3.275 3.171 3.396 3.769 3.882 3.471 2.675 1.936 1.653 1.883 2.348 2.698 2.789 2.755 2.833 3.133 3.557 3.903 4.038 3.980 3.848 3.733 3.636 3.490 3.244 2.921 2.611 2.421 + 4.241 3.856 3.462 3.483 4.007 4.692 5.024 4.721 3.943 3.147 2.728 2.746 2.948 3.024 2.869 2.630 2.541 2.712 3.046 3.347 3.488 3.487 3.460 3.502 3.609 3.712 3.747 3.712 3.650 3.601 3.568 3.522 3.440 3.325 3.212 3.143 + 5.856 5.595 5.239 4.991 4.926 4.932 4.798 4.385 3.748 3.103 2.686 2.584 2.693 2.813 2.796 2.644 2.466 2.364 2.346 2.346 2.316 2.306 2.431 2.760 3.219 3.611 3.752 3.617 3.367 3.219 3.277 3.451 3.540 3.417 3.140 2.913 + 4.347 4.069 3.761 3.688 3.881 4.101 4.048 3.644 3.114 2.796 2.838 3.045 3.029 2.540 1.697 0.929 0.664 1.011 1.684 2.227 2.347 2.099 1.800 1.760 2.052 2.493 2.809 2.850 2.681 2.494 2.447 2.557 2.721 2.826 2.839 2.814 + 4.765 4.368 3.894 3.708 3.906 4.231 4.301 3.938 3.333 2.879 2.839 3.102 3.261 2.940 2.122 1.190 0.666 0.834 1.544 2.333 2.755 2.666 2.267 1.910 1.829 2.018 2.300 2.510 2.611 2.685 2.816 2.998 3.144 3.177 3.109 3.032 + 4.872 4.176 3.260 2.706 2.775 3.246 3.647 3.653 3.303 2.893 2.659 2.563 2.362 1.891 1.281 0.907 1.089 1.813 2.691 3.224 3.150 2.607 2.012 1.752 1.941 2.400 2.848 3.114 3.222 3.307 3.454 3.625 3.702 3.614 3.414 3.252 + 4.586 4.835 5.094 5.070 4.635 3.944 3.333 3.082 3.219 3.495 3.579 3.305 2.791 2.320 2.107 2.120 2.129 1.936 1.583 1.348 1.516 2.114 2.837 3.257 3.135 2.609 2.085 1.936 2.244 2.782 3.224 3.388 3.315 3.171 3.079 3.051 + 4.127 4.300 4.586 4.849 4.910 4.639 4.075 3.448 3.067 3.115 3.519 3.984 4.189 3.978 3.415 2.694 1.995 1.422 1.035 0.903 1.085 1.552 2.129 2.571 2.711 2.583 2.399 2.383 2.608 2.954 3.227 3.308 3.224 3.086 2.986 2.945 + 5.058 5.047 4.975 4.792 4.496 4.158 3.887 3.757 3.746 3.734 3.576 3.197 2.656 2.121 1.777 1.708 1.853 2.047 2.135 2.060 1.891 1.763 1.787 1.986 2.306 2.669 3.031 3.392 3.772 4.165 4.522 4.771 4.866 4.820 4.705 4.614 + 4.146 4.295 4.488 4.581 4.466 4.133 3.672 3.209 2.836 2.566 2.343 2.100 1.829 1.602 1.536 1.715 2.115 2.589 2.939 3.014 2.805 2.449 2.157 2.099 2.326 2.764 3.280 3.766 4.182 4.538 4.846 5.089 5.234 5.267 5.224 5.174 + 4.198 3.916 3.599 3.480 3.530 3.476 3.074 2.385 1.762 1.556 1.806 2.223 2.461 2.434 2.364 2.530 2.965 3.392 3.473 3.116 2.563 2.178 2.146 2.367 2.620 2.815 3.075 3.584 4.351 5.147 5.673 5.791 5.614 5.373 5.226 5.181 + 3.694 3.923 4.313 4.664 4.662 4.079 3.021 1.960 1.445 1.670 2.297 2.726 2.605 2.135 1.873 2.201 2.955 3.560 3.561 3.050 2.590 2.701 3.378 4.110 4.358 4.059 3.679 3.782 4.517 5.496 6.143 6.169 5.746 5.271 5.004 4.931 + 5.187 4.232 3.036 2.448 2.781 3.594 4.087 3.758 2.776 1.793 1.404 1.717 2.356 2.836 2.936 2.795 2.695 2.798 3.051 3.316 3.530 3.740 4.002 4.277 4.449 4.456 4.390 4.454 4.797 5.375 5.944 6.215 6.035 5.489 4.847 4.424 + 5.751 5.155 4.245 3.428 3.016 3.063 3.357 3.575 3.496 3.140 2.729 2.520 2.623 2.940 3.268 3.456 3.504 3.528 3.642 3.871 4.161 4.459 4.763 5.097 5.444 5.717 5.825 5.774 5.700 5.772 6.055 6.433 6.692 6.695 6.499 6.310 + 2.978 3.069 3.256 3.511 3.742 3.818 3.645 3.255 2.819 2.575 2.685 3.136 3.738 4.237 4.465 4.431 4.294 4.248 4.395 4.696 5.025 5.260 5.368 5.405 5.462 5.593 5.789 5.998 6.175 6.307 6.418 6.538 6.679 6.825 6.948 7.017 + 3.218 3.650 4.129 4.232 3.870 3.352 3.097 3.259 3.612 3.790 3.633 3.327 3.202 3.409 3.775 3.971 3.831 3.515 3.374 3.639 4.223 4.806 5.107 5.095 4.982 5.005 5.237 5.551 5.760 5.768 5.613 5.401 5.209 5.061 4.955 4.895 + 1.533 2.310 3.213 3.501 2.967 2.088 1.587 1.816 2.509 3.074 3.127 2.778 2.452 2.463 2.763 3.054 3.119 3.025 3.018 3.259 3.677 4.071 4.326 4.502 4.725 5.000 5.186 5.144 4.911 4.688 4.639 4.707 4.658 4.312 3.763 3.342 + 2.530 2.482 2.537 2.880 3.570 4.447 5.187 5.478 5.210 4.538 3.772 3.170 2.795 2.549 2.340 2.214 2.335 2.804 3.507 4.146 4.454 4.415 4.281 4.356 4.720 5.152 5.327 5.115 4.708 4.445 4.490 4.657 4.567 4.004 3.161 2.532 + 4.412 4.419 4.536 4.813 5.124 5.243 5.065 4.745 4.567 4.645 4.735 4.404 3.419 2.040 0.902 0.560 1.076 1.983 2.673 2.852 2.687 2.550 2.639 2.815 2.794 2.466 2.028 1.813 1.990 2.421 2.792 2.877 2.687 2.400 2.179 2.077 + 4.347 4.129 3.830 3.584 3.392 3.150 2.812 2.502 2.433 2.686 3.073 3.239 2.942 2.281 1.637 1.379 1.584 2.005 2.314 2.374 2.306 2.319 2.487 2.702 2.828 2.876 3.011 3.371 3.884 4.287 4.323 3.970 3.446 3.030 2.843 2.809 + 7.037 6.533 5.882 5.516 5.611 5.962 6.170 5.958 5.375 4.718 4.274 4.091 3.974 3.684 3.154 2.541 2.084 1.908 1.932 1.973 1.923 1.855 1.959 2.376 3.065 3.814 4.381 4.644 4.646 4.508 4.313 4.043 3.637 3.099 2.554 2.205 + 8.683 7.907 6.825 6.035 5.857 6.159 6.532 6.632 6.411 6.067 5.801 5.616 5.334 4.785 3.987 3.154 2.533 2.223 2.129 2.083 2.009 1.982 2.151 2.588 3.207 3.811 4.215 4.355 4.293 4.142 3.982 3.824 3.641 3.425 3.215 3.083 + 9.042 8.336 7.376 6.712 6.587 6.808 6.982 6.867 6.540 6.243 6.091 5.939 5.524 4.743 3.794 3.045 2.743 2.831 3.031 3.106 3.062 3.104 3.412 3.939 4.422 4.594 4.404 4.066 3.885 4.008 4.315 4.501 4.311 3.726 3.000 2.504 + 8.347 8.111 7.677 7.162 6.766 6.671 6.897 7.247 7.439 7.316 6.961 6.599 6.364 6.165 5.776 5.083 4.251 3.629 3.482 3.770 4.191 4.450 4.496 4.531 4.775 5.242 5.709 5.926 5.834 5.588 5.384 5.259 5.086 4.740 4.280 3.943 + 8.968 8.840 8.645 8.460 8.329 8.224 8.067 7.787 7.389 6.966 6.643 6.485 6.441 6.373 6.159 5.787 5.363 5.040 4.909 4.969 5.166 5.465 5.872 6.374 6.875 7.202 7.206 6.889 6.427 6.063 5.935 5.989 6.041 5.947 5.729 5.545 + 8.766 8.595 8.385 8.284 8.332 8.421 8.382 8.123 7.700 7.274 7.001 6.927 6.986 7.059 7.059 6.963 6.801 6.617 6.462 6.387 6.442 6.648 6.967 7.304 7.547 7.619 7.518 7.297 7.033 6.787 6.595 6.476 6.439 6.472 6.539 6.590 + 8.638 8.367 7.970 7.634 7.463 7.435 7.451 7.439 7.404 7.385 7.386 7.334 7.140 6.785 6.373 6.071 5.986 6.080 6.191 6.165 5.985 5.793 5.784 6.047 6.493 6.915 7.137 7.142 7.059 7.046 7.146 7.256 7.215 6.958 6.587 6.316 + 8.932 8.198 7.243 6.676 6.733 7.147 7.459 7.443 7.257 7.220 7.433 7.654 7.522 6.940 6.216 5.823 5.981 6.434 6.651 6.283 5.475 4.780 4.726 5.407 6.414 7.158 7.304 6.967 6.566 6.457 6.675 6.936 6.902 6.453 5.796 5.318 + 8.827 8.289 7.602 7.226 7.331 7.686 7.892 7.739 7.364 7.103 7.158 7.408 7.513 7.230 6.647 6.127 5.997 6.269 6.624 6.686 6.349 5.871 5.666 5.949 6.555 7.066 7.147 6.810 6.384 6.219 6.385 6.596 6.456 5.804 4.892 4.232 + 8.910 8.918 8.867 8.685 8.367 7.977 7.607 7.320 7.136 7.054 7.072 7.167 7.259 7.232 7.004 6.603 6.164 5.847 5.730 5.779 5.920 6.137 6.469 6.916 7.343 7.512 7.267 6.707 6.180 6.042 6.369 6.860 7.057 6.713 6.016 5.462 + 8.124 7.784 7.345 7.119 7.249 7.589 7.780 7.488 6.639 5.491 4.480 3.951 3.970 4.334 4.764 5.104 5.376 5.668 5.989 6.237 6.307 6.228 6.178 6.334 6.696 7.058 7.174 6.977 6.656 6.491 6.600 6.806 6.785 6.359 5.688 5.182 + 6.268 5.027 3.778 3.885 5.626 7.929 9.273 8.921 7.416 5.976 5.424 5.625 5.855 5.637 5.201 5.169 5.846 6.858 7.488 7.364 6.814 6.546 6.985 7.893 8.617 8.694 8.240 7.794 7.805 8.269 8.808 9.050 8.917 8.602 8.329 8.195 + 9.200 8.435 7.450 6.909 7.105 7.783 8.394 8.527 8.171 7.616 7.167 6.928 6.826 6.764 6.737 6.788 6.905 7.001 7.009 6.982 7.069 7.361 7.773 8.095 8.180 8.101 8.103 8.379 8.881 9.337 9.477 9.252 8.862 8.565 8.464 8.476 + 8.071 8.081 8.190 8.460 8.813 9.036 8.919 8.418 7.714 7.096 6.772 6.749 6.860 6.913 6.830 6.682 6.606 6.695 6.940 7.259 7.567 7.818 8.011 8.163 8.287 8.395 8.503 8.619 8.736 8.820 8.833 8.755 8.603 8.425 8.275 8.190 + 8.090 7.823 7.564 7.622 8.048 8.549 8.680 8.187 7.228 6.292 5.882 6.169 6.890 7.555 7.791 7.574 7.188 6.975 7.084 7.413 7.755 8.003 8.222 8.549 9.017 9.484 9.727 9.628 9.273 8.897 8.701 8.716 8.816 8.855 8.794 8.716 + 8.193 7.388 6.447 6.154 6.760 7.795 8.469 8.306 7.490 6.651 6.339 6.624 7.141 7.459 7.432 7.239 7.143 7.242 7.428 7.559 7.637 7.807 8.198 8.767 9.310 9.618 9.627 9.442 9.224 9.064 8.946 8.811 8.633 8.440 8.284 8.200 + 5.164 5.288 5.659 6.354 7.235 7.976 8.267 8.043 7.518 7.025 6.785 6.808 6.966 7.127 7.220 7.197 7.005 6.635 6.213 6.011 6.287 7.068 8.069 8.850 9.128 8.966 8.701 8.639 8.817 9.009 8.970 8.677 8.338 8.184 8.254 8.381 + 6.449 6.594 6.906 7.372 7.884 8.252 8.300 7.976 7.419 6.888 6.624 6.705 7.022 7.363 7.554 7.553 7.433 7.303 7.227 7.235 7.358 7.662 8.192 8.889 9.553 9.926 9.858 9.428 8.910 8.597 8.589 8.742 8.789 8.576 8.185 7.879 + 5.543 5.809 6.389 7.255 8.201 8.884 9.029 8.627 7.961 7.410 7.185 7.208 7.216 7.012 6.646 6.368 6.418 6.816 7.355 7.774 7.977 8.105 8.393 8.947 9.621 10.102 10.134 9.707 9.072 8.558 8.363 8.446 8.614 8.688 8.637 8.559 + 4.372 4.423 4.709 5.402 6.439 7.477 8.083 8.024 7.436 6.731 6.319 6.343 6.621 6.830 6.758 6.458 6.170 6.128 6.396 6.864 7.380 7.878 8.391 8.955 9.498 9.836 9.797 9.365 8.720 8.139 7.819 7.770 7.852 7.909 7.885 7.836 + 5.675 5.764 5.911 6.080 6.247 6.399 6.500 6.488 6.326 6.057 5.828 5.815 6.094 6.554 6.932 6.975 6.621 6.068 5.669 5.722 6.296 7.197 8.100 8.735 9.000 8.955 8.722 8.395 8.023 7.650 7.365 7.286 7.488 7.927 8.428 8.760 + 5.281 5.112 4.966 5.063 5.458 5.974 6.323 6.321 6.036 5.735 5.689 5.966 6.386 6.658 6.608 6.307 6.016 6.002 6.356 6.962 7.606 8.131 8.506 8.776 8.951 8.962 8.717 8.212 7.588 7.072 6.852 6.962 7.287 7.653 7.928 8.065 + 3.325 3.498 3.914 4.582 5.340 5.898 6.032 5.769 5.397 5.266 5.530 6.044 6.491 6.626 6.443 6.156 6.015 6.146 6.516 7.026 7.611 8.265 8.965 9.614 10.048 10.121 9.800 9.187 8.476 7.864 7.492 7.422 7.631 8.018 8.424 8.681 + 1.874 2.048 2.516 3.351 4.389 5.231 5.458 4.940 3.992 3.220 3.156 3.909 5.111 6.182 6.732 6.791 6.717 6.863 7.296 7.790 8.066 8.065 8.001 8.148 8.568 9.016 9.133 8.757 8.078 7.505 7.359 7.636 8.059 8.328 8.358 8.290 + 3.248 3.459 3.909 4.575 5.303 5.815 5.839 5.302 4.438 3.709 3.551 4.098 5.090 6.046 6.587 6.674 6.576 6.612 6.884 7.226 7.402 7.356 7.279 7.422 7.835 8.277 8.411 8.103 7.566 7.190 7.215 7.518 7.732 7.580 7.132 6.745 + 3.560 3.779 4.249 4.909 5.507 5.674 5.165 4.097 2.967 2.396 2.753 3.912 5.341 6.432 6.857 6.693 6.280 5.949 5.832 5.882 6.012 6.214 6.539 6.986 7.423 7.642 7.521 7.143 6.757 6.602 6.718 6.912 6.912 6.594 6.093 5.717 + 4.696 4.469 4.267 4.380 4.888 5.592 6.169 6.414 6.349 6.146 5.943 5.743 5.469 5.107 4.776 4.645 4.782 5.069 5.289 5.296 5.142 5.027 5.130 5.458 5.830 6.018 5.911 5.578 5.201 4.938 4.825 4.784 4.709 4.553 4.361 4.228 + 4.631 4.567 4.563 4.743 5.115 5.540 5.837 5.914 5.815 5.655 5.503 5.333 5.062 4.646 4.127 3.595 3.128 2.761 2.514 2.439 2.606 3.044 3.665 4.286 4.718 4.877 4.827 4.709 4.635 4.620 4.600 4.509 4.335 4.127 3.949 3.850 + 5.073 5.588 6.417 7.252 7.806 7.915 7.565 6.869 6.026 5.253 4.717 4.471 4.434 4.447 4.379 4.211 4.025 3.909 3.860 3.780 3.576 3.272 3.020 2.985 3.196 3.504 3.698 3.680 3.542 3.468 3.541 3.647 3.564 3.177 2.621 2.212 + 7.360 7.463 7.811 8.479 9.285 9.837 9.808 9.201 8.365 7.725 7.483 7.524 7.605 7.601 7.579 7.644 7.731 7.589 6.997 6.016 5.023 4.479 4.596 5.191 5.839 6.174 6.100 5.760 5.344 4.933 4.496 3.992 3.461 3.000 2.690 2.544 + 7.675 7.751 8.119 8.919 9.936 10.661 10.669 9.973 9.017 8.324 8.101 8.178 8.281 8.335 8.483 8.809 9.098 8.911 7.982 6.548 5.279 4.816 5.294 6.263 7.057 7.283 7.015 6.577 6.174 5.735 5.075 4.171 3.241 2.570 2.261 2.189 + 8.101 8.072 8.293 8.979 9.958 10.713 10.770 10.101 9.139 8.418 8.170 8.244 8.378 8.503 8.743 9.143 9.430 9.133 8.019 6.419 5.115 4.803 5.568 6.831 7.802 8.046 7.696 7.188 6.813 6.506 6.023 5.261 4.397 3.718 3.366 3.260 + 8.276 8.230 8.412 9.039 9.952 10.650 10.667 9.962 8.957 8.193 7.927 8.030 8.228 8.403 8.636 8.969 9.177 8.854 7.786 6.268 5.017 4.698 5.435 6.716 7.777 8.124 7.787 7.128 6.465 5.852 5.177 4.395 3.647 3.132 2.913 2.876 + 8.287 8.286 8.520 9.163 10.041 10.664 10.582 9.757 8.613 7.723 7.402 7.564 7.909 8.220 8.471 8.676 8.695 8.262 7.245 5.900 4.820 4.563 5.245 6.434 7.442 7.775 7.390 6.598 5.749 5.012 4.371 3.787 3.303 3.000 2.890 2.883 + 8.375 8.490 8.803 9.329 9.887 10.148 9.856 9.041 8.033 7.252 6.947 7.091 7.468 7.865 8.155 8.264 8.087 7.518 6.579 5.528 4.782 4.678 5.233 6.103 6.798 6.978 6.627 5.990 5.352 4.857 4.487 4.154 3.817 3.504 3.268 3.146 + 8.198 8.388 8.754 9.188 9.463 9.324 8.683 7.731 6.858 6.402 6.441 6.784 7.162 7.431 7.614 7.750 7.748 7.400 6.591 5.498 4.579 4.299 4.796 5.749 6.573 6.792 6.328 5.493 4.732 4.321 4.226 4.207 4.028 3.630 3.153 2.831 + 8.025 8.280 8.619 8.769 8.495 7.764 6.817 6.051 5.758 5.899 6.135 6.108 5.753 5.363 5.305 5.650 6.038 5.960 5.220 4.172 3.495 3.667 4.570 5.574 6.018 5.682 4.879 4.121 3.703 3.552 3.426 3.211 3.020 3.024 3.224 3.426 + 8.093 7.743 7.306 7.040 6.933 6.712 6.126 5.237 4.409 4.017 4.121 4.428 4.578 4.465 4.303 4.369 4.685 4.950 4.805 4.193 3.461 3.111 3.397 4.126 4.816 5.056 4.782 4.247 3.773 3.523 3.454 3.443 3.416 3.380 3.364 3.365 + 6.914 6.388 5.886 5.975 6.671 7.379 7.387 6.490 5.154 4.122 3.809 4.042 4.329 4.345 4.184 4.153 4.383 4.647 4.569 4.006 3.211 2.632 2.539 2.831 3.189 3.380 3.426 3.488 3.640 3.779 3.756 3.573 3.412 3.457 3.698 3.923 + 6.588 6.116 5.648 5.675 6.218 6.768 6.715 5.866 4.595 3.510 2.969 2.879 2.919 2.917 2.994 3.352 3.954 4.455 4.468 3.924 3.169 2.693 2.743 3.156 3.553 3.672 3.552 3.400 3.351 3.348 3.263 3.084 2.962 3.049 3.317 3.553 + 6.315 5.693 5.077 5.134 5.932 6.818 6.937 5.945 4.302 2.913 2.435 2.840 3.545 3.945 3.867 3.580 3.448 3.575 3.766 3.767 3.524 3.219 3.068 3.119 3.232 3.238 3.110 2.975 2.981 3.153 3.380 3.513 3.482 3.330 3.156 3.047 + 5.719 5.153 4.516 4.358 4.790 5.388 5.558 5.043 4.131 3.400 3.253 3.643 4.191 4.537 4.590 4.488 4.371 4.226 3.940 3.492 3.035 2.796 2.873 3.145 3.385 3.457 3.408 3.383 3.454 3.545 3.516 3.314 3.024 2.789 2.681 2.660 + 6.090 5.466 4.798 4.730 5.384 6.242 6.571 6.032 4.930 3.935 3.537 3.717 4.075 4.230 4.120 3.942 3.873 3.863 3.710 3.297 2.755 2.375 2.364 2.691 3.140 3.506 3.728 3.857 3.927 3.886 3.670 3.307 2.943 2.727 2.689 2.726 + 7.051 6.531 5.857 5.453 5.462 5.658 5.680 5.357 4.836 4.431 4.340 4.514 4.742 4.858 4.848 4.779 4.659 4.403 3.942 3.355 2.871 2.706 2.890 3.243 3.521 3.611 3.577 3.548 3.559 3.528 3.361 3.088 2.861 2.817 2.943 3.082 + 8.279 7.273 5.993 5.311 5.567 6.355 6.926 6.809 6.141 5.463 5.225 5.458 5.840 6.020 5.877 5.505 5.030 4.501 3.944 3.474 3.277 3.443 3.817 4.071 3.961 3.551 3.173 3.143 3.482 3.902 4.072 3.900 3.581 3.386 3.403 3.496 + 9.231 8.230 6.848 5.879 5.742 6.270 6.941 7.316 7.303 7.094 6.910 6.817 6.754 6.664 6.555 6.427 6.185 5.691 4.929 4.119 3.616 3.636 4.048 4.445 4.446 3.997 3.396 3.035 3.079 3.369 3.598 3.573 3.345 3.095 2.951 2.909 + 8.993 8.245 7.125 6.182 5.843 6.202 7.002 7.794 8.199 8.098 7.675 7.278 7.196 7.459 7.806 7.830 7.252 6.134 4.887 4.050 3.945 4.469 5.142 5.415 5.020 4.123 3.184 2.643 2.642 2.986 3.325 3.393 3.144 2.719 2.316 2.080 + 8.755 8.123 7.237 6.593 6.483 6.854 7.415 7.866 8.063 8.029 7.874 7.722 7.682 7.828 8.127 8.383 8.296 7.652 6.535 5.353 4.604 4.529 4.919 5.256 5.095 4.390 3.503 2.903 2.815 3.081 3.328 3.266 2.863 2.302 1.812 1.541 + 8.492 7.794 6.896 6.404 6.581 7.215 7.857 8.188 8.190 8.036 7.871 7.726 7.601 7.557 7.648 7.769 7.619 6.916 5.711 4.483 3.850 4.082 4.839 5.395 5.202 4.323 3.352 2.911 3.142 3.642 3.852 3.523 2.862 2.263 1.952 1.871 + 8.132 7.210 6.065 5.531 5.938 6.908 7.727 7.922 7.552 7.032 6.714 6.650 6.678 6.675 6.670 6.720 6.735 6.497 5.888 5.091 4.516 4.461 4.823 5.137 4.951 4.217 3.340 2.840 2.933 3.377 3.710 3.621 3.148 2.561 2.113 1.894 + 7.515 6.534 5.403 5.069 5.796 6.981 7.693 7.449 6.532 5.642 5.264 5.340 5.478 5.415 5.241 5.210 5.390 5.552 5.418 4.988 4.587 4.552 4.885 5.213 5.132 4.588 3.926 3.553 3.553 3.628 3.410 2.828 2.174 1.803 1.800 1.931 + 8.536 7.208 5.531 4.676 5.088 6.204 6.987 6.768 5.700 4.500 3.815 3.777 4.073 4.333 4.421 4.398 4.313 4.110 3.766 3.451 3.469 3.972 4.733 5.254 5.151 4.495 3.753 3.384 3.442 3.564 3.341 2.709 1.998 1.596 1.590 1.730 + 4.982 4.797 4.522 4.310 4.301 4.526 4.848 5.016 4.821 4.251 3.539 3.023 2.916 3.154 3.437 3.447 3.076 2.491 2.011 1.882 2.137 2.602 3.029 3.235 3.161 2.865 2.467 2.109 1.908 1.901 2.006 2.047 1.858 1.409 0.863 0.487 + 6.690 5.643 4.296 3.546 3.738 4.457 4.944 4.747 4.047 3.422 3.318 3.688 4.108 4.181 3.849 3.365 3.004 2.833 2.740 2.637 2.593 2.753 3.135 3.531 3.638 3.311 2.696 2.125 1.856 1.903 2.063 2.105 1.937 1.632 1.333 1.157 + 7.682 6.565 5.045 3.994 3.793 4.134 4.380 4.126 3.485 2.873 2.586 2.554 2.502 2.280 2.035 2.045 2.394 2.840 3.003 2.708 2.150 1.724 1.689 1.962 2.215 2.181 1.861 1.487 1.293 1.325 1.451 1.504 1.428 1.280 1.150 1.083 + 5.910 5.203 4.209 3.461 3.240 3.418 3.613 3.514 3.103 2.629 2.381 2.469 2.784 3.131 3.387 3.545 3.638 3.629 3.414 2.927 2.259 1.650 1.351 1.442 1.776 2.075 2.134 1.945 1.677 1.517 1.511 1.536 1.411 1.066 0.616 0.299 + 2.653 3.053 3.649 4.162 4.398 4.330 4.057 3.708 3.375 3.115 2.974 2.986 3.136 3.327 3.424 3.334 3.081 2.787 2.570 2.454 2.362 2.199 1.955 1.728 1.644 1.750 1.958 2.110 2.081 1.860 1.536 1.224 0.998 0.867 0.804 0.779 + 4.027 3.931 3.858 3.930 4.136 4.304 4.218 3.782 3.097 2.411 1.955 1.818 1.924 2.118 2.282 2.383 2.448 2.501 2.526 2.482 2.346 2.145 1.947 1.830 1.838 1.955 2.107 2.182 2.084 1.787 1.360 0.942 0.672 0.602 0.675 0.761 + 5.823 5.479 5.027 4.740 4.699 4.715 4.484 3.843 2.928 2.114 1.773 2.022 2.648 3.242 3.447 3.156 2.545 1.940 1.628 1.701 2.035 2.381 2.513 2.352 1.989 1.615 1.391 1.353 1.405 1.405 1.277 1.061 0.872 0.798 0.832 0.890 + 5.279 4.645 3.860 3.494 3.752 4.333 4.704 4.529 3.894 3.181 2.748 2.708 2.943 3.274 3.583 3.793 3.809 3.535 2.985 2.354 1.928 1.862 2.038 2.140 1.920 1.415 0.916 0.715 0.854 1.102 1.178 0.989 0.685 0.484 0.464 0.521 + 7.856 7.657 7.325 6.922 6.448 5.864 5.177 4.494 3.969 3.698 3.656 3.736 3.860 4.017 4.206 4.341 4.257 3.853 3.243 2.756 2.729 3.245 4.052 4.752 5.109 5.198 5.275 5.478 5.672 5.576 5.078 4.420 4.047 4.234 4.825 5.332 + 9.001 8.794 8.460 8.085 7.683 7.217 6.675 6.119 5.644 5.310 5.134 5.165 5.526 6.328 7.476 8.565 9.044 8.610 7.500 6.411 6.023 6.502 7.384 7.993 8.009 7.714 7.670 8.143 8.801 8.994 8.373 7.267 6.453 6.493 7.233 7.936 + 6.529 5.638 4.315 3.220 2.856 3.291 4.136 4.783 4.785 4.143 3.322 2.980 3.541 4.904 6.457 7.432 7.375 6.422 5.203 4.422 4.417 4.990 5.635 5.947 5.915 5.856 6.076 6.549 6.907 6.741 5.981 5.010 4.397 4.459 5.011 5.515 + 4.948 3.964 2.651 1.807 1.787 2.296 2.717 2.641 2.151 1.675 1.578 1.882 2.322 2.617 2.679 2.600 2.493 2.381 2.234 2.081 2.026 2.145 2.372 2.531 2.501 2.351 2.289 2.460 2.776 2.968 2.819 2.367 1.880 1.627 1.650 1.762 + 3.835 3.669 3.538 3.624 3.856 3.936 3.600 2.889 2.177 1.903 2.234 2.949 3.620 3.921 3.811 3.468 3.090 2.769 2.519 2.375 2.417 2.679 3.056 3.336 3.359 3.171 3.002 3.078 3.435 3.891 4.212 4.303 4.254 4.224 4.277 4.350 + 3.799 3.740 3.711 3.760 3.787 3.605 3.121 2.488 2.041 2.046 2.487 3.067 3.446 3.503 3.399 3.402 3.635 3.977 4.194 4.160 3.960 3.792 3.778 3.871 3.921 3.841 3.691 3.609 3.681 3.862 4.034 4.119 4.133 4.143 4.186 4.230 + 4.616 4.093 3.395 2.971 3.048 3.491 3.924 4.011 3.684 3.171 2.815 2.849 3.269 3.874 4.407 4.693 4.706 4.551 4.405 4.446 4.789 5.432 6.247 7.020 7.534 7.668 7.438 6.983 6.485 6.103 5.928 5.977 6.208 6.535 6.847 7.037 + 4.656 4.633 4.572 4.496 4.480 4.592 4.799 4.938 4.840 4.501 4.145 4.082 4.450 5.065 5.515 5.462 4.907 4.205 3.824 4.045 4.817 5.861 6.875 7.675 8.191 8.389 8.253 7.834 7.301 6.877 6.696 6.706 6.717 6.572 6.297 6.074 + 4.696 4.079 3.228 2.652 2.653 3.134 3.686 3.893 3.635 3.176 2.971 3.329 4.191 5.168 5.818 5.940 5.674 5.360 5.286 5.527 5.980 6.515 7.085 7.694 8.300 8.761 8.922 8.756 8.417 8.135 8.026 7.991 7.813 7.373 6.792 6.375 + 5.714 5.350 4.804 4.313 4.020 3.902 3.824 3.668 3.421 3.191 3.129 3.345 3.835 4.467 5.025 5.295 5.192 4.838 4.538 4.611 5.185 6.071 6.863 7.198 7.003 6.545 6.221 6.259 6.567 6.831 6.796 6.457 6.041 5.787 5.755 5.814 + 6.045 6.043 6.104 6.274 6.501 6.616 6.423 5.828 4.928 3.995 3.369 3.303 3.845 4.798 5.785 6.406 6.425 5.900 5.173 4.696 4.767 5.348 6.084 6.525 6.411 5.831 5.144 4.737 4.789 5.200 5.710 6.080 6.224 6.193 6.100 6.032 + 7.267 6.590 5.729 5.279 5.484 6.072 6.496 6.361 5.680 4.801 4.103 3.742 3.631 3.613 3.622 3.699 3.880 4.110 4.277 4.321 4.307 4.371 4.600 4.954 5.304 5.539 5.639 5.657 5.647 5.627 5.597 5.590 5.669 5.862 6.111 6.289 + 7.124 6.935 6.718 6.630 6.663 6.631 6.328 5.716 4.951 4.265 3.792 3.522 3.383 3.348 3.452 3.702 4.003 4.202 4.214 4.112 4.071 4.199 4.430 4.576 4.514 4.310 4.170 4.244 4.483 4.685 4.693 4.558 4.492 4.665 5.022 5.315 + 4.343 4.523 4.813 5.072 5.127 4.869 4.341 3.746 3.329 3.219 3.347 3.527 3.622 3.657 3.772 4.058 4.440 4.708 4.694 4.423 4.102 3.965 4.091 4.369 4.604 4.673 4.586 4.421 4.224 3.981 3.690 3.421 3.297 3.386 3.617 3.809 + 4.162 4.495 4.911 5.099 4.911 4.458 4.000 3.744 3.703 3.729 3.672 3.528 3.430 3.519 3.795 4.092 4.204 4.058 3.789 3.642 3.786 4.185 4.619 4.852 4.801 4.574 4.374 4.335 4.435 4.543 4.543 4.427 4.286 4.215 4.231 4.272 + 4.242 4.770 5.352 5.470 5.030 4.422 4.142 4.335 4.691 4.768 4.422 3.926 3.678 3.809 4.055 4.029 3.601 3.034 2.740 2.911 3.373 3.779 3.935 3.930 3.974 4.137 4.261 4.130 3.722 3.263 3.036 3.130 3.378 3.541 3.529 3.450 + 3.956 4.038 4.214 4.463 4.696 4.784 4.648 4.337 4.022 3.887 3.995 4.226 4.351 4.192 3.751 3.216 2.825 2.715 2.854 3.102 3.346 3.575 3.848 4.187 4.500 4.628 4.468 4.086 3.697 3.517 3.607 3.824 3.940 3.821 3.537 3.303 + 5.006 4.423 3.684 3.282 3.371 3.670 3.746 3.403 2.832 2.419 2.409 2.728 3.102 3.308 3.329 3.276 3.225 3.136 2.951 2.720 2.605 2.735 3.054 3.339 3.393 3.217 3.012 2.979 3.127 3.265 3.187 2.877 2.519 2.325 2.339 2.424 + 2.931 3.315 3.855 4.268 4.406 4.297 4.048 3.729 3.366 3.024 2.838 2.912 3.171 3.346 3.162 2.595 1.944 1.619 1.803 2.285 2.641 2.607 2.312 2.141 2.367 2.883 3.300 3.303 2.945 2.577 2.499 2.670 2.752 2.461 1.875 1.397 + 2.013 2.081 2.322 2.782 3.306 3.586 3.402 2.840 2.264 2.050 2.292 2.738 3.008 2.921 2.631 2.472 2.650 3.061 3.387 3.378 3.074 2.780 2.822 3.293 3.998 4.603 4.873 4.791 4.510 4.202 3.939 3.685 3.376 3.007 2.654 2.436 + 3.930 3.503 2.934 2.584 2.627 2.953 3.274 3.367 3.226 3.047 3.046 3.294 3.672 3.969 4.034 3.855 3.536 3.216 3.000 2.939 3.054 3.340 3.758 4.224 4.624 4.856 4.876 4.717 4.458 4.192 3.984 3.864 3.829 3.854 3.904 3.941 + 4.715 4.194 3.553 3.245 3.408 3.791 4.025 3.978 3.847 3.931 4.312 4.759 4.936 4.705 4.227 3.786 3.515 3.308 2.984 2.538 2.210 2.292 2.855 3.653 4.295 4.542 4.454 4.285 4.248 4.358 4.481 4.498 4.411 4.311 4.264 4.261 + 3.373 3.289 3.208 3.217 3.300 3.325 3.136 2.696 2.147 1.761 1.784 2.288 3.132 4.038 4.732 5.068 5.069 4.883 4.693 4.639 4.764 5.030 5.350 5.645 5.887 6.098 6.326 6.593 6.873 7.101 7.215 7.193 7.069 6.905 6.764 6.685 + 3.719 3.247 2.679 2.464 2.779 3.388 3.835 3.787 3.266 2.605 2.195 2.224 2.605 3.101 3.501 3.726 3.805 3.802 3.767 3.753 3.829 4.063 4.459 4.932 5.343 5.587 5.662 5.660 5.693 5.808 5.958 6.050 6.013 5.857 5.660 5.526 + 5.229 5.748 6.639 7.615 8.320 8.475 8.030 7.203 6.350 5.735 5.374 5.071 4.620 3.999 3.388 3.022 2.999 3.218 3.487 3.680 3.811 3.960 4.160 4.354 4.461 4.491 4.556 4.787 5.196 5.645 5.922 5.890 5.568 5.106 4.685 4.443 + 5.118 5.208 5.446 5.858 6.332 6.615 6.449 5.745 4.686 3.650 3.007 2.904 3.204 3.599 3.829 3.826 3.716 3.680 3.817 4.108 4.469 4.842 5.207 5.522 5.687 5.585 5.202 4.709 4.403 4.505 4.976 5.506 5.717 5.446 4.879 4.429 + 5.726 5.629 5.754 6.382 7.395 8.284 8.531 8.021 7.113 6.324 5.921 5.797 5.693 5.494 5.316 5.315 5.476 5.638 5.713 5.855 6.337 7.229 8.202 8.708 8.434 7.604 6.842 6.677 7.122 7.699 7.881 7.540 7.000 6.682 6.712 6.865 + 5.516 5.696 6.102 6.741 7.496 8.140 8.441 8.294 7.753 6.986 6.187 5.521 5.115 5.028 5.209 5.479 5.608 5.479 5.218 5.156 5.602 6.584 7.777 8.688 8.992 8.734 8.257 7.914 7.819 7.818 7.694 7.384 7.022 6.788 6.739 6.775 + 4.587 4.975 5.671 6.548 7.449 8.171 8.454 8.070 6.999 5.540 4.230 3.536 3.552 3.931 4.163 3.981 3.570 3.408 3.859 4.887 6.108 7.115 7.768 8.201 8.578 8.870 8.882 8.488 7.820 7.193 6.823 6.621 6.275 5.578 4.685 4.046 + 4.304 4.582 5.131 5.911 6.805 7.608 8.072 8.014 7.424 6.501 5.548 4.797 4.282 3.872 3.441 3.032 2.873 3.209 4.091 5.295 6.454 7.293 7.761 7.988 8.108 8.141 8.031 7.773 7.482 7.288 7.172 6.911 6.236 5.103 3.840 2.996 + 3.637 4.010 4.520 4.890 5.019 4.999 4.946 4.838 4.528 3.930 3.181 2.593 2.414 2.628 2.978 3.203 3.266 3.363 3.709 4.320 4.984 5.451 5.633 5.631 5.588 5.535 5.407 5.187 5.001 5.024 5.259 5.433 5.170 4.326 3.202 2.400 + 2.673 3.051 3.694 4.404 4.961 5.206 5.092 4.693 4.141 3.556 2.992 2.464 1.998 1.664 1.547 1.671 1.970 2.316 2.618 2.891 3.231 3.709 4.267 4.710 4.826 4.548 4.038 3.612 3.543 3.876 4.385 4.706 4.571 3.980 3.218 2.694 + 5.070 4.996 5.056 5.422 5.980 6.337 6.096 5.187 3.947 2.892 2.354 2.287 2.371 2.301 2.010 1.665 1.490 1.595 1.942 2.424 2.955 3.474 3.906 4.164 4.206 4.097 3.986 3.999 4.137 4.281 4.306 4.196 4.054 3.996 4.045 4.115 + 5.535 5.776 6.115 6.335 6.249 5.800 5.099 4.371 3.833 3.569 3.487 3.390 3.108 2.616 2.048 1.615 1.480 1.680 2.123 2.654 3.130 3.466 3.645 3.702 3.705 3.728 3.818 3.958 4.074 4.061 3.853 3.458 2.963 2.486 2.126 1.936 + 3.224 3.896 4.792 5.318 5.135 4.370 3.507 3.034 3.109 3.466 3.640 3.314 2.555 1.758 1.360 1.531 2.076 2.605 2.827 2.750 2.640 2.784 3.255 3.848 4.229 4.181 3.757 3.239 2.940 2.997 3.299 3.579 3.606 3.331 2.914 2.611 + 3.709 3.953 4.460 5.154 5.784 6.032 5.746 5.094 4.471 4.196 4.263 4.352 4.126 3.531 2.853 2.475 2.554 2.906 3.196 3.245 3.181 3.299 3.765 4.442 4.972 5.065 4.711 4.179 3.801 3.743 3.924 4.127 4.169 4.018 3.779 3.606 + 2.750 2.685 2.868 3.564 4.628 5.485 5.539 4.662 3.351 2.383 2.239 2.756 3.290 3.253 2.587 1.787 1.495 1.984 2.966 3.842 4.172 3.988 3.715 3.798 4.353 5.099 5.597 5.580 5.122 4.547 4.178 4.142 4.345 4.602 4.784 4.864 + 3.339 3.328 3.793 5.108 6.945 8.314 8.283 6.758 4.616 3.051 2.676 3.152 3.620 3.529 3.093 3.026 3.824 5.264 6.567 7.032 6.591 5.813 5.403 5.661 6.318 6.832 6.821 6.281 5.494 4.771 4.289 4.074 4.081 4.238 4.448 4.594 + 1.223 1.836 3.255 5.458 7.853 9.434 9.431 7.933 5.907 4.529 4.352 4.988 5.554 5.490 5.031 4.942 5.780 7.326 8.702 9.061 8.279 7.054 6.370 6.742 7.870 8.916 9.149 8.447 7.294 6.342 5.932 5.919 5.897 5.583 5.048 4.631 + 3.099 3.712 4.930 6.597 8.287 9.412 9.539 8.699 7.417 6.381 5.988 6.104 6.261 6.123 5.831 5.909 6.762 8.202 9.441 9.637 8.593 7.014 6.061 6.487 8.041 9.636 10.172 9.375 7.962 7.007 7.046 7.655 7.874 7.086 5.597 4.416 + 2.984 3.594 4.741 6.257 7.869 9.207 9.910 9.783 8.935 7.764 6.745 6.156 5.968 5.981 6.110 6.504 7.359 8.565 9.565 9.662 8.619 7.018 5.972 6.325 7.937 9.716 10.435 9.700 8.244 7.279 7.437 8.217 8.453 7.393 5.442 3.905 + 3.697 4.120 4.841 5.718 6.686 7.712 8.675 9.311 9.345 8.704 7.626 6.535 5.807 5.609 5.927 6.680 7.737 8.817 9.451 9.201 8.049 6.615 5.876 6.478 8.160 9.837 10.386 9.527 8.062 7.199 7.509 8.415 8.696 7.591 5.551 3.944 + 5.240 5.410 5.805 6.493 7.474 8.612 9.627 10.184 10.049 9.215 7.930 6.591 5.601 5.251 5.653 6.704 8.061 9.179 9.513 8.825 7.438 6.160 5.833 6.751 8.389 9.709 9.892 8.945 7.688 7.087 7.461 8.206 8.305 7.217 5.399 4.008 + 3.237 3.904 5.043 6.378 7.684 8.830 9.719 10.227 10.225 9.666 8.672 7.520 6.551 6.056 6.189 6.915 7.961 8.845 9.041 8.284 6.841 5.483 5.070 5.957 7.662 9.129 9.457 8.565 7.240 6.504 6.775 7.528 7.762 6.879 5.257 3.983 + 6.509 6.507 6.666 7.192 8.149 9.328 10.275 10.524 9.903 8.685 7.433 6.629 6.368 6.378 6.339 6.200 6.189 6.497 6.956 7.076 6.473 5.312 4.328 4.298 5.400 7.004 8.141 8.267 7.665 7.134 7.245 7.827 8.165 7.708 6.633 5.736 + 5.615 5.781 6.231 7.061 8.180 9.253 9.828 9.607 8.662 7.417 6.402 5.921 5.909 6.082 6.241 6.439 6.847 7.443 7.859 7.596 6.493 5.018 4.047 4.234 5.457 6.860 7.500 7.096 6.237 5.847 6.339 7.226 7.525 6.649 4.994 3.687 + 5.997 5.954 6.016 6.358 7.021 7.826 8.444 8.573 8.132 7.315 6.486 5.966 5.872 6.101 6.447 6.738 6.888 6.852 6.576 6.023 5.269 4.552 4.178 4.321 4.855 5.406 5.596 5.314 4.788 4.382 4.291 4.384 4.339 3.949 3.334 2.867 + 5.772 5.711 5.630 5.605 5.730 6.058 6.541 7.010 7.243 7.076 6.511 5.728 5.014 4.641 4.744 5.257 5.925 6.388 6.339 5.691 4.671 3.734 3.320 3.577 4.250 4.839 4.940 4.526 3.949 3.641 3.754 4.040 4.062 3.580 2.788 2.184 + 6.356 6.273 6.235 6.407 6.854 7.454 7.930 7.993 7.520 6.646 5.695 4.989 4.679 4.699 4.861 4.995 5.024 4.933 4.718 4.388 4.029 3.827 3.966 4.449 5.012 5.245 4.903 4.132 3.426 3.257 3.693 4.294 4.437 3.821 2.749 1.924 + 4.382 5.123 6.150 6.890 7.044 6.716 6.226 5.817 5.520 5.264 5.046 4.975 5.126 5.399 5.548 5.386 4.964 4.541 4.356 4.429 4.564 4.564 4.415 4.275 4.273 4.347 4.297 4.010 3.618 3.403 3.518 3.803 3.885 3.522 2.854 2.326 + 1.950 2.996 4.546 5.894 6.615 6.740 6.569 6.340 6.067 5.650 5.107 4.664 4.591 4.953 5.511 5.878 5.809 5.364 4.829 4.482 4.408 4.494 4.569 4.530 4.360 4.086 3.737 3.372 3.101 3.034 3.182 3.401 3.474 3.279 2.909 2.617 + 3.515 3.691 4.129 4.864 5.747 6.474 6.772 6.583 6.094 5.584 5.240 5.084 5.052 5.099 5.216 5.356 5.382 5.142 4.624 4.031 3.683 3.778 4.226 4.702 4.890 4.716 4.372 4.122 4.077 4.128 4.079 3.840 3.493 3.195 3.035 2.987 + 2.463 3.059 4.124 5.400 6.527 7.175 7.194 6.707 6.031 5.497 5.269 5.316 5.500 5.699 5.852 5.909 5.792 5.433 4.873 4.313 4.031 4.187 4.685 5.207 5.419 5.197 4.698 4.222 3.990 4.004 4.081 4.010 3.702 3.230 2.766 2.484 + 3.836 4.260 4.993 5.839 6.575 7.018 7.081 6.792 6.280 5.715 5.249 4.966 4.880 4.956 5.136 5.350 5.508 5.513 5.301 4.904 4.470 4.208 4.262 4.597 4.987 5.153 4.945 4.462 3.989 3.797 3.944 4.234 4.378 4.214 3.842 3.539 + 5.817 6.071 6.442 6.738 6.820 6.674 6.400 6.136 5.963 5.862 5.749 5.554 5.293 5.066 4.991 5.107 5.325 5.475 5.416 5.142 4.798 4.587 4.627 4.854 5.066 5.066 4.814 4.468 4.275 4.378 4.689 4.930 4.826 4.315 3.626 3.137 + 5.492 5.775 6.283 6.850 7.207 7.108 6.519 5.704 5.093 4.998 5.387 5.916 6.199 6.096 5.782 5.558 5.569 5.688 5.654 5.335 4.869 4.564 4.639 5.035 5.457 5.595 5.353 4.892 4.485 4.307 4.330 4.372 4.261 3.958 3.582 3.325 + 5.622 5.886 6.400 7.060 7.644 7.897 7.706 7.201 6.677 6.384 6.354 6.414 6.369 6.175 5.946 5.797 5.701 5.504 5.089 4.538 4.103 4.006 4.244 4.576 4.720 4.576 4.291 4.116 4.193 4.454 4.714 4.837 4.824 4.769 4.745 4.749 + 5.506 5.863 6.541 7.390 8.120 8.423 8.181 7.574 6.955 6.583 6.437 6.294 5.974 5.535 5.204 5.125 5.174 5.043 4.537 3.795 3.224 3.163 3.597 4.166 4.469 4.382 4.122 4.002 4.137 4.357 4.398 4.158 3.773 3.469 3.351 3.348 + 6.232 6.124 6.214 6.778 7.712 8.531 8.739 8.246 7.448 6.896 6.853 7.118 7.266 7.050 6.612 6.314 6.386 6.724 7.010 7.028 6.860 6.786 7.001 7.417 7.741 7.731 7.415 7.065 6.973 7.228 7.672 8.042 8.159 8.023 7.778 7.599 + 2.784 3.367 4.457 5.841 7.159 8.035 8.292 8.074 7.733 7.563 7.572 7.513 7.134 6.433 5.691 5.246 5.222 5.448 5.624 5.596 5.467 5.473 5.740 6.151 6.437 6.414 6.137 5.854 5.812 6.066 6.461 6.759 6.807 6.619 6.340 6.144 + 4.669 5.479 6.581 7.327 7.404 7.014 6.650 6.694 7.141 7.669 7.923 7.763 7.302 6.744 6.219 5.743 5.289 4.861 4.483 4.142 3.777 3.349 2.934 2.724 2.905 3.505 4.336 5.090 5.508 5.501 5.140 4.565 3.904 3.260 2.734 2.434 + 5.150 5.622 6.268 6.746 6.947 7.034 7.235 7.590 7.899 7.912 7.568 7.050 6.612 6.354 6.158 5.836 5.326 4.749 4.275 3.952 3.687 3.381 3.076 2.948 3.138 3.594 4.087 4.393 4.461 4.408 4.350 4.243 3.925 3.316 2.578 2.063 + 5.097 5.291 5.647 6.137 6.741 7.412 8.023 8.381 8.348 7.974 7.512 7.270 7.380 7.682 7.824 7.522 6.760 5.790 4.924 4.324 3.942 3.635 3.337 3.103 3.031 3.143 3.364 3.599 3.815 4.026 4.193 4.177 3.818 3.103 2.268 1.702 + 5.351 5.720 6.228 6.635 6.913 7.233 7.733 8.309 8.657 8.548 8.080 7.657 7.668 8.154 8.755 8.968 8.515 7.504 6.286 5.182 4.326 3.714 3.347 3.282 3.540 4.010 4.470 4.750 4.852 4.896 4.932 4.821 4.331 3.399 2.303 1.553 + 3.846 4.786 5.918 6.430 6.177 5.772 5.967 6.922 8.051 8.566 8.207 7.456 7.087 7.465 8.268 8.821 8.691 7.980 7.101 6.350 5.708 5.050 4.447 4.200 4.532 5.287 5.981 6.195 5.933 5.572 5.430 5.405 5.057 4.091 2.764 1.792 + 3.691 3.659 3.765 4.207 5.032 6.105 7.203 8.156 8.886 9.341 9.432 9.079 8.348 7.539 7.078 7.248 7.941 8.668 8.854 8.242 7.087 6.002 5.550 5.883 6.680 7.414 7.717 7.586 7.281 7.046 6.885 6.563 5.833 4.696 3.482 2.692 + 3.719 3.928 4.341 4.965 5.807 6.833 7.916 8.846 9.413 9.506 9.166 8.542 7.828 7.226 6.948 7.170 7.916 8.929 9.696 9.709 8.837 7.507 6.495 6.401 7.209 8.286 8.856 8.591 7.809 7.138 6.913 6.874 6.418 5.215 3.611 2.456 + 4.825 4.527 4.252 4.419 5.240 6.568 7.983 9.049 9.553 9.552 9.235 8.743 8.117 7.415 6.845 6.741 7.327 8.453 9.572 10.050 9.616 8.601 7.724 7.561 8.109 8.819 9.068 8.682 8.057 7.759 7.953 8.186 7.754 6.355 4.475 3.127 + 2.203 2.839 3.748 4.559 5.239 6.062 7.228 8.523 9.387 9.361 8.502 7.368 6.579 6.365 6.500 6.644 6.720 6.942 7.514 8.322 8.977 9.173 8.981 8.769 8.811 8.996 8.949 8.451 7.732 7.290 7.375 7.668 7.494 6.458 4.904 3.741 + 4.041 4.315 4.732 5.178 5.679 6.355 7.234 8.104 8.591 8.423 7.656 6.663 5.886 5.557 5.617 5.858 6.135 6.453 6.883 7.442 8.055 8.633 9.123 9.478 9.587 9.291 8.552 7.607 6.918 6.853 7.342 7.826 7.620 6.473 4.851 3.674 + 3.455 3.523 3.891 4.757 6.012 7.218 7.891 7.853 7.339 6.785 6.472 6.331 6.079 5.537 4.843 4.382 4.490 5.194 6.209 7.169 7.887 8.417 8.891 9.317 9.522 9.306 8.669 7.883 7.333 7.227 7.424 7.507 7.086 6.103 4.921 4.117 + 3.786 3.737 3.808 4.177 4.836 5.553 6.021 6.075 5.807 5.472 5.269 5.187 5.038 4.665 4.128 3.716 3.756 4.371 5.386 6.458 7.317 7.919 8.384 8.798 9.065 8.970 8.391 7.483 6.639 6.225 6.302 6.562 6.565 6.091 5.331 4.758 + 3.544 3.574 3.693 3.939 4.252 4.483 4.506 4.333 4.128 4.101 4.346 4.763 5.123 5.232 5.060 4.755 4.525 4.507 4.719 5.101 5.599 6.188 6.820 7.359 7.596 7.359 6.655 5.715 4.883 4.415 4.319 4.367 4.273 3.906 3.393 3.021 + 4.110 4.437 4.953 5.433 5.661 5.552 5.210 4.862 4.695 4.710 4.725 4.551 4.189 3.871 3.891 4.341 5.004 5.502 5.589 5.344 5.096 5.144 5.521 5.997 6.292 6.317 6.207 6.156 6.220 6.280 6.185 5.921 5.631 5.482 5.503 5.578 + 5.249 5.379 5.626 5.914 6.090 6.002 5.625 5.118 4.729 4.609 4.694 4.776 4.704 4.539 4.511 4.800 5.333 5.798 5.870 5.475 4.862 4.430 4.436 4.831 5.340 5.690 5.803 5.801 5.865 6.075 6.362 6.586 6.654 6.571 6.425 6.320 + 5.327 6.162 7.354 8.267 8.506 8.100 7.378 6.677 6.133 5.697 5.309 5.028 5.004 5.327 5.908 6.513 6.911 7.024 6.941 6.825 6.788 6.852 6.989 7.190 7.473 7.843 8.248 8.591 8.779 8.783 8.640 8.422 8.191 7.985 7.829 7.743 + 7.039 7.226 7.499 7.711 7.741 7.526 7.067 6.431 5.763 5.280 5.188 5.559 6.251 6.961 7.416 7.551 7.538 7.623 7.908 8.266 8.475 8.439 8.306 8.350 8.726 9.318 9.820 9.983 9.812 9.528 9.359 9.335 9.302 9.105 8.774 8.512 + 7.314 7.114 6.857 6.731 6.833 7.094 7.306 7.255 6.871 6.297 5.824 5.726 6.089 6.758 7.429 7.836 7.898 7.740 7.578 7.555 7.660 7.763 7.750 7.631 7.539 7.626 7.931 8.333 8.621 8.643 8.410 8.093 7.898 7.925 8.108 8.271 + 6.136 6.519 7.042 7.406 7.479 7.366 7.284 7.348 7.483 7.506 7.336 7.108 7.083 7.421 7.996 8.441 8.403 7.828 7.028 6.487 6.518 7.054 7.720 8.119 8.109 7.863 7.675 7.704 7.865 7.942 7.808 7.555 7.413 7.535 7.851 8.116 + 5.076 5.278 5.565 5.800 5.934 6.040 6.239 6.580 6.973 7.244 7.265 7.060 6.790 6.626 6.608 6.612 6.464 6.110 5.705 5.525 5.771 6.399 7.135 7.646 7.760 7.560 7.283 7.124 7.090 7.025 6.752 6.221 5.544 4.903 4.441 4.210 + 3.365 3.886 4.846 6.052 7.190 7.901 7.931 7.302 6.343 5.551 5.314 5.669 6.282 6.685 6.600 6.134 5.682 5.614 6.003 6.598 7.064 7.260 7.328 7.509 7.878 8.234 8.268 7.840 7.130 6.497 6.183 6.112 5.993 5.604 5.026 4.588 + 7.415 7.118 6.815 6.866 7.414 8.240 8.884 8.945 8.358 7.453 6.736 6.564 6.933 7.534 8.012 8.218 8.256 8.323 8.502 8.705 8.796 8.766 8.771 8.986 9.405 9.797 9.876 9.548 9.004 8.568 8.419 8.431 8.302 7.840 7.174 6.680 + 6.172 5.710 5.170 5.008 5.383 6.026 6.449 6.329 5.763 5.185 5.034 5.422 6.069 6.531 6.539 6.184 5.813 5.761 6.119 6.706 7.241 7.547 7.624 7.589 7.536 7.487 7.427 7.380 7.417 7.566 7.728 7.686 7.252 6.437 5.517 4.906 + 5.402 5.239 5.122 5.267 5.675 6.078 6.119 5.631 4.794 4.038 3.762 4.064 4.689 5.208 5.304 4.960 4.435 4.073 4.098 4.511 5.132 5.729 6.123 6.236 6.085 5.749 5.350 5.015 4.835 4.816 4.865 4.834 4.611 4.202 3.747 3.447 + 5.017 4.644 4.279 4.366 5.033 5.958 6.598 6.574 5.937 5.101 4.527 4.407 4.587 4.742 4.647 4.341 4.070 4.102 4.556 5.350 6.276 7.115 7.723 8.054 8.146 8.084 7.961 7.834 7.698 7.486 7.118 6.556 5.839 5.091 4.470 4.118 + 5.045 4.887 4.883 5.332 6.183 6.978 7.174 6.573 5.505 4.605 4.351 4.735 5.316 5.591 5.380 4.925 4.654 4.840 5.414 6.076 6.551 6.787 6.927 7.134 7.429 7.687 7.774 7.672 7.490 7.336 7.190 6.896 6.294 5.398 4.459 3.852 + 3.296 3.877 4.742 5.535 6.093 6.465 6.734 6.834 6.596 5.979 5.237 4.816 5.013 5.708 6.424 6.690 6.402 5.883 5.606 5.826 6.451 7.188 7.798 8.207 8.414 8.381 8.048 7.476 6.918 6.669 6.795 7.004 6.836 6.070 4.974 4.171 + 3.553 4.811 6.560 7.794 7.926 7.096 5.939 5.081 4.752 4.791 4.924 5.036 5.196 5.488 5.843 6.058 5.975 5.638 5.301 5.269 5.709 6.565 7.584 8.436 8.832 8.640 7.954 7.094 6.465 6.328 6.612 6.934 6.850 6.199 5.255 4.567 + 4.886 5.755 6.971 7.833 7.896 7.194 6.134 5.197 4.674 4.608 4.886 5.355 5.878 6.329 6.608 6.690 6.655 6.639 6.743 6.966 7.239 7.511 7.801 8.135 8.455 8.604 8.448 8.029 7.594 7.421 7.573 7.806 7.745 7.208 6.400 5.800 + 4.989 6.090 7.408 7.917 7.277 6.031 5.047 4.773 4.964 5.076 4.860 4.574 4.642 5.154 5.753 5.999 5.837 5.675 5.975 6.787 7.675 8.126 8.030 7.751 7.738 8.067 8.391 8.313 7.820 7.307 7.184 7.455 7.714 7.558 7.010 6.518 + 5.338 6.055 7.032 7.670 7.620 6.959 6.059 5.292 4.826 4.619 4.567 4.624 4.793 5.038 5.242 5.267 5.064 4.737 4.481 4.474 4.793 5.403 6.184 6.964 7.543 7.753 7.557 7.125 6.769 6.752 7.084 7.480 7.561 7.155 6.463 5.935 + 6.052 6.389 6.821 7.043 6.902 6.458 5.887 5.314 4.752 4.174 3.634 3.284 3.267 3.570 3.985 4.224 4.116 3.727 3.331 3.256 3.715 4.704 5.997 7.225 8.009 8.125 7.632 6.880 6.342 6.332 6.780 7.263 7.295 6.695 5.755 5.056 + 4.294 5.283 6.557 7.213 6.780 5.518 4.184 3.472 3.563 4.082 4.464 4.391 3.975 3.585 3.499 3.674 3.816 3.668 3.269 2.982 3.260 4.302 5.869 7.366 8.168 7.987 7.045 5.950 5.344 5.522 6.272 7.028 7.248 6.772 5.920 5.274 + 6.104 6.902 7.819 8.036 7.232 5.820 4.604 4.161 4.446 4.902 4.942 4.388 3.540 2.874 2.657 2.791 2.967 2.965 2.852 2.926 3.494 4.634 6.098 7.406 8.077 7.883 6.994 5.925 5.272 5.373 6.084 6.859 7.110 6.617 5.696 4.984 + 7.392 7.520 7.803 8.201 8.543 8.599 8.252 7.624 7.007 6.648 6.556 6.520 6.313 5.897 5.449 5.178 5.126 5.144 5.073 4.958 5.072 5.693 6.815 8.051 8.846 8.850 8.170 7.298 6.777 6.840 7.276 7.618 7.471 6.787 5.890 5.267 + 6.098 6.755 7.841 8.965 9.703 9.791 9.263 8.449 7.791 7.568 7.741 8.003 8.016 7.637 6.975 6.264 5.678 5.248 4.934 4.749 4.800 5.194 5.902 6.721 7.377 7.696 7.706 7.584 7.512 7.550 7.627 7.620 7.466 7.201 6.928 6.757 + 6.206 6.669 7.459 8.322 8.964 9.158 8.859 8.243 7.619 7.260 7.244 7.424 7.545 7.413 7.014 6.481 5.968 5.542 5.187 4.897 4.769 4.967 5.586 6.509 7.405 7.912 7.868 7.437 6.993 6.850 7.026 7.234 7.116 6.538 5.731 5.151 + 3.995 4.562 5.433 6.245 6.732 6.824 6.601 6.190 5.704 5.249 4.940 4.856 4.962 5.075 4.958 4.488 3.774 3.106 2.773 2.882 3.317 3.865 4.375 4.827 5.263 5.682 5.997 6.108 5.990 5.720 5.404 5.090 4.755 4.376 4.007 3.770 + 3.892 4.320 5.186 6.361 7.467 7.989 7.580 6.348 4.851 3.768 3.473 3.824 4.316 4.478 4.190 3.694 3.342 3.306 3.488 3.679 3.785 3.918 4.275 4.928 5.720 6.347 6.578 6.407 6.044 5.741 5.618 5.600 5.524 5.294 4.974 4.740 + 4.336 3.911 3.581 3.911 4.968 6.205 6.863 6.559 5.568 4.573 4.130 4.279 4.624 4.730 4.491 4.143 3.982 4.069 4.204 4.175 4.010 4.000 4.443 5.344 6.352 6.984 6.973 6.450 5.822 5.451 5.395 5.400 5.137 4.491 3.679 3.114 + 3.461 3.432 3.454 3.626 3.980 4.425 4.781 4.887 4.720 4.447 4.331 4.561 5.103 5.696 6.013 5.859 5.298 4.603 4.093 3.968 4.260 4.870 5.641 6.399 6.968 7.207 7.077 6.698 6.298 6.070 6.016 5.932 5.567 4.847 3.996 3.414 + 1.782 2.281 3.171 4.230 5.163 5.693 5.697 5.259 4.621 4.042 3.686 3.592 3.733 4.066 4.527 4.988 5.265 5.225 4.910 4.566 4.511 4.917 5.677 6.474 7.003 7.177 7.141 7.118 7.200 7.280 7.153 6.692 5.953 5.134 4.459 4.086 + 2.727 3.469 4.726 6.108 7.192 7.674 7.474 6.741 5.749 4.758 3.929 3.335 3.028 3.055 3.406 3.946 4.432 4.639 4.517 4.250 4.132 4.354 4.868 5.423 5.757 5.772 5.568 5.314 5.103 4.896 4.615 4.242 3.863 3.586 3.452 3.415 + 2.114 2.612 3.383 4.093 4.467 4.413 4.040 3.565 3.177 2.942 2.803 2.662 2.476 2.296 2.214 2.278 2.432 2.550 2.533 2.408 2.328 2.479 2.934 3.574 4.136 4.366 4.180 3.711 3.214 2.890 2.759 2.666 2.420 1.960 1.421 1.055 + 4.281 3.956 3.596 3.495 3.663 3.807 3.620 3.073 2.454 2.095 2.071 2.149 2.037 1.687 1.351 1.330 1.670 2.098 2.269 2.094 1.838 1.885 2.378 3.069 3.510 3.414 2.877 2.280 1.980 2.048 2.260 2.305 2.019 1.474 0.898 0.537 + 4.266 3.954 3.531 3.252 3.247 3.431 3.580 3.509 3.218 2.885 2.706 2.721 2.766 2.620 2.208 1.700 1.394 1.471 1.835 2.183 2.264 2.093 1.939 2.072 2.495 2.913 2.968 2.560 1.953 1.559 1.588 1.859 1.963 1.632 0.994 0.485 + 2.775 3.458 4.182 4.250 3.544 2.610 2.144 2.363 2.850 2.993 2.580 1.979 1.755 2.125 2.753 3.087 2.867 2.334 1.952 1.951 2.143 2.172 1.907 1.592 1.594 2.013 2.565 2.825 2.613 2.131 1.750 1.667 1.779 1.847 1.767 1.650 + 2.772 3.386 3.980 3.894 3.070 2.109 1.712 2.047 2.641 2.876 2.591 2.203 2.257 2.856 3.542 3.726 3.236 2.454 1.934 1.895 2.095 2.161 2.009 1.908 2.139 2.627 2.961 2.797 2.235 1.757 1.765 2.164 2.436 2.140 1.370 0.712 + 4.129 3.866 3.572 3.543 3.918 4.549 5.064 5.100 4.555 3.682 2.946 2.734 3.102 3.753 4.248 4.294 3.911 3.360 2.924 2.725 2.693 2.690 2.645 2.592 2.599 2.685 2.813 2.947 3.097 3.282 3.450 3.456 3.149 2.522 1.788 1.292 + 3.701 3.767 4.128 4.999 6.311 7.663 8.543 8.657 8.082 7.188 6.388 5.948 5.956 6.373 7.080 7.855 8.369 8.294 7.510 6.242 4.989 4.243 4.184 4.598 5.065 5.291 5.299 5.353 5.680 6.223 6.624 6.449 5.489 3.940 2.347 1.342 + 2.426 3.259 4.649 6.179 7.478 8.358 8.834 9.022 9.009 8.791 8.337 7.710 7.140 6.945 7.335 8.208 9.126 9.516 9.008 7.685 6.070 4.840 4.436 4.839 5.641 6.359 6.751 6.918 7.126 7.498 7.837 7.718 6.811 5.196 3.427 2.269 + 2.209 3.385 5.172 6.819 7.855 8.294 8.460 8.636 8.820 8.794 8.394 7.728 7.164 7.096 7.667 8.659 9.588 9.950 9.473 8.251 6.727 5.502 5.053 5.490 6.494 7.521 8.143 8.306 8.287 8.382 8.564 8.433 7.533 5.810 3.824 2.486 + 1.786 3.077 5.041 6.845 7.938 8.291 8.239 8.132 8.083 7.993 7.765 7.476 7.361 7.636 8.322 9.206 9.925 10.132 9.636 8.506 7.087 5.906 5.442 5.858 6.881 7.947 8.567 8.645 8.487 8.464 8.603 8.487 7.584 5.785 3.666 2.224 + 3.178 4.182 5.683 7.019 7.807 8.110 8.264 8.535 8.902 9.128 9.011 8.583 8.109 7.902 8.122 8.682 9.297 9.619 9.386 8.553 7.355 6.247 5.700 5.931 6.758 7.704 8.332 8.537 8.562 8.692 8.884 8.693 7.615 5.599 3.291 1.740 + 3.870 4.718 6.025 7.268 8.108 8.518 8.687 8.798 8.899 8.924 8.807 8.565 8.299 8.147 8.237 8.636 9.264 9.838 9.932 9.220 7.776 6.173 5.214 5.408 6.579 7.961 8.751 8.702 8.255 8.059 8.310 8.484 7.770 5.858 3.391 1.649 + 1.354 2.825 5.042 7.054 8.274 8.721 8.795 8.852 8.956 8.967 8.771 8.421 8.072 7.863 7.875 8.172 8.781 9.566 10.138 9.988 8.879 7.165 5.709 5.328 6.179 7.616 8.685 8.882 8.494 8.230 8.450 8.742 8.266 6.591 4.275 2.592 + 3.029 4.361 6.132 7.342 7.715 7.793 8.262 9.194 9.960 9.867 8.870 7.660 7.055 7.320 8.060 8.720 9.123 9.483 9.941 10.204 9.766 8.524 7.116 6.514 7.171 8.545 9.530 9.455 8.703 8.303 8.838 9.737 9.692 7.913 5.048 2.865 + 2.814 3.964 5.461 6.451 6.793 7.091 7.989 9.436 10.658 10.861 9.958 8.627 7.685 7.415 7.514 7.613 7.749 8.255 9.193 10.015 9.939 8.747 7.186 6.457 7.168 8.722 9.793 9.515 8.259 7.254 7.363 8.195 8.427 7.102 4.664 2.729 + 2.284 2.902 3.851 4.825 5.758 6.802 8.037 9.242 9.973 9.898 9.076 7.912 6.859 6.161 5.869 6.016 6.685 7.821 9.013 9.578 9.040 7.617 6.220 5.822 6.679 8.083 8.929 8.646 7.660 6.950 7.084 7.638 7.556 6.173 3.960 2.273 + 2.876 3.095 3.562 4.327 5.407 6.696 7.902 8.645 8.673 8.048 7.122 6.292 5.745 5.425 5.245 5.297 5.822 6.892 8.139 8.866 8.541 7.290 5.909 5.299 5.761 6.765 7.416 7.229 6.518 6.034 6.201 6.643 6.503 5.268 3.363 1.928 + 2.072 3.050 4.309 5.158 5.578 6.138 7.238 8.495 8.962 8.022 6.087 4.346 3.764 4.282 4.997 5.128 4.803 4.851 5.833 7.307 8.121 7.521 5.946 4.708 4.794 5.937 6.890 6.647 5.417 4.388 4.491 5.386 5.722 4.464 2.024 0.059 + 3.969 3.790 3.723 4.171 5.361 7.103 8.777 9.634 9.244 7.812 6.069 4.802 4.359 4.517 4.805 4.977 5.197 5.779 6.745 7.653 7.904 7.270 6.156 5.313 5.236 5.780 6.337 6.393 5.953 5.439 5.195 5.093 4.651 3.558 2.101 1.046 + 3.053 3.514 4.304 5.271 6.325 7.405 8.358 8.900 8.750 7.859 6.514 5.197 4.309 3.977 4.102 4.553 5.276 6.207 7.108 7.569 7.270 6.299 5.208 4.668 4.974 5.811 6.516 6.613 6.149 5.556 5.168 4.871 4.239 3.018 1.509 0.446 + 2.347 2.644 3.341 4.494 5.947 7.303 8.085 8.018 7.214 6.112 5.210 4.757 4.662 4.665 4.629 4.687 5.098 5.933 6.890 7.432 7.194 6.317 5.408 5.117 5.655 6.643 7.412 7.506 6.975 6.222 5.585 5.043 4.305 3.192 1.933 1.074 + 3.025 3.449 4.251 5.311 6.419 7.291 7.663 7.416 6.669 5.745 5.001 4.630 4.577 4.644 4.698 4.806 5.150 5.796 6.528 6.934 6.713 5.955 5.136 4.783 5.080 5.727 6.188 6.112 5.571 4.924 4.448 4.081 3.523 2.592 1.491 0.727 + 4.718 4.330 4.029 4.349 5.398 6.702 7.513 7.348 6.338 5.109 4.303 4.135 4.326 4.446 4.339 4.258 4.581 5.382 6.243 6.527 5.899 4.660 3.585 3.358 4.056 5.098 5.712 5.517 4.768 4.068 3.815 3.888 3.806 3.226 2.304 1.597 + 3.553 3.824 4.356 5.114 5.984 6.735 7.047 6.668 5.633 4.347 3.405 3.215 3.702 4.369 4.698 4.573 4.350 4.489 5.074 5.657 5.621 4.752 3.501 2.685 2.841 3.801 4.840 5.273 4.963 4.322 3.853 3.685 3.539 3.097 2.401 1.857 + 3.620 3.779 3.991 4.160 4.293 4.488 4.794 5.115 5.245 5.031 4.513 3.913 3.482 3.346 3.478 3.786 4.193 4.630 4.974 5.036 4.691 4.029 3.376 3.100 3.344 3.908 4.396 4.527 4.330 4.057 3.900 3.792 3.479 2.809 1.957 1.351 + 4.457 4.180 3.917 4.003 4.523 5.220 5.679 5.630 5.132 4.504 4.059 3.892 3.865 3.790 3.628 3.528 3.676 4.093 4.579 4.837 4.694 4.227 3.699 3.360 3.284 3.356 3.416 3.401 3.379 3.436 3.541 3.524 3.197 2.539 1.771 1.251 + 1.624 1.811 2.252 2.988 3.928 4.822 5.359 5.345 4.830 4.098 3.514 3.308 3.470 3.796 4.059 4.174 4.216 4.313 4.497 4.651 4.597 4.242 3.667 3.083 2.702 2.621 2.806 3.157 3.566 3.929 4.116 3.977 3.425 2.542 1.613 1.015 + 5.147 4.947 4.515 3.924 3.429 3.318 3.650 4.134 4.331 4.040 3.495 3.175 3.374 3.938 4.426 4.537 4.391 4.372 4.693 5.126 5.191 4.642 3.763 3.159 3.213 3.721 4.081 3.869 3.245 2.791 2.927 3.455 3.717 3.219 2.147 1.267 + 4.250 4.268 4.246 4.172 4.148 4.301 4.612 4.846 4.716 4.151 3.429 2.999 3.125 3.665 4.198 4.378 4.217 4.016 4.038 4.232 4.291 3.976 3.388 2.916 2.902 3.331 3.855 4.100 3.978 3.691 3.457 3.246 2.816 2.010 1.017 0.317 + 4.474 4.133 3.789 3.807 4.249 4.793 4.997 4.668 4.023 3.502 3.414 3.710 4.064 4.188 4.071 3.963 4.116 4.526 4.908 4.924 4.459 3.731 3.132 2.953 3.200 3.634 3.975 4.092 4.032 3.904 3.737 3.444 2.919 2.176 1.413 0.924 + 3.763 3.276 2.732 2.609 3.024 3.644 3.998 3.893 3.566 3.436 3.709 4.190 4.468 4.299 3.833 3.483 3.563 4.016 4.458 4.499 4.052 3.379 2.876 2.785 3.064 3.477 3.794 3.916 3.869 3.707 3.449 3.080 2.609 2.101 1.667 1.417 + 2.178 2.107 2.091 2.286 2.751 3.367 3.872 4.017 3.738 3.225 2.818 2.790 3.167 3.727 4.179 4.374 4.381 4.369 4.424 4.461 4.316 3.937 3.473 3.181 3.218 3.506 3.792 3.852 3.655 3.344 3.071 2.853 2.577 2.156 1.667 1.329 + 4.459 3.353 1.956 1.267 1.734 2.959 4.075 4.428 4.012 3.356 3.024 3.179 3.565 3.830 3.872 3.885 4.110 4.562 4.980 5.048 4.675 4.077 3.603 3.475 3.640 3.853 3.876 3.640 3.244 2.847 2.541 2.319 2.125 1.922 1.733 1.614 + 3.950 3.777 3.523 3.327 3.299 3.446 3.654 3.759 3.670 3.451 3.296 3.380 3.716 4.133 4.408 4.444 4.344 4.304 4.421 4.585 4.558 4.188 3.565 2.992 2.766 2.964 3.398 3.752 3.801 3.523 3.053 2.548 2.095 1.714 1.419 1.251 + 5.161 4.423 3.571 3.300 3.779 4.525 4.844 4.444 3.654 3.087 3.094 3.493 3.811 3.769 3.543 3.554 4.025 4.711 5.083 4.781 3.940 3.087 2.719 2.924 3.367 3.599 3.420 2.990 2.639 2.579 2.755 2.925 2.875 2.568 2.159 1.874 + 3.780 3.147 2.370 2.031 2.349 3.051 3.651 3.862 3.774 3.684 3.765 3.915 3.909 3.680 3.432 3.470 3.888 4.438 4.694 4.399 3.678 2.943 2.586 2.702 3.074 3.380 3.430 3.254 3.003 2.798 2.654 2.519 2.357 2.180 2.030 1.947 + 4.552 3.845 3.038 2.810 3.334 4.156 4.629 4.471 3.946 3.536 3.470 3.553 3.450 3.095 2.800 2.944 3.546 4.158 4.217 3.532 2.485 1.733 1.696 2.261 2.943 3.307 3.285 3.122 3.083 3.198 3.277 3.116 2.686 2.138 1.670 1.412 + 2.447 2.473 2.585 2.861 3.327 3.906 4.422 4.677 4.575 4.192 3.733 3.398 3.244 3.174 3.051 2.846 2.679 2.716 3.000 3.378 3.598 3.508 3.181 2.861 2.769 2.933 3.183 3.300 3.184 2.908 2.618 2.403 2.247 2.088 1.918 1.799 + 2.415 2.056 1.633 1.522 1.913 2.670 3.415 3.786 3.669 3.254 2.891 2.840 3.118 3.530 3.833 3.917 3.850 3.787 3.817 3.896 3.894 3.723 3.417 3.108 2.930 2.920 3.009 3.089 3.090 3.008 2.870 2.692 2.467 2.202 1.947 1.787 + 2.451 2.578 2.782 3.002 3.205 3.385 3.536 3.631 3.631 3.533 3.396 3.320 3.375 3.561 3.807 4.036 4.210 4.334 4.411 4.401 4.243 3.911 3.470 3.059 2.814 2.782 2.903 3.061 3.152 3.133 3.003 2.776 2.462 2.099 1.762 1.556 + 3.196 2.784 2.407 2.541 3.235 4.021 4.297 3.827 2.959 2.350 2.456 3.199 4.068 4.536 4.429 3.980 3.570 3.416 3.461 3.498 3.379 3.116 2.829 2.630 2.557 2.583 2.660 2.737 2.754 2.660 2.460 2.240 2.129 2.197 2.387 2.547 + 4.222 3.465 2.701 2.707 3.542 4.467 4.631 3.851 2.768 2.252 2.622 3.410 3.862 3.660 3.177 3.046 3.500 4.130 4.282 3.698 2.773 2.191 2.312 2.879 3.299 3.198 2.718 2.312 2.287 2.547 2.749 2.665 2.372 2.114 2.031 2.055 + 2.930 3.099 3.346 3.564 3.708 3.805 3.886 3.932 3.884 3.718 3.492 3.305 3.213 3.172 3.086 2.917 2.739 2.685 2.811 3.021 3.133 3.032 2.780 2.571 2.564 2.745 2.942 2.968 2.780 2.493 2.261 2.141 2.067 1.947 1.773 1.639 + 2.211 2.163 2.211 2.501 3.031 3.610 3.972 3.947 3.568 3.027 2.554 2.302 2.312 2.545 2.920 3.334 3.668 3.826 3.785 3.625 3.479 3.440 3.487 3.496 3.349 3.032 2.657 2.383 2.293 2.341 2.391 2.320 2.095 1.780 1.486 1.313 + 2.364 1.953 1.483 1.359 1.711 2.331 2.892 3.221 3.358 3.401 3.325 3.025 2.511 2.041 1.981 2.485 3.291 3.871 3.854 3.332 2.785 2.661 2.988 3.366 3.339 2.808 2.111 1.709 1.791 2.144 2.376 2.262 1.892 1.521 1.316 1.258 + 1.630 1.661 1.849 2.280 2.844 3.268 3.319 3.011 2.595 2.358 2.395 2.574 2.691 2.677 2.635 2.704 2.895 3.069 3.084 2.946 2.806 2.797 2.883 2.877 2.629 2.202 1.861 1.860 2.209 2.646 2.822 2.552 1.923 1.194 0.613 0.307 + 2.898 2.364 1.811 1.813 2.493 3.400 3.875 3.584 2.773 2.034 1.828 2.161 2.663 2.948 2.919 2.766 2.727 2.858 3.025 3.081 3.031 3.014 3.129 3.306 3.340 3.077 2.571 2.062 1.798 1.846 2.045 2.128 1.914 1.427 0.870 0.503 + 3.463 2.476 1.312 0.910 1.570 2.726 3.441 3.177 2.174 1.193 0.874 1.293 2.034 2.623 2.889 2.970 3.035 3.067 2.919 2.550 2.154 2.033 2.313 2.796 3.096 2.951 2.436 1.886 1.619 1.697 1.914 1.988 1.771 1.329 0.859 0.565 + 3.396 2.797 2.164 2.123 2.795 3.664 3.993 3.436 2.320 1.384 1.198 1.761 2.570 3.069 3.063 2.785 2.607 2.699 2.927 3.036 2.913 2.677 2.544 2.614 2.779 2.835 2.661 2.321 1.994 1.809 1.740 1.636 1.351 0.875 0.355 0.016 + 2.698 2.234 1.766 1.811 2.482 3.370 3.862 3.634 2.900 2.222 2.048 2.379 2.815 2.926 2.609 2.148 1.942 2.162 2.622 2.952 2.916 2.588 2.268 2.223 2.476 2.804 2.928 2.723 2.284 1.822 1.496 1.315 1.182 1.005 0.794 0.643 + 2.321 1.678 1.009 1.019 1.894 3.134 3.949 3.887 3.154 2.406 2.197 2.573 3.109 3.315 3.025 2.474 2.046 1.953 2.120 2.319 2.396 2.368 2.350 2.408 2.498 2.515 2.399 2.174 1.911 1.662 1.439 1.241 1.080 0.977 0.933 0.925 + 2.891 2.884 2.915 3.024 3.188 3.310 3.254 2.939 2.402 1.804 1.358 1.223 1.419 1.823 2.239 2.497 2.530 2.382 2.151 1.922 1.724 1.549 1.396 1.307 1.352 1.573 1.925 2.275 2.456 2.365 2.026 1.576 1.186 0.962 0.894 0.899 + 1.020 1.203 1.465 1.699 1.880 2.053 2.234 2.333 2.203 1.787 1.228 0.808 0.763 1.102 1.603 1.980 2.088 1.992 1.866 1.828 1.863 1.883 1.843 1.789 1.799 1.887 1.979 1.978 1.858 1.675 1.498 1.327 1.101 0.780 0.425 0.185 + 0.709 0.413 0.134 0.217 0.737 1.424 1.897 1.964 1.755 1.560 1.566 1.722 1.846 1.855 1.869 2.096 2.604 3.190 3.506 3.308 2.653 1.858 1.269 1.036 1.065 1.145 1.132 1.026 0.920 0.876 0.870 0.812 0.637 0.359 0.070 -0.113 + 1.610 1.578 1.629 1.855 2.190 2.416 2.326 1.899 1.335 0.918 0.830 1.062 1.473 1.929 2.365 2.743 2.990 2.986 2.668 2.120 1.563 1.226 1.193 1.362 1.543 1.613 1.579 1.531 1.522 1.507 1.383 1.088 0.661 0.216 -0.134 -0.320 + 2.609 2.223 1.793 1.710 2.090 2.668 3.008 2.834 2.228 1.539 1.124 1.115 1.401 1.772 2.077 2.263 2.313 2.186 1.833 1.282 0.688 0.271 0.187 0.432 0.852 1.238 1.444 1.425 1.219 0.901 0.562 0.291 0.160 0.183 0.298 0.398 + 1.279 1.259 1.343 1.667 2.250 2.915 3.350 3.283 2.665 1.742 0.946 0.655 0.980 1.714 2.465 2.907 2.941 2.699 2.387 2.120 1.866 1.527 1.075 0.614 0.316 0.290 0.489 0.732 0.822 0.672 0.351 0.022 -0.167 -0.172 -0.062 0.039 + 1.092 0.267 -0.671 -0.881 -0.072 1.271 2.286 2.414 1.804 1.128 1.010 1.544 2.267 2.578 2.210 1.397 0.646 0.343 0.523 0.925 1.243 1.337 1.269 1.187 1.200 1.326 1.515 1.699 1.813 1.797 1.611 1.258 0.796 0.324 -0.054 -0.261 + 3.430 2.241 0.775 0.110 0.634 1.785 2.589 2.496 1.793 1.296 1.619 2.669 3.763 4.203 3.802 2.932 2.151 1.768 1.712 1.727 1.641 1.464 1.281 1.112 0.900 0.621 0.359 0.255 0.373 0.621 0.816 0.829 0.673 0.461 0.298 0.220 + 1.335 1.237 1.339 1.895 2.786 3.539 3.703 3.253 2.628 2.359 2.621 3.102 3.306 3.005 2.419 1.984 1.937 2.104 2.084 1.640 0.939 0.413 0.395 0.849 1.420 1.730 1.662 1.388 1.167 1.119 1.158 1.105 0.855 0.453 0.048 -0.202 + 3.932 3.597 3.087 2.656 2.534 2.790 3.258 3.613 3.573 3.098 2.429 1.915 1.768 1.927 2.139 2.174 1.984 1.687 1.419 1.224 1.077 0.996 1.077 1.396 1.860 2.184 2.081 1.517 0.791 0.344 0.411 0.835 1.194 1.169 0.806 0.460 + 1.466 1.348 1.330 1.632 2.248 2.892 3.192 2.959 2.321 1.629 1.206 1.156 1.362 1.629 1.835 1.966 2.038 2.017 1.830 1.447 0.964 0.574 0.460 0.669 1.083 1.491 1.703 1.643 1.350 0.938 0.530 0.220 0.053 0.018 0.059 0.105 + 4.898 4.078 3.041 2.495 2.671 3.145 3.200 2.426 1.061 -0.182 -0.640 -0.143 0.933 2.004 2.680 2.924 2.915 2.809 2.620 2.307 1.922 1.643 1.644 1.929 2.287 2.436 2.221 1.727 1.203 0.867 0.756 0.727 0.587 0.259 -0.153 -0.441 + 2.209 1.876 1.417 1.082 0.971 0.974 0.882 0.589 0.189 -0.077 0.003 0.463 1.148 1.826 2.325 2.597 2.687 2.657 2.544 2.369 2.165 1.983 1.863 1.798 1.744 1.654 1.522 1.388 1.298 1.262 1.238 1.161 0.989 0.742 0.494 0.338 + 3.550 3.304 3.076 3.118 3.393 3.563 3.287 2.546 1.712 1.276 1.466 2.082 2.670 2.878 2.683 2.338 2.119 2.121 2.245 2.352 2.389 2.396 2.401 2.365 2.220 1.962 1.675 1.464 1.353 1.268 1.118 0.897 0.700 0.624 0.673 0.747 + 4.305 4.361 4.524 4.808 5.093 5.140 4.730 3.833 2.682 1.674 1.154 1.225 1.708 2.276 2.658 2.769 2.705 2.618 2.591 2.599 2.570 2.471 2.345 2.272 2.288 2.345 2.344 2.205 1.932 1.612 1.354 1.229 1.233 1.314 1.405 1.461 + 1.830 2.106 2.495 2.806 2.971 3.058 3.156 3.254 3.246 3.052 2.727 2.443 2.353 2.472 2.683 2.863 2.989 3.124 3.297 3.431 3.403 3.191 2.950 2.903 3.143 3.512 3.709 3.532 3.048 2.539 2.249 2.190 2.159 1.961 1.613 1.333 + 1.600 1.463 1.397 1.633 2.205 2.868 3.231 3.029 2.326 1.497 0.987 1.021 1.473 1.993 2.279 2.281 2.189 2.237 2.494 2.830 3.068 3.162 3.237 3.441 3.762 3.990 3.879 3.376 2.701 2.196 2.059 2.190 2.294 2.143 1.782 1.479 + 0.895 1.025 1.309 1.747 2.261 2.689 2.862 2.708 2.334 1.982 1.893 2.140 2.566 2.880 2.859 2.503 2.032 1.726 1.730 1.975 2.268 2.457 2.534 2.592 2.701 2.829 2.878 2.794 2.635 2.522 2.508 2.509 2.369 2.013 1.548 1.216 + 4.390 3.935 3.303 2.813 2.568 2.428 2.217 1.941 1.791 1.923 2.253 2.476 2.336 1.873 1.427 1.356 1.732 2.285 2.646 2.657 2.485 2.422 2.601 2.875 2.971 2.758 2.374 2.102 2.115 2.331 2.492 2.376 1.954 1.383 0.875 0.587 + 3.470 3.383 3.119 2.642 2.103 1.772 1.826 2.174 2.510 2.568 2.335 2.049 1.968 2.145 2.402 2.531 2.497 2.454 2.569 2.834 3.068 3.099 2.934 2.744 2.676 2.685 2.584 2.249 1.786 1.474 1.514 1.827 2.111 2.109 1.838 1.572 + 4.263 3.389 2.263 1.664 1.951 2.831 3.617 3.755 3.203 2.404 1.922 2.059 2.705 3.196 3.428 3.947 4.656 5.328 5.755 5.906 5.938 6.059 6.337 6.644 6.770 6.611 6.273 6.000 5.991 6.272 6.694 7.060 7.247 7.257 7.178 7.108 + 2.025 1.823 1.607 1.615 1.946 2.450 2.796 2.693 2.127 1.431 1.101 1.468 2.441 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.368 3.804 3.062 2.599 2.590 2.824 2.924 2.691 2.271 2.011 2.160 2.662 3.210 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.022 2.914 2.794 2.739 2.702 2.556 2.258 1.954 1.903 2.266 2.942 3.622 4.025 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.505 3.257 2.874 2.501 2.227 2.048 1.915 1.807 1.772 1.888 2.187 2.615 3.053 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.499 2.803 1.948 1.561 1.846 2.455 2.820 2.656 2.182 1.896 2.127 2.769 3.400 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 1.665 1.718 1.681 1.424 0.991 0.616 0.568 0.952 1.631 2.335 2.847 3.131 3.289 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.066 1.514 0.818 0.475 0.699 1.288 1.822 2.008 1.883 1.743 1.883 2.381 3.079 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.385 1.567 0.517 -0.027 0.307 1.314 2.430 3.161 3.365 3.229 3.028 2.926 2.932 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.774 3.442 2.995 2.719 2.783 3.141 3.595 3.933 4.060 4.019 3.927 3.883 3.914 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.115 2.418 2.914 3.443 3.861 4.099 4.160 4.101 3.991 3.902 3.899 4.030 4.299 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.653 2.893 3.225 3.468 3.542 3.513 3.519 3.650 3.890 4.147 4.339 4.446 4.500 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.685 3.584 3.524 3.634 3.878 4.060 3.998 3.700 3.372 3.253 3.426 3.776 4.134 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.770 3.256 2.546 2.070 2.093 2.562 3.165 3.554 3.573 3.347 3.176 3.322 3.848 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.634 4.055 3.490 3.560 4.315 5.150 5.320 4.578 3.375 2.472 2.337 2.871 3.641 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.004 2.933 2.896 3.027 3.381 3.876 4.323 4.540 4.477 4.265 4.142 4.311 4.799 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.057 3.257 3.454 3.435 3.188 2.936 2.957 3.358 3.987 4.568 4.928 5.126 5.359 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.199 2.576 3.035 3.240 3.105 2.859 2.843 3.224 3.864 4.464 4.823 4.987 5.168 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.303 3.857 3.351 3.180 3.372 3.582 3.475 3.092 2.851 3.150 3.969 4.860 5.331 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.476 3.884 3.095 2.581 2.535 2.778 2.988 3.001 2.930 3.003 3.322 3.774 4.163 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.175 1.748 1.223 1.011 1.310 1.991 2.733 3.259 3.486 3.497 3.409 3.291 3.191 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.504 2.598 2.775 3.002 3.231 3.414 3.529 3.595 3.652 3.741 3.884 4.086 4.346 4.659 4.999 5.305 5.505 5.567 5.543 5.554 5.720 6.058 6.459 6.748 6.808 6.675 6.516 6.520 6.764 7.158 7.502 7.612 7.424 7.021 6.587 6.311 + 3.175 3.116 3.074 3.143 3.360 3.661 3.915 4.008 3.950 3.890 4.031 4.475 5.122 5.698 5.922 5.697 5.194 4.760 4.718 5.186 6.026 6.940 7.623 7.887 7.706 7.202 6.605 6.183 6.144 6.526 7.144 7.657 7.762 7.391 6.779 6.322 + 3.426 3.256 3.094 3.136 3.411 3.749 3.915 3.805 3.539 3.366 3.487 3.918 4.490 4.969 5.180 5.085 4.787 4.484 4.403 4.706 5.388 6.239 6.917 7.133 6.837 6.260 5.765 5.612 5.795 6.091 6.257 6.211 6.054 5.941 5.935 5.974 + 5.617 4.994 4.213 3.804 3.921 4.248 4.323 3.974 3.485 3.333 3.764 4.563 5.228 5.372 5.000 4.456 4.114 4.116 4.334 4.563 4.700 4.776 4.844 4.877 4.798 4.602 4.418 4.441 4.771 5.317 5.837 6.100 6.024 5.704 5.333 5.095 + 4.689 4.521 4.331 4.259 4.293 4.257 3.972 3.439 2.880 2.600 2.781 3.372 4.156 4.907 5.511 5.958 6.260 6.393 6.328 6.099 5.827 5.657 5.667 5.816 5.996 6.107 6.115 6.026 5.841 5.544 5.135 4.671 4.260 3.987 3.867 3.838 + 3.818 3.493 3.137 3.091 3.443 3.946 4.208 3.997 3.414 2.815 2.555 2.775 3.373 4.140 4.905 5.586 6.123 6.429 6.414 6.090 5.620 5.262 5.209 5.463 5.836 6.090 6.098 5.908 5.669 5.493 5.359 5.139 4.721 4.120 3.504 3.111 + 4.709 4.294 3.683 3.202 3.099 3.383 3.790 3.942 3.612 2.915 2.268 2.110 2.583 3.424 4.157 4.427 4.221 3.808 3.474 3.307 3.201 3.033 2.826 2.717 2.789 2.949 2.992 2.807 2.509 2.348 2.473 2.765 2.922 2.731 2.281 1.908 + 4.985 4.787 4.369 3.767 3.130 2.667 2.502 2.570 2.661 2.598 2.384 2.198 2.222 2.470 2.759 2.857 2.677 2.345 2.090 2.054 2.193 2.340 2.359 2.244 2.104 2.048 2.106 2.232 2.360 2.452 2.485 2.427 2.239 1.926 1.580 1.350 + 5.604 5.245 4.923 5.003 5.403 5.616 5.177 4.128 3.024 2.477 2.658 3.208 3.618 3.678 3.576 3.604 3.824 4.052 4.147 4.263 4.726 5.637 6.618 7.023 6.496 5.345 4.364 4.209 4.883 5.796 6.338 6.410 6.437 6.864 7.658 8.306 + 5.586 5.022 4.368 4.120 4.328 4.558 4.310 3.493 2.506 1.882 1.850 2.222 2.658 2.997 3.310 3.679 3.996 4.053 3.843 3.707 4.096 5.111 6.288 6.898 6.562 5.613 4.845 4.839 5.486 6.136 6.248 5.914 5.753 6.279 7.343 8.212 + 4.156 3.456 2.594 2.167 2.315 2.621 2.522 1.855 1.043 0.754 1.329 2.491 3.556 3.969 3.685 3.106 2.669 2.489 2.345 1.997 1.493 1.171 1.365 2.069 2.882 3.286 3.030 2.310 1.616 1.368 1.639 2.146 2.493 2.471 2.175 1.904 + 2.197 2.234 2.442 2.893 3.421 3.665 3.344 2.526 1.645 1.229 1.524 2.337 3.199 3.708 3.769 3.559 3.313 3.119 2.912 2.628 2.335 2.207 2.373 2.772 3.183 3.385 3.329 3.171 3.143 3.372 3.794 4.206 4.418 4.374 4.179 4.014 + 4.643 4.038 3.294 2.939 3.108 3.432 3.374 2.697 1.688 0.932 0.875 1.516 2.468 3.281 3.725 3.837 3.749 3.523 3.144 2.637 2.159 1.930 2.077 2.526 3.068 3.526 3.874 4.213 4.628 5.072 5.376 5.378 5.041 4.490 3.943 3.609 + 4.685 4.586 4.487 4.488 4.586 4.636 4.442 3.911 3.164 2.495 2.188 2.319 2.696 3.002 3.030 2.826 2.626 2.630 2.820 2.982 2.912 2.619 2.335 2.306 2.555 2.845 2.889 2.627 2.310 2.293 2.703 3.295 3.622 3.416 2.832 2.340 + 4.457 4.137 3.823 3.861 4.271 4.687 4.649 3.987 2.983 2.154 1.861 2.052 2.362 2.442 2.244 2.016 2.040 2.368 2.775 2.965 2.835 2.559 2.437 2.631 3.039 3.377 3.412 3.142 2.770 2.533 2.509 2.573 2.521 2.251 1.859 1.572 + 6.045 5.819 5.534 5.402 5.520 5.771 5.890 5.646 5.028 4.283 3.755 3.638 3.832 4.030 3.975 3.676 3.387 3.371 3.658 4.015 4.172 4.085 3.999 4.217 4.800 5.467 5.813 5.657 5.208 4.869 4.867 5.031 4.948 4.367 3.477 2.806 + 12.291 12.020 11.610 11.238 11.013 10.887 10.678 10.209 9.473 8.688 8.160 8.050 8.234 8.402 8.326 8.087 8.018 8.404 9.176 9.909 10.146 9.796 9.247 9.069 9.538 10.410 11.117 11.247 10.873 10.454 10.418 10.800 11.263 11.444 11.288 11.067 + 13.355 13.937 14.643 14.918 14.525 13.655 12.687 11.869 11.205 10.614 10.126 9.894 10.001 10.316 10.587 10.693 10.806 11.238 12.094 13.071 13.644 13.499 12.836 12.236 12.189 12.704 13.351 13.670 13.573 13.360 13.366 13.602 13.752 13.520 12.969 12.503 + 13.643 14.391 15.417 16.110 16.108 15.452 14.442 13.394 12.506 11.893 11.636 11.742 12.049 12.268 12.198 11.962 11.987 12.668 13.966 15.329 16.059 15.864 15.096 14.463 14.443 14.939 15.455 15.624 15.550 15.621 15.997 16.292 15.838 14.339 12.313 10.855 + 14.020 14.847 15.993 16.806 16.906 16.340 15.416 14.428 13.539 12.844 12.451 12.427 12.656 12.848 12.761 12.485 12.462 13.146 14.550 16.108 17.039 16.954 16.162 15.413 15.283 15.756 16.361 16.689 16.774 16.946 17.334 17.540 16.910 15.184 12.943 11.354 + 13.839 14.864 16.243 17.152 17.177 16.484 15.518 14.586 13.744 12.988 12.450 12.327 12.601 12.934 12.934 12.595 12.428 13.062 14.612 16.423 17.500 17.317 16.266 15.334 15.268 16.000 16.829 17.168 17.092 17.148 17.622 18.050 17.523 15.595 12.924 10.983 + 13.742 14.838 16.304 17.247 17.235 16.468 15.435 14.460 13.578 12.761 12.156 12.001 12.308 12.719 12.788 12.464 12.268 12.884 14.475 16.381 17.564 17.449 16.428 15.518 15.487 16.239 17.027 17.247 17.028 17.010 17.543 18.134 17.779 15.943 13.273 11.301 + 13.659 14.791 16.278 17.185 17.088 16.249 15.210 14.291 13.461 12.633 11.956 11.732 12.042 12.536 12.704 12.417 12.164 12.664 14.144 15.983 17.141 17.032 16.043 15.195 15.235 16.015 16.740 16.820 16.475 16.448 17.121 17.913 17.677 15.788 12.941 10.816 + 13.666 14.633 15.869 16.540 16.287 15.379 14.333 13.453 12.708 12.003 11.448 11.286 11.571 11.991 12.126 11.907 11.801 12.412 13.847 15.458 16.303 15.959 14.931 14.231 14.478 15.373 16.046 15.953 15.430 15.332 16.069 17.013 16.931 15.140 12.327 10.204 + 12.161 12.745 13.488 13.888 13.745 13.254 12.775 12.514 12.414 12.301 12.079 11.778 11.442 11.044 10.569 10.167 10.154 10.771 11.888 12.980 13.476 13.208 12.567 12.155 12.259 12.616 12.720 12.381 11.982 12.125 12.981 13.962 14.116 12.959 11.016 9.530 + 11.396 11.395 11.169 10.518 9.516 8.508 7.852 7.639 7.649 7.564 7.236 6.751 6.294 5.974 5.788 5.735 5.895 6.349 7.018 7.628 7.888 7.748 7.463 7.370 7.553 7.760 7.665 7.262 6.974 7.303 8.295 9.341 9.574 8.592 6.894 5.591 + 10.878 10.840 10.484 9.592 8.320 7.144 6.468 6.283 6.219 5.921 5.369 4.830 4.522 4.385 4.226 4.056 4.212 5.036 6.405 7.623 7.907 7.075 5.790 5.042 5.306 6.138 6.640 6.355 5.746 5.747 6.760 8.089 8.421 7.006 4.478 2.509 + 11.732 11.386 10.644 9.574 8.456 7.634 7.210 6.929 6.396 5.482 4.484 3.865 3.799 3.997 4.018 3.779 3.712 4.355 5.726 7.126 7.641 6.952 5.673 4.870 5.133 6.081 6.750 6.540 5.795 5.445 6.033 7.071 7.394 6.248 4.107 2.412 + 11.467 11.121 10.415 9.433 8.409 7.612 7.128 6.787 6.326 5.660 4.972 4.516 4.334 4.201 3.903 3.564 3.643 4.510 5.971 7.251 7.543 6.704 5.433 4.716 4.993 5.804 6.263 5.933 5.260 5.135 5.949 7.067 7.277 5.892 3.504 1.659 + 11.116 11.153 11.027 10.529 9.642 8.551 7.481 6.548 5.779 5.243 5.097 5.451 6.171 6.872 7.179 7.041 6.791 6.840 7.276 7.751 7.809 7.354 6.800 6.706 7.220 7.871 7.962 7.239 6.211 5.765 6.382 7.666 8.644 8.595 7.687 6.822 + 11.121 11.913 12.799 12.998 12.296 11.169 10.292 9.954 9.916 9.782 9.456 9.212 9.331 9.745 10.087 10.099 9.954 10.107 10.791 11.688 12.158 11.844 11.078 10.626 10.984 11.895 12.560 12.400 11.619 11.038 11.324 12.347 13.289 13.411 12.745 12.045 + 11.630 12.072 12.600 12.797 12.510 11.913 11.293 10.798 10.385 9.974 9.614 9.447 9.522 9.693 9.757 9.703 9.816 10.443 11.615 12.891 13.625 13.480 12.725 12.038 11.961 12.482 13.114 13.382 13.249 13.105 13.336 13.926 14.465 14.557 14.211 13.836 + 11.842 12.875 14.163 14.785 14.389 13.361 12.370 11.789 11.504 11.229 10.893 10.695 10.789 11.018 11.048 10.781 10.587 11.025 12.259 13.753 14.627 14.394 13.418 12.614 12.637 13.324 13.906 13.803 13.206 12.883 13.367 14.344 14.867 14.245 12.764 11.530 + 12.974 13.942 15.177 15.849 15.624 14.792 13.869 13.110 12.422 11.685 11.060 10.901 11.345 12.042 12.401 12.160 11.721 11.853 12.969 14.658 15.948 16.106 15.254 14.223 13.804 14.077 14.461 14.385 13.887 13.549 13.836 14.529 14.852 14.223 12.883 11.785 + 13.331 14.351 15.645 16.337 16.084 15.219 14.308 13.616 12.992 12.234 11.460 11.068 11.295 11.892 12.288 12.152 11.787 11.903 12.939 14.566 15.881 16.147 15.416 14.446 14.004 14.221 14.583 14.540 14.085 13.712 13.833 14.246 14.255 13.364 11.860 10.689 + 13.254 14.338 15.709 16.437 16.173 15.296 14.435 13.870 13.407 12.762 11.999 11.516 11.610 12.097 12.449 12.332 12.011 12.146 13.139 14.656 15.830 16.004 15.308 14.527 14.373 14.850 15.326 15.203 14.527 13.899 13.809 14.056 13.893 12.784 11.049 9.726 + 13.031 14.152 15.531 16.176 15.752 14.735 13.845 13.374 13.047 12.482 11.705 11.166 11.241 11.781 12.221 12.171 11.872 12.006 13.004 14.522 15.649 15.696 14.824 13.900 13.695 14.204 14.725 14.602 13.883 13.231 13.175 13.483 13.324 12.106 10.189 8.725 + 12.529 13.548 14.729 15.105 14.401 13.169 12.189 11.773 11.621 11.299 10.774 10.431 10.586 11.065 11.340 11.126 10.780 11.029 12.220 13.846 14.869 14.618 13.414 12.298 12.096 12.692 13.206 12.910 11.957 11.219 11.366 12.121 12.455 11.583 9.807 8.363 + 10.864 11.232 11.563 11.418 10.708 9.739 8.895 8.320 7.887 7.454 7.073 6.919 7.021 7.152 7.049 6.775 6.783 7.539 8.989 10.430 11.002 10.416 9.244 8.457 8.582 9.259 9.630 9.202 8.361 8.016 8.680 9.868 10.445 9.650 7.872 6.413 + 10.965 10.817 10.296 9.256 7.908 6.742 6.143 6.064 6.087 5.816 5.211 4.555 4.114 3.872 3.632 3.362 3.371 4.055 5.425 6.899 7.655 7.295 6.210 5.280 5.138 5.655 6.128 5.985 5.339 4.861 5.103 5.929 6.612 6.528 5.756 5.025 + 10.298 10.257 9.774 8.532 6.771 5.262 4.745 5.338 6.424 7.147 7.043 6.300 5.455 4.895 4.618 4.431 4.292 4.406 4.978 5.897 6.714 6.980 6.624 6.007 5.596 5.581 5.781 5.906 5.882 5.896 6.125 6.473 6.597 6.243 5.550 4.992 + 9.808 9.970 9.903 9.238 8.042 6.843 6.208 6.278 6.666 6.806 6.413 5.643 4.871 4.342 4.044 3.878 3.878 4.206 4.910 5.731 6.210 6.047 5.391 4.753 4.596 4.965 5.507 5.832 5.876 5.911 6.206 6.707 7.053 6.939 6.441 5.992 + 8.206 8.399 8.536 8.344 7.764 7.008 6.373 6.008 5.822 5.617 5.289 4.913 4.650 4.578 4.622 4.644 4.585 4.520 4.563 4.733 4.917 4.977 4.883 4.754 4.750 4.927 5.185 5.370 5.418 5.417 5.532 5.865 6.375 6.917 7.344 7.571 + 8.734 9.160 9.517 9.246 8.202 6.772 5.554 4.893 4.693 4.618 4.447 4.235 4.165 4.281 4.395 4.286 3.964 3.721 3.888 4.516 5.289 5.761 5.725 5.371 5.116 5.242 5.682 6.116 6.263 6.128 5.978 6.124 6.687 7.526 8.341 8.836 + 8.649 9.186 9.536 8.947 7.387 5.630 4.619 4.680 5.312 5.692 5.406 4.727 4.239 4.219 4.405 4.342 3.920 3.539 3.730 4.597 5.644 6.174 5.892 5.165 4.706 4.975 5.850 6.797 7.356 7.464 7.388 7.400 7.548 7.705 7.765 7.755 + 10.152 10.168 9.949 9.311 8.435 7.798 7.770 8.260 8.761 8.789 8.304 7.723 7.519 7.783 8.161 8.218 7.850 7.366 7.171 7.381 7.743 7.932 7.890 7.880 8.196 8.845 9.523 9.915 10.000 10.051 10.329 10.776 11.051 10.868 10.324 9.852 + 11.165 11.487 11.761 11.610 11.019 10.349 9.983 9.968 9.997 9.748 9.224 8.753 8.651 8.897 9.156 9.123 8.847 8.687 8.943 9.534 10.052 10.153 9.909 9.749 10.051 10.774 11.495 11.818 11.752 11.679 11.952 12.517 12.951 12.880 12.369 11.889 + 10.688 11.464 12.400 12.792 12.419 11.636 10.959 10.586 10.318 9.898 9.358 8.984 8.951 9.065 8.940 8.479 8.129 8.564 10.014 11.893 13.143 13.074 11.962 10.840 10.646 11.471 12.578 13.122 12.904 12.465 12.482 13.104 13.848 14.128 13.849 13.464 + 12.171 13.039 14.123 14.657 14.343 13.484 12.606 11.977 11.492 10.963 10.437 10.181 10.362 10.790 11.071 11.031 10.973 11.432 12.611 14.048 14.907 14.672 13.631 12.664 12.502 13.120 13.819 13.914 13.365 12.771 12.758 13.374 14.059 14.220 13.806 13.333 + 13.223 13.974 14.981 15.630 15.610 15.038 14.239 13.452 12.749 12.166 11.831 11.875 12.222 12.532 12.451 11.983 11.599 11.900 13.069 14.619 15.713 15.812 15.106 14.323 14.099 14.477 14.977 15.131 14.930 14.768 14.938 15.230 15.069 14.094 12.625 11.522 + 13.448 14.369 15.617 16.445 16.460 15.782 14.809 13.861 13.050 12.406 12.021 12.008 12.302 12.601 12.596 12.311 12.176 12.699 13.953 15.404 16.280 16.206 15.526 14.988 15.080 15.617 15.990 15.812 15.326 15.139 15.527 16.012 15.697 14.113 11.821 10.131 + 13.470 14.451 15.791 16.704 16.766 16.095 15.112 14.171 13.402 12.825 12.503 12.509 12.764 12.985 12.903 12.583 12.478 13.077 14.420 15.935 16.831 16.737 16.013 15.426 15.467 15.949 16.258 16.011 15.462 15.231 15.602 16.095 15.800 14.239 11.963 10.281 + 13.365 14.411 15.851 16.857 16.968 16.290 15.267 14.292 13.525 12.987 12.708 12.723 12.937 13.089 12.953 12.623 12.544 13.169 14.496 15.943 16.748 16.594 15.878 15.371 15.527 16.100 16.423 16.087 15.364 14.935 15.175 15.688 15.598 14.379 12.460 11.005 + 13.421 14.428 15.794 16.698 16.691 15.900 14.781 13.740 12.951 12.440 12.229 12.321 12.575 12.712 12.551 12.272 12.384 13.300 14.865 16.320 16.841 16.230 15.128 14.489 14.761 15.507 15.847 15.327 14.383 13.928 14.422 15.319 15.463 14.157 11.916 10.180 + 13.412 14.116 15.111 15.830 15.878 15.213 14.100 12.929 12.041 11.615 11.621 11.832 11.929 11.707 11.284 11.111 11.677 13.074 14.784 15.939 15.932 14.912 13.716 13.224 13.666 14.471 14.803 14.339 13.564 13.313 13.946 14.921 15.209 14.212 12.380 10.943 + 12.684 13.258 13.987 14.349 14.092 13.387 12.645 12.205 12.107 12.128 11.977 11.492 10.733 9.943 9.456 9.570 10.393 11.721 13.049 13.801 13.671 12.857 11.944 11.506 11.699 12.191 12.507 12.474 12.375 12.639 13.346 14.024 13.977 12.904 11.269 10.054 + 12.514 13.297 14.368 15.075 15.027 14.276 13.193 12.170 11.422 10.956 10.683 10.502 10.337 10.166 10.070 10.239 10.862 11.916 13.047 13.723 13.598 12.830 12.020 11.780 12.249 13.000 13.429 13.318 13.028 13.138 13.825 14.577 14.568 13.398 11.561 10.183 + 13.360 13.667 14.241 14.896 15.243 14.861 13.614 11.867 10.354 9.722 10.079 10.906 11.450 11.304 10.733 10.447 11.018 12.388 13.869 14.658 14.440 13.604 12.903 12.856 13.362 13.856 13.836 13.318 12.816 12.878 13.558 14.305 14.378 13.464 12.000 10.903 + 13.633 13.979 14.567 15.168 15.459 15.152 14.185 12.828 11.585 10.906 10.896 11.246 11.472 11.303 10.921 10.833 11.457 12.734 14.099 14.868 14.751 14.070 13.499 13.513 14.012 14.426 14.237 13.460 12.654 12.438 12.906 13.472 13.314 12.079 10.267 8.937 + 13.627 14.158 14.956 15.626 15.829 15.427 14.519 13.395 12.425 11.907 11.918 12.253 12.528 12.445 12.041 11.724 11.990 13.003 14.379 15.395 15.512 14.804 13.915 13.547 13.898 14.532 14.796 14.416 13.728 13.328 13.447 13.652 13.190 11.705 9.690 8.238 + 13.583 14.289 15.277 16.002 16.137 15.695 14.902 13.992 13.137 12.488 12.197 12.303 12.620 12.801 12.633 12.295 12.297 13.048 14.412 15.693 16.138 15.574 14.587 14.044 14.350 15.117 15.548 15.198 14.386 13.851 13.963 14.258 13.799 12.082 9.666 7.897 + 13.387 14.241 15.342 15.984 15.888 15.311 14.672 14.144 13.601 12.923 12.263 11.943 12.095 12.459 12.621 12.486 12.459 13.082 14.422 15.837 16.438 15.884 14.740 14.022 14.291 15.149 15.639 15.186 14.160 13.502 13.718 14.252 13.895 11.952 9.071 6.925 + 13.483 14.249 15.169 15.554 15.204 14.486 13.910 13.635 13.392 12.858 12.057 11.362 11.133 11.371 11.779 12.128 12.524 13.240 14.295 15.254 15.544 15.015 14.183 13.818 14.235 14.960 15.165 14.483 13.423 12.902 13.292 13.902 13.475 11.362 8.303 6.048 + 12.645 13.390 14.246 14.477 13.853 12.791 11.961 11.720 11.887 11.988 11.705 11.113 10.540 10.277 10.406 10.873 11.609 12.526 13.410 13.918 13.797 13.154 12.481 12.306 12.724 13.268 13.286 12.537 11.447 10.728 10.683 10.845 10.340 8.711 6.474 4.850 + 9.188 10.247 11.315 11.235 9.776 7.840 6.690 6.894 7.913 8.666 8.483 7.614 6.893 6.936 7.644 8.395 8.660 8.441 8.149 8.134 8.360 8.506 8.319 7.845 7.321 6.901 6.550 6.186 5.878 5.814 6.048 6.306 6.124 5.265 4.032 3.123 + 8.974 9.740 10.410 10.058 8.548 6.666 5.427 5.209 5.509 5.502 4.835 3.922 3.510 3.968 4.992 5.938 6.411 6.522 6.620 6.830 6.913 6.564 5.808 5.040 4.668 4.718 4.837 4.686 4.319 4.132 4.407 4.931 5.118 4.552 3.454 2.573 + 9.987 10.502 10.838 10.275 8.761 7.003 5.853 5.607 5.835 5.874 5.463 4.922 4.761 5.149 5.783 6.236 6.384 6.447 6.642 6.856 6.726 6.071 5.183 4.635 4.720 5.123 5.179 4.537 3.578 3.119 3.630 4.713 5.373 4.902 3.562 2.418 + 9.619 10.053 10.264 9.591 8.045 6.358 5.357 5.246 5.491 5.371 4.670 3.850 3.574 4.064 4.911 5.493 5.550 5.362 5.387 5.759 6.153 6.136 5.617 4.927 4.470 4.325 4.226 3.929 3.551 3.497 4.007 4.797 5.214 4.805 3.790 2.942 + 8.513 8.977 9.392 9.182 8.199 6.836 5.680 5.058 4.867 4.788 4.634 4.478 4.493 4.717 5.018 5.271 5.523 5.924 6.494 6.979 7.016 6.481 5.672 5.107 5.085 5.418 5.606 5.323 4.734 4.353 4.526 5.070 5.405 5.088 4.263 3.563 + 8.932 8.797 8.348 7.485 6.411 5.587 5.395 5.816 6.425 6.713 6.475 5.927 5.483 5.397 5.610 5.877 6.020 6.058 6.116 6.254 6.406 6.474 6.452 6.417 6.399 6.297 5.969 5.418 4.889 4.707 4.985 5.464 5.682 5.357 4.656 4.087 + 8.372 9.068 9.765 9.712 8.807 7.734 7.391 8.127 9.427 10.331 10.200 9.196 8.098 7.664 8.077 8.903 9.524 9.623 9.342 9.067 9.081 9.384 9.769 10.000 9.947 9.597 9.026 8.379 7.852 7.606 7.656 7.823 7.838 7.554 7.080 6.715 + 8.200 8.574 8.815 8.400 7.328 6.198 5.752 6.257 7.263 7.946 7.750 6.795 5.740 5.249 5.508 6.158 6.652 6.684 6.365 6.058 6.052 6.368 6.785 7.034 6.963 6.592 6.070 5.587 5.304 5.281 5.443 5.601 5.560 5.253 4.814 4.494 + 8.717 7.963 6.927 6.208 6.101 6.394 6.540 6.090 5.053 3.909 3.257 3.365 3.979 4.532 4.591 4.191 3.766 3.770 4.292 4.990 5.391 5.286 4.872 4.547 4.537 4.724 4.798 4.590 4.259 4.143 4.414 4.876 5.103 4.820 4.176 3.646 + 6.551 6.392 6.146 5.914 5.769 5.713 5.687 5.607 5.419 5.126 4.783 4.467 4.239 4.125 4.123 4.222 4.418 4.707 5.065 5.423 5.669 5.693 5.441 4.977 4.466 4.114 4.059 4.298 4.682 4.994 5.053 4.800 4.310 3.738 3.252 2.978 + 4.450 5.034 5.795 6.237 6.137 5.650 5.107 4.729 4.504 4.321 4.160 4.127 4.313 4.638 4.879 4.880 4.720 4.670 4.936 5.439 5.849 5.856 5.438 4.878 4.519 4.482 4.610 4.656 4.530 4.354 4.300 4.389 4.462 4.354 4.082 3.848 + 4.479 5.058 5.808 6.229 6.092 5.568 5.032 4.743 4.681 4.640 4.457 4.156 3.893 3.791 3.843 3.969 4.129 4.372 4.759 5.244 5.658 5.819 5.669 5.310 4.909 4.581 4.341 4.178 4.124 4.239 4.507 4.778 4.841 4.594 4.160 3.825 + 5.463 5.669 5.871 5.849 5.569 5.187 4.872 4.647 4.414 4.137 3.957 4.088 4.580 5.184 5.514 5.377 4.977 4.767 5.069 5.782 6.457 6.670 6.351 5.794 5.351 5.131 4.979 4.726 4.428 4.322 4.549 4.936 5.087 4.736 4.036 3.474 + 6.506 6.114 5.683 5.580 5.839 6.117 6.009 5.431 4.720 4.358 4.555 5.073 5.446 5.379 4.999 4.724 4.899 5.505 6.191 6.579 6.544 6.264 6.005 5.882 5.790 5.555 5.141 4.717 4.527 4.675 5.023 5.267 5.156 4.665 4.026 3.582 + 6.059 6.002 5.981 6.080 6.262 6.360 6.198 5.736 5.142 4.688 4.557 4.703 4.886 4.870 4.619 4.346 4.338 4.717 5.312 5.765 5.798 5.429 4.962 4.756 4.953 5.383 5.713 5.704 5.376 4.948 4.637 4.490 4.389 4.207 3.948 3.750 + 7.447 6.658 5.607 4.961 5.044 5.621 6.103 6.017 5.371 4.631 4.338 4.675 5.316 5.701 5.490 4.848 4.317 4.379 5.068 5.938 6.407 6.203 5.535 4.896 4.668 4.861 5.190 5.358 5.301 5.171 5.116 5.100 4.935 4.498 3.905 3.474 + 7.593 6.830 5.810 5.159 5.167 5.617 6.011 5.982 5.546 5.023 4.736 4.760 4.931 5.041 5.036 5.028 5.152 5.421 5.712 5.882 5.890 5.804 5.709 5.624 5.499 5.302 5.086 4.972 5.046 5.269 5.486 5.516 5.276 4.829 4.354 4.053 + 5.447 5.740 6.198 6.592 6.678 6.324 5.618 4.876 4.484 4.673 5.355 6.157 6.651 6.619 6.178 5.677 5.453 5.619 6.021 6.381 6.494 6.338 6.049 5.790 5.647 5.606 5.598 5.573 5.526 5.474 5.426 5.364 5.264 5.125 4.982 4.889 + 6.238 6.119 6.065 6.244 6.599 6.848 6.702 6.127 5.416 4.982 5.052 5.492 5.930 6.048 5.823 5.517 5.446 5.727 6.205 6.598 6.710 6.556 6.296 6.078 5.931 5.779 5.559 5.302 5.118 5.094 5.201 5.299 5.236 4.971 4.613 4.359 + 6.221 6.126 6.048 6.105 6.307 6.520 6.560 6.332 5.922 5.550 5.429 5.625 6.027 6.435 6.693 6.772 6.742 6.681 6.614 6.519 6.388 6.265 6.214 6.239 6.251 6.117 5.780 5.333 4.985 4.904 5.080 5.304 5.320 5.019 4.542 4.185 + 7.820 7.759 7.616 7.364 6.996 6.540 6.062 5.655 5.410 5.384 5.572 5.887 6.187 6.340 6.295 6.117 5.960 5.971 6.195 6.549 6.871 7.021 6.956 6.736 6.462 6.208 5.998 5.820 5.672 5.568 5.521 5.521 5.530 5.516 5.477 5.442 + 7.657 7.037 6.262 5.896 6.157 6.764 7.173 7.001 6.294 5.458 4.932 4.897 5.216 5.606 5.867 5.973 6.011 6.062 6.144 6.240 6.339 6.439 6.503 6.451 6.219 5.837 5.461 5.289 5.423 5.788 6.159 6.295 6.086 5.605 5.070 4.725 + 8.344 7.733 6.926 6.443 6.519 6.926 7.146 6.775 5.851 4.858 4.389 4.723 5.624 6.521 6.919 6.736 6.296 6.031 6.126 6.411 6.559 6.384 5.997 5.677 5.607 5.728 5.825 5.767 5.638 5.646 5.889 6.209 6.303 5.994 5.426 4.980 + 9.320 8.468 7.335 6.618 6.597 6.943 7.021 6.431 5.360 4.458 4.336 5.099 6.266 7.129 7.259 6.772 6.177 5.959 6.241 6.763 7.151 7.213 7.037 6.833 6.718 6.626 6.426 6.105 5.823 5.782 6.027 6.365 6.496 6.262 5.792 5.419 + 7.477 8.271 9.548 10.824 11.658 11.824 11.357 10.476 9.448 8.491 7.768 7.428 7.604 8.333 9.446 10.564 11.253 11.276 10.755 10.102 9.736 9.805 10.112 10.315 10.218 9.917 9.681 9.690 9.858 9.913 9.641 9.077 8.478 8.101 8.002 8.034 + 7.369 7.763 8.682 10.130 11.742 12.861 12.912 11.785 9.909 7.985 6.618 6.119 6.536 7.745 9.444 11.110 12.102 11.986 10.873 9.440 8.515 8.498 9.101 9.637 9.625 9.179 8.832 8.984 9.485 9.766 9.393 8.499 7.692 7.506 7.915 8.382 + 6.565 6.097 5.681 5.968 7.233 9.123 10.801 11.396 10.471 8.257 5.568 3.452 2.731 3.618 5.595 7.663 8.874 8.884 8.136 7.524 7.730 8.718 9.789 10.156 9.592 8.598 7.962 8.083 8.651 8.979 8.661 7.976 7.645 8.156 9.274 10.189 + 6.732 6.691 6.631 6.634 6.841 7.359 8.118 8.807 9.012 8.491 7.405 6.308 5.839 6.327 7.568 8.951 9.850 10.006 9.626 9.162 8.948 8.989 9.030 8.823 8.358 7.872 7.637 7.738 7.998 8.136 7.995 7.657 7.358 7.283 7.411 7.562 + 8.133 7.884 7.749 8.129 9.093 10.301 11.266 11.701 11.664 11.425 11.237 11.220 11.409 11.826 12.424 12.991 13.174 12.720 11.746 10.760 10.327 10.603 11.161 11.312 10.680 9.547 8.637 8.517 9.120 9.805 9.885 9.164 8.019 7.015 6.459 6.276 + 10.869 11.073 11.384 11.700 12.009 12.427 13.108 14.085 15.166 15.993 16.269 15.990 15.495 15.237 15.433 15.863 16.008 15.454 14.252 12.922 12.068 11.903 12.079 11.974 11.217 10.032 9.103 9.065 10.011 11.389 12.358 12.302 11.163 9.405 7.719 6.709 + 11.432 11.704 12.082 12.371 12.526 12.724 13.254 14.271 15.600 16.761 17.258 16.935 16.142 15.523 15.550 16.152 16.741 16.648 15.658 14.200 13.041 12.696 13.025 13.353 13.006 11.864 10.479 9.680 9.957 11.089 12.264 12.590 11.635 9.674 7.531 6.153 + 11.761 11.885 12.104 12.371 12.664 13.044 13.656 14.607 15.794 16.829 17.219 16.738 15.693 14.818 14.783 15.660 16.807 17.309 16.682 15.270 14.002 13.665 14.284 15.109 15.216 14.243 12.663 11.411 11.171 11.880 12.792 13.010 12.072 10.211 8.195 6.905 + 12.167 12.341 12.629 12.956 13.294 13.707 14.319 15.193 16.197 16.983 17.175 16.655 15.729 15.001 14.968 15.645 16.514 16.889 16.436 15.430 14.541 14.297 14.668 15.092 14.937 14.005 12.690 11.672 11.408 11.806 12.320 12.337 11.574 10.225 8.821 7.938 + 12.600 12.774 13.046 13.344 13.683 14.171 14.916 15.888 16.850 17.441 17.376 16.657 15.628 14.820 14.664 15.231 16.188 17.001 17.263 16.939 16.351 15.923 15.860 15.989 15.900 15.269 14.153 12.997 12.347 12.451 13.034 13.446 13.100 11.895 10.340 9.258 + 12.862 13.016 13.290 13.673 14.207 14.933 15.777 16.526 16.917 16.812 16.286 15.566 14.880 14.368 14.112 14.200 14.702 15.542 16.414 16.897 16.745 16.101 15.409 15.038 14.934 14.656 13.813 12.528 11.468 11.322 12.143 13.156 13.286 12.037 9.986 8.432 + 13.138 13.434 13.951 14.596 15.295 15.962 16.452 16.588 16.280 15.633 14.910 14.346 13.982 13.694 13.412 13.297 13.656 14.622 15.899 16.867 17.034 16.446 15.655 15.218 15.168 14.988 14.150 12.760 11.632 11.631 12.796 14.087 14.085 12.171 9.193 6.970 + 12.847 13.295 14.030 14.819 15.461 15.810 15.755 15.250 14.385 13.431 12.716 12.400 12.345 12.256 12.009 11.859 12.275 13.468 15.058 16.245 16.419 15.693 14.828 14.555 14.871 15.009 14.176 12.417 10.770 10.435 11.637 13.220 13.460 11.510 8.254 5.772 + 13.075 13.646 14.465 15.102 15.273 14.943 14.263 13.442 12.671 12.107 11.834 11.792 11.771 11.569 11.219 11.080 11.589 12.841 14.363 15.367 15.372 14.648 14.030 14.181 14.922 15.304 14.436 12.403 10.375 9.711 10.746 12.353 12.766 11.055 8.016 5.660 + 13.327 13.834 14.608 15.316 15.705 15.657 15.162 14.284 13.192 12.180 11.550 11.409 11.551 11.617 11.435 11.246 11.536 12.555 13.970 15.018 15.129 14.457 13.794 13.849 14.528 14.917 14.094 12.073 9.993 9.249 10.252 11.932 12.518 11.024 8.174 5.925 + 13.854 14.355 15.073 15.662 15.932 15.880 15.545 14.903 13.952 12.865 11.998 11.655 11.805 12.079 12.107 11.906 11.922 12.612 13.938 15.292 15.971 15.797 15.278 15.101 15.418 15.641 15.009 13.424 11.736 11.092 11.867 13.170 13.478 11.941 9.231 7.128 + 13.808 14.364 15.132 15.708 15.926 15.872 15.667 15.278 14.585 13.622 12.690 12.157 12.122 12.297 12.293 12.047 11.956 12.529 13.852 15.400 16.426 16.596 16.245 15.995 16.089 16.110 15.430 13.955 12.427 11.861 12.573 13.724 13.894 12.309 9.634 7.580 + 13.520 14.193 15.110 15.762 15.924 15.719 15.378 14.966 14.374 13.549 12.676 12.080 11.921 12.026 12.053 11.867 11.736 12.112 13.184 14.628 15.824 16.360 16.326 16.135 16.040 15.871 15.265 14.178 13.108 12.724 13.188 13.839 13.636 12.067 9.724 7.986 + 14.022 14.352 14.809 15.160 15.314 15.308 15.156 14.751 13.973 12.886 11.818 11.158 11.046 11.255 11.405 11.344 11.314 11.734 12.782 14.171 15.361 15.991 16.136 16.126 16.139 15.998 15.411 14.412 13.511 13.312 13.890 14.549 14.286 12.652 10.281 8.541 + 13.980 14.244 14.507 14.502 14.227 13.931 13.837 13.891 13.797 13.307 12.483 11.658 11.139 10.949 10.868 10.720 10.608 10.846 11.636 12.833 14.020 14.838 15.231 15.379 15.404 15.204 14.606 13.690 12.900 12.725 13.199 13.711 13.405 11.917 9.810 8.276 + 14.245 14.197 14.000 13.606 13.140 12.848 12.876 13.111 13.237 12.984 12.355 11.604 11.012 10.661 10.420 10.154 9.914 9.943 10.458 11.436 12.596 13.586 14.186 14.364 14.174 13.660 12.883 12.038 11.450 11.378 11.747 12.094 11.858 10.832 9.415 8.394 + 15.056 14.829 14.257 13.301 12.173 11.273 10.908 11.040 11.304 11.302 10.905 10.328 9.900 9.778 9.844 9.869 9.755 9.622 9.683 10.040 10.599 11.147 11.488 11.501 11.116 10.317 9.225 8.187 7.682 8.029 9.071 10.161 10.546 9.913 8.674 7.704 + 15.309 14.866 14.030 12.954 11.899 11.163 10.919 11.090 11.370 11.398 10.985 10.239 9.496 9.105 9.208 9.655 10.103 10.241 9.998 9.609 9.469 9.856 10.677 11.428 11.449 10.361 8.411 6.453 5.492 6.058 7.807 9.693 10.619 10.166 8.860 7.781 + 15.202 14.813 14.114 13.247 12.391 11.730 11.392 11.389 11.573 11.676 11.445 10.816 9.998 9.376 9.270 9.690 10.307 10.676 10.575 10.195 10.005 10.369 11.185 11.870 11.719 10.441 8.455 6.723 6.178 7.128 9.031 10.813 11.528 10.936 9.623 8.591 + 14.907 14.619 14.091 13.403 12.664 12.008 11.579 11.457 11.566 11.656 11.426 10.751 9.833 9.129 9.041 9.598 10.398 10.888 10.799 10.375 10.184 10.638 11.589 12.362 12.224 10.947 9.049 7.505 7.130 8.071 9.730 11.161 11.646 11.088 10.011 9.194 + 14.337 14.145 13.785 13.309 12.797 12.343 12.026 11.853 11.735 11.508 11.044 10.369 9.694 9.309 9.382 9.811 10.271 10.442 10.271 10.046 10.193 10.937 12.069 13.025 13.248 12.575 11.380 10.352 10.064 10.618 11.599 12.350 12.388 11.686 10.667 9.942 + 14.111 13.865 13.438 12.969 12.649 12.621 12.861 13.132 13.097 12.540 11.548 10.502 9.854 9.825 10.248 10.675 10.685 10.195 9.538 9.266 9.787 11.090 12.715 13.999 14.450 14.007 13.066 12.233 11.976 12.360 13.020 13.397 13.086 12.097 10.873 10.040 + 12.997 13.070 13.070 12.881 12.581 12.410 12.540 12.861 13.008 12.636 11.739 10.711 10.082 10.105 10.556 10.890 10.668 9.918 9.142 8.983 9.780 11.328 13.006 14.154 14.444 14.027 13.392 13.051 13.237 13.783 14.223 14.053 13.039 11.379 9.654 8.557 + 12.573 12.914 13.268 13.274 12.866 12.333 12.058 12.163 12.378 12.269 11.628 10.678 9.924 9.745 10.069 10.429 10.340 9.715 8.980 8.780 9.504 10.988 12.610 13.702 13.972 13.643 13.247 13.235 13.685 14.284 14.557 14.167 13.099 11.660 10.319 9.519 + 12.682 13.054 13.458 13.507 13.090 12.458 11.992 11.868 11.904 11.737 11.159 10.334 9.679 9.518 9.796 10.105 10.026 9.493 8.901 8.829 9.606 11.038 12.517 13.427 13.548 13.168 12.844 12.992 13.615 14.326 14.617 14.179 13.061 11.615 10.311 9.549 + 12.738 13.069 13.435 13.501 13.171 12.642 12.196 11.929 11.676 11.201 10.472 9.753 9.402 9.556 9.970 10.184 9.894 9.231 8.706 8.851 9.834 11.320 12.692 13.446 13.486 13.133 12.871 13.027 13.587 14.235 14.550 14.247 13.312 12.010 10.773 10.024 + 12.446 12.814 13.254 13.423 13.200 12.748 12.332 12.063 11.812 11.375 10.710 10.024 9.617 9.611 9.823 9.911 9.674 9.262 9.107 9.611 10.831 12.400 13.733 14.371 14.234 13.628 13.034 12.833 13.112 13.650 14.047 13.938 13.189 11.978 10.734 9.950 + 12.722 13.077 13.535 13.775 13.626 13.168 12.635 12.208 11.893 11.548 11.061 10.483 10.014 9.835 9.945 10.155 10.268 10.297 10.510 11.228 12.512 13.988 14.997 14.996 13.936 12.334 10.970 10.416 10.723 11.461 12.042 12.089 11.593 10.825 10.117 9.709 + 12.638 13.021 13.555 13.909 13.838 13.323 12.578 11.888 11.411 11.086 10.729 10.251 9.784 9.592 9.835 10.390 10.938 11.251 11.428 11.812 12.625 13.623 14.136 13.529 11.762 9.551 7.963 7.711 8.690 10.107 11.080 11.206 10.701 10.060 9.636 9.470 + 12.728 13.074 13.582 13.956 13.922 13.380 12.476 11.513 10.756 10.270 9.932 9.615 9.367 9.397 9.858 10.628 11.341 11.665 11.609 11.529 11.795 12.371 12.734 12.239 10.692 8.615 6.959 6.455 7.121 8.305 9.207 9.427 9.119 8.702 8.460 8.394 + 12.817 13.117 13.566 13.894 13.829 13.264 12.377 11.548 11.091 11.001 10.949 10.583 9.886 9.253 9.188 9.852 10.887 11.688 11.899 11.683 11.510 11.654 11.874 11.602 10.489 8.811 7.340 6.778 7.223 8.119 8.718 8.628 8.004 7.289 6.808 6.610 + 12.793 13.103 13.573 13.926 13.867 13.281 12.374 11.578 11.232 11.276 11.270 10.779 9.815 8.910 8.709 9.411 10.565 11.439 11.649 11.448 11.412 11.806 12.242 12.006 10.766 9.009 7.749 7.726 8.806 10.096 10.690 10.367 9.640 9.190 9.241 9.471 + 12.882 13.237 13.736 14.069 14.002 13.512 12.797 12.132 11.668 11.326 10.898 10.262 9.551 9.080 9.095 9.551 10.149 10.598 10.892 11.295 12.032 12.951 13.495 13.092 11.655 9.775 8.379 8.105 8.867 9.963 10.607 10.458 9.741 8.942 8.404 8.175 + 13.271 13.566 13.949 14.158 14.043 13.643 13.106 12.552 11.990 11.357 10.635 9.915 9.362 9.105 9.158 9.443 9.887 10.502 11.357 12.464 13.660 14.607 14.941 14.471 13.319 11.884 10.671 10.044 10.072 10.517 10.970 11.062 10.636 9.814 8.928 8.361 + 13.861 13.799 13.698 13.571 13.401 13.142 12.756 12.247 11.655 11.034 10.411 9.797 9.221 8.755 8.508 8.569 8.961 9.632 10.493 11.452 12.419 13.260 13.788 13.810 13.251 12.262 11.217 10.552 10.529 11.059 11.718 11.972 11.486 10.340 9.012 8.131 + 14.381 14.331 14.065 13.422 12.437 11.364 10.515 10.031 9.798 9.540 9.046 8.324 7.599 7.164 7.208 7.707 8.436 9.079 9.384 9.304 9.039 8.923 9.183 9.727 10.140 9.958 9.068 7.901 7.219 7.571 8.814 10.124 10.539 9.680 8.081 6.845 + 14.543 14.340 13.883 13.148 12.209 11.231 10.388 9.765 9.328 8.968 8.572 8.084 7.530 7.033 6.798 7.024 7.754 8.763 9.598 9.838 9.402 8.675 8.263 8.540 9.315 9.935 9.799 8.872 7.768 7.289 7.789 8.872 9.720 9.758 9.118 8.488 + 14.474 14.271 13.858 13.220 12.360 11.344 10.344 9.588 9.238 9.246 9.341 9.178 8.595 7.770 7.142 7.110 7.731 8.639 9.279 9.302 8.810 8.279 8.187 8.642 9.296 9.610 9.275 8.467 7.725 7.564 8.099 8.972 9.636 9.759 9.446 9.110 + 13.994 13.989 13.741 13.028 11.914 10.761 9.964 9.651 9.605 9.472 9.049 8.410 7.787 7.365 7.181 7.174 7.295 7.527 7.828 8.103 8.282 8.418 8.671 9.124 9.610 9.754 9.287 8.373 7.614 7.642 8.585 9.881 10.657 10.410 9.427 8.569 + 13.120 12.990 12.561 11.722 10.644 9.738 9.370 9.550 9.891 9.885 9.270 8.206 7.134 6.458 6.320 6.596 7.056 7.520 7.903 8.186 8.392 8.582 8.826 9.120 9.315 9.174 8.569 7.675 6.950 6.856 7.492 8.476 9.193 9.255 8.793 8.333 + 11.022 10.976 10.611 9.726 8.523 7.563 7.339 7.844 8.546 8.797 8.351 7.523 6.890 6.802 7.147 7.523 7.621 7.461 7.293 7.333 7.584 7.902 8.168 8.362 8.484 8.443 8.093 7.416 6.639 6.138 6.154 6.584 7.049 7.213 7.052 6.835 + 9.745 9.658 9.242 8.335 7.167 6.309 6.243 6.934 7.778 8.029 7.356 6.085 4.936 4.493 4.826 5.537 6.120 6.316 6.203 6.030 6.002 6.178 6.498 6.846 7.078 7.041 6.648 5.984 5.323 4.987 5.115 5.543 5.919 5.975 5.741 5.494 + 7.107 7.255 7.157 6.467 5.359 4.526 4.669 5.884 7.487 8.450 8.128 6.707 5.038 4.035 4.084 4.900 5.832 6.343 6.295 5.930 5.631 5.675 6.098 6.694 7.115 7.050 6.415 5.451 4.633 4.381 4.769 5.452 5.903 5.807 5.300 4.846 + 5.127 5.732 6.356 6.356 5.629 4.740 4.470 5.159 6.407 7.371 7.394 6.463 5.164 4.213 3.976 4.320 4.819 5.104 5.071 4.863 4.717 4.811 5.179 5.695 6.112 6.176 5.790 5.130 4.584 4.502 4.918 5.479 5.687 5.289 4.508 3.891 + 7.234 7.536 7.956 8.270 8.381 8.364 8.355 8.416 8.485 8.458 8.312 8.141 8.074 8.162 8.343 8.520 8.662 8.827 9.080 9.399 9.658 9.742 9.675 9.643 9.876 10.466 11.273 11.986 12.306 12.103 11.462 10.599 9.741 9.041 8.567 8.332 + 8.312 8.853 9.589 10.107 10.242 10.141 10.061 10.108 10.174 10.111 9.936 9.849 10.048 10.523 11.055 11.401 11.496 11.462 11.443 11.451 11.396 11.272 11.272 11.671 12.568 13.720 14.672 15.098 15.042 14.846 14.823 14.976 15.034 14.760 14.228 13.797 + 9.046 9.236 9.481 9.629 9.627 9.546 9.476 9.429 9.335 9.145 8.926 8.845 9.042 9.505 10.068 10.541 10.847 11.062 11.310 11.639 11.994 12.306 12.613 13.067 13.820 14.868 16.011 16.958 17.503 17.634 17.507 17.317 17.188 17.142 17.145 17.156 + 9.217 9.038 8.759 8.514 8.436 8.571 8.822 8.995 8.945 8.704 8.490 8.556 8.982 9.592 10.080 10.242 10.136 10.033 10.197 10.709 11.461 12.308 13.221 14.288 15.557 16.897 18.015 18.638 18.708 18.423 18.093 17.936 17.979 18.118 18.238 18.296 + 9.328 9.582 9.880 9.954 9.678 9.155 8.651 8.419 8.546 8.932 9.372 9.699 9.854 9.880 9.867 9.896 10.032 10.332 10.839 11.565 12.469 13.471 14.489 15.477 16.424 17.310 18.067 18.579 18.743 18.562 18.173 17.802 17.646 17.757 18.020 18.228 + 9.669 10.002 10.328 10.291 9.854 9.318 9.012 8.994 9.042 8.952 8.800 8.890 9.418 10.197 10.760 10.776 10.391 10.157 10.582 11.706 13.083 14.190 14.871 15.403 16.153 17.165 18.089 18.490 18.259 17.703 17.270 17.178 17.291 17.342 17.224 17.075 + 10.992 10.690 10.120 9.407 8.783 8.468 8.509 8.727 8.863 8.813 8.725 8.846 9.253 9.749 10.036 10.038 10.046 10.506 11.615 13.093 14.361 15.001 15.092 15.118 15.535 16.371 17.220 17.615 17.432 16.964 16.633 16.628 16.805 16.900 16.814 16.684 + 12.745 11.850 10.638 9.809 9.659 9.922 10.068 9.801 9.290 8.973 9.128 9.612 9.989 9.928 9.512 9.192 9.440 10.392 11.766 13.096 14.060 14.648 15.078 15.570 16.183 16.803 17.263 17.463 17.413 17.203 16.946 16.741 16.644 16.661 16.743 16.813 + 10.817 10.384 9.857 9.607 9.708 9.884 9.790 9.355 8.875 8.744 9.077 9.565 9.717 9.306 8.616 8.278 8.795 10.144 11.781 13.052 13.664 13.861 14.172 14.948 16.078 17.080 17.483 17.179 16.473 15.823 15.493 15.407 15.281 14.920 14.400 14.013 + 11.636 11.084 10.233 9.429 8.912 8.696 8.611 8.462 8.182 7.861 7.642 7.571 7.566 7.504 7.386 7.386 7.745 8.567 9.699 10.821 11.685 12.293 12.862 13.585 14.394 14.962 14.949 14.303 13.348 12.554 12.186 12.119 11.983 11.522 10.839 10.325 + 13.331 13.388 13.577 13.966 14.520 15.062 15.340 15.181 14.615 13.874 13.240 12.857 12.649 12.442 12.168 11.983 12.150 12.788 13.689 14.413 14.602 14.268 13.778 13.531 13.606 13.673 13.295 12.336 11.139 10.276 10.089 10.413 10.736 10.642 10.168 9.731 + 13.933 13.904 14.050 14.604 15.598 16.754 17.585 17.695 17.053 16.040 15.192 14.822 14.821 14.819 14.572 14.240 14.270 14.978 16.185 17.275 17.658 17.245 16.509 16.039 15.991 15.946 15.326 14.007 12.539 11.736 11.953 12.729 13.131 12.553 11.261 10.203 + 13.202 13.379 13.749 14.372 15.320 16.545 17.758 18.489 18.376 17.458 16.207 15.213 14.766 14.710 14.701 14.618 14.712 15.335 16.495 17.705 18.316 18.064 17.293 16.632 16.408 16.355 15.940 14.978 13.931 13.540 14.085 14.992 15.223 14.181 12.316 10.860 + 12.376 12.827 13.553 14.389 15.334 16.452 17.627 18.467 18.537 17.751 16.531 15.524 15.107 15.135 15.187 15.074 15.074 15.650 16.889 18.249 18.924 18.517 17.401 16.383 15.979 15.998 15.830 15.167 14.406 14.286 15.060 16.043 16.058 14.483 11.959 10.047 + 12.206 12.718 13.404 13.967 14.479 15.294 16.587 18.005 18.833 18.570 17.385 16.005 15.131 14.931 15.063 15.160 15.260 15.719 16.724 17.934 18.662 18.457 17.511 16.464 15.807 15.472 15.050 14.394 13.944 14.351 15.695 17.111 17.311 15.679 12.973 10.914 + 12.303 12.568 12.929 13.293 13.816 14.773 16.180 17.586 18.296 17.908 16.668 15.310 14.504 14.393 14.635 14.859 15.059 15.536 16.468 17.580 18.282 18.155 17.320 16.303 15.542 15.050 14.560 14.005 13.762 14.325 15.671 16.986 17.143 15.648 13.210 11.366 + 11.659 11.978 12.443 12.940 13.576 14.574 15.934 17.248 17.900 17.537 16.391 15.135 14.371 14.223 14.383 14.522 14.659 15.098 16.022 17.177 17.981 17.987 17.241 16.202 15.311 14.659 14.085 13.560 13.399 13.993 15.272 16.480 16.617 15.258 13.058 11.399 + 12.037 12.225 12.560 13.065 13.862 15.030 16.374 17.389 17.546 16.707 15.299 14.051 13.464 13.496 13.714 13.776 13.773 14.098 14.993 16.205 17.119 17.238 16.568 15.547 14.616 13.883 13.203 12.544 12.216 12.627 13.772 14.999 15.376 14.450 12.725 11.377 + 12.166 12.293 12.563 13.043 13.830 14.907 15.993 16.591 16.284 15.068 13.429 12.027 11.239 10.954 10.798 10.574 10.487 10.939 12.068 13.516 14.659 15.089 14.906 14.515 14.169 13.723 12.878 11.674 10.687 10.635 11.699 13.198 14.018 13.503 12.046 10.817 + 9.519 9.725 10.220 11.067 12.176 13.244 13.854 13.686 12.731 11.330 9.993 9.104 8.712 8.578 8.428 8.205 8.120 8.450 9.288 10.437 11.551 12.376 12.855 13.042 12.935 12.441 11.537 10.463 9.705 9.697 10.459 11.500 12.129 11.963 11.231 10.587 + 8.540 7.846 6.904 6.367 6.729 8.004 9.661 10.888 11.073 10.173 8.732 7.499 6.931 6.958 7.150 7.153 6.992 7.015 7.542 8.542 9.624 10.317 10.395 9.966 9.312 8.653 8.074 7.625 7.418 7.577 8.062 8.585 8.751 8.372 7.657 7.096 + 5.468 5.587 5.823 6.264 7.089 8.371 9.825 10.818 10.755 9.559 7.812 6.349 5.633 5.459 5.275 4.828 4.493 4.929 6.374 8.246 9.501 9.459 8.375 7.204 6.784 7.172 7.726 7.813 7.429 7.135 7.398 8.022 8.270 7.590 6.231 5.132 + 5.997 5.636 5.259 5.334 6.134 7.502 8.875 9.589 9.288 8.159 6.794 5.771 5.280 5.084 4.848 4.531 4.479 5.115 6.489 8.107 9.219 9.350 8.621 7.608 6.873 6.587 6.549 6.517 6.502 6.711 7.234 7.815 7.988 7.489 6.561 5.832 + 4.990 5.234 5.623 6.073 6.594 7.219 7.851 8.205 7.972 7.095 5.902 4.927 4.554 4.769 5.254 5.719 6.150 6.751 7.635 8.598 9.217 9.222 8.786 8.443 8.684 9.567 10.683 11.486 11.693 11.409 10.920 10.394 9.796 9.054 8.276 7.756 + 5.389 5.504 5.620 5.705 5.951 6.622 7.710 8.752 9.071 8.310 6.798 5.400 4.912 5.498 6.637 7.602 8.030 8.099 8.217 8.563 8.938 9.037 8.836 8.695 9.051 10.007 11.200 12.067 12.271 11.891 11.260 10.646 10.092 9.528 8.975 8.610 + 4.553 4.626 4.802 5.175 5.871 6.924 8.127 9.029 9.152 8.323 6.842 5.341 4.414 4.283 4.751 5.435 6.060 6.567 7.006 7.362 7.519 7.387 7.029 6.645 6.417 6.365 6.372 6.343 6.331 6.476 6.814 7.155 7.197 6.786 6.107 5.590 + 4.789 4.511 4.143 4.014 4.459 5.611 7.233 8.743 9.481 9.094 7.770 6.137 4.897 4.442 4.707 5.335 5.966 6.434 6.749 6.965 7.071 7.014 6.784 6.455 6.142 5.933 5.866 5.969 6.281 6.795 7.372 7.743 7.647 7.046 6.218 5.628 + 4.554 4.685 4.915 5.271 5.871 6.806 7.938 8.852 9.070 8.393 7.093 5.748 4.860 4.569 4.694 5.027 5.550 6.363 7.418 8.362 8.715 8.251 7.218 6.183 5.603 5.520 5.658 5.786 5.980 6.489 7.350 8.154 8.287 7.460 6.074 5.017 + 7.661 7.813 8.148 8.636 9.131 9.431 9.438 9.270 9.177 9.340 9.694 9.974 9.955 9.682 9.485 9.723 10.483 11.457 12.142 12.192 11.667 10.980 10.607 10.780 11.388 12.125 12.734 13.147 13.452 13.740 13.991 14.083 13.907 13.482 12.982 12.647 + 7.722 7.667 7.844 8.507 9.554 10.531 10.981 10.824 10.417 10.235 10.462 10.868 11.068 10.917 10.665 10.732 11.310 12.160 12.792 12.852 12.396 11.821 11.544 11.714 12.183 12.700 13.131 13.505 13.894 14.273 14.506 14.451 14.085 13.531 13.000 12.680 + 5.608 5.584 5.662 5.969 6.495 7.075 7.509 7.716 7.776 7.831 7.944 8.044 8.014 7.833 7.636 7.629 7.917 8.400 8.827 8.975 8.803 8.477 8.248 8.290 8.621 9.141 9.738 10.356 10.980 11.569 12.015 12.181 11.992 11.516 10.964 10.599 + 7.347 7.841 8.558 9.151 9.426 9.440 9.387 9.411 9.491 9.494 9.320 9.004 8.690 8.516 8.514 8.607 8.689 8.703 8.654 8.569 8.466 8.354 8.274 8.313 8.570 9.105 9.900 10.863 11.860 12.736 13.331 13.515 13.247 12.638 11.949 11.497 + 9.306 10.259 11.583 12.540 12.738 12.310 11.683 11.185 10.846 10.522 10.137 9.791 9.629 9.644 9.658 9.505 9.234 9.106 9.351 9.925 10.502 10.738 10.572 10.286 10.273 10.717 11.461 12.168 12.596 12.744 12.764 12.772 12.756 12.645 12.451 12.293 + 11.826 12.573 13.633 14.470 14.798 14.669 14.263 13.660 12.826 11.804 10.847 10.275 10.191 10.341 10.332 10.034 9.772 10.070 11.150 12.633 13.763 13.978 13.323 12.360 11.671 11.449 11.526 11.745 12.218 13.154 14.418 15.334 15.071 13.366 10.951 9.201 + 12.382 12.807 13.570 14.497 15.332 15.793 15.664 14.921 13.788 12.663 11.907 11.619 11.582 11.453 11.065 10.617 10.555 11.204 12.453 13.760 14.496 14.374 13.619 12.745 12.162 11.944 11.934 12.022 12.299 12.900 13.708 14.254 13.995 12.786 11.135 9.955 + 12.697 12.878 13.318 14.059 14.975 15.751 16.027 15.612 14.635 13.477 12.534 11.964 11.629 11.276 10.815 10.455 10.557 11.310 12.503 13.601 14.100 13.869 13.217 12.625 12.386 12.448 12.586 12.684 12.864 13.298 13.911 14.288 13.936 12.730 11.145 10.025 + 12.753 12.733 12.896 13.483 14.523 15.702 16.464 16.342 15.310 13.861 12.700 12.250 12.356 12.477 12.219 11.744 11.666 12.467 13.956 15.290 15.600 14.713 13.307 12.352 12.306 12.801 13.094 12.852 12.504 12.773 13.839 14.931 14.854 13.055 10.292 8.231 + 12.592 12.603 12.706 13.064 13.830 14.963 16.094 16.652 16.246 15.014 13.588 12.646 12.404 12.523 12.536 12.384 12.517 13.404 14.910 16.194 16.317 15.074 13.258 12.044 12.020 12.733 13.199 12.902 12.310 12.391 13.539 14.976 15.284 13.677 10.876 8.708 + 12.574 12.433 12.379 12.727 13.648 14.978 16.209 16.749 16.301 15.095 13.743 12.813 12.458 12.427 12.434 12.518 13.009 14.104 15.459 16.273 15.889 14.404 12.703 11.796 12.007 12.741 13.078 12.667 12.079 12.242 13.448 14.884 15.198 13.684 11.053 9.024 + 12.757 12.520 12.371 12.725 13.755 15.196 16.434 16.863 16.275 14.999 13.667 12.780 12.431 12.395 12.475 12.743 13.398 14.383 15.176 15.072 13.807 11.958 10.656 10.741 12.025 13.378 13.642 12.644 11.393 11.216 12.535 14.369 15.068 13.727 11.060 8.942 + 12.511 12.102 11.706 11.820 12.605 13.750 14.703 15.056 14.767 14.084 13.286 12.520 11.851 11.424 11.488 12.192 13.326 14.278 14.367 13.351 11.707 10.390 10.196 11.170 12.544 13.282 12.849 11.619 10.590 10.616 11.739 13.135 13.744 13.079 11.617 10.448 + 9.919 9.954 10.095 10.428 10.991 11.749 12.598 13.386 13.921 14.002 13.511 12.536 11.441 10.759 10.908 11.892 13.202 14.062 13.889 12.690 11.082 9.914 9.713 10.365 11.228 11.620 11.300 10.610 10.187 10.453 11.289 12.107 12.282 11.616 10.505 9.671 + 9.187 8.854 8.402 8.112 8.158 8.528 9.082 9.644 10.044 10.126 9.778 9.038 8.172 7.617 7.740 8.563 9.684 10.502 10.606 10.048 9.279 8.811 8.876 9.340 9.913 10.429 10.956 11.667 12.617 13.653 14.525 15.072 15.321 15.413 15.465 15.503 + 8.999 8.733 8.361 8.071 7.940 7.914 7.909 7.920 8.014 8.228 8.483 8.625 8.574 8.420 8.372 8.575 8.969 9.315 9.395 9.189 8.891 8.761 8.937 9.387 10.006 10.743 11.624 12.657 13.745 14.717 15.463 16.033 16.593 17.249 17.916 18.353 + 8.533 8.090 7.554 7.318 7.484 7.816 7.999 7.950 7.867 7.988 8.301 8.507 8.303 7.699 7.081 6.912 7.335 8.034 8.484 8.379 7.884 7.501 7.679 8.495 9.654 10.761 11.618 12.313 13.063 14.004 15.076 16.096 16.891 17.398 17.660 17.762 + 6.927 7.087 7.480 8.097 8.733 9.059 8.873 8.303 7.744 7.559 7.786 8.113 8.157 7.815 7.366 7.236 7.625 8.317 8.848 8.887 8.509 8.128 8.172 8.758 9.642 10.466 11.071 11.618 12.430 13.686 15.227 16.629 17.475 17.633 17.341 17.031 + 7.131 7.529 8.009 8.240 8.179 8.080 8.205 8.532 8.752 8.559 7.952 7.257 6.841 6.819 7.019 7.214 7.378 7.673 8.220 8.884 9.345 9.392 9.156 9.024 9.311 9.990 10.765 11.402 11.983 12.820 14.084 15.537 16.653 17.043 16.809 16.459 + 6.375 6.135 5.967 6.207 6.883 7.648 8.027 7.786 7.113 6.465 6.228 6.456 6.883 7.185 7.225 7.128 7.124 7.342 7.721 8.086 8.298 8.348 8.328 8.348 8.471 8.723 9.130 9.735 10.553 11.531 12.531 13.384 13.972 14.278 14.379 14.388 + 3.332 4.347 6.000 7.702 8.898 9.285 8.909 8.108 7.325 6.890 6.873 7.080 7.203 7.041 6.642 6.272 6.216 6.552 7.068 7.412 7.354 6.975 6.609 6.592 7.007 7.642 8.189 8.515 8.763 9.198 9.935 10.795 11.430 11.609 11.413 11.170 + 3.828 5.349 7.417 8.811 8.929 8.111 7.224 6.923 7.210 7.598 7.636 7.302 6.937 6.876 7.148 7.500 7.671 7.610 7.462 7.375 7.366 7.363 7.345 7.403 7.644 8.077 8.599 9.123 9.669 10.314 11.008 11.483 11.406 10.682 9.637 8.876 + 3.985 5.757 8.132 9.670 9.699 8.689 7.707 7.493 7.956 8.435 8.392 7.876 7.391 7.368 7.775 8.214 8.335 8.153 7.971 8.045 8.340 8.610 8.696 8.715 8.962 9.637 10.658 11.741 12.616 13.175 13.433 13.395 13.022 12.341 11.564 11.039 + 7.009 7.605 8.409 8.935 8.937 8.556 8.162 8.043 8.191 8.349 8.250 7.847 7.352 7.066 7.155 7.547 8.022 8.390 8.625 8.856 9.247 9.874 10.688 11.569 12.419 13.210 13.966 14.705 15.381 15.880 16.065 15.848 15.255 14.447 13.680 13.214 + 8.242 8.984 10.001 10.728 10.939 10.847 10.838 11.092 11.443 11.570 11.329 10.881 10.531 10.446 10.534 10.580 10.493 10.405 10.534 10.968 11.584 12.179 12.679 13.199 13.910 14.836 15.797 16.540 16.933 17.029 16.961 16.791 16.478 15.994 15.450 15.080 + 8.272 9.014 10.147 11.200 11.863 12.113 12.131 12.109 12.125 12.156 12.158 12.117 12.031 11.883 11.665 11.431 11.307 11.415 11.752 12.175 12.514 12.739 13.016 13.571 14.473 15.515 16.346 16.719 16.668 16.442 16.257 16.118 15.850 15.333 14.686 14.225 + 12.701 12.748 12.953 13.363 13.811 13.973 13.611 12.790 11.855 11.164 10.812 10.605 10.303 9.901 9.681 9.965 10.778 11.746 12.341 12.294 11.822 11.475 11.715 12.562 13.578 14.199 14.136 13.549 12.881 12.516 12.518 12.645 12.574 12.174 11.603 11.188 + 13.028 13.363 13.980 14.705 15.220 15.205 14.556 13.503 12.481 11.823 11.539 11.361 11.046 10.647 10.503 10.937 11.928 13.051 13.763 13.804 13.363 12.874 12.614 12.469 12.065 11.163 9.972 9.085 9.073 10.013 11.346 12.172 11.823 10.309 8.361 7.019 + 13.359 13.438 13.706 14.199 14.707 14.849 14.359 13.334 12.206 11.426 11.124 11.060 10.895 10.556 10.341 10.677 11.711 13.117 14.279 14.697 14.298 13.400 12.403 11.507 10.679 9.886 9.310 9.321 10.171 11.658 13.066 13.495 12.403 10.018 7.311 5.529 + 13.155 13.071 13.168 13.617 14.175 14.278 13.520 12.067 10.595 9.763 9.693 9.938 9.965 9.697 9.598 10.210 11.574 13.091 13.959 13.809 12.974 12.164 11.854 11.941 11.937 11.495 10.763 10.265 10.424 11.158 11.895 11.955 11.021 9.337 7.568 6.451 + 11.403 11.360 11.511 11.978 12.458 12.359 11.312 9.576 7.915 7.003 6.902 7.088 7.018 6.691 6.663 7.494 9.141 10.886 11.882 11.821 11.130 10.528 10.387 10.468 10.250 9.509 8.570 8.035 8.242 8.961 9.576 9.562 8.833 7.721 6.693 6.099 + 10.324 9.662 8.809 8.241 7.993 7.694 7.039 6.184 5.622 5.641 5.947 5.879 5.090 4.002 3.550 4.361 6.123 7.760 8.303 7.688 6.761 6.488 7.115 8.012 8.330 7.805 6.962 6.585 6.975 7.715 8.111 7.830 7.141 6.564 6.364 6.393 + 10.131 10.200 10.020 9.244 7.832 6.181 4.901 4.417 4.661 5.125 5.229 4.750 3.977 3.490 3.715 4.613 5.730 6.550 6.871 6.898 7.012 7.416 7.973 8.345 8.307 7.936 7.539 7.388 7.503 7.681 7.709 7.562 7.404 7.406 7.573 7.739 + 9.835 9.662 9.343 8.912 8.410 7.890 7.433 7.119 6.971 6.907 6.773 6.467 6.054 5.775 5.896 6.499 7.374 8.125 8.426 8.255 7.905 7.783 8.111 8.784 9.454 9.783 9.661 9.247 8.817 8.555 8.443 8.317 8.016 7.519 6.979 6.626 + 11.902 11.929 12.122 12.571 13.138 13.474 13.270 12.514 11.545 10.817 10.565 10.658 10.765 10.694 10.601 10.872 11.752 13.059 14.230 14.708 14.360 13.585 13.004 12.977 13.348 13.629 13.462 12.957 12.603 12.811 13.469 13.922 13.443 11.851 9.776 8.318 + 12.843 12.492 12.312 12.835 14.051 15.322 15.848 15.295 14.036 12.816 12.157 12.020 11.993 11.789 11.562 11.763 12.672 14.052 15.260 15.720 15.354 14.593 13.979 13.717 13.560 13.115 12.286 11.450 11.190 11.810 13.006 14.007 14.083 13.073 11.540 10.423 + 12.906 12.458 12.174 12.714 14.138 15.758 16.607 16.162 14.721 13.138 12.158 11.925 12.030 12.019 11.862 11.964 12.732 14.098 15.458 16.109 15.797 14.910 14.121 13.806 13.732 13.324 12.267 10.923 10.147 10.608 12.159 13.810 14.397 13.453 11.606 10.165 + 12.889 12.565 12.426 13.020 14.404 15.986 16.905 16.639 15.374 13.837 12.750 12.355 12.371 12.376 12.250 12.277 12.840 13.986 15.283 16.102 16.108 15.502 14.815 14.421 14.217 13.763 12.781 11.552 10.811 11.158 12.481 13.887 14.303 13.292 11.454 10.037 + 13.136 12.793 12.617 13.154 14.450 15.916 16.719 16.388 15.142 13.687 12.681 12.304 12.264 12.182 11.977 11.932 12.397 13.430 14.687 15.656 16.024 15.848 15.422 14.976 14.501 13.854 13.014 12.247 11.969 12.407 13.328 14.110 14.139 13.255 11.923 10.950 + 13.142 12.824 12.669 13.178 14.359 15.630 16.225 15.766 14.523 13.164 12.247 11.865 11.732 11.547 11.301 11.267 11.722 12.686 13.892 14.972 15.669 15.894 15.653 14.973 13.940 12.791 11.910 11.666 12.163 13.114 13.955 14.148 13.479 12.174 10.778 9.889 + 13.023 12.753 12.650 13.158 14.257 15.384 15.820 15.234 13.922 12.557 11.681 11.371 11.324 11.225 11.057 11.083 11.568 12.503 13.599 14.506 15.045 15.249 15.206 14.904 14.253 13.267 12.211 11.543 11.630 12.447 13.508 14.116 13.784 12.554 11.011 9.958 + 12.706 12.569 12.621 13.173 14.155 15.069 15.315 14.645 13.351 12.049 11.234 10.983 11.009 10.985 10.840 10.785 11.094 11.854 12.900 13.947 14.771 15.268 15.376 15.004 14.089 12.758 11.427 10.674 10.910 12.049 13.453 14.241 13.801 12.199 10.191 8.820 + 12.369 12.460 12.765 13.358 14.094 14.617 14.569 13.849 12.707 11.589 10.861 10.596 10.607 10.644 10.612 10.630 10.917 11.622 12.707 13.960 15.073 15.736 15.705 14.879 13.382 11.616 10.182 9.653 10.269 11.741 13.324 14.165 13.755 12.234 10.352 9.077 + 12.292 12.822 13.623 14.322 14.613 14.377 13.692 12.759 11.802 11.011 10.496 10.267 10.254 10.357 10.540 10.863 11.437 12.306 13.348 14.296 14.869 14.902 14.391 13.421 12.105 10.616 9.285 8.607 9.026 10.579 12.674 14.276 14.483 13.149 11.071 9.547 + 12.400 13.193 14.256 14.917 14.805 14.045 13.077 12.292 11.787 11.421 11.061 10.774 10.776 11.197 11.894 12.489 12.622 12.232 11.615 11.227 11.350 11.877 12.348 12.234 11.286 9.732 8.212 7.461 7.905 9.392 11.219 12.473 12.525 11.397 9.774 8.620 + 12.537 12.927 13.531 14.049 14.168 13.720 12.803 11.773 11.068 10.959 11.379 11.970 12.306 12.155 11.576 10.825 10.149 9.657 9.340 9.186 9.240 9.530 9.929 10.117 9.744 8.724 7.417 6.521 6.673 7.989 9.901 11.428 11.757 10.770 9.143 7.940 + 12.058 12.405 12.967 13.490 13.669 13.312 12.503 11.613 11.097 11.182 11.681 12.107 12.003 11.258 10.149 9.107 8.408 8.049 7.881 7.836 8.005 8.491 9.170 9.642 9.460 8.508 7.201 6.317 6.516 7.873 9.774 11.247 11.548 10.617 9.113 8.010 + 11.872 12.405 13.178 13.762 13.819 13.300 12.470 11.759 11.488 11.665 11.984 12.035 11.579 10.686 9.655 8.787 8.215 7.903 7.790 7.904 8.320 8.993 9.642 9.836 9.283 8.110 6.890 6.360 6.962 8.538 10.367 11.560 11.560 10.452 8.917 7.843 + 11.660 12.322 13.325 14.173 14.443 14.014 13.153 12.360 12.054 12.288 12.711 12.811 12.275 11.192 9.956 8.974 8.420 8.227 8.269 8.522 9.035 9.741 10.333 10.385 9.674 8.444 7.361 7.129 8.033 9.716 11.368 12.190 11.827 10.528 8.985 7.968 + 11.917 12.425 13.302 14.258 14.918 14.980 14.417 13.543 12.848 12.689 13.037 13.491 13.548 12.933 11.748 10.381 9.251 8.623 8.561 8.991 9.745 10.550 11.032 10.847 9.896 8.497 7.320 7.052 7.983 9.776 11.599 12.560 12.188 10.695 8.860 7.627 + 12.801 12.951 13.368 14.101 14.952 15.513 15.431 14.690 13.683 12.966 12.875 13.299 13.764 13.765 13.100 11.970 10.827 10.094 9.964 10.361 11.030 11.645 11.902 11.610 10.774 9.662 8.753 8.538 9.243 10.644 12.110 12.908 12.599 11.310 9.695 8.597 + 13.001 12.747 12.663 13.203 14.389 15.697 16.393 16.061 14.926 13.703 13.103 13.364 14.127 14.721 14.611 13.710 12.373 11.157 10.511 10.587 11.207 11.972 12.432 12.275 11.472 10.318 9.323 8.967 9.440 10.517 11.648 12.244 11.986 11.000 9.790 8.976 + 12.468 12.322 12.361 12.951 14.134 15.507 16.439 16.479 15.662 14.493 13.641 13.534 14.128 14.965 15.453 15.203 14.226 12.916 11.830 11.388 11.649 12.279 12.744 12.622 11.857 10.795 9.968 9.768 10.219 10.990 11.609 11.744 11.349 10.638 9.928 9.498 + 12.608 12.341 12.165 12.534 13.644 15.231 16.656 17.253 16.730 15.373 13.922 13.160 13.465 14.567 15.707 16.084 15.346 13.816 12.295 11.558 11.869 12.828 13.649 13.685 12.837 11.569 10.566 10.265 10.613 11.177 11.492 11.358 10.898 10.383 10.014 9.842 + 12.487 12.337 12.264 12.573 13.442 14.752 16.077 16.858 16.700 15.631 14.166 13.080 12.984 13.937 15.360 16.341 16.199 14.937 13.268 12.162 12.204 13.208 14.357 14.780 14.136 12.807 11.565 11.008 11.179 11.636 11.844 11.568 10.957 10.336 9.929 9.757 + 12.072 11.889 11.797 12.140 13.066 14.401 15.731 16.611 16.775 16.234 15.259 14.286 13.751 13.897 14.621 15.469 15.861 15.445 14.372 13.250 12.758 13.172 14.142 14.921 14.876 13.927 12.581 11.554 11.277 11.642 12.140 12.237 11.706 10.714 9.680 9.033 + 12.242 12.054 11.963 12.309 13.209 14.449 15.618 16.333 16.413 15.899 15.002 14.041 13.388 13.349 13.987 14.987 15.747 15.714 14.785 13.448 12.501 12.515 13.416 14.531 15.067 14.680 13.696 12.834 12.662 13.179 13.826 13.886 12.962 11.237 9.380 8.188 + 12.293 11.966 11.724 12.042 13.054 14.426 15.591 16.115 15.916 15.207 14.307 13.497 13.015 13.051 13.645 14.555 15.255 15.214 14.293 12.937 11.946 11.928 12.836 13.983 14.534 14.115 13.068 12.163 12.007 12.605 13.377 13.576 12.794 11.210 9.475 8.357 + 12.006 11.544 11.197 11.610 12.924 14.623 15.903 16.228 15.614 14.489 13.343 12.502 12.146 12.390 13.230 14.373 15.207 15.104 13.905 12.183 10.955 10.976 12.163 13.615 14.276 13.717 12.439 11.453 11.500 12.501 13.635 13.931 12.907 10.848 8.620 7.196 + 11.466 11.277 11.315 11.986 13.234 14.480 15.028 14.561 13.334 11.934 10.886 10.431 10.591 11.307 12.433 13.607 14.256 13.885 12.523 10.881 9.981 10.436 11.944 13.448 13.907 13.074 11.683 10.875 11.332 12.773 14.166 14.435 13.147 10.729 8.190 6.593 + 10.880 11.109 11.550 12.106 12.567 12.691 12.354 11.643 10.803 10.083 9.623 9.466 9.640 10.165 10.953 11.702 11.971 11.471 10.358 9.247 8.843 9.427 10.601 11.546 11.615 10.824 9.842 9.488 10.121 11.379 12.439 12.567 11.554 9.788 7.999 6.896 + 11.287 11.464 11.860 12.437 12.978 13.170 12.821 12.026 11.115 10.419 10.075 10.021 10.172 10.544 11.187 11.983 12.559 12.480 11.615 10.354 9.427 9.400 10.238 11.308 11.850 11.555 10.803 10.356 10.762 11.909 13.064 13.348 12.307 10.208 7.912 6.432 + 11.868 11.749 11.829 12.389 13.311 14.086 14.199 13.538 12.457 11.463 10.846 10.589 10.585 10.869 11.563 12.585 13.473 13.603 12.703 11.213 10.082 10.097 11.265 12.773 13.605 13.319 12.356 11.657 11.894 12.952 14.019 14.168 12.985 10.808 8.516 7.070 + 12.078 11.806 11.747 12.371 13.613 14.828 15.275 14.688 13.437 12.169 11.318 10.925 10.860 11.126 11.857 13.017 14.142 14.527 13.775 12.241 10.905 10.676 11.679 13.142 13.991 13.696 12.666 11.888 12.123 13.301 14.568 14.895 13.769 11.506 9.055 7.488 + 12.214 11.822 11.635 12.258 13.667 15.141 15.805 15.305 14.006 12.614 11.620 11.093 10.917 11.124 11.892 13.195 14.523 15.085 14.417 12.872 11.478 11.186 12.126 13.497 14.228 13.838 12.796 12.086 12.385 13.525 14.640 14.817 13.710 11.706 9.646 8.367 + 12.141 11.959 12.015 12.708 13.961 15.189 15.723 15.300 14.200 12.943 11.899 11.174 10.801 10.937 11.769 13.185 14.608 15.270 14.789 13.550 12.487 12.376 13.214 14.238 14.560 13.900 12.791 12.100 12.306 13.137 13.818 13.679 12.592 10.976 9.467 8.583 + 12.296 12.346 12.610 13.226 14.111 14.930 15.281 14.946 14.016 12.822 11.755 11.113 11.046 11.567 12.548 13.722 14.724 15.244 15.195 14.759 14.254 13.884 13.593 13.140 12.366 11.406 10.662 10.531 11.093 12.007 12.694 12.680 11.860 10.526 9.200 8.387 + 12.193 12.384 12.770 13.341 14.026 14.655 14.964 14.720 13.892 12.757 11.794 11.429 11.779 12.614 13.562 14.371 14.999 15.470 15.675 15.347 14.284 12.617 10.844 9.534 8.942 8.866 8.893 8.803 8.753 9.051 9.724 10.327 10.228 9.167 7.592 6.431 + 11.871 12.139 12.649 13.329 14.038 14.551 14.618 14.090 13.066 11.919 11.134 11.040 11.619 12.550 13.461 14.160 14.653 14.946 14.863 14.112 12.581 10.590 8.808 7.824 7.714 7.996 8.062 7.720 7.353 7.527 8.375 9.335 9.542 8.568 6.887 5.595 + 11.496 11.742 12.281 13.090 13.962 14.536 14.486 13.744 12.594 11.533 10.995 11.122 11.748 12.567 13.338 13.953 14.345 14.362 13.785 12.506 10.730 8.969 7.774 7.367 7.485 7.578 7.255 6.607 6.140 6.335 7.188 8.132 8.429 7.760 6.519 5.556 + 11.572 11.765 12.251 13.054 13.956 14.533 14.412 13.562 12.384 11.482 11.283 11.777 12.577 13.228 13.509 13.496 13.353 13.079 12.454 11.264 9.587 7.877 6.714 6.399 6.721 7.108 7.065 6.555 5.996 5.879 6.318 6.916 7.070 6.484 5.448 4.648 + 11.697 11.961 12.531 13.370 14.242 14.767 14.642 13.889 12.912 12.272 12.322 12.962 13.716 14.084 13.896 13.385 12.933 12.693 12.433 11.740 10.422 8.759 7.354 6.692 6.754 7.046 7.005 6.471 5.800 5.535 5.895 6.552 6.887 6.523 5.667 4.963 + 11.667 11.856 12.339 13.147 14.057 14.627 14.481 13.625 12.531 11.872 12.052 12.902 13.786 14.061 13.544 12.626 11.922 11.753 11.872 11.683 10.756 9.220 7.691 6.789 6.659 6.897 6.942 6.583 6.124 6.072 6.618 7.398 7.758 7.318 6.335 5.536 + 10.119 10.431 11.131 12.199 13.356 14.099 13.994 13.024 11.714 10.864 11.019 12.051 13.212 13.649 13.037 11.828 10.886 10.785 11.326 11.691 11.113 9.527 7.654 6.435 6.298 6.867 7.344 7.214 6.652 6.283 6.556 7.300 7.877 7.778 7.103 6.477 + 10.784 11.246 12.084 13.117 14.079 14.649 14.573 13.832 12.769 11.985 11.999 12.853 13.989 14.582 14.139 12.911 11.728 11.347 11.822 12.436 12.291 11.060 9.257 7.788 7.188 7.223 7.207 6.729 6.077 5.967 6.814 8.244 9.342 9.423 8.645 7.864 + 11.191 11.599 12.282 13.052 13.736 14.177 14.214 13.748 12.892 12.049 11.742 12.244 13.278 14.114 14.074 13.078 11.755 10.975 11.143 11.854 12.214 11.569 10.026 8.336 7.270 7.042 7.277 7.471 7.480 7.575 8.057 8.858 9.545 9.715 9.396 9.024 + 9.816 10.483 11.506 12.509 13.269 13.729 13.827 13.430 12.518 11.423 10.797 11.177 12.457 13.804 14.210 13.294 11.668 10.478 10.470 11.364 12.095 11.715 10.178 8.332 7.168 7.023 7.431 7.673 7.474 7.172 7.279 7.910 8.670 9.055 8.954 8.708 + 10.240 11.019 12.165 13.209 13.957 14.472 14.757 14.581 13.705 12.321 11.179 11.115 12.315 13.996 14.929 14.410 12.871 11.527 11.339 12.204 13.068 12.878 11.480 9.687 8.501 8.247 8.416 8.285 7.670 7.067 7.094 7.831 8.721 9.119 8.905 8.542 + 11.510 11.960 12.676 13.437 14.118 14.661 14.941 14.731 13.881 12.578 11.401 11.001 11.622 12.846 13.841 13.961 13.225 12.276 11.839 12.147 12.785 13.065 12.585 11.510 10.363 9.590 9.263 9.145 8.989 8.755 8.575 8.568 8.702 8.849 8.918 8.925 + 11.769 12.040 12.577 13.319 14.105 14.683 14.796 14.311 13.328 12.167 11.255 10.926 11.270 12.090 13.001 13.614 13.711 13.320 12.672 12.075 11.763 11.790 12.018 12.191 12.069 11.563 10.796 10.046 9.596 9.560 9.809 10.044 9.989 9.574 8.992 8.576 + 11.862 11.817 12.047 12.820 13.976 14.932 15.088 14.286 12.920 11.629 10.858 10.677 10.927 11.478 12.286 13.229 13.970 14.087 13.424 12.334 11.513 11.491 12.191 12.963 13.087 12.360 11.253 10.536 10.671 11.473 12.277 12.426 11.698 10.379 9.036 8.211 + 11.953 11.917 12.152 12.908 14.015 14.911 15.049 14.321 13.124 12.018 11.328 11.035 11.015 11.285 11.974 13.032 14.029 14.350 13.689 12.403 11.345 11.233 12.074 13.144 13.567 13.020 11.984 11.328 11.612 12.658 13.700 13.952 13.118 11.521 9.859 8.824 + 12.381 12.201 12.148 12.493 13.136 13.637 13.591 12.984 12.175 11.542 11.170 10.896 10.642 10.633 11.208 12.368 13.544 13.911 13.073 11.504 10.288 10.301 11.503 12.958 13.582 13.000 11.802 11.018 11.275 12.352 13.413 13.673 12.909 11.504 10.105 9.263 + 10.984 11.261 11.745 12.257 12.541 12.394 11.832 11.116 10.569 10.312 10.177 9.893 9.407 9.019 9.165 10.000 11.155 11.920 11.764 10.754 9.538 8.869 9.073 9.873 10.691 11.145 11.317 11.602 12.303 13.333 14.256 14.605 14.199 13.244 12.200 11.536 + 8.939 9.256 9.783 10.299 10.506 10.190 9.392 8.434 7.730 7.498 7.605 7.713 7.605 7.418 7.543 8.264 9.430 10.482 10.828 10.301 9.299 8.507 8.410 8.986 9.805 10.443 10.827 11.270 12.159 13.578 15.160 16.294 16.520 15.847 14.770 13.986 + 8.545 8.803 9.274 9.797 10.072 9.815 8.989 7.906 7.052 6.731 6.842 6.993 6.876 6.570 6.490 6.993 8.000 8.973 9.314 8.850 8.003 7.485 7.772 8.771 9.960 10.839 11.325 11.772 12.628 14.022 15.608 16.783 17.090 16.528 15.563 14.851 + 8.028 8.285 8.740 9.255 9.611 9.598 9.140 8.369 7.574 7.031 6.841 6.900 7.019 7.099 7.204 7.468 7.932 8.440 8.727 8.627 8.235 7.881 7.920 8.490 9.443 10.480 11.404 12.259 13.249 14.496 15.843 16.893 17.260 16.875 16.087 15.477 + 9.526 9.561 9.569 9.489 9.327 9.171 9.132 9.241 9.397 9.409 9.125 8.568 7.966 7.652 7.862 8.568 9.449 10.056 10.065 9.481 8.644 8.046 8.046 8.695 9.750 10.885 11.910 12.870 13.922 15.118 16.265 16.987 16.980 16.265 15.249 14.526 + 9.639 9.110 8.621 8.741 9.449 10.115 10.080 9.270 8.264 7.758 7.927 8.319 8.355 7.946 7.610 7.966 9.075 10.285 10.730 10.066 8.775 7.790 7.785 8.741 10.119 11.399 12.462 13.514 14.709 15.864 16.557 16.464 15.626 14.420 13.325 12.695 + 10.397 9.641 8.810 8.633 9.222 9.979 10.161 9.537 8.549 7.838 7.636 7.622 7.348 6.799 6.494 7.002 8.325 9.758 10.394 9.856 8.609 7.605 7.578 8.574 10.056 11.390 12.253 12.659 12.722 12.465 11.868 11.037 10.244 9.751 9.607 9.634 + 10.821 10.484 10.073 9.877 9.972 10.193 10.322 10.283 10.147 9.962 9.628 8.991 8.090 7.277 7.031 7.559 8.540 9.285 9.238 8.410 7.388 6.880 7.175 7.954 8.577 8.600 8.082 7.469 7.206 7.409 7.851 8.195 8.246 8.041 7.753 7.560 + 12.244 12.234 12.053 11.525 10.639 9.623 8.829 8.510 8.632 8.885 8.886 8.460 7.785 7.281 7.327 7.982 8.935 9.696 9.906 9.539 8.865 8.235 7.852 7.696 7.615 7.480 7.276 7.077 6.963 6.968 7.091 7.330 7.689 8.134 8.562 8.830 + 12.811 12.915 12.803 12.175 11.103 10.046 9.490 9.541 9.837 9.870 9.420 8.727 8.266 8.338 8.838 9.387 9.655 9.591 9.380 9.215 9.133 9.037 8.837 8.542 8.221 7.892 7.515 7.085 6.721 6.628 6.927 7.521 8.132 8.505 8.594 8.553 + 13.415 13.268 12.807 11.948 10.910 10.130 9.917 10.148 10.330 10.007 9.174 8.319 8.035 8.534 9.476 10.248 10.441 10.122 9.690 9.500 9.583 9.691 9.565 9.166 8.670 8.287 8.097 8.054 8.093 8.219 8.466 8.805 9.120 9.295 9.313 9.271 + 13.716 13.547 13.130 12.439 11.613 10.912 10.518 10.376 10.237 9.877 9.323 8.850 8.772 9.173 9.840 10.433 10.752 10.857 10.963 11.208 11.513 11.647 11.410 10.789 9.948 9.109 8.430 7.984 7.793 7.860 8.148 8.550 8.912 9.119 9.166 9.144 + 13.444 13.343 12.991 12.281 11.327 10.430 9.830 9.512 9.238 8.811 8.307 8.047 8.302 9.017 9.802 10.229 10.174 9.907 9.857 10.260 10.979 11.614 11.790 11.363 10.446 9.309 8.280 7.690 7.800 8.652 9.942 11.074 11.467 10.945 9.907 9.098 + 13.265 13.033 12.625 12.114 11.543 10.917 10.248 9.586 9.033 8.694 8.622 8.781 9.067 9.347 9.514 9.520 9.404 9.284 9.328 9.664 10.276 10.942 11.300 11.027 10.056 8.682 7.459 6.936 7.361 8.542 9.946 10.976 11.275 10.883 10.180 9.661 + 13.249 12.902 12.444 12.158 12.144 12.249 12.196 11.796 11.098 10.347 9.833 9.727 10.004 10.469 10.847 10.906 10.575 10.014 9.563 9.553 10.060 10.784 11.181 10.820 9.706 8.344 7.434 7.424 8.233 9.354 10.230 10.602 10.585 10.456 10.398 10.407 + 12.912 12.658 12.462 12.661 13.291 14.007 14.318 13.929 12.954 11.818 10.993 10.745 11.040 11.616 12.118 12.240 11.859 11.119 10.413 10.180 10.596 11.371 11.853 11.453 10.102 8.391 7.229 7.255 8.417 10.036 11.284 11.691 11.337 10.644 10.024 9.691 + 13.430 13.170 12.961 13.131 13.709 14.349 14.580 14.147 13.176 12.068 11.247 10.953 11.203 11.833 12.545 12.974 12.821 12.052 11.016 10.303 10.340 11.019 11.676 11.532 10.312 8.540 7.246 7.268 8.669 10.714 12.382 13.012 12.600 11.635 10.691 10.145 + 13.512 13.280 13.125 13.349 13.921 14.458 14.526 13.972 13.004 11.996 11.234 10.854 10.920 11.463 12.364 13.232 13.516 12.912 11.718 10.757 10.771 11.745 12.777 12.718 11.128 8.746 7.024 7.065 8.806 11.110 12.654 12.846 12.054 11.085 10.483 10.275 + 13.266 13.274 13.381 13.653 14.019 14.278 14.231 13.805 13.086 12.252 11.509 11.063 11.102 11.694 12.654 13.522 13.784 13.245 12.259 11.543 11.645 12.446 13.162 12.908 11.429 9.400 8.001 8.085 9.571 11.535 12.897 13.124 12.441 11.473 10.731 10.377 + 12.905 13.021 13.278 13.658 14.036 14.223 14.068 13.548 12.774 11.925 11.195 10.777 10.841 11.437 12.373 13.198 13.424 12.870 11.877 11.144 11.213 12.008 12.793 12.688 11.362 9.362 7.795 7.573 8.791 10.710 12.288 12.855 12.412 11.447 10.522 9.995 + 12.528 12.857 13.386 13.907 14.218 14.203 13.864 13.289 12.581 11.830 11.148 10.720 10.760 11.367 12.352 13.242 13.528 13.030 12.092 11.392 11.440 12.143 12.794 12.567 11.159 9.095 7.430 7.061 8.139 10.012 11.687 12.440 12.157 11.236 10.249 9.646 + 12.422 12.889 13.608 14.250 14.532 14.338 13.745 12.942 12.110 11.365 10.798 10.539 10.748 11.480 12.532 13.443 13.737 13.269 12.396 11.771 11.860 12.537 13.107 12.799 11.371 9.369 7.798 7.456 8.415 10.022 11.373 11.887 11.555 10.778 10.025 9.594 + 12.171 12.674 13.484 14.258 14.641 14.436 13.728 12.827 12.058 11.562 11.288 11.173 11.306 11.858 12.816 13.788 14.168 13.612 12.424 11.440 11.392 12.257 13.172 13.080 11.618 9.498 8.014 8.056 9.442 11.110 11.975 11.716 10.854 10.152 9.948 10.021 + 13.127 13.348 13.690 13.978 14.018 13.707 13.099 12.386 11.774 11.360 11.124 11.038 11.165 11.613 12.361 13.127 13.476 13.135 12.282 11.489 11.313 11.815 12.437 12.389 11.287 9.521 8.049 7.739 8.760 10.485 11.933 12.393 11.780 10.544 9.313 8.577 + 13.149 13.264 13.397 13.407 13.205 12.807 12.323 11.875 11.502 11.160 10.811 10.547 10.581 11.082 11.956 12.787 13.067 12.574 11.602 10.802 10.704 11.276 11.908 11.867 10.893 9.445 8.391 8.373 9.349 10.666 11.560 11.674 11.191 10.562 10.118 9.927 + 12.378 12.140 11.842 11.691 11.753 11.902 11.926 11.677 11.172 10.571 10.094 9.937 10.202 10.840 11.613 12.147 12.114 11.465 10.540 9.893 9.910 10.486 11.042 10.933 9.955 8.562 7.581 7.640 8.729 10.221 11.320 11.565 11.028 10.139 9.344 8.906 + 9.226 9.645 10.341 11.082 11.637 11.863 11.741 11.342 10.761 10.088 9.443 9.028 9.078 9.702 10.702 11.584 11.827 11.264 10.281 9.590 9.702 10.494 11.237 11.136 9.975 8.356 7.311 7.569 9.035 10.877 12.113 12.232 11.404 10.210 9.201 8.662 + 10.004 10.047 10.197 10.490 10.866 11.192 11.353 11.317 11.095 10.680 10.067 9.370 8.892 8.992 9.799 10.996 11.954 12.163 11.652 10.988 10.800 11.205 11.654 11.379 10.099 8.368 7.228 7.428 8.837 10.546 11.552 11.441 10.545 9.532 8.859 8.583 + 10.458 10.591 10.900 11.384 11.927 12.346 12.520 12.460 12.257 11.964 11.571 11.107 10.750 10.772 11.310 12.152 12.806 12.863 12.360 11.793 11.706 12.166 12.623 12.340 11.056 9.329 8.200 8.430 9.907 11.716 12.794 12.633 11.499 10.082 8.975 8.416 + 9.683 9.837 10.284 11.101 12.124 12.998 13.427 13.373 13.027 12.588 12.111 11.585 11.128 11.028 11.526 12.506 13.467 13.870 13.603 13.101 12.947 13.283 13.581 13.067 11.470 9.426 8.119 8.400 10.107 12.154 13.322 13.076 11.786 10.276 9.177 8.664 + 11.517 10.973 10.561 10.996 12.344 13.932 14.894 14.843 14.061 13.119 12.366 11.797 11.346 11.177 11.605 12.686 13.965 14.744 14.673 14.099 13.749 14.005 14.449 14.191 12.735 10.594 9.028 9.072 10.673 12.704 13.825 13.451 12.023 10.466 9.431 8.999 + 11.666 10.937 10.337 10.790 12.431 14.452 15.760 15.816 14.921 13.784 12.877 12.201 11.602 11.178 11.294 12.166 13.502 14.642 15.113 15.041 14.967 15.217 15.471 15.010 13.479 11.406 9.925 9.873 11.066 12.420 12.846 12.099 10.855 10.001 9.852 10.027 + 13.259 12.637 12.027 12.140 13.152 14.570 15.648 15.945 15.531 14.743 13.833 12.872 11.950 11.358 11.458 12.339 13.633 14.747 15.336 15.560 15.817 16.217 16.339 15.579 13.827 11.797 10.607 10.906 12.300 13.632 13.900 13.018 11.769 11.037 11.055 11.345 + 13.584 12.746 11.806 11.633 12.533 14.035 15.286 15.683 15.216 14.307 13.397 12.679 12.155 11.853 11.900 12.391 13.216 14.097 14.803 15.320 15.769 16.147 16.183 15.536 14.178 12.607 11.588 11.601 12.435 13.313 13.462 12.659 11.306 10.041 9.250 8.929 + 13.534 12.595 11.437 10.962 11.603 13.045 14.493 15.235 15.055 14.240 13.266 12.470 11.943 11.642 11.534 11.650 12.024 12.645 13.465 14.417 15.392 16.173 16.449 15.973 14.786 13.311 12.178 11.852 12.315 13.052 13.360 12.769 11.289 9.366 7.626 6.608 + 13.270 12.464 11.452 11.004 11.526 12.800 14.170 14.982 14.947 14.216 13.180 12.206 11.493 11.076 10.901 10.902 11.048 11.374 11.981 12.958 14.240 15.507 16.249 16.038 14.846 13.162 11.770 11.289 11.794 12.762 13.403 13.121 11.833 9.958 8.170 7.095 + 13.229 12.564 11.708 11.292 11.686 12.769 14.010 14.803 14.807 14.094 13.032 12.040 11.366 11.019 10.856 10.737 10.648 10.725 11.177 12.139 13.532 15.000 16.007 16.064 15.007 13.168 11.282 10.147 10.198 11.215 12.404 12.805 11.844 9.698 7.249 5.633 + 13.339 12.703 11.849 11.328 11.458 12.152 13.008 13.583 13.630 13.171 12.419 11.649 11.081 10.804 10.745 10.703 10.489 10.110 9.865 10.200 11.369 13.127 14.724 15.294 14.413 12.432 10.317 9.077 9.157 10.214 11.382 11.826 11.198 9.766 8.195 7.192 + 13.042 12.390 11.535 11.010 11.042 11.442 11.852 12.055 12.069 11.988 11.786 11.338 10.627 9.892 9.496 9.601 9.970 10.144 9.876 9.421 9.365 10.088 11.325 12.244 12.051 10.641 8.759 7.517 7.634 8.965 10.641 11.668 11.523 10.386 8.943 7.975 + 11.715 11.074 10.249 9.811 10.031 10.726 11.447 11.824 11.780 11.469 11.070 10.644 10.171 9.682 9.322 9.245 9.464 9.814 10.082 10.188 10.230 10.337 10.459 10.322 9.628 8.354 6.907 5.960 6.039 7.164 8.782 10.075 10.434 9.805 8.703 7.883 + 11.352 10.818 10.105 9.636 9.575 9.752 9.876 9.808 9.647 9.555 9.538 9.416 9.019 8.413 7.921 7.878 8.353 9.083 9.682 9.951 9.979 9.980 10.004 9.836 9.181 7.984 6.603 5.647 5.597 6.481 7.850 9.055 9.626 9.499 8.996 8.582 + 8.017 8.595 9.312 9.632 9.329 8.644 8.066 7.931 8.162 8.342 8.068 7.280 6.323 5.692 5.686 6.222 6.944 7.515 7.847 8.106 8.504 9.065 9.548 9.599 9.009 7.903 6.716 5.978 6.031 6.863 8.124 9.329 10.102 10.342 10.227 10.058 + 7.754 7.888 8.121 8.373 8.537 8.529 8.349 8.075 7.776 7.427 6.913 6.153 5.243 4.473 4.174 4.491 5.281 6.215 7.009 7.585 8.030 8.412 8.649 8.566 8.091 7.408 6.877 6.791 7.141 7.609 7.790 7.457 6.689 5.772 5.009 4.591 + 5.805 6.555 7.650 8.507 8.684 8.129 7.196 6.421 6.184 6.472 6.900 6.966 6.401 5.352 4.307 3.803 4.116 5.139 6.479 7.693 8.490 8.795 8.698 8.356 7.933 7.575 7.392 7.415 7.566 7.669 7.525 7.020 6.189 5.217 4.364 3.867 + 6.350 6.846 7.538 8.018 8.018 7.558 6.895 6.344 6.085 6.086 6.164 6.125 5.879 5.479 5.091 4.907 5.069 5.606 6.420 7.318 8.080 8.542 8.655 8.488 8.181 7.877 7.675 7.604 7.618 7.604 7.418 6.933 6.121 5.109 4.163 3.587 + 7.356 7.733 8.284 8.695 8.697 8.208 7.388 6.553 5.994 5.803 5.843 5.862 5.694 5.369 5.088 5.069 5.410 6.053 6.850 7.640 8.285 8.659 8.662 8.290 7.705 7.209 7.086 7.410 7.954 8.303 8.104 7.271 6.024 4.733 3.726 3.191 + 6.554 7.041 7.900 8.841 9.420 9.248 8.275 6.906 5.770 5.292 5.392 5.593 5.452 4.952 4.526 4.681 5.567 6.845 7.953 8.518 8.557 8.346 8.125 7.935 7.698 7.407 7.200 7.222 7.435 7.583 7.366 6.677 5.681 4.692 3.965 3.601 + 6.405 7.447 8.836 9.657 9.372 8.151 6.694 5.728 5.535 5.847 6.121 5.979 5.452 4.906 4.733 5.072 5.764 6.518 7.134 7.587 7.944 8.215 8.301 8.085 7.573 6.961 6.535 6.480 6.742 7.050 7.075 6.626 5.749 4.686 3.753 3.213 + 6.463 7.346 8.516 9.187 8.911 7.842 6.579 5.721 5.478 5.600 5.647 5.357 4.839 4.457 4.535 5.122 5.977 6.759 7.251 7.447 7.474 7.438 7.345 7.140 6.817 6.472 6.248 6.222 6.326 6.381 6.207 5.743 5.073 4.373 3.815 3.512 + 5.642 6.504 7.786 8.834 9.124 8.540 7.415 6.311 5.657 5.508 5.573 5.502 5.185 4.837 4.795 5.223 5.968 6.701 7.178 7.399 7.520 7.631 7.641 7.391 6.881 6.367 6.191 6.467 6.931 7.106 6.678 5.749 4.756 4.116 3.925 3.957 + 7.095 7.393 7.895 8.390 8.596 8.316 7.618 6.846 6.398 6.406 6.616 6.599 6.140 5.482 5.166 5.601 6.703 7.931 8.681 8.714 8.260 7.756 7.474 7.365 7.225 6.959 6.686 6.585 6.670 6.729 6.503 5.907 5.113 4.397 3.937 3.738 + 7.595 7.444 7.285 7.253 7.335 7.381 7.273 7.058 6.915 6.964 7.110 7.102 6.780 6.285 6.017 6.338 7.250 8.331 9.014 8.981 8.387 7.723 7.457 7.724 8.292 8.775 8.908 8.669 8.209 7.692 7.185 6.673 6.137 5.608 5.172 4.924 + 7.833 7.722 7.675 7.856 8.222 8.524 8.507 8.131 7.597 7.162 6.917 6.752 6.520 6.255 6.197 6.595 7.437 8.380 8.947 8.871 8.290 7.646 7.373 7.613 8.164 8.662 8.830 8.610 8.129 7.557 7.003 6.503 6.057 5.677 5.394 5.242 + 7.235 7.801 8.705 9.550 9.936 9.667 8.905 8.085 7.630 7.629 7.774 7.630 7.034 6.280 5.913 6.277 7.219 8.180 8.621 8.399 7.808 7.275 7.021 6.982 6.994 7.017 7.145 7.419 7.663 7.572 6.985 6.093 5.336 5.058 5.227 5.481 + 7.162 8.047 9.364 10.455 10.806 10.335 9.408 8.580 8.208 8.215 8.194 7.783 7.023 6.379 6.398 7.250 8.534 9.529 9.692 9.026 8.028 7.296 7.114 7.348 7.655 7.790 7.724 7.536 7.240 6.764 6.087 5.364 4.873 4.795 5.039 5.298 + 6.062 7.474 9.485 10.986 11.264 10.396 9.108 8.207 8.017 8.211 8.162 7.515 6.527 5.904 6.252 7.578 9.225 10.305 10.293 9.328 8.038 7.063 6.663 6.686 6.837 6.952 7.047 7.147 7.141 6.817 6.087 5.128 4.308 3.909 3.914 4.048 + 5.754 7.185 9.266 10.915 11.378 10.621 9.241 8.006 7.363 7.249 7.287 7.173 6.936 6.889 7.330 8.252 9.306 10.020 10.114 9.653 8.953 8.333 7.917 7.630 7.346 7.038 6.795 6.710 6.763 6.800 6.641 6.212 5.589 4.946 4.445 4.180 + 5.303 6.381 8.083 9.717 10.684 10.744 10.076 9.123 8.305 7.810 7.583 7.489 7.493 7.698 8.202 8.924 9.569 9.800 9.484 8.810 8.156 7.814 7.784 7.813 7.636 7.206 6.732 6.492 6.592 6.874 7.029 6.816 6.215 5.414 4.686 4.262 + 5.091 6.178 7.911 9.585 10.541 10.490 9.674 8.718 8.222 8.369 8.832 9.069 8.774 8.122 7.597 7.576 8.017 8.523 8.703 8.485 8.109 7.846 7.723 7.530 7.094 6.526 6.174 6.319 6.890 7.467 7.596 7.127 6.294 5.486 4.958 4.732 + 6.102 7.269 8.945 10.216 10.466 9.709 8.524 7.634 7.450 7.853 8.362 8.510 8.166 7.578 7.142 7.103 7.406 7.798 8.056 8.148 8.198 8.314 8.446 8.405 8.038 7.407 6.806 6.589 6.918 7.618 8.244 8.332 7.669 6.430 5.103 4.254 + 6.712 7.916 9.483 10.386 10.189 9.296 8.532 8.436 8.870 9.228 8.994 8.151 7.131 6.424 6.232 6.438 6.832 7.323 7.930 8.619 9.199 9.404 9.106 8.424 7.657 7.085 6.836 6.898 7.190 7.599 7.939 7.946 7.399 6.327 5.098 4.274 + 6.594 7.665 9.141 10.156 10.221 9.515 8.687 8.349 8.653 9.231 9.511 9.140 8.212 7.166 6.481 6.399 6.847 7.556 8.247 8.752 9.018 9.043 8.829 8.388 7.784 7.154 6.687 6.536 6.731 7.138 7.490 7.514 7.072 6.261 5.384 4.818 + 6.311 7.493 9.056 10.013 9.925 9.149 8.454 8.369 8.807 9.241 9.196 8.626 7.870 7.320 7.124 7.167 7.276 7.401 7.609 7.949 8.344 8.646 8.749 8.650 8.404 8.044 7.603 7.187 6.991 7.164 7.613 7.960 7.765 6.887 5.681 4.815 + 5.765 7.168 9.093 10.389 10.398 9.340 8.069 7.436 7.739 8.620 9.402 9.559 8.997 8.014 7.050 6.456 6.379 6.780 7.492 8.290 8.956 9.338 9.387 9.145 8.698 8.140 7.577 7.140 6.961 7.078 7.349 7.483 7.205 6.473 5.566 4.939 + 5.791 6.756 8.282 9.728 10.505 10.365 9.535 8.595 8.132 8.372 9.045 9.573 9.469 8.668 7.552 6.684 6.449 6.863 7.647 8.454 9.058 9.386 9.437 9.217 8.756 8.162 7.633 7.352 7.367 7.532 7.595 7.347 6.756 5.973 5.247 4.816 + 6.485 6.811 7.390 8.101 8.791 9.298 9.484 9.308 8.897 8.527 8.470 8.788 9.231 9.380 8.961 8.106 7.311 7.097 7.612 8.505 9.186 9.260 8.784 8.150 7.725 7.571 7.486 7.280 6.993 6.836 6.918 7.061 6.912 6.277 5.367 4.696 + 6.390 6.859 7.462 7.859 8.023 8.204 8.584 9.001 9.068 8.590 7.858 7.463 7.777 8.570 9.176 9.077 8.380 7.736 7.751 8.445 9.252 9.542 9.166 8.522 8.117 8.078 8.095 7.812 7.234 6.730 6.615 6.764 6.689 6.021 4.941 4.107 + 6.434 6.782 7.271 7.685 7.987 8.281 8.603 8.798 8.643 8.134 7.620 7.575 8.178 9.074 9.602 9.328 8.447 7.649 7.571 8.270 9.186 9.610 9.241 8.371 7.568 7.200 7.208 7.288 7.221 7.038 6.878 6.752 6.503 5.999 5.345 4.872 + 6.190 5.959 5.653 5.586 6.093 7.254 8.657 9.527 9.252 7.940 6.474 5.928 6.724 8.274 9.438 9.453 8.539 7.658 7.647 8.507 9.468 9.722 9.134 8.281 7.838 7.947 8.163 7.979 7.376 6.816 6.702 6.892 6.781 5.914 4.533 3.470 + 4.320 5.021 5.971 6.674 7.004 7.211 7.551 7.923 7.926 7.292 6.262 5.490 5.528 6.344 7.345 7.894 7.839 7.592 7.683 8.248 8.916 9.176 8.848 8.204 7.663 7.401 7.265 7.047 6.773 6.683 6.900 7.168 6.990 6.091 4.779 3.807 + 5.079 5.336 5.594 5.644 5.575 5.703 6.206 6.855 7.166 6.852 6.155 5.688 5.907 6.688 7.436 7.632 7.322 7.074 7.435 8.397 9.364 9.659 9.083 8.047 7.180 6.814 6.826 6.909 6.945 7.063 7.364 7.648 7.491 6.658 5.441 4.538 + 5.313 5.590 5.778 5.580 5.166 5.064 5.615 6.536 7.069 6.654 5.488 4.435 4.316 5.215 6.437 7.144 7.085 6.747 6.822 7.526 8.403 8.772 8.360 7.518 6.859 6.704 6.887 7.040 7.025 7.034 7.285 7.677 7.798 7.338 6.464 5.763 + 5.730 5.681 5.620 5.664 5.979 6.629 7.412 7.903 7.735 6.941 6.003 5.521 5.727 6.301 6.663 6.514 6.136 6.145 6.912 8.172 9.195 9.378 8.739 7.865 7.397 7.517 7.900 8.114 8.044 7.924 7.990 8.130 7.949 7.180 6.057 5.218 + 5.448 5.424 5.326 5.224 5.388 6.098 7.288 8.419 8.789 8.107 6.802 5.756 5.631 6.359 7.258 7.658 7.483 7.252 7.539 8.394 9.278 9.551 9.034 8.145 7.496 7.379 7.610 7.827 7.884 7.935 8.145 8.381 8.259 7.535 6.448 5.631 + 5.589 5.414 5.127 4.926 5.144 6.034 7.476 8.892 9.549 9.080 7.805 6.561 6.112 6.613 7.554 8.211 8.214 7.781 7.440 7.546 8.007 8.425 8.478 8.172 7.788 7.607 7.708 7.977 8.264 8.486 8.595 8.501 8.088 7.355 6.523 5.961 + 4.760 4.461 4.058 3.915 4.428 5.767 7.649 9.377 10.215 9.870 8.711 7.512 6.907 6.984 7.344 7.527 7.417 7.267 7.375 7.748 8.085 8.087 7.762 7.435 7.434 7.788 8.215 8.409 8.329 8.189 8.181 8.220 7.999 7.323 6.385 5.698 + 4.239 4.431 4.692 4.991 5.523 6.546 8.023 9.450 10.147 9.790 8.731 7.744 7.409 7.663 7.955 7.831 7.388 7.155 7.525 8.301 8.827 8.599 7.754 6.973 6.862 7.416 8.073 8.282 8.027 7.781 7.951 8.389 8.489 7.797 6.548 5.559 + 4.565 4.835 5.228 5.615 6.038 6.673 7.613 8.693 9.520 9.736 9.274 8.404 7.544 7.004 6.869 7.069 7.494 8.038 8.548 8.810 8.656 8.127 7.508 7.160 7.246 7.618 7.963 8.096 8.120 8.278 8.647 8.962 8.801 7.980 6.812 5.959 + 5.630 5.607 5.552 5.530 5.727 6.337 7.365 8.507 9.264 9.241 8.416 7.171 6.070 5.554 5.760 6.538 7.574 8.512 9.033 8.940 8.274 7.361 6.693 6.639 7.186 7.937 8.403 8.387 8.114 7.998 8.225 8.543 8.462 7.725 6.607 5.771 + 6.853 6.647 6.312 6.019 5.994 6.388 7.133 7.912 8.321 8.123 7.404 6.506 5.804 5.511 5.655 6.182 7.026 8.065 9.036 9.564 9.380 8.556 7.538 6.880 6.867 7.341 7.874 8.151 8.199 8.275 8.521 8.740 8.540 7.729 6.592 5.763 + 7.431 6.954 6.196 5.489 5.167 5.404 6.090 6.870 7.328 7.228 6.643 5.884 5.293 5.078 5.274 5.823 6.644 7.620 8.539 9.120 9.152 8.657 7.926 7.349 7.168 7.346 7.669 7.964 8.233 8.567 8.936 9.099 8.750 7.821 6.650 5.833 + 7.263 6.676 5.946 5.634 6.019 6.930 7.905 8.520 8.610 8.254 7.602 6.756 5.808 4.972 4.600 4.997 6.159 7.646 8.787 9.074 8.500 7.545 6.840 6.734 7.102 7.529 7.683 7.586 7.552 7.867 8.474 8.962 8.865 8.051 6.894 6.060 + 5.810 5.405 4.936 4.848 5.375 6.368 7.372 7.907 7.758 7.067 6.191 5.447 4.959 4.698 4.648 4.907 5.615 6.742 7.969 8.810 8.913 8.324 7.476 6.882 6.792 7.065 7.368 7.503 7.561 7.772 8.205 8.614 8.603 7.997 7.057 6.356 + 3.853 3.752 3.607 3.536 3.682 4.127 4.798 5.460 5.828 5.737 5.246 4.599 4.074 3.846 3.966 4.417 5.170 6.159 7.217 8.075 8.479 8.356 7.883 7.381 7.110 7.125 7.308 7.524 7.738 7.991 8.262 8.394 8.181 7.571 6.790 6.241 + 3.099 3.146 3.286 3.601 4.152 4.899 5.641 6.071 5.951 5.297 4.421 3.765 3.633 4.027 4.704 5.401 6.022 6.647 7.360 8.088 8.602 8.684 8.306 7.663 7.040 6.640 6.519 6.635 6.936 7.362 7.784 7.982 7.751 7.077 6.229 5.641 + 4.109 3.718 3.271 3.218 3.792 4.809 5.716 5.936 5.264 4.056 3.026 2.774 3.382 4.408 5.261 5.677 5.882 6.323 7.202 8.233 8.847 8.658 7.789 6.788 6.202 6.203 6.562 6.943 7.215 7.479 7.842 8.193 8.249 7.838 7.134 6.589 + 3.249 3.098 2.972 3.106 3.623 4.418 5.173 5.529 5.315 4.672 3.992 3.673 3.878 4.450 5.066 5.492 5.739 6.010 6.476 7.087 7.573 7.654 7.269 6.655 6.204 6.209 6.686 7.396 8.014 8.322 8.293 8.046 7.738 7.478 7.309 7.229 + 2.303 1.961 1.690 2.008 3.123 4.728 6.145 6.731 6.284 5.159 4.020 3.409 3.453 3.888 4.355 4.707 5.067 5.631 6.396 7.087 7.350 7.051 6.417 5.893 5.826 6.247 6.898 7.478 7.854 8.082 8.249 8.319 8.163 7.717 7.131 6.712 + 4.328 3.909 3.368 3.113 3.400 4.148 4.973 5.421 5.281 4.724 4.177 3.998 4.210 4.517 4.591 4.396 4.257 4.595 5.537 6.742 7.605 7.696 7.082 6.268 5.828 6.016 6.660 7.380 7.889 8.148 8.266 8.316 8.265 8.059 7.755 7.525 + 3.901 3.172 2.287 1.966 2.539 3.701 4.732 5.020 4.488 3.620 3.075 3.195 3.784 4.310 4.362 3.978 3.611 3.754 4.543 5.650 6.528 6.813 6.557 6.138 5.958 6.171 6.653 7.174 7.589 7.889 8.103 8.189 8.050 7.658 7.153 6.797 + 3.811 3.148 2.339 2.041 2.570 3.676 4.723 5.145 4.827 4.138 3.616 3.555 3.831 4.083 4.078 3.956 4.121 4.892 6.188 7.523 8.323 8.325 7.735 7.045 6.674 6.722 7.005 7.294 7.515 7.737 8.009 8.226 8.187 7.798 7.217 6.786 + 4.320 3.709 2.889 2.422 2.687 3.638 4.821 5.644 5.735 5.154 4.314 3.673 3.451 3.558 3.792 4.087 4.597 5.517 6.803 8.066 8.767 8.586 7.680 6.605 5.967 6.045 6.676 7.445 7.991 8.200 8.174 8.065 7.950 7.829 7.705 7.618 + 1.620 2.149 2.871 3.410 3.658 3.806 4.097 4.546 4.924 4.997 4.769 4.477 4.354 4.410 4.481 4.486 4.603 5.146 6.214 7.462 8.261 8.162 7.268 6.187 5.583 5.718 6.347 7.019 7.464 7.714 7.907 8.023 7.867 7.308 6.523 5.944 + 2.707 2.258 1.849 2.026 2.910 4.076 4.889 5.010 4.626 4.245 4.230 4.520 4.740 4.602 4.211 4.013 4.424 5.463 6.705 7.570 7.723 7.267 6.612 6.161 6.078 6.275 6.583 6.911 7.268 7.660 7.983 8.045 7.694 6.975 6.159 5.619 + 2.212 2.003 1.930 2.351 3.268 4.275 4.863 4.813 4.339 3.870 3.689 3.747 3.810 3.744 3.686 3.921 4.614 5.638 6.648 7.321 7.548 7.431 7.149 6.831 6.554 6.396 6.452 6.759 7.214 7.593 7.682 7.431 6.975 6.525 6.221 6.085 + 3.244 3.601 4.113 4.569 4.936 5.323 5.774 6.115 6.058 5.480 4.611 3.906 3.699 3.954 4.345 4.614 4.833 5.317 6.249 7.385 8.147 8.066 7.182 6.050 5.339 5.356 5.903 6.531 6.925 7.067 7.089 7.029 6.772 6.227 5.535 5.040 + 6.444 6.304 6.353 6.882 7.765 8.469 8.465 7.678 6.563 5.739 5.511 5.696 5.889 5.873 5.805 6.014 6.642 7.474 8.103 8.250 7.946 7.426 6.908 6.464 6.104 5.910 6.032 6.524 7.196 7.677 7.672 7.197 6.561 6.107 5.954 5.966 + 6.664 6.620 6.797 7.434 8.438 9.367 9.740 9.390 8.579 7.775 7.315 7.243 7.406 7.667 7.992 8.366 8.667 8.685 8.295 7.611 6.939 6.546 6.458 6.481 6.421 6.296 6.319 6.668 7.265 7.795 7.947 7.667 7.186 6.804 6.651 6.642 + 5.513 5.827 6.428 7.269 8.270 9.293 10.124 10.526 10.345 9.636 8.683 7.882 7.544 7.742 8.300 8.928 9.388 9.570 9.468 9.100 8.480 7.653 6.754 5.998 5.593 5.628 6.024 6.587 7.107 7.440 7.524 7.360 6.991 6.507 6.046 5.763 + 5.614 5.922 6.568 7.562 8.823 10.118 11.083 11.351 10.751 9.459 7.984 6.947 6.762 7.401 8.426 9.253 9.502 9.189 8.631 8.178 7.950 7.800 7.501 6.984 6.444 6.200 6.434 7.017 7.565 7.699 7.301 6.587 5.935 5.610 5.607 5.707 + 7.296 7.205 7.280 7.815 8.869 10.139 11.100 11.306 10.664 9.493 8.351 7.723 7.789 8.367 9.061 9.489 9.467 9.054 8.461 7.902 7.481 7.179 6.922 6.681 6.514 6.512 6.706 7.002 7.211 7.166 6.835 6.353 5.927 5.702 5.670 5.710 + 7.513 7.302 7.170 7.481 8.378 9.619 10.671 11.010 10.458 9.313 8.186 7.631 7.829 8.517 9.216 9.553 9.476 9.193 8.957 8.855 8.782 8.584 8.218 7.795 7.483 7.374 7.436 7.563 7.669 7.716 7.674 7.484 7.084 6.500 5.889 5.494 + 6.141 6.549 7.397 8.632 10.003 11.093 11.515 11.142 10.196 9.128 8.367 8.113 8.299 8.712 9.142 9.468 9.629 9.576 9.273 8.752 8.161 7.715 7.573 7.727 7.989 8.115 7.974 7.629 7.276 7.085 7.064 7.055 6.868 6.444 5.924 5.565 + 5.328 6.267 7.816 9.480 10.814 11.558 11.648 11.163 10.270 9.214 8.292 7.777 7.803 8.298 9.019 9.683 10.082 10.137 9.854 9.282 8.512 7.709 7.095 6.859 7.034 7.452 7.846 8.013 7.931 7.719 7.493 7.252 6.906 6.407 5.862 5.497 + 7.210 7.462 8.014 8.869 9.889 10.779 11.198 10.934 10.038 8.824 7.730 7.116 7.123 7.647 8.424 9.161 9.646 9.784 9.593 9.167 8.642 8.164 7.844 7.726 7.774 7.896 7.998 8.017 7.939 7.763 7.479 7.060 6.500 5.864 5.290 4.945 + 7.341 7.869 8.717 9.584 10.224 10.520 10.452 10.040 9.317 8.385 7.463 6.862 6.843 7.452 8.448 9.408 9.949 9.929 9.499 8.968 8.599 8.467 8.464 8.422 8.252 7.997 7.777 7.678 7.678 7.654 7.456 7.000 6.319 5.553 4.892 4.511 + 8.382 8.596 9.011 9.568 10.139 10.531 10.545 10.060 9.092 7.823 6.555 5.627 5.299 5.654 6.556 7.692 8.695 9.309 9.482 9.366 9.192 9.129 9.196 9.294 9.307 9.193 8.998 8.786 8.564 8.266 7.803 7.140 6.341 5.545 4.912 4.564 + 8.482 8.105 7.758 7.910 8.668 9.637 10.169 9.818 8.655 7.213 6.132 5.765 6.038 6.613 7.178 7.622 8.002 8.365 8.638 8.679 8.431 8.033 7.764 7.852 8.305 8.898 9.316 9.354 9.007 8.413 7.718 6.977 6.178 5.346 4.608 4.163 + 8.085 8.240 8.569 9.065 9.634 10.071 10.118 9.582 8.465 7.017 5.650 4.762 4.559 4.983 5.781 6.656 7.393 7.898 8.161 8.207 8.086 7.884 7.701 7.606 7.574 7.500 7.273 6.882 6.436 6.081 5.875 5.731 5.493 5.086 4.607 4.278 + 7.412 6.904 6.234 5.851 5.999 6.548 7.078 7.154 6.596 5.580 4.534 3.903 3.933 4.584 5.579 6.556 7.217 7.440 7.286 6.944 6.613 6.409 6.332 6.306 6.258 6.175 6.097 6.065 6.058 5.995 5.782 5.378 4.833 4.260 3.793 3.533 + 6.708 6.452 6.201 6.288 6.853 7.710 8.418 8.533 7.879 6.667 5.377 4.507 4.325 4.776 5.575 6.390 6.993 7.301 7.331 7.138 6.788 6.362 5.954 5.636 5.428 5.292 5.188 5.119 5.128 5.235 5.369 5.367 5.080 4.509 3.849 3.407 + 4.438 4.841 5.551 6.369 7.023 7.288 7.108 6.625 6.056 5.535 5.061 4.618 4.328 4.446 5.142 6.256 7.274 7.637 7.153 6.177 5.371 5.202 5.604 6.067 6.090 5.596 4.966 4.688 4.935 5.437 5.716 5.468 4.752 3.881 3.176 2.802 + 4.612 4.861 5.267 5.707 6.095 6.394 6.580 6.601 6.387 5.921 5.306 4.767 4.557 4.829 5.548 6.509 7.426 8.053 8.271 8.099 7.666 7.149 6.701 6.397 6.221 6.095 5.950 5.783 5.657 5.644 5.747 5.877 5.914 5.799 5.590 5.429 + 3.931 4.657 5.855 7.100 7.951 8.137 7.681 6.877 6.110 5.627 5.414 5.276 5.056 4.819 4.840 5.394 6.497 7.818 8.829 9.108 8.583 7.558 6.509 5.822 5.614 5.750 5.987 6.135 6.145 6.089 6.086 6.222 6.510 6.885 7.235 7.445 + 3.815 4.621 5.909 7.164 7.906 7.917 7.348 6.615 6.125 6.013 6.082 6.007 5.650 5.220 5.138 5.682 6.716 7.723 8.151 7.811 7.020 6.376 6.341 6.935 7.756 8.277 8.196 7.588 6.795 6.186 5.949 6.050 6.326 6.609 6.806 6.900 + 4.959 5.528 6.412 7.237 7.682 7.602 7.047 6.207 5.325 4.614 4.204 4.102 4.225 4.483 4.866 5.448 6.283 7.256 8.054 8.336 7.997 7.332 6.889 7.093 7.911 8.837 9.255 8.893 8.013 7.172 6.767 6.744 6.714 6.352 5.721 5.220 + 5.837 6.548 7.610 8.551 9.060 9.086 8.725 8.062 7.156 6.130 5.231 4.727 4.721 5.078 5.564 6.069 6.672 7.472 8.336 8.876 8.749 8.033 7.300 7.240 8.095 9.409 10.343 10.316 9.433 8.335 7.620 7.360 7.142 6.559 5.673 4.989 + 7.082 6.855 6.681 6.881 7.518 8.274 8.614 8.163 6.991 5.610 4.623 4.315 4.499 4.754 4.854 5.007 5.644 6.942 8.504 9.545 9.497 8.527 7.499 7.339 8.306 9.768 10.707 10.516 9.443 8.301 7.738 7.715 7.641 7.010 5.940 5.096 + 7.341 7.213 7.186 7.522 8.255 9.052 9.341 8.672 7.082 5.167 3.749 3.337 3.801 4.531 4.965 5.065 5.289 6.103 7.446 8.674 9.074 8.511 7.608 7.271 7.926 9.155 10.058 10.013 9.171 8.247 7.820 7.804 7.585 6.687 5.319 4.279 + 6.246 6.313 6.620 7.317 8.302 9.144 9.285 8.404 6.712 4.902 3.753 3.623 4.237 4.942 5.251 5.232 5.403 6.217 7.575 8.821 9.260 8.760 7.906 7.543 8.090 9.205 10.092 10.176 9.539 8.752 8.293 8.101 7.689 6.700 5.358 4.376 + 4.493 5.339 6.660 7.954 8.857 9.232 9.068 8.367 7.182 5.743 4.489 3.869 4.039 4.743 5.514 6.052 6.433 6.950 7.736 8.545 8.930 8.673 8.058 7.697 8.037 8.973 9.931 10.328 10.016 9.302 8.585 7.977 7.277 6.296 5.190 4.429 + 2.846 4.308 6.443 8.263 9.242 9.488 9.372 9.053 8.386 7.248 5.876 4.804 4.439 4.701 5.144 5.426 5.665 6.274 7.438 8.760 9.507 9.264 8.371 7.692 7.874 8.788 9.665 9.816 9.236 8.529 8.237 8.265 7.975 6.882 5.261 4.039 + 4.067 4.557 5.445 6.557 7.656 8.467 8.737 8.335 7.343 6.060 4.879 4.092 3.770 3.799 4.059 4.551 5.359 6.461 7.586 8.305 8.327 7.763 7.101 6.862 7.206 7.819 8.191 8.054 7.583 7.194 7.111 7.130 6.794 5.857 4.601 3.695 + 4.821 5.691 6.934 7.910 8.262 8.059 7.611 7.155 6.717 6.206 5.606 5.038 4.662 4.552 4.689 5.059 5.686 6.534 7.368 7.787 7.486 6.560 5.538 5.041 5.313 6.040 6.623 6.703 6.444 6.314 6.571 6.939 6.823 5.885 4.463 3.398 + 4.684 5.679 7.139 8.355 8.870 8.652 7.957 7.063 6.134 5.264 4.581 4.231 4.258 4.550 4.936 5.356 5.908 6.672 7.486 7.935 7.649 6.667 5.522 4.888 5.066 5.754 6.327 6.396 6.118 5.979 6.243 6.610 6.443 5.387 3.817 2.648 + 5.017 6.049 7.519 8.625 8.834 8.144 6.963 5.792 4.943 4.467 4.261 4.200 4.208 4.279 4.470 4.884 5.596 6.523 7.371 7.744 7.408 6.516 5.580 5.142 5.397 6.058 6.598 6.674 6.368 6.034 5.913 5.879 5.557 4.731 3.632 2.839 + 3.794 4.798 6.275 7.505 8.007 7.725 6.915 5.902 4.928 4.160 3.723 3.666 3.882 4.134 4.247 4.294 4.562 5.262 6.224 6.898 6.765 5.814 4.658 4.113 4.549 5.591 6.425 6.479 5.862 5.180 4.919 4.978 4.799 3.961 2.680 1.707 + 5.002 5.486 6.278 7.082 7.580 7.558 7.006 6.124 5.219 4.543 4.170 4.005 3.912 3.874 4.023 4.522 5.359 6.252 6.757 6.562 5.736 4.736 4.128 4.211 4.817 5.447 5.651 5.350 4.854 4.563 4.608 4.735 4.527 3.794 2.789 2.064 + 3.695 4.635 6.045 7.280 7.888 7.785 7.157 6.261 5.288 4.378 3.671 3.297 3.294 3.573 4.000 4.522 5.184 5.998 6.783 7.179 6.904 6.042 5.077 4.589 4.822 5.495 6.045 6.099 5.751 5.411 5.357 5.438 5.209 4.393 3.232 2.376 + 3.772 4.763 6.219 7.418 7.857 7.479 6.589 5.591 4.764 4.189 3.816 3.562 3.362 3.213 3.189 3.425 4.020 4.895 5.741 6.164 5.964 5.337 4.784 4.744 5.235 5.830 6.006 5.608 4.987 4.685 4.913 5.312 5.232 4.328 2.938 1.897 + 3.441 4.063 5.016 5.886 6.355 6.340 5.964 5.425 4.861 4.304 3.739 3.197 2.787 2.656 2.898 3.485 4.258 4.999 5.519 5.730 5.657 5.405 5.090 4.787 4.526 4.316 4.189 4.196 4.368 4.648 4.863 4.793 4.304 3.467 2.571 1.991 + 3.215 3.911 4.912 5.712 6.012 5.831 5.383 4.859 4.336 3.835 3.401 3.097 2.927 2.822 2.750 2.831 3.293 4.230 5.380 6.189 6.185 5.388 4.360 3.805 4.006 4.613 4.974 4.732 4.141 3.801 4.053 4.595 4.720 3.979 2.659 1.627 + 4.047 4.596 5.318 5.774 5.795 5.535 5.224 4.903 4.396 3.569 2.578 1.855 1.812 2.529 3.698 4.867 5.729 6.212 6.348 6.124 5.509 4.627 3.843 3.581 4.003 4.833 5.537 5.738 5.489 5.159 5.030 5.001 4.688 3.847 2.708 1.880 + 3.594 3.711 4.104 4.835 5.634 5.988 5.531 4.395 3.184 2.546 2.697 3.294 3.788 3.928 3.973 4.415 5.464 6.761 7.578 7.379 6.256 4.891 4.076 4.160 4.867 5.577 5.818 5.571 5.185 5.011 5.085 5.106 4.713 3.816 2.726 1.979 + 2.172 3.363 4.933 5.894 5.829 5.116 4.513 4.472 4.803 4.925 4.445 3.528 2.771 2.706 3.398 4.444 5.312 5.700 5.640 5.340 4.974 4.616 4.306 4.125 4.160 4.408 4.743 4.997 5.080 5.003 4.797 4.422 3.799 2.939 2.050 1.474 + 3.591 4.249 5.074 5.506 5.389 5.057 4.983 5.308 5.698 5.651 4.969 3.982 3.315 3.421 4.251 5.326 6.094 6.267 5.911 5.287 4.655 4.182 3.968 4.068 4.455 4.974 5.391 5.533 5.390 5.088 4.735 4.301 3.663 2.790 1.876 1.276 + 3.761 4.094 4.544 4.881 5.082 5.354 5.911 6.711 7.369 7.388 6.549 5.152 3.907 3.497 4.136 5.423 6.613 7.100 6.775 6.014 5.346 5.076 5.134 5.230 5.145 4.903 4.704 4.709 4.862 4.925 4.658 4.004 3.122 2.269 1.644 1.329 + 3.676 4.026 4.467 4.746 4.886 5.163 5.800 6.663 7.258 7.112 6.198 5.059 4.470 4.892 6.133 7.485 8.200 7.959 6.993 5.830 4.923 4.427 4.252 4.248 4.352 4.577 4.919 5.276 5.482 5.389 4.943 4.202 3.299 2.403 1.685 1.285 + 4.359 4.442 4.553 4.658 4.819 5.173 5.797 6.570 7.154 7.171 6.484 5.392 4.542 4.560 5.632 7.315 8.755 9.185 8.398 6.849 5.352 4.565 4.649 5.282 5.980 6.436 6.647 6.770 6.888 6.894 6.574 5.796 4.632 3.347 2.267 1.658 + 5.669 5.081 4.399 4.212 4.756 5.775 6.765 7.336 7.383 6.998 6.322 5.534 4.949 4.994 5.949 7.601 9.182 9.779 8.966 7.171 5.416 4.612 4.947 5.868 6.615 6.841 6.777 6.874 7.286 7.692 7.574 6.673 5.203 3.664 2.500 1.906 + 6.374 5.944 5.433 5.306 5.841 6.921 8.076 8.742 8.573 7.643 6.401 5.432 5.164 5.689 6.754 7.905 8.690 8.822 8.276 7.285 6.253 5.585 5.495 5.897 6.453 6.792 6.760 6.517 6.392 6.579 6.911 6.912 6.147 4.601 2.814 1.616 + 5.911 5.729 5.579 5.723 6.257 7.026 7.704 7.971 7.659 6.800 5.611 4.442 3.697 3.706 4.542 5.906 7.204 7.828 7.514 6.509 5.421 4.823 4.891 5.337 5.674 5.599 5.202 4.850 4.860 5.221 5.568 5.428 4.548 3.087 1.563 0.595 + 5.570 6.062 6.765 7.316 7.503 7.361 7.070 6.757 6.377 5.779 4.905 3.936 3.260 3.246 3.988 5.202 6.353 6.943 6.775 6.027 5.109 4.410 4.098 4.084 4.153 4.149 4.087 4.112 4.343 4.723 4.988 4.799 3.969 2.632 1.238 0.348 + 2.416 3.677 5.483 6.912 7.458 7.267 6.860 6.616 6.476 6.090 5.226 4.069 3.135 2.897 3.429 4.362 5.141 5.382 5.054 4.418 3.814 3.467 3.411 3.526 3.629 3.587 3.397 3.205 3.209 3.491 3.882 4.009 3.529 2.425 1.104 0.205 + 1.189 1.976 3.111 4.043 4.505 4.644 4.806 5.163 5.510 5.427 4.669 3.462 2.442 2.242 3.039 4.400 5.553 5.892 5.351 4.394 3.648 3.467 3.733 4.014 3.923 3.406 2.756 2.381 2.500 2.997 3.498 3.617 3.180 2.319 1.391 0.798 + 3.803 3.729 3.704 3.844 4.137 4.446 4.633 4.659 4.564 4.366 4.029 3.550 3.095 2.977 3.421 4.304 5.129 5.331 4.717 3.668 2.885 2.860 3.497 4.198 4.349 3.801 2.952 2.392 2.431 2.905 3.372 3.483 3.205 2.752 2.363 2.160 + 3.832 4.066 4.397 4.650 4.724 4.636 4.460 4.235 3.930 3.507 3.016 2.631 2.568 2.936 3.634 4.373 4.842 4.880 4.558 4.108 3.773 3.676 3.799 4.055 4.378 4.753 5.173 5.583 5.869 5.918 5.695 5.278 4.818 4.449 4.228 4.136 + 2.945 3.495 4.219 4.670 4.672 4.394 4.119 3.962 3.796 3.451 2.959 2.578 2.568 2.939 3.414 3.662 3.571 3.320 3.183 3.269 3.447 3.512 3.414 3.315 3.418 3.751 4.123 4.294 4.189 3.953 3.792 3.780 3.811 3.737 3.545 3.375 + 1.899 2.539 3.502 4.328 4.651 4.379 3.707 2.979 2.485 2.328 2.427 2.625 2.815 2.978 3.142 3.301 3.396 3.368 3.233 3.094 3.084 3.254 3.533 3.770 3.849 3.765 3.614 3.505 3.471 3.463 3.408 3.284 3.133 3.018 2.968 2.959 + 3.307 3.305 3.426 3.763 4.223 4.529 4.409 3.812 2.981 2.301 2.048 2.229 2.635 3.026 3.302 3.513 3.737 3.962 4.081 4.005 3.776 3.569 3.562 3.800 4.149 4.398 4.412 4.226 3.996 3.863 3.840 3.805 3.616 3.234 2.785 2.480 + 4.156 4.552 5.189 5.773 5.965 5.559 4.656 3.637 2.936 2.726 2.818 2.849 2.631 2.331 2.316 2.796 3.594 4.259 4.445 4.196 3.894 3.907 4.276 4.713 4.902 4.797 4.637 4.677 4.911 5.066 4.860 4.286 3.623 3.193 3.086 3.133 + 2.912 3.624 4.652 5.427 5.517 4.869 3.825 2.891 2.422 2.427 2.631 2.746 2.717 2.752 3.106 3.816 4.627 5.178 5.288 5.093 4.904 4.919 5.062 5.080 4.815 4.384 4.091 4.157 4.501 4.791 4.719 4.244 3.605 3.105 2.870 2.818 + 0.560 1.782 3.560 4.989 5.479 5.059 4.261 3.697 3.659 4.002 4.339 4.358 4.029 3.581 3.316 3.411 3.843 4.443 5.009 5.404 5.590 5.600 5.500 5.340 5.140 4.889 4.578 4.227 3.890 3.631 3.473 3.389 3.314 3.208 3.082 2.993 + 1.670 2.630 3.971 4.920 5.016 4.382 3.596 3.262 3.599 4.334 4.945 5.048 4.657 4.126 3.865 4.051 4.553 5.079 5.411 5.534 5.573 5.647 5.759 5.826 5.778 5.624 5.419 5.176 4.831 4.314 3.657 3.036 2.674 2.673 2.916 3.144 + 2.744 3.296 3.980 4.305 4.103 3.655 3.450 3.792 4.576 5.393 5.832 5.750 5.296 4.757 4.379 4.290 4.527 5.065 5.795 6.510 6.965 7.011 6.706 6.288 6.007 5.947 5.991 5.934 5.656 5.192 4.673 4.200 3.786 3.405 3.074 2.871 + 2.636 3.964 5.493 5.963 5.078 3.715 3.102 3.740 5.034 5.911 5.793 5.022 4.421 4.478 4.969 5.315 5.250 5.106 5.431 6.373 7.453 7.971 7.643 6.850 6.269 6.256 6.572 6.674 6.244 5.443 4.680 4.187 3.847 3.420 2.873 2.463 + 3.837 4.874 6.079 6.517 6.039 5.387 5.464 6.450 7.598 7.883 6.904 5.225 3.875 3.504 3.959 4.598 4.964 5.162 5.611 6.506 7.539 8.155 8.062 7.487 6.935 6.728 6.766 6.708 6.355 5.813 5.318 4.940 4.511 3.856 3.067 2.507 + 3.773 4.334 5.067 5.580 5.853 6.207 6.899 7.754 8.232 7.910 6.913 5.875 5.423 5.672 6.178 6.399 6.214 6.008 6.266 7.063 7.955 8.367 8.093 7.454 6.976 6.926 7.129 7.206 6.948 6.457 5.941 5.439 4.778 3.830 2.770 2.047 + 3.463 3.896 4.545 5.135 5.527 5.781 6.050 6.405 6.737 6.839 6.577 6.026 5.437 5.068 5.011 5.161 5.341 5.475 5.646 5.999 6.566 7.177 7.547 7.478 7.019 6.445 6.067 6.004 6.105 6.054 5.601 4.718 3.607 2.555 1.783 1.389 + 2.737 3.662 4.860 5.594 5.663 5.510 5.758 6.588 7.550 7.950 7.446 6.323 5.227 4.643 4.591 4.766 4.920 5.091 5.486 6.186 6.992 7.579 7.777 7.695 7.576 7.549 7.527 7.345 6.958 6.477 6.006 5.488 4.737 3.677 2.539 1.782 + 3.714 4.053 4.482 4.756 4.889 5.156 5.810 6.791 7.692 8.038 7.640 6.722 5.734 5.024 4.665 4.531 4.525 4.693 5.155 5.930 6.851 7.654 8.147 8.287 8.144 7.792 7.287 6.715 6.219 5.929 5.817 5.655 5.160 4.249 3.188 2.465 + 4.328 4.864 5.562 6.009 6.118 6.176 6.552 7.314 8.123 8.475 8.087 7.081 5.861 4.810 4.103 3.735 3.683 3.980 4.647 5.573 6.515 7.235 7.643 7.814 7.851 7.773 7.533 7.145 6.752 6.523 6.444 6.242 5.570 4.338 2.912 1.944 + 4.443 5.038 5.768 6.121 5.977 5.697 5.784 6.434 7.364 8.035 8.048 7.370 6.259 5.031 3.919 3.087 2.697 2.860 3.510 4.355 5.041 5.409 5.612 5.940 6.501 7.068 7.276 6.982 6.448 6.113 6.150 6.231 5.775 4.512 2.842 1.647 + 4.834 4.946 5.101 5.248 5.418 5.695 6.097 6.491 6.640 6.367 5.699 4.866 4.148 3.694 3.469 3.341 3.230 3.181 3.311 3.705 4.346 5.131 5.915 6.555 6.922 6.931 6.607 6.123 5.737 5.621 5.705 5.679 5.208 4.224 3.054 2.255 + 1.790 2.378 3.257 4.055 4.578 4.903 5.229 5.649 6.026 6.088 5.661 4.841 3.956 3.357 3.192 3.341 3.536 3.586 3.512 3.525 3.865 4.612 5.603 6.502 6.965 6.831 6.210 5.423 4.830 4.623 4.723 4.844 4.699 4.205 3.555 3.097 + 3.002 3.289 3.679 3.968 4.098 4.188 4.395 4.743 5.078 5.192 5.002 4.615 4.237 4.001 3.882 3.759 3.561 3.357 3.306 3.522 3.972 4.488 4.871 5.001 4.875 4.579 4.231 3.945 3.798 3.795 3.848 3.799 3.512 2.982 2.384 1.984 + 2.484 2.996 3.640 3.975 3.868 3.578 3.511 3.852 4.388 4.687 4.439 3.707 2.879 2.386 2.445 2.972 3.712 4.419 4.966 5.330 5.544 5.649 5.679 5.643 5.503 5.188 4.665 4.013 3.423 3.083 3.024 3.071 2.962 2.564 2.005 1.596 + 5.000 4.689 4.192 3.673 3.238 2.928 2.779 2.863 3.242 3.866 4.525 4.946 4.985 4.756 4.578 4.750 5.329 6.091 6.701 6.952 6.885 6.702 6.570 6.487 6.322 5.965 5.459 4.984 4.726 4.740 4.914 5.057 5.031 4.826 4.553 4.364 + 3.386 3.263 3.129 3.107 3.226 3.420 3.616 3.827 4.134 4.567 5.014 5.266 5.188 4.882 4.670 4.884 5.607 6.576 7.334 7.545 7.218 6.690 6.378 6.500 6.956 7.443 7.700 7.671 7.509 7.417 7.488 7.653 7.763 7.724 7.573 7.442 + 1.751 2.397 3.383 4.254 4.648 4.490 4.026 3.661 3.700 4.152 4.756 5.190 5.333 5.346 5.533 6.065 6.818 7.455 7.690 7.526 7.262 7.274 7.727 8.458 9.108 9.383 9.249 8.919 8.671 8.652 8.813 8.981 9.006 8.860 8.635 8.472 + 2.026 2.891 4.054 4.830 4.926 4.590 4.312 4.379 4.693 4.954 4.989 4.897 4.902 5.118 5.473 5.851 6.267 6.849 7.653 8.506 9.101 9.261 9.133 9.072 9.323 9.779 10.086 9.990 9.603 9.306 9.382 9.724 9.917 9.639 8.993 8.455 + 3.438 3.642 3.970 4.320 4.641 4.953 5.304 5.702 6.080 6.317 6.321 6.100 5.790 5.603 5.734 6.261 7.092 7.990 8.668 8.928 8.770 8.405 8.147 8.242 8.734 9.443 10.083 10.432 10.441 10.232 9.982 9.813 9.744 9.728 9.722 9.714 + 6.003 5.751 5.400 5.168 5.200 5.472 5.805 5.975 5.876 5.592 5.347 5.341 5.624 6.090 6.593 7.078 7.603 8.230 8.902 9.438 9.670 9.607 9.461 9.494 9.800 10.221 10.477 10.409 10.118 9.873 9.879 10.106 10.329 10.346 10.162 9.974 + 4.766 5.038 5.517 6.037 6.355 6.296 5.920 5.548 5.551 6.037 6.711 7.077 6.852 6.255 5.898 6.329 7.574 9.079 10.100 10.242 9.731 9.193 9.154 9.664 10.311 10.601 10.351 9.806 9.412 9.457 9.874 10.317 10.437 10.133 9.605 9.209 + 6.790 6.431 6.066 6.045 6.366 6.679 6.648 6.317 6.103 6.401 7.176 7.938 8.171 7.824 7.404 7.560 8.505 9.789 10.632 10.540 9.688 8.754 8.368 8.651 9.198 9.489 9.330 8.978 8.867 9.207 9.784 10.118 9.818 8.885 7.733 6.950 + 8.872 8.253 7.428 6.889 6.828 7.043 7.190 7.115 6.966 6.996 7.271 7.594 7.700 7.556 7.430 7.658 8.306 9.049 9.391 9.068 8.274 7.517 7.223 7.417 7.739 7.768 7.368 6.792 6.457 6.610 7.129 7.621 7.710 7.300 6.641 6.155 + 12.526 12.074 11.596 11.562 12.067 12.735 13.022 12.635 11.706 10.606 9.622 8.801 8.096 7.591 7.541 8.129 9.176 10.112 10.328 9.638 8.474 7.592 7.520 8.157 8.870 9.003 8.401 7.530 7.110 7.553 8.627 9.607 9.789 8.994 7.706 6.751 + 13.400 12.891 12.412 12.571 13.501 14.710 15.439 15.212 14.133 12.729 11.526 10.756 10.375 10.309 10.589 11.249 12.105 12.701 12.568 11.613 10.286 9.318 9.212 9.857 10.617 10.828 10.330 9.597 9.360 10.009 11.234 12.194 12.102 10.815 8.985 7.675 + 12.820 12.556 12.391 12.755 13.773 15.106 16.124 16.292 15.495 14.087 12.646 11.655 11.302 11.520 12.127 12.936 13.726 14.199 14.051 13.165 11.799 10.518 9.872 10.006 10.538 10.864 10.677 10.272 10.332 11.306 12.879 14.022 13.685 11.640 8.819 6.808 + 12.484 12.316 12.164 12.299 12.916 13.965 15.092 15.747 15.449 14.069 11.972 9.888 8.589 8.514 9.581 11.254 12.808 13.655 13.557 12.655 11.353 10.111 9.252 8.862 8.819 8.928 9.078 9.302 9.694 10.237 10.684 10.643 9.829 8.332 6.677 5.591 + 12.606 12.314 12.028 12.123 12.765 13.773 14.711 15.114 14.713 13.539 11.901 10.286 9.212 9.050 9.847 11.247 12.613 13.328 13.130 12.247 11.219 10.529 10.293 10.249 10.043 9.564 9.065 8.970 9.506 10.467 11.276 11.315 10.312 8.525 6.640 5.443 + 12.256 12.102 11.877 11.781 12.092 12.957 14.160 15.098 15.096 13.897 11.931 10.127 9.343 9.832 11.140 12.464 13.185 13.152 12.601 11.857 11.120 10.460 9.916 9.540 9.343 9.249 9.169 9.139 9.338 9.895 10.638 11.056 10.607 9.186 7.354 6.070 + 12.372 12.100 11.722 11.543 11.885 12.868 14.209 15.260 15.353 14.253 12.400 10.700 9.975 10.467 11.735 12.994 13.628 13.485 12.816 11.991 11.249 10.651 10.168 9.773 9.459 9.219 9.082 9.149 9.557 10.317 11.153 11.542 11.015 9.555 7.746 6.501 + 12.538 12.268 11.894 11.718 12.059 13.042 14.419 15.588 15.895 15.052 13.396 11.744 10.919 11.254 12.412 13.641 14.259 14.025 13.182 12.203 11.464 11.064 10.864 10.649 10.295 9.852 9.524 9.564 10.113 11.044 11.927 12.196 11.473 9.861 7.999 6.758 + 12.697 12.502 12.215 12.064 12.355 13.270 14.631 15.866 16.285 15.550 13.970 12.376 11.613 12.003 13.174 14.339 14.825 14.440 13.489 12.493 11.851 11.663 11.751 11.803 11.545 10.902 10.093 9.583 9.826 10.916 12.366 13.272 12.854 11.040 8.654 6.982 + 12.710 12.539 12.268 12.096 12.321 13.159 14.485 15.756 16.267 15.625 14.093 12.506 11.759 12.231 13.537 14.809 15.269 14.694 13.476 12.293 11.666 11.690 12.070 12.354 12.215 11.625 10.870 10.400 10.578 11.417 12.487 13.097 12.700 11.288 9.491 8.249 + 12.659 12.516 12.272 12.098 12.291 13.098 14.420 15.719 16.268 15.658 14.161 12.636 11.981 12.526 13.822 14.964 15.216 14.460 13.191 12.128 11.740 12.026 12.591 12.934 12.714 11.920 10.874 10.092 10.021 10.750 11.870 12.634 12.398 11.078 9.294 8.034 + 12.377 12.274 12.049 11.824 11.930 12.702 14.100 15.536 16.169 15.512 13.888 12.286 11.695 12.392 13.767 14.796 14.778 13.774 12.451 11.545 11.385 11.787 12.296 12.490 12.165 11.367 10.361 9.575 9.441 10.128 11.320 12.277 12.262 11.082 9.325 8.042 + 12.268 12.143 11.891 11.658 11.791 12.611 14.044 15.464 16.025 15.286 13.637 12.105 11.641 12.427 13.764 14.623 14.396 13.272 11.986 11.233 11.222 11.672 12.120 12.229 11.892 11.183 10.308 9.604 9.456 10.067 11.198 12.173 12.259 11.220 9.587 8.373 + 12.401 12.262 11.997 11.770 11.932 12.790 14.242 15.643 16.150 15.354 13.686 12.199 11.826 12.695 14.048 14.822 14.433 13.137 11.745 10.989 11.059 11.620 12.157 12.323 12.039 11.402 10.607 9.929 9.688 10.075 10.928 11.705 11.785 10.940 9.593 8.585 + 12.523 12.420 12.196 11.982 12.121 12.935 14.333 15.668 16.096 15.238 13.580 12.201 11.990 12.969 14.284 14.884 14.308 12.960 11.698 11.150 11.333 11.810 12.121 12.085 11.752 11.226 10.587 10.002 9.768 10.131 10.964 11.663 11.496 10.203 8.333 6.968 + 12.808 12.622 12.297 12.037 12.197 13.041 14.403 15.618 15.911 15.006 13.436 12.226 12.132 13.064 14.163 14.491 13.735 12.384 11.264 10.898 11.217 11.771 12.159 12.243 12.054 11.610 10.919 10.158 9.725 9.991 10.879 11.730 11.693 10.421 8.479 7.036 + 12.903 12.557 12.046 11.719 11.967 12.941 14.330 15.427 15.579 14.696 13.396 12.575 12.715 13.502 14.086 13.782 12.615 11.261 10.475 10.527 11.108 11.714 12.062 12.168 12.088 11.713 10.890 9.763 8.886 8.864 9.768 10.889 11.184 10.126 8.234 6.766 + 12.852 12.288 11.557 11.229 11.694 12.885 14.270 15.144 15.089 14.260 13.283 12.800 12.995 13.471 13.571 12.905 11.647 10.382 9.672 9.694 10.225 10.910 11.507 11.912 12.019 11.663 10.769 9.584 8.674 8.568 9.314 10.326 10.766 10.198 8.969 7.980 + 12.692 11.893 10.962 10.716 11.486 12.885 14.123 14.607 14.330 13.780 13.472 13.529 13.633 13.343 12.492 11.324 10.293 9.731 9.667 9.911 10.277 10.708 11.206 11.668 11.827 11.417 10.421 9.196 8.311 8.185 8.792 9.665 10.217 10.150 9.643 9.186 + 12.596 11.736 10.725 10.381 10.964 12.030 12.900 13.264 13.366 13.615 14.042 14.152 13.348 11.544 9.386 7.846 7.532 8.271 9.317 9.959 10.019 9.836 9.854 10.188 10.551 10.531 9.942 8.950 7.933 7.237 7.037 7.342 8.051 8.978 9.856 10.394 + 11.829 11.335 10.681 10.263 10.239 10.476 10.761 11.027 11.355 11.755 11.981 11.618 10.440 8.703 7.093 6.284 6.458 7.186 7.774 7.805 7.436 7.209 7.563 8.446 9.337 9.647 9.140 8.093 7.082 6.616 6.871 7.680 8.702 9.629 10.283 10.610 + 8.721 8.392 7.895 7.472 7.327 7.521 7.940 8.351 8.538 8.410 8.028 7.547 7.120 6.843 6.749 6.840 7.080 7.387 7.646 7.783 7.843 7.991 8.382 8.973 9.469 9.475 8.808 7.714 6.787 6.588 7.248 8.353 9.243 9.489 9.186 8.818 + 8.414 7.976 7.265 6.541 6.057 5.967 6.279 6.863 7.505 7.980 8.124 7.894 7.398 6.865 6.543 6.575 6.902 7.285 7.449 7.277 6.911 6.678 6.854 7.438 8.119 8.467 8.251 7.627 7.046 6.939 7.400 8.116 8.614 8.613 8.232 7.871 + 9.970 8.920 7.367 6.063 5.520 5.778 6.492 7.230 7.713 7.881 7.788 7.507 7.113 6.737 6.556 6.685 7.056 7.408 7.455 7.112 6.592 6.272 6.416 6.969 7.587 7.901 7.797 7.497 7.383 7.691 8.307 8.840 8.900 8.388 7.595 7.012 + 10.206 8.980 7.432 6.612 6.874 7.658 8.053 7.598 6.617 5.837 5.708 6.058 6.365 6.307 6.056 6.043 6.474 7.092 7.420 7.234 6.792 6.599 6.925 7.553 7.978 7.867 7.367 6.974 7.114 7.805 8.662 9.212 9.213 8.769 8.195 7.813 + 9.862 8.960 7.728 6.900 6.859 7.398 7.920 7.906 7.288 6.453 5.906 5.877 6.183 6.432 6.370 6.089 5.912 6.102 6.635 7.240 7.652 7.830 7.952 8.193 8.518 8.692 8.518 8.084 7.773 7.975 8.746 9.706 10.296 10.208 9.634 9.118 + 9.282 9.020 8.483 7.730 6.948 6.392 6.217 6.361 6.588 6.680 6.592 6.462 6.450 6.575 6.701 6.681 6.517 6.389 6.513 6.967 7.628 8.264 8.683 8.815 8.685 8.360 7.943 7.597 7.543 7.943 8.755 9.694 10.385 10.608 10.455 10.241 + 9.050 8.603 7.905 7.239 6.827 6.738 6.888 7.106 7.231 7.169 6.926 6.594 6.321 6.235 6.373 6.645 6.885 6.969 6.923 6.927 7.189 7.760 8.452 8.914 8.868 8.308 7.548 7.043 7.122 7.795 8.757 9.579 9.950 9.838 9.466 9.165 + 9.526 8.475 7.104 6.286 6.357 6.919 7.266 6.998 6.318 5.761 5.684 5.973 6.224 6.166 5.909 5.793 6.028 6.478 6.821 6.890 6.865 7.108 7.789 8.663 9.228 9.122 8.444 7.706 7.462 7.917 8.796 9.569 9.808 9.454 8.810 8.329 + 9.483 9.172 8.657 8.105 7.673 7.462 7.486 7.668 7.855 7.866 7.584 7.047 6.462 6.098 6.113 6.428 6.778 6.911 6.794 6.659 6.814 7.375 8.136 8.685 8.708 8.231 7.619 7.329 7.600 8.318 9.118 9.636 9.711 9.431 9.036 8.767 + 9.570 9.104 8.349 7.609 7.216 7.388 8.094 9.037 9.771 9.934 9.453 8.595 7.805 7.431 7.514 7.787 7.878 7.586 7.028 6.554 6.500 6.949 7.668 8.264 8.435 8.159 7.678 7.335 7.357 7.738 8.284 8.745 8.961 8.928 8.764 8.630 + 9.116 8.575 7.793 7.216 7.202 7.828 8.834 9.758 10.185 9.978 9.347 8.706 8.404 8.510 8.776 8.824 8.421 7.653 6.875 6.482 6.652 7.230 7.840 8.122 7.946 7.458 6.958 6.702 6.774 7.089 7.491 7.861 8.162 8.400 8.581 8.684 + 7.851 7.423 6.883 6.675 7.100 8.143 9.472 10.612 11.189 11.109 10.584 10.006 9.723 9.844 10.173 10.318 9.939 8.977 7.730 6.699 6.291 6.566 7.208 7.733 7.805 7.427 6.894 6.561 6.600 6.915 7.251 7.384 7.248 6.938 6.615 6.418 + 8.711 8.162 7.425 7.045 7.449 8.686 10.339 11.710 12.191 11.622 10.404 9.261 8.805 9.173 9.976 10.575 10.489 9.669 8.473 7.413 6.858 6.867 7.226 7.604 7.730 7.509 7.044 6.572 6.334 6.438 6.779 7.091 7.113 6.768 6.237 5.846 + 7.101 7.054 7.044 7.229 7.783 8.780 10.066 11.256 11.892 11.710 10.838 9.764 9.068 9.068 9.630 10.253 10.388 9.771 8.571 7.274 6.395 6.201 6.592 7.194 7.580 7.502 7.006 6.383 5.979 5.987 6.335 6.741 6.903 6.709 6.304 5.985 + 8.640 7.851 6.874 6.477 7.057 8.405 9.907 10.975 11.358 11.154 10.612 9.952 9.337 8.922 8.839 9.068 9.341 9.239 8.486 7.223 6.004 5.461 5.849 6.837 7.718 7.890 7.267 6.310 5.667 5.712 6.303 6.916 7.039 6.526 5.686 5.063 + 7.978 7.357 6.633 6.453 7.126 8.424 9.777 10.662 10.881 10.568 9.999 9.412 8.959 8.741 8.794 9.019 9.146 8.857 8.029 6.908 6.020 5.836 6.420 7.349 7.979 7.883 7.125 6.180 5.584 5.575 5.973 6.362 6.386 5.982 5.385 4.956 + 8.342 7.676 6.919 6.785 7.582 9.003 10.354 11.032 10.864 10.117 9.243 8.607 8.373 8.527 8.930 9.333 9.417 8.931 7.893 6.676 5.844 5.805 6.510 7.452 7.999 7.814 7.062 6.253 5.861 6.009 6.430 6.699 6.531 5.947 5.232 4.753 + 6.822 6.821 6.922 7.282 8.025 9.125 10.339 11.246 11.424 10.702 9.331 7.924 7.161 7.387 8.374 9.424 9.790 9.143 7.789 6.468 5.863 6.163 6.973 7.623 7.634 7.020 6.215 5.728 5.787 6.222 6.632 6.672 6.252 5.543 4.842 4.418 + 6.817 6.617 6.408 6.480 7.055 8.137 9.445 10.499 10.840 10.293 9.097 7.824 7.085 7.182 7.929 8.752 9.027 8.454 7.240 5.967 5.242 5.345 6.088 6.959 7.443 7.316 6.734 6.084 5.721 5.758 6.028 6.226 6.112 5.668 5.100 4.709 + 4.882 5.192 5.652 6.112 6.605 7.303 8.284 9.311 9.879 9.559 8.381 6.949 6.108 6.382 7.577 8.874 9.358 8.633 7.067 5.521 4.766 5.011 5.850 6.624 6.882 6.619 6.165 5.866 5.834 5.931 5.950 5.800 5.556 5.352 5.258 5.240 + 6.038 5.910 5.674 5.433 5.409 5.835 6.764 7.937 8.860 9.102 8.592 7.706 7.036 6.987 7.491 8.051 8.093 7.372 6.149 5.021 4.529 4.826 5.612 6.355 6.626 6.335 5.722 5.161 4.922 5.041 5.348 5.601 5.642 5.463 5.192 4.998 + 6.520 5.978 5.335 5.156 5.731 6.890 8.147 8.999 9.188 8.765 8.008 7.292 6.960 7.186 7.852 8.525 8.647 7.888 6.437 4.969 4.240 4.568 5.599 6.556 6.797 6.247 5.383 4.812 4.810 5.187 5.538 5.600 5.418 5.205 5.104 5.095 + 7.327 6.849 6.208 5.862 6.139 7.041 8.216 9.145 9.427 9.012 8.229 7.585 7.450 7.830 8.365 8.569 8.141 7.162 6.036 5.237 5.025 5.312 5.761 6.026 5.952 5.636 5.310 5.163 5.229 5.403 5.541 5.567 5.494 5.392 5.313 5.277 + 6.619 5.904 5.007 4.629 5.168 6.446 7.824 8.622 8.552 7.860 7.120 6.826 7.081 7.600 7.959 7.905 7.472 6.884 6.352 5.954 5.680 5.529 5.537 5.702 5.895 5.899 5.577 5.037 4.618 4.648 5.168 5.854 6.235 6.059 5.496 5.018 + 5.987 6.179 6.396 6.498 6.544 6.733 7.157 7.636 7.829 7.558 7.027 6.696 6.890 7.502 8.052 8.081 7.511 6.672 5.988 5.644 5.528 5.453 5.386 5.444 5.668 5.872 5.768 5.275 4.694 4.507 4.945 5.721 6.225 6.037 5.315 4.678 + 6.564 6.573 6.601 6.710 7.001 7.517 8.127 8.523 8.413 7.774 6.948 6.440 6.558 7.159 7.741 7.808 7.233 6.329 5.588 5.332 5.528 5.897 6.161 6.204 6.063 5.816 5.521 5.250 5.118 5.235 5.574 5.918 5.978 5.623 5.026 4.570 + 6.768 6.763 6.883 7.258 7.867 8.499 8.852 8.721 8.127 7.306 6.587 6.229 6.312 6.725 7.219 7.509 7.396 6.860 6.107 5.488 5.331 5.735 6.485 7.151 7.339 6.952 6.270 5.783 5.880 6.584 7.516 8.117 7.993 7.163 6.063 5.300 + 6.182 6.253 6.602 7.368 8.349 9.029 8.928 7.975 6.591 5.400 4.822 4.871 5.280 5.780 6.255 6.670 6.930 6.872 6.458 5.955 5.873 6.612 8.085 9.660 10.533 10.287 9.213 8.137 7.846 8.549 9.729 10.498 10.190 8.806 7.021 5.792 + 5.889 5.537 5.547 6.616 8.636 10.606 11.345 10.403 8.392 6.484 5.530 5.564 6.015 6.324 6.372 6.370 6.462 6.500 6.261 5.834 5.723 6.477 8.144 10.064 11.261 11.155 10.012 8.761 8.313 8.922 10.034 10.721 10.327 8.894 7.112 5.905 + 6.911 6.582 6.667 7.833 9.843 11.534 11.701 10.108 7.731 5.999 5.703 6.495 7.346 7.475 6.912 6.260 6.008 6.108 6.172 6.042 6.075 6.831 8.450 10.342 11.538 11.433 10.294 9.080 8.726 9.460 10.677 11.406 10.996 9.522 7.708 6.488 + 7.064 7.137 7.624 8.798 10.433 11.784 12.062 11.016 9.155 7.408 6.501 6.525 7.006 7.353 7.285 6.921 6.552 6.363 6.367 6.561 7.060 8.031 9.449 10.935 11.886 11.871 10.992 9.889 9.337 9.700 10.633 11.296 10.935 9.438 7.474 6.103 + 8.336 8.012 7.997 8.901 10.607 12.190 12.574 11.368 9.188 7.188 6.227 6.354 6.966 7.400 7.422 7.223 7.075 7.043 7.047 7.122 7.547 8.617 10.269 11.939 12.860 12.622 11.527 10.421 10.104 10.754 11.797 12.301 11.618 9.820 7.686 6.259 + 7.355 7.148 7.314 8.401 10.274 12.038 12.648 11.686 9.678 7.679 6.520 6.327 6.641 6.932 7.002 6.987 7.051 7.182 7.274 7.380 7.787 8.783 10.288 11.750 12.459 12.086 10.991 10.020 9.922 10.803 12.040 12.694 12.136 10.454 8.422 7.057 + 7.224 7.554 8.359 9.688 11.246 12.429 12.656 11.761 10.121 8.427 7.252 6.768 6.764 6.909 6.994 6.991 6.951 6.905 6.887 7.027 7.546 8.595 10.033 11.374 12.023 11.685 10.641 9.641 9.439 10.261 11.601 12.509 12.213 10.654 8.588 7.145 diff --git a/test/regression/chan3.2chan.wav b/test/regression/chan3.2chan.wav new file mode 100644 index 0000000000000000000000000000000000000000..fcc8b69b46f11c9002cf8fa1ca8540da28dae330 GIT binary patch literal 920476 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⁣E={dbhtJ0dpo5axv{NjER=nEA& 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%0Dmo6^-j9Ptj zYx3VMso!XcE~P2wrajGhLB_Q$qAjBB;D3uaGtU_79-trh2mKSJdW}4+woWdfEByqF zjicEp3Y5pPW6|0=*1=vy%({(wh7o85t(l$=+JO3?dANC?B{r9BoapPh{~iSTF>-nO zB-6svg50fnGwqAE+Z?gJ+pp*b-Sgb*ZwKZ+)Wppu7wO#k6U?Oc`g?G0?%douxZiSu zobjBuVyy55z1;l%Px@QVpl_5pD089u{>}?I41H!_)AxD{J^v>lh#9dh`r*~+$*j%! zspzMoGYZcryq{iRFBZO7cpd0a+@ZL6mF88xpdLyN(Y11bJhi@oKKt&n-DO9mj!M-i zs}b}W)?Vok7<>90=qKF`T+dl%Pf$a@ zob$`{HO-e-A&zQ7&#sGe7juI5qTI`zkK2-Z!wx_n&NU)uJ(yly&S%%EHo=%${~5DX zX$*1_eNxuJk-6^c0eR95)K|y_yRT?RwaXK!$*`8oaW}rx$r(-Wzgs~hFB0^A`I7us zLu$8Yf_BtJML{vT)g_rFnGMu)xEE;KkDy=2;YEiREy!Pxe_s5&_&>$}6xT1TU-(e* zL&ZI+^{7^p{y64Z9!xx#kS~&Zlh>|QQmdpF`ri7b^-C9}7Ny#f;~d5rV(Jy#oAW6Q zt3&;&`GLvcZO(!{8l)rXh}x3R@;=LJPVPekbrqBFgqQ;RvXwFk92 zaxPzx_tW_HjrC=vwvEY`91o5L*Kn3%S)?qYhR{8!4z<|t(f9vGbjXJTUo)18W!j@1 z>jMYp_^ty7spr2bd{dy$85SKzSEdJ0`rHzY@Uekj_VQ43@Wp(t^7=dJ#iORdy+U8e z*vPTFl|FAbfN|vZr&1UCI{JP0zOSeue*n(vd(Z`#%XMDJH+H6HxIXk|dOQ_pi?fe{ zC&{nsPx_4Ih0Rs_I`4v|!2j<_9i}-${ih-1yIs$d={I0L!2S6_YCdA+v7pzidyx6$ zqw|l>HwSxZ;?hLlDt)Vbng3;ei=q}q&sKf5Y7pn-AD_R6T4Z12-N?HU^BvcgU0YU- zUf>5x4wSgwwr96z$CQmJ)2Dm6^5sgo0(sx7z$={b*Cx@1jBoSA63$mD0Bs{}gL5Pr z(&M57{fHkzU)u+qTy}C<%XG{1d*GVXH9-&B5_;nD7^rWb-(Iwu6>WmBH zmw>72d527!r z8?8%~&eVW^S%ea(mQF{tm-pL|6(V9ul;FwS+HC!jZw zZ!^X>=2sW+DUhpno*3WCmuhd!eOa?NkN(u7;-lh&stl?!FFr4RPr*F}$>LA>X#i(&EDJ9SUxxm2ada`t@mJ_{_Y&PuuZ-S>=IvvkEtk{&8tuv& zbYbR0}nNB*u)Dlc-D^AGty1U0wvZ02#Sb1)|$2XjUG zigXy%<4oq+rL#+4<(%MnHl8&fYpf|}qK~hC{0Yba^PNk8oTPi^X3oFXht@wg2ipiv zN$#;Gc}KN<`e*II#o3Fq-7?)W(Ofhb8?_0>v2uKu(0|1}?ybmMK@PoDv{e*odsJWd zW$-6Cwc%h9XHEEQjl1@v)4K(jOQ zHSvGaGe>@TJ&;=)1msral++y-mKTR-_ZPJNibS(dXTGq!bv#yFbarPlM|p440v8l$()DIvFfLW7sR+EB;lyrOP`_qGxk$>LtEGPvBfJUX)ioh8W%FX|CA(jB`SR zYaZZ1@FKcd`Ca|0E}Jc;{<_kI<44Y($|fj5Bfr!K*m(fMi} ztF;#fF^ALB&kyfQj@oCt0vL1b0>%bD&xOGK+za%%seh6a)Hkx$$FXP*+!s56N#JvO z-pHwM1-_Qo(E^y~Pz&eR`fTzB)<4Mu9S`)Et#y<0G)B~(HULGyc<3CUu1=rGyw&%> zx#9k3o>To@6VL|8ak)nuC*B8)0o7|h1LRfoWz1=L%|4gfpbVjV3Glh3DpSE(>b_n} zpr-!NYr2=J4^;ape0{Y8{`^s(f9Utxu8+VwK#kyhpdbASa85YK#3R6Ku?M8SODo_r zm6&zDdY_KHKBhTO=a0Ohd8zY(dLucf)}RfLAMqJG=l%L*&G0>|1t)$e-(=Ytpq9ADSAdRe)%-9R5uF5*IPEzsxE9(fI3vwM-B{h8NxGtdV& zrq(WbPkuJ{CAZib_?%Az>iEtE#_j%GeYE!^4*j3+eJb$xzK;Lb8K@_`1Y8f)l&Sf; z0bBv(bS?vaEvIe_Xf9Fo0k;6>sn>o#@cOlx&Li!RJn*f+x##t{UX42sP=li`L%v7* zHx*0)Wx}5B%_TwOQKj^RznfaP9foIi_uJ zUih=qf!E^SI>)s+J}+&i&*(egSorx6yl-O#pSkb(e?Pn)pOx3s}w^OW?C}Ec{z-tFNIw)&?JXUe0Uht~xmV6xWRXUcKL);9uY~7p{B9*n9AM$ICGl zUXx?!-+P_@ufBly?C%c!t@hXX;S*Y~4TVff~ST_Z}R} z99*}1jC0Ykk<+LK93#JX-XF44?pg9E-kV&8bHmU6tzY{*98>dT?(?os^WCmdZJeK7 zn~t&T$~EmgYYcpC-`hFq{d#XcZ=aFR-p@V{pQ+bspyYiVnz!EXF~Do^{{7mq@cNxQ z{-1E(`uff#*OAZJpF5|0fA7QBa(~kHI0wBS?V0zaT@pS|-^b_e{rmiV9k1WDcxX+U zUvmEYp8nk5J6^t*w*Sz*ct2i)zju!Ld)J)s?|kNti|^z8IJaH@2Z7JZ`EY1{{f34_ zo8laEJ@|9~#^>jKJO2;a5TCKv=$z6v`1gx}dx`VZ_2uhq0RFAlC%jjmm2=AH;2J#= zc#YnR^UC{n-ui#e<3oO>ujln?8@+D*ALq8eKV&zYd(Kbisn5Xsc3nB<&SAe6{@tMu zpPO^pG4{Rv>}z_jJ}1Y-zw!DV1MRTadgwKLAIHP@^>>H<)~|i7Lv!ZP-#Z3ABiDp` zh`CGmZ1+ZMNZzIoU>$Vj?)lb=ZKXy+|KIoaI=`UC>mtrFUI6+Cav^7j&JHc6-^>@} zGtF5WLpzuMLpP`|aWou@`}(iMNzOg}EAz45r@qkBK>Il=G%6IqK{md8iTWF)#=-UJ z3+wZkx6p^u*9h^UCSfKpuURcrEp!z48XrV{q8CsFn!+1GH-wI(#!G#q{)4%qwZNRc zc}Den)*a~Y{fNHAyqj@t30f+BXnpR6U@5$!JjBbKU$TJu_6fk(aIUzPjP3eShbHgg z96z4=1otj;^&_Y;aSs23R>?VF{f6_=xvPzpQ*+;1O1-r=>uc0gOImo4}0Ub^KhCGgWE_1-<%DndN^!e>cuj^UB{D~aB`Qh(@ znntluqZ2j}uC@O?MZx59O@3EWLSLyeQqb0+u_5tB?2VZ5<(-B7UmXg-bYi@3eJ@Eq05d50jyIa9V&Kw-hx#Ru8 z@${kg8jb}I17l0=ig`wJ+s^_yXmt+q<8qQdhrZ}bjW4u0D?=+o)&yS)KIU9l`C@Z- zaYOMsli{POwb+L;?cBXA+-Gst64 z21gYfRWLMvX#Rxcgyh!zt@)W`COIfED6yEHIp2_LP&4CtcO5te>S*Vt=BBPsU!VRO z+yvx|%^SW*Z;jpb*3y@pN{&G7&>rAe%hA>YAH+W3-7ky{=Iq)p>2=s5+#>9r{uw=2 z%{QuXpGyDIr!r4vR?<7OWu|3jK6sV$1*TIoGLSmUzo{coKk2hS4PD|s(4G1$^#sSo zjtg{%cX2+d{A)9`yCF@Ug7)Bn&ytwBVXg}1zJV%e4ahY-duTNTEdI-z`a)}=U^S#K?%by4H zfa`4oxCE`@qaa(6tx%U@?&L_IUdkMfxk~xk)6o~-M6W>gOxBFPPT$41BX36vlZDA6 z^N-A5TClWWXmV)MJc7OLPNmmsAtwcVM1M(rk6+MZxgWlndowo|9sXnK$I@HMwv;`S zdM5Qv=9|o-?4s-g=#|_D)xktUk&PuGue;N|d0GwDN=h$ezO#hl2T z$f=y)>{#9gc7}F_^dqW+cJ!5SPgZ~MDYXm70r}Ym)IpdBS^(5#{SKUav*>;D2YT=` zI153pxic6FtRrX{Z5j0498CqAvFL8_6u74Hno7sSJjCam_fSTS(r?sK?xL1hZd4vp z{fR!7ezm&%2J~QW0ki|gz~)Ev!(6A`KnLKyWNt{F&zz^Z=-r?M+(GXDCa@mO{c128 zZSPs&ChFDHUM-I$3zZF)`{3bnz?uOUU_G_PJP-}JsxB^_unLEqDOmI8(UXGQ#hU;hr{c6>jIR@_m z`FJE-u`bar(FW90S*v0m!#z$;q;Eyviaqq<_?7dqMgr&M`RH<{g1^9F)F`O?3FaOC zk6LVP_+OxVxI6E*B79=xL^52-NV{;m@U@|9LrXYENgu-4PJT^2(+!+GYQCunXFRn9 zBZ2c@{-X(fz4Q_0(ZfF*&Ia0~Pw4afXZTN46^XEZnem-|gFcp=-pOd?UBg?^Yz_r- z?6rWr@>*(W)I7LnsiXII%fUQgPE7r#=am=_%V&Ch=3M0VA3A-&Xnl=M+zYAz^=bulC z^#rZx+xR6o0xhQFVf-qO;xls(R@0-8IgZ|d&46=4&QE=c0YhD&-)@lj7tps;M;Xe#-y%u zV=Ko@Zs!ocV_fweFpiTa(Rb8l`2X#Je5bE3E(P*+a%%Dy#+Jrx#)96nv59lg{oXv% z`@o+WFZ$uV8ZWzl`Z{ui@@HPV9GpC^+>Y<-wR&&H<&LQ_nfGlxX6$8*?7exf`h>=O zK4ag{=Or)cv(s;vi@oiCFjsVl&oq}Lm#GHLSmz_~3GiOzUc3gcU9L)wM=sXqHxU@~ zYmfDRoqJxhF*{Q!(3E*Ua)S1~GY=|{Y_3v`p&AEctS!K}Xd8%zqK1;819=Am4X`#| z|JuDrzg^BqAKtO@xti~nulF8D0^3kl(u6YHYpU>UBSl{2VkyDln^_t|v5ApZL0`4*X%=zcM^y3iU;y5~|Tpy03_fa4C zbK_yxh0j@EQ!ZT|&AIO!8Veo+<`v|sjX&g3&82vqj+=AtZ{P!L42)^zV6+FWL7$)b z0DUm$i*wNXaUNd)j7bmut@F>Z^KZS+8-f3?opmkCANx0s$N%Lr%x%a^$unqs{N6Pu z4)IK`DS2tH&walGaBVt|U8~MtuTKt@P&PQ5&F6oJ&pX8F`PupJ^VH60e|&A>eH?mC z*RC+eGp_Ky8v&oa@8M_f!Ex{!<=DI?$577P`*jYx_PuX^CVV~b-}`hu%A0xJaxKP< zUY|UYw!|3Pb?+9rRd?UaAg_W2slOYg(i zbWUj-{rMpn8+i@>&jujZs}1+H{48A0+Am+*Iq2W`x7uXqlxtr*;Li@(01x^EqfAeKyWX$3z>@iSsVo0ByhinK^6s%>%&w&iL8=Lax+#ZJt0*NW0{i zd!NoN$JsG+e)$~bnH*blXFaIpGVklyu12S8%)J%7M;)H;>o~jS zC+DNj!F%>~9|gXTWA1o34%!CilxxC$)-m^gwV^&6$HjH2O>(Tvqxt{ZIG>}>#&LGc zT=Uuh-`D#xu5{kG2YbKHRrg}oxc-NB)89Fs=I{JJ?OFri-+IsfpYzSv^5@QbzxQ=r zla9CfAnlQyxZ~qJ`Aq$}>(ifkAKEr^2JW4%xkJy=XX5p08{|NJhH88c*%sG>&)o5K zzi_{HU(}Cs-McUPd&kGG{eN@paNc+c7`@84&v z&210N?V1yD>~93_Uyi@)O}HMk%f7C2+yC{syBE6#Tu1(1dvquV-ZyYKnhzJ}bR zd%DlUx!_v&{T(x(nfLGCIUih;zPEe3w%I+w@%4Xvf4_Eb*G{{Re74@7@9AqhCw%t4 zo_w?Wj=%GN90R#j?SgaDTFYUnUCaKBKFEGFE`F~MD*t&XHgf#6GaIQ3 zvY!cMt)UWP=sM_Ntq1VEyiel^;|=GnzK@*z2+r|35}Xch1KM3VSO2e=dNKKWd0p-7 zSHSmJ46dd=%)j#)xbC#wJ~M4Z8t7v>PQI^eSMG5RaL-u@Twijg=D?l9&MkFpK6CAr zdxrkC9Fk+%2>3qwY38(zQG6CR0`0nW;@TGXO7$J)i+o1%y7JJz=CN>@izAC8Ptj-O zMtYU30`BAbH12=eNI67(c*kls@O9-Tr=ii8k5g~)59c8n6UyCc2Tldn?A-`Tfp%Pf z&UNqj`y7rz%PBvlZ|S{UPW_es_*Br18oZw18PE~P@4O7ulequ5c3uM3_}R~_7qOsm zg<2*#^LgM-Fp>Vva@lj~Vcd{@aq^vU@H2ReUbS+n^Qign0b*bT_#19-IOp6qK!^A$ z{ek4a&jH)f`>JP~0P3T?Qs*v@?`vH_A5D2M-_IJ|=|G+9Y@p3_A9jv;{b9sra$)9L z%l7>fy2ff`UaQ4^Npb$I&7K3$QYIthU>)Sc2Z86?) z4?K(hZ;c|2BJHXBQ{(1(*+$*nRp4Cox9W$?b6f!Q>E(FTpv^^h?3l{^nrBki;#@Jl za86_@G8Kd9?O<*}o0SM9Lia}QjaS*L*`=`p-1x+ypV<{{1@H*;_c|xF(58U@+f#B{zUwH_`;jPDX~*xo57v&JL9`J8|M@7Z}i`2lUS2j zXUNE-Rp-`Pa!h{$`5edF zXZslSo@y4S&;xQ6wMFlNa&M{aB zno{$t4l`Aes?gT-qvw`6xo1PqhO|}kLVL4&v%^3yAa8s=I3ayPx}>zEv|CBHk_Qhw zc;NAUkMHA{^1YqF>fNh%CwC=xb>Go_$7fqV+xo~qkNk5a=)bxD<~f_@Y}&nf_vZh$ z{I}(!tsiaOwQbk7x&O}nx7(g>dphs$yuVdxtJ3M&=~?q;b0c#jb2wYJUw*&*C51~0 z?ZwipMzb2zt52_fc8#-ZoDP=MTvGF@!>&54ea-eYH&xqIt!9;)RhEG7i@q-!nLjdr zYhr7nalCPSa&&Uk@qHR}ps(R}P#7shJ$PyG9!C`(Rd`+Tb;X^*MsPPcx5~Lyz5}bO zuB!T3&ChC{e)#E!_dBfLVWWVJh3*0EYPPF+HaPO|BMzg_Tl!7H4(IzBc&)-2jAT02}j+<|%(_lV!n96m)Koy+J` z8cWC0XO*5+ItFwBT@Q9W_}GER4s6@IZSTFi@7?`5coBTL=gU2<_qE=)de7=TN9{do z@7R4~_r1CI&AkV}S^Lh~H+28d{XZT2>0mW5cmLe|eGl|K&~ty!{U7Z6VBfd>ad!(Eh6rUVX4lNt=?l54?S#2poIx z*n{1`nI&hIEKe;@)#R*^r&CX-dZc@#cY?*4#hK2z&i@}%=K){S{r~^wj^y6##3qS| zz166yRimh)D79+TD7C6ot7>mW=|F4LZf%P8OYPdVXAs1U?45gaSNeZF@6UZa{+^GA zdvnLR=X}m*y!Xdj!x^1~xnZQhKf>J8Lg4G7UQ#z<5N*Uf^E`7G|1SQ|v^PSuCE7C3 zI?%d7^<_~2*`sZ+b+C1*NDN2}V3MUiRuAQwc2fQkIRM1%dvz174dga2Rt)$js@gl( zG1qaxe!$*FT(n)Z8AbX0^7#Yv2IjTOZIzpylbzE%uX)}_;)JN3Upqg<7GgVQKW2}2 z#5=J2)>N$@;+FA+Aj2b5IsKe|9E@D`zeN-6alKQy%gE}dRD*G|KtDicdP})0*wHu0 zmsDE}RbIw>@);afuGntHa(^H^E|06K>Y*~Xv#y>poH7u`rV_ObS{wh*f=t1bMC6tx0s1&q`_EN>`Jix}V>LH(O3LzDq~+9lbi?V2bJ5nGhk=HKh}S&-GaJlhn)FA z69Xp(ZnJE&obW&4KhiwXd{;To8%1ML(^%7pjD+og80a8@EQ{VWM71~CXn#=hXs?T( z#SlTf`G=}26KV=I{UkPvGGd8pBqB3m|9wZX_#MUD!e5X_g53$f6gFMtp(O%+5}gSd z8Q+X1xP zeU1p_cs(#YFl;hyGPPCC;#vggkC`JjZ>i^6aNupyw$AGn>P~eYlU~OP^3HE4Vua*zR zG_grM5iNsT24533Lu!VM64Y)C)xQtLE^$*V5G_SgNK(j0;$HB*;9BC#pf7{g1+EJu z=X!@_hlSsrsG9zzwEyDw@_VsfFt5*7J*CU;%kE09O0GqYMUKjal?%_?&fC~aGEh9u zf1J-)+$Q?l`rD}M$Q)-Wv=j~!>%}wC*wNUrNkluNwQKioXJc1m*B%k2e54-)_u!Er z&J2AII}dtgPwjL5MD$f%2UXk9j#Bru15<)`FGh6P^D%a^TLd-*`Yt{q>?e;EQ!r6TJ@(e*&egu!y~QEz0a8ZHRxWU|BU#ZKeH=%% zA5nF&*1pyrEPl5AY>N?_3N{rq5*P9>%m6@=QEgW0;NOX2| z_Rhh?KTH)*#M{bm-711rRBn_wEvPp)R-6!wMQY^`-xsP}7-EJ_2y}LA9Mq0M-@=}| zMi9GJO*M+gifsZPuR(ol^D>%-ZqLv_*$zO2&*9Ct3#bToP zSRmKe6X=H7hHUSi^g9$AxKMm9`iqXDwkRf0lpYH9|3QBHp4=fZQA`l%oS%qc!e@K$ z?$_O~vtUktPjq@k8`U0fEE)*b!)l_kC@Yxvk!#pT>9I%@JZF7)BJPSS;-o+)rv40Z zl=uqiD_;nFaro)*ZQ;wo_J@tE*(-R?YYkrcys%|rC&t#UrPgcb#1@C`5&J7PIBZ|o z{P2O|m&4~q?gI8R^!M=sz5Ppp50SVFe2myau(?$gGDoC|=i;Ft7Ut$F z&}W$!c#qE{3u2-0Wn31g1u=uf&oOr`7Wg>GvnNltsURi+dk8j^I6+(-F*lV&tl)3n z$5vDC732rk7Q7cFLIvw9bCX1GZ)_W}Q!hlKcqZ}%dNB4FezS#WCx}%XAgCAikr*bh z2aOP%=McgBy+lvZTM$b^yv4j%Oj8Y>*eoC~v%i93|#u;=IVs#g0k*Aoe%zE$cM#55(s(hwm2H zx#=6&O0k*ZTfxqXpN&3*tc0ByyD&CHU=6@l6eFl9qr^3GP0SBm5AB4H zhwJ9Lu#e(P;5xZx9%&0~>)7D=zVChB<2b~e@EW!`&XJrb+J<9sT;P2kIS$9bZ^8Gt zhumZA(cEur)x^c%3$G$r1F-{#3+%Vpf3XMSlfkx*U*)C1E{|^m{{y}sd?q~l`WnxH z{)cVNcPwmdypErZ@PW`CKJdZNHh>+U@8BcEN5wgCEZWF-p7>m_ zpEAcY*8}a!_~UiodGmSBpLU}?X%o&FpC;p&NBrZw#+deME}E|L0jWf0bb*8UgvWdp=e9q^F8}yZA2oEa&a}$6U(qa(vE-_n22{OXgMlFN|;6qPc2; zBirB~L9VPQh$%(BL6&FSC5XKoFHUGLN$ic!9M2pDg$0Eww{CxAdt`f3 z@T6dcAh4Cv3U7!Mdx||91fS%b2!=3LELp1VAEzd)BbZa;44#ILK~Cwk~P>pAQGu>E1l zC6h~zFE_qi#i)u=En`~7d|&?i@*!et^w#KGVpYtlm=e(?qIZ_wS-MQIGQ~!Rj}HGX z?}NN1Tf|H}K5BGvma$v**r6 zU5L6+_fp+UC$5T{CvHBAe-_{RLF)&eStoK>sbQr$#&nFCRb^I{_v*Y?XKbUfjc&HQ z*>df>Yu{baZ9%t;-Wk2)2gDCZ|2X|)3gv2h?jeJQ4jQ^*@QT6h2euzr>Z4L0P3|+f zPrncQeYmFEnr{6%_v^g#-JS1VYImvKoYr$%uWi1zdDL4`Z|!(v#~VrYlj^Uiv!YJD zn)Pb-uhzdBf?P^$N-Ra0n?^N_Qu&cGElRd1c|7uX8aCGzkDgwmRp`~d0OR3l_$xM zk{|Va(DT8U_rJV<^WM#S`|j?$+xkxHJ7aH+y>PguT2vh z#ZOm%y1Mhq&MQ|%)YYh~8?J1)Qc;{2XRn^UdQ6NJ>x9aIT&r=T#*NZK+u2`laI?Y9 z@Y~_HPYAoXd*|+*fA0Qsch9{&EG74D-M@8z_=omYui>oWyeV#}CKCRl z*F3K&GP$znq}ZkWt8}qdAp4`wGRLANl&ubW!c*Jb}t5?2L!E&A-2VybWo zo9b`>X#UY#6Yg{W&;2vRH`-S*N#Jl_Y+Y=m%oG1wUVcF5ZyOU0YPZw5aU?L*s#4h$O@ zwp5G^9T}P@;=<#?9bt~JB_cI6HS}juLo5qf7LpX46kJiX2x<{@!g|7bOmr9Y$4CB; z{2Pd2qO(A6z9L4&#Rco&J#Vkay1iUVDvWFKRC~`EBy% z3K9>5@0qoeyt8oCXh#ofAc9p#XsPyK`P}uncCY`*MZJ}E@>|w*)^*l&)pS*NR@ZL! z*PNZS?^-i=GgXHx>z<%JrO7|}K~SG&jC+jxZ{KF$7aYnzl;2y-5ZKy!*?QTM3X%%&wOzDdw1+xE_3aK0nd+R? zwD$>d?svovaa*wq{62akb(PUg7YcOD`KlwfL7+#<6{;PpTd8`_60hH%e3Six8b_>I zUBohhK1co{wpwbAuojOoj4{*|4HX;GN_+HT+fZ2fGaDmcqrelA%by8EH`AbTSd zkgtxMObk>l@vcAy<1^?Q$m6W{+@p9wjXe!{Z~erEriNZSj#8#fJp~<%zPj49T04XF zH&qfT#uQ^+)uJka5CFmQ$W3SL&q0zz7!QWWEvHT`10hR!pzfIM%4*47P5B+JSAnphma+-AGcU-In*s7MjsnSsOqHORBdV657`45hxQ`pZ<)a6&RkVq zu~Nj74HVore0!6{Br#ld4>vkDI9mRig$D|M7lXwW+Z9_6 zdk=fF!e)ioKAYQ{+b0xGDC{TJIMz5u3WUV~cYr%hHN@}*yiiThCxZ9^Vq;nf=IZ~c z#%P=;&NEl6P##=u(Zbcjr4RyFTkScrPH_XoSg_!ztNURWqvr1%)k1w_d1OHzz@AuL zb$;!t;A||*R&@QKG!RLSNzfq=>}{+zsqMyTYRtDZ7JG+B}_!hfml{7 za4v8z6;~Wr9L_?gb~3$JxLmcsb}9FbJRS12W)#ivj)hFWOs_q8mftLIu1-6}d=wdr zj3<<1azJ&;u-(0_+TkliH?dm#X=B$Or#f)N@(?#zUVL2iv3779S42$w8`@#*faib* zJJA*8O)>6>gDTQL^10B%wh8L~#+%|z)ED0*?wjtL76&X27%r%}SJznA*vs6@e9Zrt z|3%fxjF3MA{a}ysyM7YbXpmizQ|?+iwZ&S=?Itsr@TE5dJyxU(hf4UDjX5 z?GV)#JFS?jsj7c8$vDZl-MZa+P%xL54k)diX2%6gu}rbF3ThQJ-G93O2j&mV#K{~r z9W`}Vo$fQrzuKfYNOTV31iJ|IA;upv<5%vl-2c;F2(uNjGR8H=72}L?J`z(EkL6Il zB6jfJsz29Dpl@uJADp-zbUy5!`0CrLZtGgZT7yOVHX}osv>e!2lt}t`1e(g+YHr@9w+FF%+bsVU^Q?*M^spgl$KHQx>oxOF= zW~i=THNm`I*In1mn$$&jbsFuLja`r!9&8=xTfu(8e%Si4~= zdh;9c2eS^(5>HhVkb8Vvpr6%Nt~Ys)bp-POZ4f1nXy5sbVv+bxJd!`SyttvduZ_h< z$3{nDVPYYBm%S&>+Rob23(^Zh#FzPB=CkR}|HL;UCpRbep-}ovUNO-@;G0~Uzcjyn zLHh!y_|o>Jt+>6oU8$1xtA$q!IsSC{Opy;*i#fNsMRSX$X|J09sU8&Z1?7~hSl?9N z)LuEjjDgJon*%mkHd%->85cM%5T9|S;7Y-l1^z&7n-Q`qbX91XurguaiszzHc%$&& z1$&eCi0BdVgE%4zMd`@Wk*!5%@v#^#CW+bN6T#mdMQxEEksq;B5Koa7o~GT!mWP)X zTf?@7MTv=_6GQ(F`8%YMxEp*|)kGTvFArKC6dxELc*lCjy9UQtVl0W;>%7ohXbu+% z#spP`Eo)?+$apQoYaj6xd5X+}`^`NbrySW0%A>yTxbLuvR)wt!XV_=h|FZpMLx1il zw&icj4-!lAmgEHqVub38vpHvTrieO1VKmw2#8xp)j1!~9SKVCkmZ)1;x9~T? z2b(yWI3|l@0)O3yVwE@}o(p8V_F||Yz709_zA(8>?uw#;ppS1BH$^$^OOHR5*vnIb z_@e#-n>{t-kR`|sbP8exuniMyiYBYM+827ryx%|-%bOczVVc5zue6~s+Ag+eXNae}qIwO~yf zAn^0`6CaAP0v{lA3gG{HPoM|9E%^6L`RxY|bpv^weQWU55qD2a?19$~cx%^@ zuZRDP{I;h>PrZ5qz8vDtk!=&@Um`AM)+^Sj*6AXVu00Ky>oYx>9@aY6v<{+`z}JPG zgpUhfR!Q-z_(<&0UKqTO--&t?J5>*wykwrEvlCN1M^w{3H!D^1oV99)Ag7#jVJ_fx z;&sjlbgw(&pqMA}#BT9S%oOJYf2W8eB2cwZB&HSZ*PdO)wPy@}<72~T)>;G${BzW? z7%GTeo-8&9+5n%}UGY*NAJHDf-s2COBFLq}ca^U_Sq2MyWUP_rRiBrbB47LAr`sqv z2FKecCJF40zX%rDf}#TNJ~iYT2PwXXze_968Jj8ovTwvY0v{Rr**HPWJNI(6ARpv= zu~{4!_`}YKLV>>wn>IFkAXlM_u-eYX-<&Ub38|vG_O)*$4r`wj>J{=n=fHkddB+0XcSM`wyTMn3jl8kqq>x|u4*mn)M}K52a_zJ~ zJ^_wHjuiHFKFf8}KKLWi9nc4ny?KuBg=3FaEEP6+{EjBUzL@Ak3sn>0vA~ao&dz-Q zlfb`4jt`$Fp9nu0elO02xguMv7sM2NA+U`s(q6~N!{4aZ%NRkdKy5Ki91_H16Pxf@ z5GNciSTo3rU|wT=U=C!hh!VewF2Z86Xm`;8rcA+HP8`QQL2T_Wg1GjTVzwa0dY+gn zs)}yrZssM5zxY&pwlq-g1?_+w-PGOGO%M(C5#nNc*m~Ha3!)3o=AF%B&90nNIcGxF zge?C||I7#J57MuvT_*%TZA$8t)YU1gQ;Lft$w!hG2nqu~5tBqmQBRCY8kO{pc=+Ps zi~VA&h)s%3vb?msT$H>hd2;IHR85WPx3g|%Rm-cEx5u`}w%oDYfljql{?wMHmL}o_ z=ZDP?%Px^!qIK8x?xQ^}v)DS0lDY?8NAa(cQ~-FZ)@k&r0Zv>)U)!>%6E_J9=E09mWmmbGAcc+{IK$AF-N#7xhr7^nG`oEF1!oidS~^{dNbqAjQq6xv=Zqh(zj)7%jlNbEpto8mW-;| zRkM5L_sSnL_)Djj*oLq`GM^35^ssOJTX5pPclq0 z5Et;S>s?nvdqX?2oHfUqQzf%X=7978>GM+OrH)D-l|16*h?h;1nkN16;*S?c#2-n2 zBt^cAd^tOLcJk8HrK#=G+NJeO@0s2zqg4jqtszv(KI?BWAbUV|)!eGNJM(tt%`KQ) z@U8t@JMpS!r`h?w_R+*<@|~bA2Qkkhi$)ePK9?Jo8}^#^nuY}o3pivwWZfFHHE34I ztdRO)^)V%cA4bHdbTSo_s4!B{yVSdB-hOv%v$+mm8d;Znlvcn697hbSku$2*C z6?|22N>s8}vX5|%aN^fPt|?}i_9%g;_>|JlAJ zZ%f{p>@(SCGtOpoOYN3g=4F|ed!Fxk9{MEoNy$egAEhLuBz$}K+q?bmh}->dV?eHc zv-(Xoecpa+`>oEmJKvslXV#rn@vGt|-<^E-+P!P{x+HW-h<_0OphaSf#HmlFKI#6f z`?EtY4!xL>JR@1Iv6P?Feom9AGUIgC>8w#XqjEmW`z-H3!GQvo-DNLQa0ziR%=d>( zhfM#;F3+CUJ41GcTnoDvb|Cyf__l~`5%nYMNA?q!A}&Rw3SJ{;qd{bY$QfdAvBAYG z#Vy4@5p_kNc(0g|R(xXhP_%kXs>b#gD;11}_urnL*5ZiQp2t zdt-xhM2V0R-n@+;Lw^iCAnpj_;7^8}4Eas`Ddvmy0^R9W@U7r*@j=iBL3vgUfq~6L=>OT`oe&KB;h0;S%Q(=TX;D7XgK=eQS+tjf4CL`D5=t zWj$rZk1<)WH^O@V_5Rr0i>a0hYbtB}PQhBqI{usXu4K=K17fsbeO5^w?;4Bl!QV&y zj{5yAEC!1={tcfj@i0oO`w!blf7Se+=$Pn;EsXWX&kwN=u`h(eg@qMV_q?I%@huj} zP1rKAGha~tFpt=Buk**)aC)#_wuZS1KNKI9ZhwX|5 z@2+~;2Bz5s9~((jh+0TYS5I>{>49O&z_a8mEJ%R_Ex!^dpUP%_SEcU zSS6E|Xk_b#Rzq{~&KBFndm<|-E9s0_A(BPe zmu0>3%8le3$@5d@r+l6Ib!zRj+G#1`=k%Y`{}ja0_sr;-QCoZ{;0#Y!?w5VZ`o@X)-F6E8aWy{Tw;K8 zfU}XSk+M2cyfOFq#R>&+lxzN5C@wB&kMt3O{{5zCECNNU_Tl1@ISact z@-KQhc9RyOjX;)JBz6mO7Pkt<^mNf#bP(@}7~wBGeje|f$>VczTNw1uB!UG#qspSD zh!v#-hKh%Zn_(Ws?n-=2FHv8hOgzy3$;Soy6}r^`K^{MP2(dZLm-v9li^UH#T}%=^ z#Cw8T0@#`H)$unq-v$bN0z9IJ^7$Epx;@m!IVLU&^dRDbY71ig(EYv>=xcuq-@Ym2 zKl3+v;MnwuKg6y*OAHdMDd=9rp<#1JcV#gnUh7|RT5t`A1-X3uK05DtL0lJcU*vs1 z5$Irvg70EC$8LRF{4LOnx4o+8vr#@ua$S~-^@5!7nPR12O`spI61>l6u}@<+VXdG& zsCo2>ppA%MrM-Nys~neO@Ozvy@-h0HFE*>RY6mnF=#A))ZwuB;p4S)Xhv@3>2y{IB z*u;R48Qf^upgZ!P+mgxGYi0ssI`9{SMzpf9IUgrI|--3gQlF zj}&o35dY0RW=$u?mv+OS%6(xSUMIK*^gsGBuhS2C#0G**WTBY*YCi+tJtOApfWRio zJ)kepNAPJ7r$+oCaeu_Jac|J`i4`E`4JRkDcD{H}bZp~mMsNHZ@AEeUkn3O(rq5y% zNEiGL$L09M|M6M+GoRE`7w5q_ac;iz#D;(^g5Tt~h#kZZ#P7!n&Vk1W!9BtTLOdw47cua>2nixHSn2!tvw_eTf0E>5dv2jg&q>J>0IlkX9t`W`g}eF2*?a}C#y zACNx9IWxAfBQgJcr@U~^9Xlko+?cDWx9i2bwnFvD)1Sd{3^$sq5Jb)NZ&xt+NW zd)0fda)w$c7rv#aXQ*eu4p>}JccYacrr{s?gSoHB81xHbG_ZlQH_Se5u-}&jt2&Z12pClT<67wUfDxm?>g{j;nU;X6--QQp|JAb9`F( zY2jx3W;^-R33&;5BXURNuFGDRO-^fo=p*n+GC_C9?T{Om7nT<-iscvc=4ul&e8zUh zHn4DDA^uPt%jm)$F;cO?kHk{d87IaHS#PBLL~9ktK%CZ2(@xV5<{!)qq=VvvfDZyF z{CZ35weGckANYM>iJ%g)Y;6s)37Lev^&!3q{wDZ>2oDKYWZ|-qW}(eOKN7=4e?e?w zdPsW60r5Zavsfv{ioPODkb^o$R1g<}E(Cof6y6p%MU)rItjnz7;xo%M&Zmkh;9tEHozb;Nr8%I6&CymiLMI>&nR>alrX7g{KYX^K%TXkrwJ zfgm=bx7aFj1in1l=&B%giaBDtU|e(+@zDGi)Mm;(@o%i9wELGa|Hfa9%qRu0>3SF9(sw+qP3_l!bP_Bf4C<8 z68JLcgZLqOiWZ`}h!pvTe6O$kZ{^*u6XbP{65T~BK@J4GBY3TYAnuX*y@_Zj(DTsu zVnu0DOrQ&<`=xtxAeaNOtu+%x+G~QfoH@9!V0}bpWnDrp9xU)h;;+0U)`{-~>jU|K z*tqdo4isHQM?t&|K3x2v{;laND@ zRgfj?3Z5ey19A)U46-KcgYS{`pZq8E31k}NW%LH*Q)GJdROD4;5@c%hKI91U?~v2b zlXnShuISOsbJS9&wlDryWQKDB-5>c5e|Q@CH)MR_FNm9?K-8svCna{SQrMHV%#nKnblMqcH*kfV_a z(KV@2iVfgbfuEQ-Fk}F(g*gY`?-PM<7de+}rSB6T$#u>V$blRi`4?S<-$fTd24g+% zAUIEAD;0jOtYDKQ@Gx&)D)SxvmPh0^uAlx(AN^Y3E5o*cuE>1IeWp#37tp7%bCBbS zOiu0&_6_{fkHk}fo(u`%vN$P_ve&3C2?>@3XXv>pA4-{-vfec*l0fqsWi8oh(#q8HJZ zvG1TuA}`Y>=v>G{$iUc!&~vB-jf{tG(^e3-KzqI^=qLCqkX7kx=se8?^8|AiHAm1F z(CdjGr_Ls_J-5@^d)S(o2aw_E&&Y)IC;B(%I7OhZk%NvMi1=OF0-F-wLI1@rhTg-u z^A8;v-G}kOT!9|NJ?kiF>mCCAz?aX8UI{~9<+5U{0c<`zVrL`v0o@PZKK+4lfKE%l zV9e21Ul-^++(+~b9%(hgnB`_5!Yvw&Hv_Z^jwzOuKVm z=u3dU%$Q_+a{rj)d}ER}W38aASVQ>7oX>nuKSRgndeNb=YhlZx{xau>UN~9!>>rE| z;QX`X}Ef=fG!gV%=hWVa&4ra9_FS%n$Sp`ak`RIgIhcHPO#_WPI=%a4lRj z{fhes^eg%S?ZdnP*o4XpU#>59A#7;K;`Dp&Gku>nz(zn^3-_P-n)73A`%0`8>%^zC?-j35Ohi(l?Ux|Mu_I=p*;ednz3H9#RyB~Wm z_FmlGxVuf`o5q*DQ})h_TQ6>9-ORdKO^mrQ=Ef$mNPHg?QDPmGY z!x9ZkTq}L8G{I-bV~)oRt1zs>iHavG_Nv^ga*e7rs;;fJw%W1k$Ev$(xN01)dA#P* zT1#s+s@V(djITAm z*5#U)YwoJCtH#mlN2{-_wz3+@cRyDCu`(OMza95>-00ZRv3Fzc#*~XL7d^P#;BuSF zY$~(8)b>(rU|qdf^eG~`DQ85w*ekAyTu~q@ zrB+G}7LCLpF<$&ESo{h^f;cQLijzWN|7lGH?{`bzg)TyqEr7dbap9{o?+6;w!OKEEKcF9I;Y- zC#H%WVw)iM<6n^=UWnq(;?5GHtY{_riBH5Oks{i-+9*q8w(Ec>qh#}*Vy`$TYAe5` zl~^R6iqfh9if*4Eu(cvjBM-2?AiE%|;J;9)jn^NrK=r(>2CFysX1-y*H@^Q}?LYO4 zsBNmP>}Q)P!JJ?|q+CemMe1YL4XhjZMbH<@a=sWeH+XLFboy4$^VId8~%;1?``(po~{z2;l*9Q(4{G;X_Hpa2y9l>5;v7)3%vLt!W z@0#VB~l)^G=!WMPMaK~_7 zY!&1krwMFA#KTgPVzD4Md7tPnuwj`5-=)#)V3(OISjdt2@!evFVUDLh)eqv3 z_5_^jp6XsN(v`pXqnIi9y;Wke_)x49qr@;#LMY_YRb5;Jb zf5dU|iTe}xNHI)|6JLurL?1y6GWiYV1p4SU#;fvnf-x!G97T3j8G4E0BGk z%fC@eR1mZ=@qwjPJCHdCe-inQ{rC^ zVMD-K z7n-qM?^A7@ErPshWN~aQ*sJhMVwd|?w*4;Ri1K3Ysb=v_1?9FDg<^pAFu*Us+(3LI z{y6-+_XW1;B_cvp6I|aZ(<$v#JIWMmjy2C#ygqA0oN~9Yrymn3%CTyoIDPWVzEV!p z4+0sIwlK+_O+Gc}NQ@;h3g~0#>TLuzzeCD1NDygajB$)trY|xTdFwe=Ggnh({B(1u zAl6w!&07ZuA0c`*zQ~)3t;D9iOS#-LloR`#pg%v<9+KaQ?%E6BxWFDvzE8S1r`q!9 zf!H3gWe}%A?upsY?1#M$-JW>?|1LJGh030)DL(Uj=GiD_i#8(7o#s}kp?80U>h9|9 ztFEiAOWMy8o4{n_WaDq9-%Mrv%lH$cZ4l(W4H3k(UG%@`t-n!Ab*JO~S_wn@c`X0}@&$)k6t|IcuG3}j59wI&i?9h`9lfChAHRapDmomaU!dt7emTG45 zkJn~uuVL(6*vqiN;jhC-r6KO>?(Xhh>ssqt=v?SLCz7=v1@mi1S4USTG2K1gJw^LJ zzAxy%j4f=D7z$}K#vZvu#MThY_K~2kbt>vq)J6GbUyBb_3pm%4>tWtx&gHtk5o5KN zL570Qv11U6ecf{1@|pQFZ@rWQ)&thML3M-D1JeV^dBy*^C}>g8n1C?>cU8OjuKBKc zx%MS(qBz3`+JBfF%}+(NE7~9>ZM#ZUpA9(QByG-$Pje}efkTrM9}vY zX5`!|JT8yRsM=PUu1ptolWAMx1GxT7fz2Bon`5+7or6ir)n8*;V~RJ&o1?`i#!rkL zRoj(w`O5f}kvaSK*M5JE?=f%gRF2<#)!U|z9(EmeHE}la%C!96A>na)oUG6NRfQzN z6QNzV_j&i`h*f<|Y?x3a7|R>A+LkXW@Ad8a z`T>1@rC`is_Z#9r#D8SK$N<{0i)daEOl&UChOwR27NO!eSfC6@kmQAV|cU#Rv)ZPn6$>3Hd&|Kc;@ zy3!O2iyfz|;u`S(Z4n{H5U;N@*N`iV!yyCf(@tUYv-$lZ8$ELo@kIFes24#$Z=-!S z+6v~HH{EZl5=}Gjp09O1bv=*t%qHl+{zd-Y`pT^7*njXhAY(Q#HZUS@s=TOoUyX*w zhQ>cspB#Vg4f&Fof60p@zG{c|UB%}%i+w#rr1(&K)Q5=%0$FUgVBF6Xj6Z^f1BwE) z(`#L?zYw1iwk~Wt*eH3#4~G33TOKyF`U2l%Iqk7ATI?^{@2#njq&lKeg7-KkwzO-i z^TFB>Eq>J=8WmNcsfMM7rK5jG|0q+Gsivi-MJ{GbtAJM8-TC!^2c`!m@)o8Da)Bop zCK!lC#^=GDFk2wk1glmu{=|yPvrZCoU2|Qjj#LNr1^h)v!DmtwWTgVt5^X4!=RFQ{7)xdRhPO3)WPFpTQ5m4|6T|I!twNhzFuyGhZeimlCmk$UepViuvIqqu=2Fp{=p=5~~y~&=sDk zwky~s)Emye1bdF3PGEU;l?qeMm` z=8Clxo9XKU+aWgm^NN3BZN>l7tf*NLaa_m~?+fI(zN-D*+P}5`S+g*mHFXfn&CAVx z0e%7J{m=W`&35y6(|8lU_<_m`-yv9E&~1_D>Kp1CwyQ1)>lHFLa{@WMj1~ImJF4BI zv>_L{CYM#~e35IB>km;;hMI0g-4HQ~%4@$Q);jViIsfb8V}XAM{ph6d7ql%oEzyQ( z^{5F3;>Aw9cH*@U{XX>8ZAKnsoyCrce+F6VEz$D7mjA6$jV9)2d`R4fLQkQG8dTg@ zVz2!Lu{`K^*n9EY5yy#*ls030z7)t%v^(Pn8$CK4F_HK+kx}ryt&$(Tp(y)`_C@WB zvOHPdd}-u^I?9D^DX2%>RQxIMe-;L{O349NHmbDujJvMFn zFMW)*nxGu_V}8f{$Qkl8`WY9fUYFA5%xjEmjNMhg#v__3R)3#psG3j61IUrTivwbu z;?3}_-toKR&FLj35V>uh^1q2=m?XM+x_Qu#QpFC{#Nr+pJjU%X?Wz8&SRhy{ z(v`HyoXoZ0&*nOr3y5v$E54TB9D6e{_UJEl#GBezO5IS=MjpRLhDL@(%9ACo9osZx zml!nsNGpq077dmkllW7w?@Do5O~e?%cws#IDb9ho2If7+EAt1w)QO7I_S&6QcLo1! zb%8ILJfRh0fxwSIyemE&`sBf)gGI*#Ir-eXuf%Z0pd|?U|6R{r?|jU9cuVY7EGpxJ zagiaAwb1GD0T36B-c6svXGMD;n^%^PpE>GZfzM~2^rgK;dyDX8msUOVW7=1Jg5t06 zCt)`j6)-B`s&YFvsb0~?s?$)>RMC{AeGiV9kC;DKO{Z0+RoX=3ARdU%-JiR6Ymb57JimF6jsH}wsl(d4 zrk&WR)#rlbW_-_MJYzh_Lc~xY&-WDXDlUw%*->>#nWH}v%-c)FRMjZ@Sa42!hCJ!N zRL2oLR7?7Q7gVbWzX)q3bM7tek;H^YJplYIasS2rhmM>onn^FMuiT7k;)?1#g%yPr z;R9g}&QTrGZ?uQ~DUoDI^431XH_3dD@0-{v^jPB7F1jze@i(KB^wfUR%vtYhKci`? z+rT=ZrPh z68x3OT#O5RXd}d%%7>w58P`K@J=d|_xZRjwN-!NZ9yYSZ5&N`BduiMdABY`(JN#Z3 ztyD9lvOuOhs{DKWoUBW$#6|hK{#H$esRAAKvgfjQ-3e7eP2>*No-?Y%dPlsbpyHXL zxnh;*&-(>7jw7P(e|5cc9x^^YQVoA^En50EYa}tB$T-Z~=f4pbM9k-{2Zc!K+G-l6XrSA z1lC{jSCGMI``v=;;5YGEay?uJ*GL~HK8gFz`O$uyE9YESu#T|~k%v!=_$k496r|d| z^+YStSzxaiC5U5QCa^i9r*9Rkk37y1g9Ub!l7e^{*6=xk_y&H5d64!)R^)s)2wxi! z*Hcd*XBVhuMylYExUNFs5VQw#7_kAg=|I8v*9qiNY!LYZzazF*eBSuMvGpLI5hski z$UMxPkIm?eU~VSnig;)qX$Sfhavgn*b($Eb-r{Y+`iLJEJ%-n7kug|f{}IT_ ztRve6aYx)Q;=7Ttu;cMMePov)K7x6Id&#J0)=yLxe9rEJg{a)dcbjYY*d%NB$-k0FYmi(~uEA6T|>< zEZUPflm5wXa4*ja{Pv6~t{4A0est_>#Ox4j!Sxbv#r#ZPW36Q_;+lzrL%-&4`jt-> zpkE@V5cftL7;7){H|rADOaEftVQeFtaUbbVzX{|L-@PWziatg>An(z4xYwLF{qd6U z&0*YYuEQY1CTn)A;NEhNnHP{pi4#F4qR(?}jA7(+uF;o+hHS;(!~pWyeuDeW-?Ry@ z@g3lG=3+iiY!}zd`^eP%7Qe&i7_+?2G5Ag3GsGTzAU+bjPdj0o<~85njCszV>%gwd zJir)b{a}4Z_GNBoe9>0Oyu=OBhV&zH&Unsy+;`?##vS9;H%^h;i2I;jk@c`^U~}X- zkNi#FjKu!itA_knqjd%=15p8Mu(?lI8E>1(V>j7{!8_ls+x?=eOhfAm4dDexSd z8@3JNFnG@Ej7vVtcj!+x<%qCO(Xa4B@tn3nKjF9NBM$^~G;1L6K5;a@@lJbkEMyQ~ zLr3Je%)20f8`vASLBg%_CX8{ z?{iL^1J}ggz;}5Kc%R?qy!kC(Yz%W2e{(LhEwA$$u}#Pgv@4H{6W~2Q2mI}8XFg9m z`>u!I@wE}x$~w#=?ZEW|ukpJ)BG+-h829K7|NrlxFY+1R@%WqXaXen5eQ9T3oAI2s z!7+G`e&V}!uIvALRdMe%@|<~{Yh_H)zj$N~q`&bx-}ki#pXGgy z$M5^r2HJ*mPZhJm(VtZ>gcciNct^^H9q z84HXJ+8cWazv&x8yv`V*J^38p^*wSt+Kcn0uh1r34{bpkbDh5VhJNcCH@?2dclaFl zoadYy$KZT9CV$iB^ih77V{v_~N6e%6p0M*FA0yA;TS5jR793d^|2eWX_9^6JOYG1MHs&BYS4EG=Izg+Yd-bZt9a~)G1Q%CLHwb!%P^Ss;z57wgztvt{zxDu$HBkg?PNbRl5v(cL#w! zOpS%If|!459H4*47sVHi7HOU|&sO(V_v@mz_{;T|>yqMR);rcaeig*vR4lAm*va0> z9&d}c)e_sZS0Q^8v$t@wtY%r4QZJ>lx!JJC!yZq$Kjr>_TLW%Ax%A}HiPI-eUp#j4 z*k6bKIyB|aDSzJDcWd7t`nOl)h%x)d?3?rFoIfiZs&FXsNaT^PPkenM<8;R9yBF?W zsCu>P)$zB-->&?i@`DpkPdr_bydwEv*1@cA?BCe0OD`L$n)Z)^9|fO`JQkq9rv|iWRU28w7@uWuMYK^Ncth})D{kZ#ayUOn>KQd}$RJAhI$}B6f ztVBXYLIin!0|N&J_6_J8u-CZPh@A1d=XGtOG1x&4V&A;Jd9AWrW$(<`nXxi;WvYL& ze=>1-4W2i6{_~TcpB#RC`0<0p2Z=8qy?peGIQj78!#^JV@hCPiHnHF1evfxQ-Tn0P zv&+wVCG|?Wn0zsrxUiO)Ei-3k&&+;Tdu`kDYWvu5Vr^u6hI)9R)TOC6SaJ^6a_ z@|VkBc1r4$bmjS#=j)!Wdp7dv$fqrzw0x40n2~tq(V0goPyFcFgJ%z>CrnRxOFX>) z@cyBDhwc^JEx7xq7$b%Y-S)e+?$x?CUu25j_j})8ny@rMC1rHQCm%LVY?^rQ@x8~J zo^E;?{XF_Pwd3X|&rkj;^{dpC=_}L!$owO-srJY2kl!I+A)xk~j++jv$Lc}vYo%PV z)#laab(VFOfk6XXq46c3asg(Nm&-DE~wG`W5O|_$}_Y zxb>CRSBkG3U-@N~msP&6`hC@N)y`F$RDDwQ(ITcsOpR8emRMAMQFV$$e}Ti%*d3{PiR~0W7dET)it+hfloG`06gmr?cg1C~P<$iGiSv&0jy>WJF--g@ zMvGs>KY|#*2O>`lP@S6A;;1O0xS$u#7f$@vCqyxKFJ)&telH{+f6aWPa8_euw^pzCmsT`af|itb6FVqXjmh@&elj z`m0g!NFE+G6#U`?1v&|K5!OOv5q<}~mh~9f1)YSo9C-w}gj^5bnoj&bpT|~2EDmws zteNP$O$BlR$0Sx9*#>zHJqFzwdj@$kM1{+|AnEAU*`W;poYF(5q= zTSOPd2|RW`cH{s2$Ni7K^}@}(*iQ5m(*-v7@nWI)QdCgB;ziYeudMpA*k(fov37BS zxIFCBs|B|BI|5%K_F8OL*w=}BLry_F5&8@|Eqw|77TW-} zD{N@^3}OYkGx{xUk35Ba2K|y)366{1pL>D+&vWhxG9xk|aw>h6NBSRf4}Fr~qu&ze zPyeJJlf#A%jowb*#fF1zW|AOx5t*O(E$pq21@>p`Y1qP>DX;ZCf!|@d_)PpOh+S(h zeidWIXfacC5>X;pte1TRJ4vSCypYcrFXS9C_UM=NNo*wijcto@iEd4tA$=O#8S*XT zh+H=0Y_1QzpZBp((N@Um$eYN)Tr>G8$gs%MJfA9P2l_vDMB18u56G~`WnbZ#j7{t= z*k|r*pAP&+7I9JgfbA301i7yt2;%GRd+vLb_FHsGIjxID9Z_El5yVm?xD%Ase#7gR z-=$h4x5NW6S>UHXFR}#vHdl4&=<}7up8|goeiUvvbMRn+O`UlS{ep4+uVU8ld*l1T z-hqFTxrH{vKZ)%wMlo?~3~Ri#uZcA*BZz(dN{kT4#X#-DyFuU=8Yg^t*Q^iZXb%?6 zw5Qum?VFM(?uyO=-@+B`??FH5AzX@)rCtVhd~9d5`7D9_h#vi|XHUEs0`>I4SCC-wyu%U8IU@g6lgkJc8rd-Mz7P z39bYeu~TCOpKm2LiB*DF-&ulsx5Nc8X3V07m?&C`$$}WBU&RE$*kY{l`X;ekG`DE)-7V^})Vf^tN}*66?@X;CG}B%3*;o9XkYl(Bx?g4AWbAcX24m;zYb&&hPdc8(4=b$TLC&yll4*7||uToWniCTgfAm$|EyYS`G z=cfp4>h}b5Cq7bQ6`~bigRd-I^z-ZIt*?Qei+`rR{C^*dHiEI(@B~yRQ)H!>zCqs zkgxD5W4B>p@MW^D zu%7V9y36{&x)Z7d24a4=7HW0BYk1dNBb)1Kti1-RDS~&pak?=^^#I2y&H>*vai<&y z8FHFK5}KI=!mh)}-!@uK5ixoL>% z@P96dSz?~2f6fpjh5Rl5E8jsjWc_EJpDp-4{ts;1#10Tkfm}qKU2)Y*{K5Kz^`7Vw z*d?&QQedg9z1Y_UtP5yiX<@mbecX?jj+h#I8hg;q8>wF8Y5QqAIW#X^FI)p11073L zgLbK6HC*y(R#R**djXx+KJXjFVC6^VSG#UG4wHTd~BE4IM#XAd4{@$_W!`XaaS;Jmi3hN&ad3R1kqA4 zMEG!6o2mPgq9U%u25wf?!22TGmF>;9AUA^C2l6DocYp6D?*RF9l|UvPFOW~U2F4{i z32{TjHOrjj;qj1IZd`6`ruf%3+DBuC=wa<)ohm*L_&lJBrHW;hYId?t6LZFzaZGSM zHMC!2PghSDat85N%ZN6UA2>yDFFJ{MW4w`A((a0hM5aVmv}#Yi-LBoPP>TV|;8@^j=4|Gir<{>viZRCbj|~$!u!>-8G5)DJGeY${8S{y%=Y?Dl`CsIJ)Hgwg zARi;$o$hANCVqyt$2ZA6VvP1O^iq~;CGY+mZB)~9t8z~Hog6`XBa0nStlWC>uQ(%e zRbz$t_Rbbah+%74_GiElUJ)6*f%fBkl?D z46MocIyuj-ifQM(CkgsF>j8R(Q@I|Uguln%8|y>AyQ{dLQ=*#cxO5g<1ac;RQPv=2 zTXfZ7g0%)8NexpCQzl8#OVRhB!*=E@0t&@W+ z!#{lQ#5EAdcHMJbyU0!Q?umd*-AnWn$ftD`*G%9&F?%%xF$s+X@*-;^dQZEec10T% z)Bl5*FVHcG_VXU6j9xHqg z{c*c%yDOk5pa`2h@j|BrIt1}Z=vS{S5nPH>v}mywx8hRV3c+ciSX3`Ph`tGw}2G zHCDW6>P1tZYCY9@EVUEzQN&F@Oh4Sdz_`iE!_up1r(oy6z0IZEkuy>+bZ`6K?tb1N zXAF!F(%u zS6KPL;2-JABp3M)fq7+D@}dON&)o19yw7D5ceKIAJ{CA})xAqW0=U^ma;+|;$L z7;F~&H8pi|GUYv?lO5VSwAo~n+mqYs9==b#*wLM%BZ2qm=0_cnGv(Z8LLgot-ZM65 zI=&jrpIC+8(fx1AzbQXeeX6=;Y0J_KwHa#9^gq*oQuU4I^VYZy>v0VDJeA4-(gLd?^;Ll<&*)NX-dldIbr{w30{Pi=WPt|V=zb#mk zofE64W6-ZR?QGhuQJu3rXZz0N*{WfEzV&=-rp`=xile*wwcJs>K>f!u>CVUY>JKgm z82S9qR9^C)bAmK|Tnd6W@rxi5=m;o2UPjb&?nK zMRLq<56%kC3(&adq?2<9U65S5x6+sS_VVrJgVM9W-@I;;8Up&RI;%0UkG#qU*=y=v z-8x3T9JO%dC%=k3c%Ner(9!(;;nZT)+x0eke!KJ%x2|~jiNSTjBf*`)F2Vi*zW(b# z4kUU#D*1A305m@_d0+N|oYvz4y82nAvr4UEtEkp))!M4HODdOCCInCB%-wsETl-w) zxr(1@OVgI(MxGKzEg@} z+xpf6JYEhj|0RDVn;M_>!#1U3o*nQZde3+0SZG$x8{Glc4NeM-c~Wv|`CwY*ma^*d zsMO5umO7YCf+463r5fvZl^e@9rpkALGM;}&s_B*w9ttKGCUrz+9F2v{9J#s(I zC!Y^{haWNKM3)!aQ)rT|s&=Fle=9lmLhxQNKJb4zx%{N7gwL)Q&};Wg@2HmoJwe2Y z(E#0N@ti-z&&P&icd|?Q3;8tB1A5^T_q#oAztd&W(ry7>pr021=a@h&o9|g(8$TS{ zwT`n{q0nnlU5YR928Fejpr>4c4 z|32Vfo0PN5=x|>D6}%nX7x2T;e`gBh{mvSw4d7Q;HZZ4t$1ffYtT`S9d;)B?%OQJM zuH`PJT}n5UZzzv1jV~=&S+KHGb*JiD0ln^u$`zG=mj9WPRi7^3mAZ5`^Ss4*i(lki zbo_w7mCuXLLiae`Ij*O!m}mw=uve@-j`U8?EYxwCUl+t@Q1`kQtA z@3W?sc;VoTfPTuxpwqq<;Gbdu;st!A=G^_JOZ^+$*z0-$-^9-Y`Iq>E_2TO_7Wocz z*{1`vKzC>7%eN4-FmA7CK<>g@0bSwN0KL!;)OuQXV?kHr0=b6dshEi8^?F{wcE;P~ zRh}Qy;W!x&d)hU50@VPufHK@Fp~9OR=%u!7%W#^u1W^1 z8Kg9~yiIAFR7bB+TDiD#@%CVR;_&wUvw?hnJfBR6dikUM;J)~w`H*XWKtLACk$idT z%iWxAx%uoQe#0#T@synca?X3~SI>PzuzYfKUBf!sui^%G1Rn?1eThJxIsekE0sRy| z_JRno>A8W98z}C4b5Tmev?oT|!dp8Dn z^*iaqZ~oNMu$R>vo>e|8mE?aZuTfc}+iQ36%How{gR9F|m%l81nUiUL7SG41k{ZQd z2dAX(GM^uR;%>op(_GihzcJ@m2Ihw!>f_|1^G|&n$j5&(x$5ExdU_iFT>(BgOF*At z$Icnp3v}gegAam)kGnku%{6{QNBDJM&y(l;mTdQplW)$K2=o*&A+-|LPF)RsVYvWr zA+OAhd6APz2e7BrW8vFm!aad~FSi??>GHquguT*xTK&k(foqXdT1Pn|KF%irvGG_q;( zna&OL^=1Fu6Fd?;5d1ONHu!n)Nb!;4mI2=>dzcQ%w~dF=wd^yzQ9PPY!`>Jl;9LBf zuLQmSPf7f<`eU{G8M^s9!M_4}6g>TZ_;Tu(UB9JgXZxUkcDWh`x}W?)z8HDH;-To^ zs(|k3|M)rHLO)n0-~%cI^a6Aurs=!<=c@$bO60>U0UL?!hxX~be6)PCe9CBia%y1N z;Rgir1^NPZAlt0BC)9cJ-;fJzK>VIxN$%HI0U1AY;JdCfE+A{v7U3s!3;B2aIF|?3 zo!*3Rt)Fvgj|+|nylx(B8_0<}I1pzLV`XQFmC+UCC5Y|Qq10c{Qoj~rLd_6MQ zJ|t7m4cIX9s>Pt`>}+|T@f~!*|IOxM2Reg*+~bG4GT>|Ydq6hgA#85sdJEm&I@U~BXYujA!20oJ(DCsJIvqYq*2}-Kcf>%C zNuHNsK>`wDzd}8C|E**g`@N$6O&7*75&*-Yw z-#z(Z$q>2+`$Df5_a%Gizt+Ltqz9cASi7&M`MS&3>Ed{ox#jB?!=nRPd-=ffAm}>y zaj{S=(AoHC+)F%=jzv~JB~vLqKfKQ$DR0L-*dJnqUVHI$@|TYVjpB)X)aa2t?S6Cs zx|W;^`jx+{lc1v;6T8YDJK+EFXT6VZ$s>D_oVq7)?MKr40pBq1Y%+QsAFUb;{KEg` z2)UP9H}b$7q8WO)J#|e$N5Z4oVrT*XWcQOJ{4;2g4PZTe&zR|0bOF9Xxj1q{@B#95 z!N9$b56Cy`N*0LQ(ZkK*Vaa3iT{6kF@l!Dbe45YX_0$JiXSyzZ2A^R^qY3(oeML{f zcYVh1=Es`RN8H!<&<8m{j-e|)ese3{V6EAve0Z*H{>4Ah3>vnd@gn!MF7~yvo2;+B zYCn>de3k?x+ZrA6{aSB+0X`UUVR0Wmo5fQtUEFaL_|GE=}eEjEtU`K|1Gv1IbgdZH!!(fU|RasOl0@`VmO3wxD6 zL>!6!;%{=m*yZGhc%*sbZ^a|=8aA-CK+k%TN=s{`yGb z?e?eVwKwU#YX0mGbcpV(x4Fj??Njq{Rci9gojFl|$4+O@+b8r(yt6g6HI+}mv%0^v z)91q8Vdq&Ru`^@z9-ECn8NZ{C_%2?=)?73|i(*dverTUh&?_CtGa2t%0ltDh&@erM z-NJVucj6!Mj~WmC%pOM%WTKo3@x$X&TZ^~IUobb56Z5Czqd$9=kJR7frioqPE1sJS zH*aW0>_+^_HSHaIpRK=Y@>;h^P89jPSz)sRo{B%9QRA=&$UtD!D*V2DHe?WAG5%%V*@Ebl95By# z9iI_CW*qE|1&a$7T^nyPcJ{}gQ=4lp>G`EVo+2H~=lFf?O*%clAzCqCVp(`Roy0yh zZ+HoL#J^*yyY%ovP#6ILtvEKH*d(vCUJhB7- zp)cVxWT9uL=a40y#r)u7){G5g&G;QW6B*>5WSM(5^inxZcmrOD9;}OdvD>?LW%eCgMcmb# zT%FkT=ZTwJTk~T68l6T*eeX^=_hfuP{?ha9+rI{H2k6FJ(nHBkv6{ioV8^wNPEO`@ z$%(PQ{+3>2yTl*;Mdypo*XiA2EFUGVORqFHe@{Q1`I0L{Zn+np{c++p_KkZP6B&n( z%)Z_5V&EzSRQsgFju8o-*fk z&WmSv=gx0}^@C%BTY|d+cF|h_KRCHak7G};L-}w$C!apr^&I2|o??%%kMTTt((GgQ z?;HWW&fdpQ*rIH2bVuK1%gz?y{p=_F(HdPDTad4ff8{5^{K3ny&s_7^z`EmGUdepE z$Dyf1Q=bZ64*1sSGGsRYJ>MN(XusfLKgn4k{4nef`;-rZ4WnlyU!e7+FW4L60(b%a z2~XjNWZzjgegS?Tu{~p*zcYV_-|X1r+8k3oraCd0qc%rvmi}4#PaQaQ!0Uv*3CXZp zweS6$d3!|hh~oOmi5DYUt-V_NndURiQlr#(wf<`T+Qzkwgc$3OH6ClIrJxJ{E9ap- zm0Z$m(x>B{^mW_5x_$Lum4Bt<*)};T?A&f&MY6{}zb^UjV_Rce-#5N*>=2wAJQ7R_ z&T5|3e5d_R8*lOX&6C3;hxf_!hkQTSH8?5wvGil<=;TXS=QrXTyS{UM=d1Qt?SWv& z^kF?dxFs;YBhq(|UBpkZQ}PH_udH6#p|(Re&*=8*?cEr)o)Y!~|CpHia_!~XgRQ|< zwOMU`(fFeA`{Z){uJgOjtBHg2MUp@CJ8~8eAp6J}GM+E~&BP-s$>rpe-80xFSUGq& z@mYHquds%%1bi>@@m@=g3A>#hV@=mgk2re;zaszfKQeBDjrtcqOe7Q@A0zKuk75~x%E!{ zo%+MW4-a2lzqnp(6}vq}jU6qJ0SD%+<0+*nrPC{?cl+e8Tv@sDV{+!KsX4T#A5K5U zzF_;-_N`0OBYU4|Q?Q@Pg{o|&>O$E8hJEphs{lRO&Q1EFmu{g0vw?OAJbY|$R znjVXCbWaS-|4zl7itne_^w$ADGaH9)NPnSQl7sxCJGFLdZP3`Dv1)VG=A4~5JLD97 zlkS2i@u!k+&v$;#gP)^4M=~+CY5Tu8nY}tL5Rd0`JtVMR>>2tK-mHd(Y@8we zp_)^hQ_TfA^g+O`_&D_-Ysf85kE4eNA0FIid0Eg` z>#Kd8KGAXxZ%a?|o2T47<*?zyhQAJuY#!M(Cu9wK=7V5?oc~qqEA|Zx4h%Y<&%Wnl z$@w|-gwW&PNpV}}OogZ0&$t2gh8PyNE;g~hqcbC>T8-b#PZ zvBCV6`72KbC!_{dZtGs@L%Cpc!R8!|IU3ssFE?LqF4kVGn>%<2&CiALaSBXtjLf@Y4s$iwoO07?aKOO#R%2!jK8G2^u z!*m#ZtNd1ZgY@@XrL;=vn5oB1Jw5%~=r4S{eARgC4>{}Zh2a;57pgB*pOQYxJ92v0gTf{Ihwh^HvY4 z9aI|^j0tY*yRC2Lku#6HYv8Vd=gQBO<=NX0KgJ=ncQCm*xrz5~*W9joef|3SPn$n& zlEwDR?{X&HoPBe4^RD)+?OA)a@@!@6^kWu}6<@%6?{41R{9yQl;kScL(kpaIuuOU{ z$}Qjn>7-C?`pWc`dx8^cC)CcVo>Sesw0Ad8_2a}~7EJENIm!LpI=${EHzs%c)sJtC zZ)}Ekt`Gol+4Ht+kl z_m9L{t$oGRE2hfvc%|@4VUF}qHb-pmq11VaiCK?JlM6o~xlTVOuzP)QRQeOjAHd_~ zd{`&?H`&b&7dxU0@DtMo*=zD9_;7uWAI3fDZ1_5v0$&8|M7)22<^s)9yVS0i>*X^> zo-y(_qkl7cjo`46hm9Oj9Z|Jj`dRN#+My&bXzteBt(|jr!OB0Z{KJ^ZV+bN%(< z*N4N>r|dnn_t0DQx9XFVL&oR5QgNl??Kx-h#qx{guPR?v9!wqh<-v@V87p#;<(@6p zT&#Iy^FfVEe%~-{-jExMIX*WvALswTG$?Rcn=6rCzKTpDsLI zz`uVPn9sM|sIAUgOf4*>e-M?LR6)_$ygSo-mLj(7Xs?bGyhV7h_n_8Ps{=w3=(Y#jnlT zle-6W{6~|MyxY)jL#IzXec~FE)|hnB&_zRdR*EE2d*Djam0!v zzN>v#`(0|H=ss$m4-T9yx@mpWda+q-zEppyenWcpUY{C4GIU(uxW0J@=N;Upf1Ca% zs!vqEO3e?y=YENhE}8zX^o6bKTi5rUvhS2dh87vRv~g+UZ^<7Niy2=YUp~5WbmbS- zUsM+e_6mL$oR+f*%;f{=&AVTHzxrpxpAG-J{_pyp>Dv37)ZpBn{8GAvJWsLWuTu2= zVeP~2-kvADqerF20Uwduwn=7c z*qr1HU!1%t{D9Aw??&G5G)YvW@1q@d=$PV|;=YA_yXQHJt%_w|UAnroUe4o0BY$iD zE!n9XG|3FIVC#Xc2X-C3>*xnZJUF5`*c`mR|N4G%bfL;Zl}!S6Iaz%8(BVT#2mImu zDd$gls_|6gwbYTGUOc_qFK_$wH4WLKHmk;VYsBgW2^#*3E%~ora8|BMVV~5_^30t(c zXwTi4yYc1lm&4AHou@ueeZkaN@o)bm1>7rDR;r8%R;aE}-61%qa!%z>e8s((hI-{F0-W9R2DHug-AMv=>c#=7=*#{H*e`$`OgFuAH-F@wmg1qjzcj z()xZA_nSEHgn1`iJ>}{teK}iVljMeek$#t-rT#>I_1d+yYwPu`*C#3A_5RoU^?Fu| zF>%VoDW^|5ebVehvk%RevxVvXXQtMD)?nfIDCo~i_5~xB9C7u))dORyW2(=jex8l6 zOM91YPVn_Phh~}jGWF+%o*P;}n58*O)AR3F+OMSl@hO2^ujKL4({h&4y8(S$ zJYL+ZlpMiDay|#U`xnJu6c-8fv+}uxQmg%Bz!$)`#7ECpCDuYG;NP(_DfwN z-Y-`2aL)XmAz;_DVKzyPpYO)o@ra8@oY8+q|9R!}v_UB26&rLm=q%k@y7l7li^CU9x@b~)N_ona^(*T;$0s6} zu9BYz$`6$FLVYRNvv1G7e+2zGqnPdaL~{AxpYr~cO9J!1e0}-))j2a|t(^ZrS6QyK zT!~J1df(}N&-OptzejD4+Rf#g%Xr37sqkI2wP@@0)KUGu{`+wJt?P7#e>VQvV3#hI z+?>&s(G~SM`vqumDChayQoN;DO&-%q>GNydeyIOYceeEG_1WwD<{YF}yVb@w>9DJ& z7SH|3i=PIoR930Hp7SllX^a?@(|tMO%Ms29VsqP9{9!Y;XKb&TUJ~mKuQ&YQ#0MuHFzJ9v zlj@V|a=cEio?Jbrc24a-<^Pl$wMI@hf3`LuxTWuwK6=u+$yZn_=Sq#4G-lEb!Sz$F zpEABazJ9VA+T;i0RST6DDzm#@>U*iLI#3;0u(n`Le!d)|iH(UwKx15eT>ZS@?)11= zJ+P*90X%|U_HoW#+BJBg`a)GM_*ThfqemT=8r@Bsn>P7}ZXdpV*y}T`XIif%2lM#i z@kO%j=hdI*B=)h@zg7NL8CxD(UNQA*ooPDLSgXxjo43|ztkJl=d3#el=j7A_vBTw4 zvEA9L>sHpa1uD)Ckpufm&cV2(bc1?=jS|u2l^i9 zdpGAotX^HcI$LG7inUM^bp7!4!`uF_?GG1CzG(7-!wU{S+j_QTFObc2OZSV|tFjNT z3HGe)S@~OXYUWErrk|#!@{r*}hUc!&UAOo5&Dly9wl8eIkb0PT3iA~HQTj*eg6aj; zFKb_>BJ;}HYvtF$%pr&bZEf)7&?W8pRE( z8&(&uEnbTmRbkuFo5aC8`Pn(=i%gRO{CS)6Hvbdw+n!K4p|Vu}QvEYmXReCb%$a;X zKGD4kdw27~tf@W(E96WFa*OUKCOKVsy7H~1TT5HVx6fYvsQpnJolZ{f?t+PXS-aUg zvv+oC@6_#KAl60>pH&QUWjcl$x5I+flY=ei_NAPyLtd~0#dnu2EL)(5jZN;>Ka)rH zW&6waw#gxp&wga_$ZqbMe4RZ~gRxI*pVp@BP1|gLzSVI9;|9X2ru}=c_sG3RKG*+T z|Ah1@CwI0@F6c|?L-mKo9~#RKFF$JX+IM9C zk^Rmln6)x%Wsl&>!j*;hk`upsbN8k*CXfB$*dGp`a`=?_>+{zSP5s)+$-%w5ba#oJ zY5o078+@3&UH(+E>fGkJ&8LT+9@;oKe)#xdzS)tTksW+MKF*xwIm_cK<15S6maE+n ztWjN~$`<9DKD~8%Yu?7ZjW_FW)@NzV(%81SZIcd9FFrIe`YGveFd}tgFIQi#ejOZE zIjo}2Q(SYYWOMJD^SjjqwWc=5u82GCERr!s|8|l!$Q{~k1spZoHeGSA?(Ab3L zgyx&Ur@ggGk=q~ zG&`3pVEau!W%?--h9(S+Z;fw>53yBFtesf9AULRUP(_{WBEiaWL(}mex~OO&le^oesX!v zk>Q&?qJBhuOk+%AhV)aC2j#x^_ub#usaLm%z{c zIcIF4^xC~8^;cq0*96O_9!1=U4Ip01PT;4!CeWuzJb~Q5IsRL5s=ESq#SvzOk$!9nrXE`0%I9c2j+_jY z=b|6QjExx^uLhf@N5L%9%`)9jXZh(YGtV^hOf!v`X~Z(Afj%|$%49kj%^!*PotIuy z?5t5!Mol?7STA-pz2c*sb@;c@e;b{npavF5k94t|5zP_JCxhXf3ARjUnGQPSbHY zcF+C$AbtDI^ycZJ#MfR--y6JWq2YywkEtJ1U#PiIbN<%+Eq4DZ zu>r+j=oycs{_u}E2juwb@zn|C31z5t*Z8h`w$d%_TiX1GYo$kpc(QyV zxgui5>nG=t-@QR4lb>ebBAsjx@G8! zDOXIna`?*O)6xr#Z;mauMetecvzFM!#^sH>4O&w!G`PfwB}NR@hHCZ%o_+4{xx=G^ zGwWy8_emV5*egK0L-I(U+bly0=c6@E7ftd!j?%%rq`^xu~FVo}wqx4(3 zCbr_)!)Fg4Uq8P7V)Ml&`;9CW_aqzWWXA71^VjCDJzagedT9C3vOM}psRgSy>Ww$* zZ`A+Z_^#_cGiR?Z zJ-l?+AAWlC^d{LL9y~g|ZTMRz1eXTvSM~?nlaJujoa0D_oZULRwMfooJ2O391cr2u`*7TlIz7h)b_!tXFh$z=_ATBlxLW6<{4*xX}XuDyRLR!?LWymx+{4mqXN3tcj-p*tIDq`qxwem?bg3r|3KeB z-?`;;%W_+W8^etqhjttqo-#b8K2#rCsku_~&eSThz0K>P#Y4OOipIt_)GRm4|Ec^Z z5#)bWHY{&g{zr0$-0PLbD~;a{|F(O!*^`YY8}z#MlD|OqvZHPajtUkJeidvPJX?IW zctL7^=_g0Dk7)ln{XuSR+}ikM^OsF=f-jQ$?HTE&;xJRHQ>rsmW~e+|e7Gpj1C2bN z8slw)`+_-Bd(00j)`!oZopY|vNN*7S)c*vt1ZSuAU;JV1&f1+j+jq9r zVz{d&rxLG_W2D!eygdF&IT`Y|k4{dA+O5ZPjuJZCJNex!Cl`=k34PEpXHGn)63981 zAISa@x0D|&e{9!ajnw-X{|&)j?Y-LQZ{ga)wev=uH)_8b_M1TirtL>g{&Ye!x?a)l8q zjMzKH)tge^cJQwtG#y z0#2%&RJksB82q#Y^?~|(Q{J1h|Iq$JH`H&aUywd1&nDk(rSwVB--fPnZtzCXD!0l@ zSC+24U4FZ~M`@1|n-RS%*<7-@e|`UYCFsV?(ih5p`@HaZVYAX^-TprO>2wG&EB4u) zIlJtd^aENs`C@!mati1Y4+g7tR_%C3{_lOu`&03&R+-irRzN$@J-5%<2%_sm?yX`{e|uiPD!rVLxKHktYReMEPQ5*_buKx z*T}g>PM&V^bcarR=(Ob##Q>UCd<=WwEhfivr)ZDnWadyh{ zEi#&I#YeVldPa$3PU@S~H#|5zSPb5;yg3agP8%vF zP9e54Z+w8~C9jo^7PD{~zM|vOpJ{A-2)@sbyrq0gHx4d#cu@VI`g=p~#cO`}5S?-F z#7fCjx!<1^J}c~4+_89fuukHT{|fdj@7X;MYFy5dwP&wSe%Hb6gWKyj*Khu`@zch> z!Mv?`TYpSX4D&CJI9qzpZ5N;u|Mv`^2gWv>UN5f)`2SJKc~oz+clwU1QQsjDU-(b( zUGk0jz}cxI;=ttt5zAjDy$bq*J#sF=P02SP6OK(z(UJlEfPY$?i9I4egx^m7t9)B| zK>tcz%kcqw73f`y1@hS3mkgRCSR(jSAP$0`$f1#kwM2l9z6!*Eyr=Gi-m*X-cR`G8 z|MVcZHqmb}mVd`@HMN!yTpr}@(Ql7Fa@3KdmK|7j;Kj;|75i*ba(Yf4K6%(dM7Pv$ zskfS~<_oPCTB`?S%89{T>1`zD%Qii>dTf=>dVFw1-w}N`rjDGBws33V)=Bk~>YEI2 zGW>iXH-R1UpY$I5bLY?9+V)?jpW)c#b(~W;r@)pzxO#B)+S;`>IX?29*nUgs6%add z*~YSs-v!S%pKs!e2|XsV{qagP$Y^jek_GqCG)>m>7H#;3cjl|6a`x8KlPJ)PQZoUZ%61l9&mf z@0tB)_G{o!8(ACq{NVG0bT>I4{4M1FKJ|U-CpS)R+}pgjS#Foxvj%kZgMt%s#`jgh z#Pr5v6JAicpt5=2=6yE>2jzTCaR+|5{`5IsDLEdWr}yqV0p9UVuu^bF&f{ZW+!HL2 zzLerabo~p<7nXOf?p%E?{VK#TuFKh(Vo3b_V)Q!(rv>i>#{}X@C$vxK_5 zv&l7;D{)!Qoja|3TKSCN#?pDAFm&uyj)i~B6_MFlpd}8&*BMR##ht~#8Rh8 z4cykeI zL+ah@L2;V@o+Dw5Y$ACMd??2S%La1>_&A!PgQ2szg9mc<`f|ZD>EmH9ogF_QzHw{+ zt^MN$#|^GIV$Biyz`c`mi|2@+9If&d^QY6RE=v!{ErYX?Rq*og%fmAStJYVo^99Y9 zT+f%&^XK{U^W}4E=Z5O$ul=?1*NQxpU2+bazlrbQajzve{FUUAJf1V#uWnx5e7f;8 z7kgut#Jv_yW9z@9ChVJ>=e1$#5z#aq@10i*f%i8KRw}ih4J&^zWM!yM;3QjMaURWc2x-Spz59GeAADeP0`Tu0HT23{9n+A0L_k;fA zE795cX5R^{uN*11j(t?h5pnR&ydwN~hQJ zWx?3){AY4F*j;D~o$|Nt9?-$)0%A-%1^l?Kjfc>8@qD_`NdZ6e`vJQUk8&?HCHy$M z2mH8SC$IV+!7YLOHoTXw8NW2ng#%;0IcL?1z5G0&TV0zxaxn`rm`4M-R_~^dY$*_D zQj<7WaBq4#oe;?Jemgxl>aBV##Itkq`YGL>d6y-Ja$@p_?7cSwbYT2+R{T_61X}tc zKy$|>;v}zE4Hz3zJmGi2Zvt_Nf9D(n@k}~CUx+!AdrYp(o;>E=gTsRjgBb(7pZZy3a^PV<3*_938IWz2X)4|EAC$UQ zwLPZ=p6%d39f*0<6UKg)1BM5)A;|2(z#5wmb{^iS2JV93{J?%tE9)A+4cLQg26!i1 zj^2+3(F}ft$Ge_*rF?k25slc-YAW$>^-XMJbM9HJS@Xwcw}%CpK(3pYxdQXeCKwfX zPb~yrxO?y=+e3g>fq&Rs%hM2-Uo9{WV_qS!_H;;}Rd-PH;>>S3No4^TIdo z49FzUNw%_S`A&S7kAOZ!|BydO7uq@Ck6%03IPm}N0)54f4(MR6@AZ-Zt;X~D4p-|ij(9=>N_PkIiYIW9OLpj(q=_XZya*2-M- z_jxYQcuT-1;*6Nf0`X-29K6gJJ>xxreMukh)?&mLVSVhCF9Lo9Hk`R*FVNl14|(q1 zet$A}D2~w9eMo-Vqm3|D?`?OlRlzbiah(yPvVI#q+H<-il7eNq!%& zE4K~Mf%Qkb{3qxMEs;&$M|H2HiAxIZp4Ai9on|1 z+{68L3Cw|4V=_nfhac1M~nC$e$=B!ujb10nnPnT4%h3=Cps{fzUNt72i@R%{_j2Wi)PG` zedF1!k-g)(cz|^`UgJg&=E3JZBWHeZ|5+#VX06bhz0Th6J@41y-o}fMyO(*gKAzL_ znd{zKTmSzZ!$;viy>VDW*ELSpA~Vgq&%1}Q`mFV}KIWI)u|{aw7|fr0nhWv+En6q+ zY;3OQTISLmpjY>GPwVLUd+X!-_BfeOM%oXqi#NHC&!R^^*32CH@r>?ejm(8PbAR(- zk6I)13&v(0&8<1}9oOhRzgJ@eV+Zr^-ac=Qjm4|`7z4PDu^CJ6TISR5#_MlB@4NPs z|9kbm@1q6qf1mebT<+}};P2)f?eu5??b~zK$p5XGy@h6t*W7u2yrTzmg4V2?F}S96 z!JB%p#@622nG5raPOYys!6&`iSH1P|-1I|w#YchtXCJvHdO>S`%)RgUuIpJR<3Y2= zW9;S~A9L^CtLOJOWAQm_fOdN8X^p&Z&g^@(seAgqweVf@>vO$zG)LCtf7h>fpWc3O z9WWO3g^$e>m;-v9-_4~xYb?g(9-g(grtX19cuwE32EBFgee+>{(XFu=PmeAG$6C%p1CJZ|mwgtcmOO=G44; z-+cQ_4}M3#=D;)CbI^N6bL4MmAIy!p19M>hyl?)E!Q6X(&*+)aB|b!tq6>Q!gF*lH zg)#jvee|wvZvEf=dwbV4&4Fv$M|hO^vfqru_>H^wiih~!b2dv4eDci(fp-sk`K+3=MfPq9|U?E7e=XY-(`|D9KJ+M{pt-}}4w+~0j& z!@9T*^yH^~;QK!3dH*{r|6Nn_Z)~0qdNgkS(P0n0_wf<@pr-@4mhqck*D?lcYmd9X zwMKvb-us+2>&+RO@_TPiy>F~NdE$EB^IhXZkH*m3v-mT9Wj>9|IMJQ|_da8eJ%{yl z9pm(4Oy2A5AJ5!dW6$Mp=EmoG^kOV%*fW`H&uR@kE8gbS+XL|e2 zbGp9Y-OnDUm$NU$TUJeNko)-F;z8WhU4NQ*$!ft;!Fs{=0ekJL0Kf3c@4!x>`^#%1 z5B<&f@M*RyJC0p>O28lEd+f320z884XH4e@c#r31i?1HAOX&V=1Gd)A0p9{Yf&66P zbL+;LV>j_7@PCaB^i|+X5*OfyVn^|BoF4Gq@#7ggKLe$Jn+B*jfBL>>+c*hEb=?FTt+q*^7J<`~#kkzlXhpAJX^G2V2j&qZfV! z^JJ~f6M7}b>`(i&Cl9Qj`J;2tg?yg<%MM^`n{zzcJkv+4%L4(QfWOJ*;G6W>zXs$A zyPsXe-uKEbS0})4z*hHJv9Q|%w84)cUSf^W%R>P_f$OdrSabK*AIGcfvp3{a@`Z`r z>=W?A%W>mt;75?d!gud`#{~QtK8J>VhP}_%A(rPlXv%&yPWQG~t_|c88H2I%{d=Ep z0nPFg7>mD~Tk~uV@B)4X>mrUp#*!=M-k$P49}2#QcFj53wWoTo_=>t2u_t^2KR}cG z1jdPW>`}BWSI2kdAz1gz(?bwF@fYx?SwnPUU+CS02GKB@;`23L{sQ~nbD?*1DL)x) z=zT_4s3d2?9!1+|nEbyaHGhxAKQ$_OS9~|(@pL@TYM+^JdkgOpL+A5gvs@W?ZaxHi z1g*~#@IM$QI?#&*ALS?K|6=Fh@v8=W7_Ma>8{_Eo&#=zJ(+qd}|Ye1=a_4XWA&epGad$FTwUN6-VklP?Ybux{v0jECLK-_M7k#$ApR zUdr}UV}%awd)GELyu#d*Ew0apgPyD{UR_JBE867K;m1HXcrQPhd^>wqzPi0Y_q1kw zUh?a$Gy22Z(K}xexn+-_1u~6K+P(2-&uq`|pZVT}>0*cG#{|AZUo;keTl}Mqlzg)}72lH)1Mc!sLdr@KxKp)_@$r zm-#I1UHjiY!9(m7-@_Ntt9T39;`HWizpz1E8_o0Q-5vN&cRZmX@)Ld8FXK{A zYkyfgGR3QP_AJ&*o&&yTKZ{@DapoJ3qg$XibI1ShdSX20>5%jZ<*PH#;+puo`9%xp z(b#WDoC%+!A1snyw)lqk@g_fFJ@`HTgRVZC=CiIW6K8N=>v>?|zydzwJM@l&(}#o} z<$bh;ACb4_;MT{>`t2z>LWc!;oNheF8awaSzWYh>C&guwJ2EzyE@uYq zlisMm30@6e2v#qyp3^jDC{D@Q3t>UUQlV7%J~%ay8#zAMCb%d-i}X1B!G4i9Cq_Y^ zus7`~Ih$zTGonNLAJ2R|y$$(^_~7Nwilw7lesVPTQECXq+xX|v<(t9D!Q82p`L^?I zN8Cw%+2@IyiFMZ7_4dQbM>xNIe*1&OK;`ntJvlFZf{qQuy><>h4CI*}AB<~{Ys-~X z>!2rq@5m+nSFlU)w#=r)_PgF zIx~BhFN|NDpWJ-zmtGS7eskgG0-fpl!u18Qc`?+-3Xc`UvaGwCwWY1@er(s0NDsS1aK?ds$ug>dBEqf8-Dujo-U3 z{ZFi0J}fyw4`1WQHM)KLTu)vT8EX#k0``rV1)j5V>cQ}6XT{?C{0MY;GQ{3;Ej>HP zB>kDqyM5#NJPSS{-e3&A$F{}ej>Cyp+goUh&N^ps)zquHy#Ude{69L2{qkji$I1O< z!_AZW=VOysMu#w8V!p0Rj{)?C*5wD74|9I(G{<)3gwGkL91b!TueX=+%$F1E$EWE< z#zKDL^<7&k&q8*;7|^Z6-014ohfYOCcJ-f(&$U)d{MmlM%jKcaneZO8OlFd|;(hq9 zn4P^uj?i=IgL0VUH5vn%OD>^BaU*(;{V7+54M3LQW8#l&O8T_gAvxCcvnA5s-kv7E zAD!mWZr?kxDEbq9hMq}ZwPvfNKONnZZ97Bigz0R?K{t~ZwN7E30^N^3WiMKH^kv`C z7uBB0fpD+K(%+c9Lx;6DL=ZP z?&FhFKQ5RQJQL8NmJR4XavZF?+)Df#yk}16!162QDxnWF>OSu$*M{ClN0W>DcKZ3f z6R6We^YjV&q5PXOlAD6w=;ijhYm?(>o$i4T;cH~Ny>n%-UCv#3Ex0z2HzR-eyYyvQ zF}36C268>@!Ik72l@=<^lO7p*Ev!>nr}BLAo8+B|zV~KXoZ56;CRD9V}d0xO?W>TImfVw{`QN zU1)dv?6H~YMP&B&!Rx8rekoYJvwAwM9g&KatGj1G%1`DGv99!*E0f*7L}`iA+<}D9 z=YnH{355yWUVvzjO-M(i&x!BLL&Bf!KfDP)>HVNB`WxP4&!bzmhjo_E_+8G=P?s=6 z@L6iKUI;D^@H==ukXLE#^!lKqu&L>ecqcmLr@#yNEYP-nVegUW*6Nhti2!ZzAK}I9 zBldSO@VhG3)5%ovw-fm;nWSg zXCMB%`S0f8^~3A)1;+#{HdkzpPp!rU!G!cJvZvTEwPLNfdTI62!a48snDqBMzkGiA z^qdoUPVt-~zYHCDh4i+2G(Bb1VLh4p^lej{d311Kuu5tX2RZ|tE7RW)kKLrONjE3! zkLjT^IoLU8@BKTNBj>s~_h+ZnBC{#yj_yWQteU*|Q9&{IHfLd~KUz0X10+|R&tiOf zGS69@Q;XRmIvtmuKgRcB;6C3LzRhX5N2hXdy8;=|nA+&-UZbau?w(a)U%V8kg(C~d zF*G7~^5oQuFP7TNyHck|uO_4Ma&{lyZl3Us2XiLvuY-E0o~nokJD&%qr9Y7QnJ<_> z&|?x0;1`%DHU=3ZM~EChGyGyg`eeNk$PcssW$Lfr0`K{P45WCwZ^qBAHIC})1gm? zwyJMcpSC$|bL{{1GNPmWGv^r36+96+zZmaw;=W1M^^Sq7w)YJ*h z7Lgd|djtbXICf z)MKm^;Qw^F3sZ~xY3g3iXrIxRyE{kv?RA1JQh8}_EnQx^JV#}Y3Od{>s0R3ynyd4I z9|H8YR%fk_TGtL%e*;M)wn~WWdzmT=^_a6!l3D6L|1CRfGdVBE^kh@d! zgI-<@4h?n+lDgip59mdB$&}QG<11*M{{XG>JCR?mw|8oJ@E>*%9{E-vH&YF-%}-afp2NO~L64L?mE#!t$hlrIlrVueHOTv|EUGv~u! zUAVeH=j8(+XP#<4m5xAT^Y2s5ms&5io@zhUwg=^H(eZYU&*krhzZVWH9a#EJ&XznX zm^OGdXV`ChY->_}Yij{AFZ{yy^M$L_y_?diD{9b^wQ>2G&lMg zT@vtPeVx2ix&l3L%b**N$R3b8{(ZpKWLvwATr;}J(y2qORce)E`i|)fTj~E*aPZ*4 zgS*ytt^Kw1*V2UnTK+C)^Q@O18CNu~Xr32*Qval`7H_)7bPY9eWCQ=k;{o}+QDvjb ziRBZ^zpnhcazXk%99KE6GDCXz^4sj1o>+g)`Oo_|_itX&xT3LkbM5Bit;btS2Db%U zr|%Kod}ra#!Vc+S_h$Lc^5vDwE1#uz(LAMjO6q9n)a0wZa&FGVUAw(@`{dTit%I8f zr#s=@&6RVG>!_SrCU(N-q~_v~;vvPs(qL)n;L6~`;PK+)MK&-0y!_zV)6+ry|8c>0 z0sZ8!0ef9uA3YhZ<8A7A_6sgc-z$02X9j<+{JCO({WfQht=L(yvvqrGZ5rAiq{jA% z)bn4Fnm)eIS39qE4$K+FbaV5IcdV7Oo$t?ikETU)nw z>!JH|Zt?d4S#E_(!2r=p55NCKY3gr`qe__D1Ow zx@UUy+I#HG$AilXmlgIY?i1>Iyen7!l(U^5NUuftx#}!eNl!R=>7D$LJ-1eFt?ZFA zR1WMM*yRKEn!kOUzE<=k^*a30&!rZ?{nv?)<$%Hgh40gAx>0C!eRTHyE1g$5KMUAQ zOGVq}d&CzQru3l4qOW`9Gcd-*gG+zBv`b(7`{IrKBlKrB1O9YEv?nr*EiX z^u5@-y?1-2pp~BqfqDNnxHGl5FXe1pGI>(YGJP#Qg|{njmyRZLmVc4DBsFN})LO7F z-%GEVXH%E8b9&S0XZS{NU;DoH@;PTtyllbbqR)}uqB{gz1_uW>259G#!Y2j(0(LiF z&%x;%dr|5?)br6B$OgQ>_G7K<7aAXZMa=@=*YSb)Ejyk}8x`=q&`ZsOynL}6@iltG zBZ0k6Ch%4B5wU5-<=85Jo%+}AnO}cNEem@Vov`J5*X+u$SkL$j`-u(9u4n7en?H*0 zmfo{KdaM}(+CoqG6~78QN!-J{(QEj2pGnWCyJ~mUPU%0TKc>Y%TF#94clF=Z$BK^? z+4EO)uIRYmeDS?5&|08%LC$GEt#Ml8yP@xf7H%xuSg*5Qhi~NK^2OyJDnC@t4E+46 z{HyY)?g@gUN^}{%%;C;(XV&z%YYn%szu}`AM>Q5n|F_wv&OTLKfV|l`*si!;@h9nD zxNmBAx2kMa`E|}QR>Q$pu|`go_MK~+*D~Lm-?zSRwey4L@+0H7d~ym{r-@^?9=sj= zrSz8)KRbK>AE_&OxAShg$R5?%C-|)WS^J=1pFmF-H5Gg*Kg&7sze;`jHNmpM2E`4E z{HF5-{4#V&^(bHD9DsF#o6-k|udq>RRLE1c3v@_6Om@dRsZ+xzd{^BMJr3`k)S1*l zLws!Xj&+Oc7Vjp;=f48J%z^SiS#QE?`mgEV zYhbT|`3C13e6adpb*AD>Mf%cXQy+^(*y!3<<8#*gg^ddvYX@Hpe=&S&dZUo17l~n% zcQ1dLvq&!rUQ2(fHv)40;^M{KK7ey1R;K=Lf%M@WOrPtIhCdp9Gd&=#YhBl3WQZ3( zS9q@5tK;qTWPP&qWa*65_C*|*CzU3Z-b-&VI+%wZ*BqBh)YY4>1mxov?JwGo#>OU3 z_=9IkP0X0|2mPV+Ly7)#c0fMTL-__aO+DAC=@mk6d?$Dvw)sEl z1LVzfsb#g7*mm?}F*m*^^6Jr?b+=DIe&K6sxYol z#r#YvPbwdqy5qs%*7B`P-twPHe=4c%UN{f~e?EP0W=TDu9?Dk-7c?$tEZ<(fJvP18 z*^Uzn6ASakzr%lXQR$-6M&*st)#$DA=m7olzmH373UB#o@N)1<`qwSrS-!J$`Vr&F zbXe!`ty5g5cvb1D(oN-?%DV;VW$*Mm!?VS)@Da4f9-bq$<+B8H1$-IoRKDUZidz(S zPp`LI1K(dWX9>)nS}^;ZKFX&tEK|c+|G|>t=Rzq!l@EZP2K48y;j`-g23jWnO6EEa*7N;Pu(2p7#HZYzd??wGO zz9Q!FbigOjlYxAKPsHcOw<}J*XyV)Y{Oud8p8ONK8Jli6F_MGJ2bVwT|D=DO5%Y{# zY~*4izZv{yaFd)>uAa>G*?DMumh^djuk~IFUFeH`!_W;wH`Q;dU(~s%vq-qcU6s2k zqidsUb5!T3THEtW=Xd*xuu1j{>eJM_{fF7fdLg9E!SEOLFY0Hc{+R4tD?NkuE$&-f zJfMfO5$-MBTe>Cv3r-C<&d4e2z(#(&@pxmW=1$EI({l-buvgerdANQBmU&Og6D(7($ns>?5Y3w8<|0|9UUHsozi>$6C53%ptuBo?drj$0Utkmn9qXGgfHEC z?i}!=dp`QpuL{3P*TQ)U>U{a%HVmc@>}fg~+UFbDBfay^>OZUhpn-!1o)~;$aJGTj z1{SR>TDdkgpSz`pqaF|s1pF5Br+?I8&BL0zH+FCAm%ch@G|y=A;j>Zk`0>^8)lVy* zcI`-XGGB4NqPUB^Au$ELAXaXz+~r3v)L*FotogI%FWbLt^ChpJn%_H$cccs3C+Vc~ zUGc3zZ(sJ=$HDRGTaC9(Nk7SNTHmyuZa%F=WOGz|RQu%gyyU~AJBVM(>#;ZZ5s%B6 zJl_PT>mObCOCh0}X?`6)=pN}!$ajQ~ycO_Uz8g%Fnsj^dp8=hMEsrl95sV1Tsr()J z4vUo+D{oxcxZ=H?((?oT9??3Ydj?CZ-DR+Mc{kEyC)1%XYhBju`O)9%Z_#b+?+;UdES@8_ z&355mJ3MvDzVl@u_Rlx#xp!;tmd-ufwaGtvfbZjnY+rVo_zRziI5OTY&w!rlGhH83 z&O;`D#CpYZ(6qP|8bC*KoP0+Pt+;GVp8`9Kz9ScIvDA0Z8#qJ4cj?sh(d+dIjGRON z8`U=iid0xTohcD-WES^{=B(-Yx&mr^pHL= zc>!mnkJQ%Xt<&Y^xbhmMHA*9kBa3_m*QZ}U|Ir%(KO?ztNN{<;j~VxChwe3|Fs49n z`DN*siQKJKx*+G};(>C(*`Mq;Hi(`P52e2dp245@eLxpCfA$1BfzN|qet|&!5FNnx z)!p-J9Tl(>?2+FEVk_5159Iqgw{UJ@=F-fif7Jd_JG1Z1z9-_D`KDM7~dxkfN9+?;6bnI^b^+>th$lBlul%63EUOgBLn4bS4M%j=2-t zm>k$A+IHn3l2F8FxBHz==NEKcqS`6)-mzWN{#FORtE=BSHT<7af9n**@~c}#MTd|n<9 z{}^2jo%_Dr1%6C2si!xI$<35}Q8Xb><%)pK^;U36;9N$sd5Zx5?$0?MmjthtUoB5c zKirQB9~F%8sm@ce;3swcBxsdw#-75z+2DKx-rFcSz-WUnRs7}8=|#=n`lRzo*H#dp zKQ_2AIc;)t&;$Jre;f$RF&-+v0&Va^nM1mj^*?{=`CYxsXURj)5Ywr6bFfWtQ_dc; zckoeqJs%_gleh)>k2ksgx#7dR1acGjsrZukugMc@Qw{!{oV#EBAM`<+KUhDYx84vu z9?%EaBV-iY(LD2Y@k?D3n18kkKht0!FKOdI&dN|=AJ1N#z1!=V3@~QC1$Kp80Q^TB z|JcH@Io;~2LOGCg^l;+I{GIF${(5xGr=jn{S+RHNvBu`vz7F`t#s!xJ=1k6xzq8f( zJ)R8YqM#Mm$Mf(lYrl3trt5RGMR^OY*UD$)OvR(qr&(-L?%64Uy~)0oKOqm)Sn0lO zJ-J+TL9}Pj;x+o-BqW^^RaWet6Zm*~4B|ax>seFJN_NZJU4F_hU|-R@`7OT*>H(dK zzfqnKI~^}If7X!qj2(CmJJvB~R_J4*lC zC|E5J->~05ia%0J1@EWB&mJrrm=FHSzXfCf9*-u_16oFlXig5XXJ9ArpRhyZdy&EZ zkEixt=~MC%*eTXW3_$-Bd*5CW+h=oIW4;%9?3w}DfR~At(v$EFwiRE?zJc|D#RK}Q z@!@-N1kesU{fYkrJNl%+JU<@ztb7=A>bu2hl5-xI=gkATrpEJ5K%ZfM?h~*Z$rCwZ zc(>e4GN2jI$Iy-MdiEUyd6Z36gh3|6VHKFQfa?;rS5w zl3+~0mnnAyZP7RQ$nn9`0{0_>(Vq9rF~8S~!TkZ*VeImo{}b>bf;b&Ln4ajl><2L< z>yKuv?Ti86g+1r=Z9<3u@#pd;Sd}j6l4cUX9*Q+t}vEi8@AK5;kN80!FLHr5L zc^3D_W4#Za+dQBbb}yX+A2>X)&(w(78}^oK?-F<({1W|ouHiWH#ZKH)jKjS1v7?0> z12l#9)L2*}GRI!WTg1Z1AA7{UK`Z=9)?D2Ek^rr`hVP?OdAGgTMmMh|*R$^E4bMj( z;$r-^coGHls~|}`6|GxG(b|A@84Q^56H3ym2AKZkk>bmzJ~I`lU((RaL(o4s+yEzq5NaSpl; zTN&-3NwnmBH6q4fjf~N_{T&^mCx0_$ve)m%;QqijNdKZ2$dSO~FeGE_J+o_?7e78j zCo^Z}us4_Zfc3>Y=s(`~fBLfb?NjSP#?X`Sd257zJ_@XpzoU15CwuTK-}4@s_F;hT z&_dS-oX_D2?q$yC0IoyNFb4a^`ud*dGj8KY!|qKM`8)7=`>|%$#j~3~d(7VT{CI}H z_vEbkH&5of$9u>cbYZXAN7f9_#s|=peMs)0AHQ2m`xOrW`fUI@-_S?z zI==6B{L$ykExItL@=2_Pxku0ToAKDLgz65_Pq5lw|Ir?nOmQ6eXn3$>^ZOCZ+@(uu~?s;jPZG6 zvNqo9-3wjgLExVFmH(qD{0o0T$KLaQbmzLRMRt*WJw9dZ=*j2(AAHa6Xbp{%KX?*4 zM5prvXcq0u`?r5Qw=w!Yo<&xRO_kXYchSt$EdhPK) z*F$H)7a+;dUDWrjNSV^dNN07-*a=FMlV4_frRz4h^Y=*E4`J-B!8^TywMK6C9_uJ8Ni1x@+AcORec@n_fd zEUsycen&^>-Cpqg#^afc(;92YwuizQbEMDO6{?>bL z^Wy(KKJmZbHFvJvyT36Qo1flu`hRa6Uj5yet(|A`+@24O`ac>#cRilzeZV`w|IHKl zo>%YtaZf+y*R^|lt#=Lg^m)JgTaV}TWW3+Oz0s95z}M|Jz`K0UID4xdLqj~nexig2>)_Z`?{O%RJXDxls^{h|t+Wzm_ zKHs~RzxBT7JAOQ$XYy+N=EOW0w|VHzOK-k>#^-y_?>T$xU<}r!N4Ms`$9s&y^V`?G z&lwLIM3bJsw||Vex989xy7W2kcW;(|jNQGgeQ*7(1N!j3`}q#OZcp0};Qy}eeb;th z_y4ct_^<5f?Gbb3@16rZYwvkIhv(_ReLc7DSkK=5tdHM~3Cu@tetg$6`SCe>(U^O@ z%@~ctXj@#;JHx@+O__yOL} zcHq>|%&PQB-vKreNF z&w$RzO17gpGG9F&r%)?0I9h9v=nx4!+=X#%6!oNABVI!Tk81 z`L^$R^3(N=!Qa>v)~&Z6d;8PcSvPP`*K$o`u(y5R{oLDpc+Yq60dtKOJs(=}f7dZ? z^XtC!+@Af#1~&)R$Me%+`C_aK`A@Iq127j}%~eky@oeadZHC7htGNZ^^PaK!-J167 zN6+Dz(Ip=1eR@W3PL13D9 zXN;ZAv~$2;$i}y3=G<64i}88}&tr_{pC8V>@kDdd+dF8_bNR7%R}c6N`5gGt`Th9Q z<%IGn@PG0R{y(nn1lY2wIs-8GbvF$n3TO*au%8h#IDi9*18TS6fF%(J;*>}?QmCL5 z4w!%njRu6EC}L7XQ_xK*ph*M=L@6b&jhNB~1%e;}^x=fa)Qw7m-S1uUf9LgIbt`XG zy?gH&_Fj9ffBkFiea=1C+Nt#j>k`%%tdpC=Igh@^g!9_OKIo}9sU_7VQE{)-1-02cTTc8%5X_>YdpU>~2bv3|8n zFT6Ap`FaHQ=_uA@U96 z0^%2z*^R#9i9capuD7n@T9obXm10-xL45BRxHT@g)fa#BGk#?={lV0V+zr6@eA^tL z4da4meq}5DX`hbPpjtneH##2Yh(Z1095G@Y)>;+)ae*A~J${BS_HwLi3-+@o?$kHi zYm2{O1BMA*T`P0l&DyVPEApi{GG01s-?cb?U_qhIms z`k(PxJGQ?54-wb9@VMWw4uYd@m)Mpb zxRLJKHg0~vyZ8)-#RqKRdE4oraz4Gp zG9EA%7-`(Gjqfb0Ma(;l1J2+Mc8Fv7oP7u#aUWa5u^PvpI)hDJk7QREh9}p9*-7pd z8|OywqWd}Mi;LYa!zaedKJW(vINN!~N=G(icU%B-bQZhXfiw37y7!As`4P9`41VA@ z{&SC$9KufU29JDetl}D0+Q`EqTE;a5)f1=)*IB z#EMvEH+DZUBEFqNCo#vy`h#=W#0UJ1d!57X_z8dbj9cN|KMo6;T3PJj=-yXN*vFp>}8)Zu)o@} ze5T$OgPv1nyy8i%Atu<`eWC7~cu$1x?mH1z?93jv!Mp8ppZiF}t-3RiXG zY3QXU#}jNRH`8Aof)~^s@+a(j5Bu(Mao@a{-Km6rB9rq_Y{wWdt`W}yG|GF0up4I4LV@<@mh@8gn?h_Pe>OFB}oW{nV z#^ya-!UnszHxuWxvldXBi?k|Hub?JNx2o=gJY< z9mbv5^onEU5S)eg94lt&s@8*1F(Ibl)VN_sF2=LYBl^N4zH_R6HfHf*y;YuLGjYX_ z+JRp_cCOk42kR53z>Ant&#;f}ay~m5tG0Y61{Y~t?7$N2(TOeG#|9HHg~#Pgxl8P_ zL+|I&28`h`oB;pq;nlgF2m0(-_ZJWM$RY;Qlm^0m1SK9N7+gAcVq|K=~8 z2aC8&ox#_{_~DZ;y*D1UqIed2@akjX`lF4 zi^)6cHg+=S!%^bMF>E3im@BadOsGe3rn!#Xs{Zyme7`I)Pj~nbOYkg?jm4TB>}ng2 zi79>hvkiaCL;Q{-aHFvjSXDdV9Q5@ z#gaT@zy9SmIF(!I3LkuDzZ}oj?h`g9Hh?kx@~zt5_cmMyk$+*#_Yu^;@S-2s#Es$( zm+?#Q$Hm|3fAxOH4vT!`TFK6N9xQyrF*~z6UXp_xhp){!wTCbH8n=l-`4->nSN(~D z=%;>xC0wUA!)e-dynKUCVaa%X-vUBU~ zzW@&D%>JG4vzMI7c6^J2^n(-V2w!*|&+*@jBA$oBXL7XK)^{Y#ujR895zmL?fBfQn z;}tL3_8B(us&R=?SYQj=+03}q$Bu;upK&VQ@@yGvad<^-AfA4o@4@)~qInP9)a|%{ z9`L3OW3iTQ%|X238}|sCADKtu8sk>)%U6z*dvU$*O^Ho)i0|ymJM0YS#*b6h4|g7~ zAGn#%#15aE*Etpz;g1c~erzYdz;dw*f5s|~tT&hk;7I5C4ia0zhFa1XaFe=JzQFyk zCC+daO!=<7@AZgramsFDMlAVFPF#TF+#fCv$lLr1&*m29gLp!&SJ!CYZ-eTK-gwqH z@DUuV!^JQijob5<)E(MUvl)}`ztP?EDwgHD)O;ZKiF5uHPwH}9i;L8ld})p-rqnoU zeShjr+@juNH+mQ!4AGBoal9H1R^SlsVFspQ+m0!^k7q*1v}Or_)>k#-h7QSe2)ZosRPt)?8(m7 zVARNB#Cd8D`4%R`Al=0u|D6(%Guc^;sUeJqUGWHe@j2g5N6aPI%{a-=xMr*KIx-%W!BYb9!5 zIOZcY4!)8T)NQ`ECdbH0gm3Yb+^N>Y(|7^z;x;z6k6m!9n$>5u3XI|%Hr0lD%vvIS z{qxSMWd(T@@$LYs>PkrS(h@K_I*D&c>aOz6mb%#aQ1=vMB>N~!8#GJtMTRfKm zf5WivGO^uE#6I>4#}7DGUN_h0Td_=M&o{J2=opyCLvqA#^Xy}I zf>~=9;zvHeDbJtLC!5h-oy|u0+B{VK>6y68Bi6oljEHCT>GgRYne)ZhJ`tQE*IApD zKXD5V-g~t72q(gr?-c7-oZ|u8&dYONKN;~n2X!T`7wg7ij;Lm~t_9E5XRHs*kLSnq zz#Za74pLv?A^FBU$SZCzw^DbRf4?f<$@a_=-vu>y5`)jobA5MTg`ot5YG zKR)6doXR(N)c4q(_ne3t!FW7VWjfEUIArRODbG~7D&n~+>dQ0oJRZ*nIU@41{I-jD zQCF*XPswk*ygTyNh-dtW!@aVu{l}3!Vr=w_h;?^%l!u>|?-idP@hsClBXX>~ES}bl z)(zh~pWAM3Sj!pKG4dV!L-OpIVd--iAxnefbb#>2abG*5-XGY>T^F)7sBLGf}UA(GS?;YPe#$E7= zKm5Lz>!i3-Y->yVu+Hb=TTH4W)t+*xysUN;W8&D{*7^zzs8PS4@7Al8)S|GfAK1{Z zykr|55O?yqwJ*;nfPI)=o9FeP5piup`jqV&3=Uj~pL4 zmN(U->IcuK_<6ode|BUhqOGg*oPFG}E^=;U*+a{QXDh+K{Dxyr8lN<#53aC2J=E3t z-Zg&s^N4j5u`9n_lV|UIGa@(RC>$nUu8fFN_QCD`PK;tsW)Hr3H;Tk{hb7lSy$wI$pv zXNoU1H_pX3a)3FgalkShsr$@L_|-KpzdM9~#IE&p@9~A)_^60FT<)^2hIidZEq>%m z^`scmHhmmx9$}tf9G-up9o+Pl$O|K43s2n?@hrR@^GqLgzx5;asQQJ_S^F?x{>I*H zw<5m);<-EG-LtFZSG+2pvJ;!yXAZA6RsZ2-HGuj?&QfRL5Wewj1{^oaA5y~)#;GsA zU*@?m>Q1&3$8x!T%#Ya7+J^a`>v(LVR+pps35Iar&RI7V|LQ_>4?Kbg)Xee>4psxh zn7YGf*iviXGQMRjr%?_EsX5iBxIJ!!f^k zMw6Hp_xQwpyyh>&IL*1$A?8WyLoueV5%+Q%?i1te;65j{q`V8e#t570Jo7l1R1e8j zo@ryQF6YCc`bPYT3wBfY;}={5uY#FBoUazcmoVsgTjn@wOEsanKMuCer9XOj)`#b) zsAa?{KBlWW#u(TZr>fn=j^8H|7x3MAirP@$FoOs2w^+nu`obBwgUzk4u#>e<<5r)m zd)4ZE2Rr8K){CsAc%_5d4DaH7^RrEPUWs@x7vD2tUP901Sr0TPR(q()#lAXH9V=$w zo$ffq^$zoX?WiUB-E*_}nx5K&UG*T{tyS@Xcy!&y_~F!Cf=&3qxaBo=<|{T(S9orQ z&o~|KfqA6nC}_JD8U zlz+tDJM-KU&&Jk|oX?)Ph|T%V^~3Y?Oe1pwc}UG?u4C>g7I4EL!2(XP1_}>iAD7<| zVF&XbHL~k5o)Lkc)Ti<@KZ+?iM;&KQBA#H>+=X57tNDxhG5$B#rLTJ;tX&!xJ>+0@ zt2$Y(7YpLq8jRR6591p==31q>iW&xo(-Q{phIy=eB&@;Ek&WqYZh&|3qrAzt=F#dK z>!UbbtZGXw1*Y5Ua=}VogHli;+HD8kxU>D}qd}0~b>>k0JY|2jJ6)#)skW+C4JZy;I zP5Z^1dI2xNARp3MjYw6pO@!Fb}e5l8xLIK zbzCY|%^k%aEQ=FyX047ccuoBxubRut*J9%22+mYHyU&+R&Nl<%6g$1ia(6~OA%NzPHTp+hD-6Ey25-=ZWhbN0$)U4 zl`qv3ux(Au+NPXN#24BtY(Z{%rq#5ekbI~)N!u;$fVNG#%SHeDT|t8t2d94Tjr8yp4Kt}((OOc@`H z@`XBZHp0Gq?p6MTIrwqBxg3nMr+AdJtzp^5F1U%E*rsds)<9qbW~^`EJTYqiB}Um@ z{O~EhfeF_j)sx?i$Ya(3VAFL3bs&tnA5G2MIguBg6qg*^X$jBN7VIy9r61^`;GR?(`o-| zB-b3DXVAYm^8Uy_MGlCZ5V8OCh_wX2Z*uU|!Bh8)?isx=@`$NNOxgCS$PXeHM!en- zc~pMi*qX$9B2U;R2j`iHc=F*9bqWla^TR*9iFNe~jJci$i!g<|)UUSVYB>(K<7{^6 z{a9k(njjv)gLC7#F@Lcs-@%eOgL7Tm5^t~w`)nsS*e>6z(Z!jVP`}{{b(=Y%d|WKC zKkhYuG*^%-VNJb9Kl{}%u!>j2fZPG&^n!OaJUkntx|fgLkE!N&UC+A0ecOJ^;fkyQ z`n?ggs=0!L$6YPLwy)5MqhF;B48g zfK}MGhN8B2Je{lqnloC1$5qycjrDi=eNViu{>8blEw0p-S4Y%->+?IH#^b&rHKJqW z>$~y{TXmAPV|}nMyUIUmNP5cmY6W>t{5e)``F++KyyxTdB4Pu_`OF5m++0Ha!WV2W zZ;Lr|ZaIuktsBT|?jvC*JO>AOP7R~xkQcqjH}Zw~hnf_xz!DBJUp9}i#*g3RbNN=x zSwB!im_NXowK8)n_Y6DUTt+;=nQJJng{mW9)VxDoYYk6LE61wG*GIH3j>WouY+n~q zr<$Lu-OY>iW31*1=1Xcea~scuQww<(rR{z%*&4ok2=rwRWR9(G^_hI2{*n9Xgu{(h zZS7hD{pBLHr~JjX@}FEKrx~j`gE^Y(`szKogs#?L)xcia%JJ^4)km*$s0qcU`i710 z9^N+=b+j79{R;AdX9lZVJzrNY(=NM+Z+*&h`e7UQ+!!nWv5j%!Q*#M^;#;rUbu1iM zhcp**4H7owJa{vAZjEm}TmBX2@~-W2kosP2h~un}S#Oh1@rU_@SWu(LpJG^U#v3z{ z#=5%5d$l_*G%qp-f=jWfPiv9tPV+nUoAw*ejeE~wRu8BbPM z4!omwGuIJ+ILUQ@OUIXv@seZYIPE__vMO?60|?0Seg2ludn{jOKIZwV)}yE?)=2Ve7@njOAyyP6Ic z$rG@%B7&dURol2tO^d_T>CHvf46MzmkMM!_c*K759~k9Z`C2TfSw1QmwvKNtL!4UI z!g1zwj`#dg_xNZ7N5Qyxg1GbEnjMZ4i(cvK_W;GPdQ@HQ7_ZI|&+eBHBWz=?tnR}D z;#SQk$IHd$gX(^<1K+rRbp-a*X7Zyo3OL(3-a6ze&p(z6tb^Z>-xv6C3tuUfm{H~XA}JK@Qi04|ho%qQrLqv?dp*})jpOXio>I?Q9# z9B@uYb(C?a*Wg`EWPYPfW49(|O-Nj-+0^&uP1Z`yTfMiADCYQFK6eft^S<|yn-7UA z?YD-s{*3o$O2Yeq%d+g>A7Rr^z+)qZ}a@@jbh{|JXJ; zLEf-_A+F$oh&l0RE@JIkp2auTV4N#A$%A5pp4KYh%v^w;^kQ3_tX>fp=Kk)(a*fvY z8?m7d#_O(SsK5LM@~Vhhm>pfu!K1DpdsR=tJZ}GPe$VF%k)K37kKg=5{J7Tj!^pi6 z^{76riQ!&-=%3HjYUZkNAQz~u*x7o5dfvGBMeQvw$yNNK=9l-(qs5)|abp$>)|lZ8 zkK#i3#~bVh_xMHLhHrN6HAnFwM(tB0@EwlF*S1-wwVn^->J}VkZY>w^r*_l^;zG_< zr&wPw4w$y4YMyVsgwAS7<9DBwwMe2CmeX+>U*Ru4P?K7RP(#8nY|E)?R`Xr$;T+s# zEzdkxo|1#u&OYm&&WGFP4|cRR>b@L0!;djpm$0@WM%ctX{>IO?<}~K)cnEi}5B#e& ztm&&|)SK!=`^>S~z^mHGx)i&L6~}5*O(XX4hI&ZM;jifkTG^4YO;Gq=>P_u9fG{^T9{;bZ;bYGNIX4jrp=s$Y-u z**Mg+`lXZh&4K8Qr{o3a+9t-~SdC*n&D_zsj+1NQUOf0Lp6E~11r>ek!?^f^{jD>3 z&xY`9{;eO!!8Yt^N9`-ttce_$-(cBy$-YZoyZvjoKWFJVOE>SZd58OUyl=+~BbV=R z`3|QqJ$>odmV9l=(Tk2=q*gj`eBk&I`K_Q`x9qy*um=x&aMR{Zn|F@feE-e&Z;hO= z`Gn2;Jh0CLyF9o{eqHSL2RHm-!ynGya{iVBw;s6llE{|G0doh;Ju|XPpcpc=$cD*Drqk;+-S6EV^aURT00H_U*_wBI_gHk6aho5V7w^k$WT4i>DXwA9+*c ztjL9tb0UXFo)oz)zc+t;WaHGv;dk5omdeSIT_Trnclog9tq#H^;y`T!>K1v%x~@dIKT0^U*zlg{aOCKYU@>7Pl_BB@p@5YbL7yuL+5UYyk`D2 z^H)Tcjh79-n|^$LuUc2-%p!AEx*okM1KABMe~n}+&On=e(mu4`K7Zf z=PuhO7tdWh_s`qplDSLfW+Qv%H^bf%`E2Cc$fEJ0{EGNh+*E=GIM9jrr7&##F zrpP}=T$_P0YdzMt2TBA9Xd6xSqt&^Ki;!C+lT`AUHIeO*jGZAZo z)(p3w+J0(DWYcIms95q83v=I-*JKJmxSxhLU($j2gIk8FrM z5P|chQ%k27Mdn6xqpgv9BWz>et&xi(AB`B-OCx_2asAmE&216uyZ1%hgJn(CJzvEA zTJMaorSsYM)X3jQj*J`>`ICtI&dl?y@mq_Mhs`(nT0NmQH*U3vH9zwtVjYgHtW{cX za37TSD@JSwQu?V2%rjay;0J3U@;SeXSv7$9mo;QHLF*#^S8rPjRC~aJ>m_PUIY$1pj%uCJ zdVu;F&zg^zd%EuKJ}9-b>uhXc4bwcc*s+e{KG26!SeU1JZ{6RTr&sqIyMJps;$BC! zx^vw}wlX4LsjuPBy;#CFYV#}WrhK4| zSJQj%l~2^>YIeSHu60B2@rr%UHUCz>Te~oaGA~oNd-Yk(Y9G1SFNeOR41~7`qFqEOBdKv`H;OZ_ct?!jngb%%0&x-!5|hp|CpH%r!>)h2 z?rhz_{S4-)=BMUc>IfVz=B<;eEzJScj^>@>LfqgHVr?GB;1{oAL>+By!#@5r*WgdJ zhk1;p+pHtA4WF66x~|4Xd})5mMruoTlJ{LlQM;=P%xCb6SM|NRU+u02 zH!qPR&6AzuczM#XY6$hYd8v65zF|XiYjMUVgne)Y+u;MTOUw^z)5Zx-#|yA4=ByEj z8|#tQ$MC_Li29h=<{0s%4f9*R(pO_uoLl#zlbj^)0qlJE)zCJvLFtn#Y(6!k!vay#;@rhrt7T;coL+b(XniapJh1;}w3r!VV0X z@5$*z`|xBQXbk3Pd}1CYSBL?%jD6;y=6dFEw#kq5ghijd@0`r5JVS4PbTqH-tG?+& zFS?5-xmxaJTd@QKw#nr%VNN5q?8n2lTL%zpj+bxbB6#uIJk!`~+!aTBE7zDW;8c7^ zY=f(wCqBinHCFiz7OX>9`{;U+Snm3S^Lji!$M3jP{t(adY4b0<8<)@OMSk_?y}Zmm z>}yWV?yzC5E3V+h9N8L@`LkFQYj9{kUd9p5Z5#Z|r+fz&`~YXR@v*kmdSV&3SYuV& zHh$Ih?hkPt+pEv^%|yJ%r}(I^ctbvL&lIe~zV$GIXT-zWh*-f@*2m1L@DJ`0OXVQ# zINxXO>Qmk!=7D&{*ySYS#y>u@L)Qk_!5R)+iXAb`FR+7i`AM#q?{Kkrhe@yesJ5}) zan`Qj&ntmPxU@|^_o{8@dT$?0SL6(MupS2k@`zV{7u!U01M028*sMfst%Bi>LGs@>Fpq&1)%hNqkl57rC$ z0sqR2*6zeM>3UhWiFGwfvEJk59yORa5kqQ!b8`1Ws-xWd;`*n$N=;<0?p{&%x{5t9 zDMrP-*q6gyJ2BV7Jzm*bzVOGVID~j#Y{3OlAHoLCk=Mjy*C(}QJMJ-VSchl6;upSG zW6S%vRjya}<6ZV=bJ!4PeA!rlUG32Y?u$1#U}tgeTyv57$!FX3C$`mWYOlsL{CO{i z8@uodldz3D@r|0uTv5H`l`Zig{^TpRpc|cvCF7H)%sY&Y4z2(62^V5cY>G$ywI;=5 z;!M0XcgxR2Uyc`Z@Lk-)HKD(lV0W>^&vcxP$N_vM2M{|W0NE0Ty+)Pn{yefJW4wDl|$BE_%FWrg+0U;!Oyr9&#D3ROMiNZe|Ul`7^Als z@rwV6@yUxb5&5Wd6gfrB4F7VA+#|n;H^;Ll`?8a9vjaciBfhtv-Pp-FYGiQ;1FrFC zkF<`KJ7I->+Lv$XCPwg?KKPiO*kz=Qhoq8bhyhYDj^ufq~L@tedGjefcZRDiL>d1Z($6gUR zF7n)n`y4+Kc}m3dYUt(%$e9uA+c!kqw`ZNn+K{=k^)vGk*AK-6{-|&H zv$Zon;#=z^t0U%A@|f#zu2;L(=YFV@BIZ?UXm(UPn?s3WF)Lp2jXvP3JSo=9iRjXM z`mC=J^Ht(HwzcFn5yzOT%3H*Jy4DNa*JIA_o)7C|)*Iaq;+{y~eRiL@dqLR1x|_8~ z-)(fytlyipMxZ_SUF)Ok6!<_6rJvW1pM6Ym}881*U+5UaRIT;U5gz>D$= z+p?*-r~5{%y;z@dKb`OK`L4e2=uM5LhI?ao$+eG%MV3UCMIIS>cx120(TRbmZfa_eI_oc|+vo z5&b+nqR&T17Du*^(8=fBB0EJS;iVDl{=_=+VM&83& z_yKlsqS^?4tkVV2hRO!?vHa1o%^<} z8C#QrSwFq-4_p{;!b4YckS{pyWvV0|%!nFH^-E%8utl{y&+6e5cMbutu zBQ*wp%K5Ipxlav8yWi6N`0kyw4x>(h0X2dgqh^sK$S3lpHDqQ^qneeqV9`zPn*x4UFAEm;?DhU)<@Sxtf|sl{f^JnV)~Y| z)V}H|IgprVnETUFjH^k#s!!yXR$IT`wo+JerwLw=i$K`w7g$`kx-t_BNy00Zi4Ym3$+aIbX`YZB@!_E6)PzgTa>?{bPf;~pIA&gMnp#l27B z&~+8>#cFHxmeJzc5xJ&!##bh=cyxci~NL##HssjagTPyk9(!8N2?3y zs@8*(uA8Yb{lSeIP7SKI^=e$Opyt!3SD)n@n8KB<2c4^3_ELAL!{j4#T6(jOn$0{% zJ;yij;yrs?H8OEM3Kyaq}}@u8OcX9(12?e@C8QalgF4_iS#>Nq+a< z{8!$#{w;@e&I}uPR34E(aH%%s3D?|uE!h3Vd}=PO4LoZ;&9C~ykFFPb#kKU6!|p>vPjZi;9Q(zH8eNWb(~3OD)~?yO*5jHp zUHKd*T30i67&h;~RmKIccv>u~Dbx|&&YtF}_`&@}Y>LleRIEAPJjS2c!Fza7JjyFD z=Ng6BkgL=$Z0lanJw|)vsYFj6>LfLp&nHG+6FDSuWJC@1XAuLGd)$kSZ`Iavl{u4m z#4qM}=BR1}F(QweufTwMi0(5HInsF4u>!E+73k;@KFVi>Pzez-r&eM4l0Gk2)N| z11!N9&Qb%J$6HHNBf>JiVLNug4{W3kye?vn_sfWS4~Er*YCN`A-`zgGeXtR`sV6@W zIW+Rdh&kbhBECDp&YL3IaId=BfPQkj*f+maPrLSuJH@U0|9v+AN4r1SJy2>N9ASKF zA{=f_MmxB~x;LDg!^z980pnla#c}KtM^7AG7Qq82MlOr2kDL=ZKJw|v>5&ga9v5*> z&$@{DgV=z3+$4VFG;9928#ls*>$v7_=4@=ro^0)23)hL|QuVX@jB)CU2zUEK$BBw<@AGs!SedOB61Chs#A2&WI@~Oy71TQ@haqosX zJFLQ`yg_ey1J|oNkYd{#D#l+%p+kyjqCd# zZ0}yI)@1IFP;Z&XyWZ97o9b8fu2*%!bVMzw*0tseBWgh$tiHv`a=92$v$Bbtio3)I zpNbW6V9wp^^X@@cd+|NN@vi^425p{gz9KitnPN}9i|fok%wObtb0Bje+~&C=@(O;# zL+3<}jJUULzsSnSt0RX+Y=3X$qmc_Dj>nU}Pvrg^xd-0VY%uD+Y_ZS(#-@hEx5g;% z(;N5NZkw792W!W@J20e{z{EgqudCXh*fj@?4vLtrRkzmQ(#9ET?^T_4y z`+zq!GwjK^d?VLc_ZDAxQ+?|C0Uniy>E?T0V$Qg%T^N%!OMX;WI3L%_IV&T4jdRss z=5cUzTjXI`laS9|5V3aVKC{CjM@8g2>kqcUDxB^dQIlBbFb+7BL)9DR5bDg*cRkm-DSxP!)ezh`Qsz!+U|IE_ujGEWee9UtTj~lr#8AfHE-`nuub1;W#?$UqGqgLl<7$Eh#?LIq3+xpj* zHuPf~{nRorQM<8IF<5+bjK=A`KXsqEn|5JNJ1}NE^ivlT`|azP*;s7wCCrJ3`jcH7 z6U8Fi^9Mfg%Kx^J&Pm0FK8=qUx42*nH8%UmA!=rMLR_mcT+@+fdYuc$5Or3s!Qnyc z49|%;UL9ti&)!=@)voIcL|^zyzsAlcbmKSgYhN~ILpC)gc!5KZQ^)T8Fo z_Sr@p3(w__+Qsn|$Fa3n?M?EJm=b61-B9C;MX@bD#rI?!n$OD*ws|!tnT_yM`OT|- z#0A|*`}JD=y3JVVX}e>)pFP;ZE4&$FaVLfwul767t5`M8#;jNSoC`Ph!5tB!#4*){ z&OVoWy{8YZ=s3Kuj@qOw^~&nDv4Ht`_lyvn^WrY*;4N4$$o_=Cx=VZmuJE4FRN5sn*zKL51uPaE3ShuCg> zJEuHm8@|B_-6js?E%lsOY`lpb@5P(?L7q34Ce~TZuWeWFRjk#BN%LYcti9=o_&0u- zVN15>8^R}(c?OP(^*Jtci+p!HF)E8_dSF=AG z;cs*Ba+W!k_iW_aGY&IHB0gJ(vW+dQL3a+N4kPyCH8#?&_N+DNx4N(ysc#2I=O5fv zPddYlSHj=bT@6Cy9AoinpIn2Nivc;#djenDpaU$iRqf>!reRzRc!lGNZH|HO#({19 z>{Xle)xKA@g%5V7htK*qmc|3@dv6=lpTT)2P}ud@+Y z!nn_(l%kFFBxgnamS-qjqcl;&11Z;!j+|OL4LgMGN<) z!8d_5uXJnN`0Tw`*wjY(!YhpFgXoWrbdopOwYK)!Jmi&3?w50VUUQIRY;Ubm>>9tm z^xZsTT=b@6xyFTUV2uY5D8(0gqZAGm0elgd@CkzuJ^Q9t@@+_2SGzUqFjeCRlKBHrs0@9Bdc#s$Od zVcfVFC$o*uY*QO~Ke^4ZT?1LDau@C&>RJed5uw+CC%mKRoqE% z6%NC-L~OK1b)IAJnDfL4{5P(|hPbd_j>l(?Yunn=hV}>@+P_zAO^(Z$@g1JE&+*!z zSM|W3`oi~k-Fy8vrs-fj_L(!cKDS0P6Y**u-F)DDe5?(kAN|sUty}kcr zkK-nJ$NP?>y0<><_-n7$-fY8e&0GAU-ryVW`An?wpLoIBlNf_#xPwD+1Ep8CJm=nTYG3Y!vRkyTGfHC{Uj{a~1Ou-M4hw%|xvmKkTKYP{} zw%N}HFa#^GVLLx8RIpDQeD1wESia!*?vqp8dq>=3U|!Jqx>xluo^5{7E`Re2oGfIH z<-_|)ztgKVqI@`+lf{ZZt7G+FF2$Mpg%8;A2S0GduI$gY@XQCzA@+-PK64(t)sI6X`3IMsd#ZbC5AU5P zU%(?w;3C|E{|G%{2WJuYPWAh4t|z)D!gWS#hj6J4_<~Jsd1a4sa%*GU2g7W^MzCq0 zP_l^0;5Tn{U)ANUZVN5qRbv5$TE$}1n)?iJo` zhwHWt8`=^F?O!bLl{V=}Kl&So<9aOY;$HqUPUjmRJK&7whjJDF;U2c-PxfrCz!~_> zv8~n0ck+Zbah)6l18mIZ-ouSJWW(B`Hvb&+JIp zkFCU%*deVU#2s!Ct7;3mU}4s|a1XoOVV`51&u4VgCTYDU2AwaCy1wX|fH?Om&uFXH z25Ej;1%49G`~eT%%Ny2z`5q4VR*cvukJzR?pJ4!g9B-{gTszO&v1`xn74e-C+@M{@ zidpffrhzGKYfoFSGab<<-Qfk^;7`B$x4-p~Rkd@<;Ozyz`fsb)HzV-*NiWUfXfpWG;3LzjvNP2YL~IFaR^oC%6U&5%ESJco&o6 z2j1Y&d-&^pN3I>Ojku=-_Gcn;o&91@ernzof8s_v^f4w_(zpC07m9yllv~)axz~8% zMO{gE?c!1Ab}ZWDBj>}^bi^2qMcZP4-;9@Cj799Z_AQRtTRdr7ywMdG;8Z^L$6xd( zj-wMjy%*Q8;dt1zosa0pru=9d%oBcgK8(RJ%!ygs9qZ5eaHf6s)4v#pExhVIpRofD zRwK%(u%aFI(5F6#T)>vq1^=@XoZ>j+rxT14#~Bmb6vM^?Z+MRV*uvQHHeL9=wGO}X zsdnWmJda!PocG%17w=mO!7=>uQFEsA^$Ra_HTSQc?8bh4EvGn^ery5@1lDi}yE~3Q z@lfyE#TVinkFg0+Z>TTWl8xj=>pRZV7Q4a{U(kWQ_>0ZiULW*wUh5afw0~GO9%C^! z_BFP0WObplzKUtO7?1ddXJal_Y9AOBzi^{{=i^g4;Q;ofCmqUlw!^79M9jduaj+*I z5EJ5okDbro{Kmh0CLa0BA6ycBxBj4$W3&&0^w*YL=sSEc0~>HIHr+4jJ{0${%6+f` zTduv^M(`5s(T{HOsbg^}z5UHbyOMk`$kFX+U;kFoc4u8T`FM_1=LU#|4Zeyu%W%6RF|w)BTR z*o156>JPS!mkrsa*nnmFvMIm86)swc+=b`V(?Q%g2Pd_5WLG$DT(J*ZI9}iSq$^$6 z&=}#|xNOI3gg%btQ?EYL)gQmaNu}jb8g3jgJ6xWY|8Im;U2E&DyEE+ z-(a*{t`GWZ)3(-Q#wwrS8$P8Ey?n+k#so*jn6{0PujwdGwaM=G!5;nSgkv2G=X8gA z`18kxY>&(7EH;cqU;N-4`<%}<+U7^chy&+04)~v4okN%M4xO}xN8}#*@{M-IvEyx{ zo6q_d3$W@vJLr?Xj-@BDk6!vzE8qdSP9OI1pW{29v%PVvO?~hUTYK+VI(T)iwvAW& z{AL{R3V*m;Y|zPA%(3JHT+U8xqd)K6r)aJvj%?$1_A_5nkBB8cw^pF<*8iipN`na*2X4Z;cfPS1?R#CUHH>j zZ7=__g&1Qudcw1I#gKFGjD2*r%^XvmYAo8Jk2Z0MxZqd%5Ev4ld=EQxHEz1Ht9XPV zwziKgjLo>&myh}0e(!B-EUKTZ^Ei)R>1m(X;0yj1b99C!b~R?UrW1eTE!*@#7jbIc zmTkoX{5YO}8^i1X>-=fF?(u<-`qh5h-K*z2Kx_qn;#FVT!gK7!KJ=#>8`(!+HkBjQ ziu?z6d`l*-sqrvwiT#R{TfD`pj|ofUWee&Dz6p#-|N^uov9n7W-g|J@|w# zaUwgi86UDEeqaN5_g)`(%v?`9bmSMuYEzxS7WNqv5HBy77x~W)Xnu3dxO*iE0+0) zfBC>zd=^LaU}tekPkEP5_)|N@miGMdncM;!{6bgl`Ky2V5`K+epI&{Y4@~Qio%ClP zdwFjk{rTKB?X#6X`{@XaVveo6vOT*y$3D6^hrW(C9)4#B#~Y91w1>;sjb8L%W5*ab zTWeQ5;!u7QFK`H3j&Y7{#tR4Zt^Ra?KgX0W#0(5Hew;)29wv$Qoojq-4D+}b#+}dS z#)xBVBi_?Pf4IhRvk{!brfg)tHDq|A6TZg3Y@ttMggL&q9nPK0Z{nQKY~wffVk=`Y zUKnD_#QDOiZ1xk zXJe9MVOqOlRb03p?0T8pDNeO*?AE`1#~d%>0qwfi)HdH?G2buevkPBaFT|y=Anw>r z%`1;vXRuw|_~R?}oN>S(JJJiL8rR~`*o+0Q7%wcbKfJ4L*opn&)@Qc!-5<8?cQDxj ze_C7i`~&ryI*xy|4Ojf4?vX?ENhi8`uU#<)zjR=0^$_2xALUj0(O{+Qv_? z3=8UPuWB~4(^s zd+j>bSozpzZR?9J`jU&`3_ctC#_w1dgIDj_Z8pLta=F+S=WHit;JoXj@~Pu+Cq4D$ zSaxGe`WOekah^6{j;+gqaKzu{n%4W&G5jND@tFCQxg(Ahla7a3$I#Pw`HTI;6`Y9) zHn-i__0K-IPyV25bG0_~E02g9dJ_86wY(%&#U)M=6ZF!an4=F|^?ONlg?Zz3zHzuF z<2*i-pPl2lju$85VE(jEe6kb!>f3AWC+_44JndSV^XO~L{LaU=H;2GFJMoSAgjdI_ zZS}!EcnsgM1I`s=?1$HlyENvHFC$)(`NeePf3=yn_>PotU9Ny|ra*#wf;ctaI73H2_@%#eCEJO0V}mt167B1U4a5j(uHaX=q6`1CH(m5+%=!LR09QDZzu1?4 z#!grIJ4YL0oxj8bp`)CpA9fVmVwIhp2cuq#V`H^V9@nNZ5c=wuj^5({W27$~+19Ib z)$8)VXLP7RaBMjkzSR=A!14NHW8KZ5$|f(g$8}86VPBAAHhv4H)Dn{b^et#t4tN z3dZP7j0<1!q4Cqt*!jks6kfy?ed&!CS4QY4R@t9l#X)fgdvXb#iTgGBTNCC3o&(}q zmHf^Ie8xY%Q|%cS`$v5L{rCAz+FwR~5xFk%-N;oD?{ANI7K&$od47cNi+etpXV!Se zK%YOS4w#J?Biyj1?@jxiKi?DgOcCGt-!0$&e?jDRks~6Wjd66uGYCBQ?Tm=$3A`oZ z`6T;Co*H>dWIFPM$j%YJCGw+)=SKJ)RnOe;ED6tQ^2`Y}z8ok9`B$9JMAXV_BmKU) z=jZs&zvqVR9q}8To(JREXg+)9+JoZdlZpGR(ruoHXv{Idu< zZj3ngcM->XZiMG@_&p5I*zi0F&x!E8d(T1ftfw^*&tCFu9?v}!PoC?bhWC6K+%9fm ziLJ$jIDjKQ#zWRuU<#Jt#~jZyGd#b@^ISY1%d-&u-lFFgc_xQvLU@LT=loqC`Dx^~ z$Q=>CCF}VNp4H&_c(+DoBYrRD#)#v76>*&3c=<`hZ|*vmzdg&$^B%O}`Ip4`j`Q3z zzvak>e)E%fj(}$h(8=#~dLD@9hj`u=EO{1_dy>q%4IDZJy8R8O5Hl;kg^yfE~|{@Vhd6 z={F%fU%|7U9Iw4T2T#nwTYc~OA=-1E=Q((06Y-2E&u;P@yAMP>56ZP0*Y?es{eFt) zB*2QChl9pq3Ilcn_w`gT<7! z1l%OwTTkE%xKg*OA@LWU(vCK~!Xi$PSIoUUC&#m%U=x?&HeA*=)TuCyv$UmMJZJu< z22o4Ey5l|jq4&RiV;!Szl4se<@#0TjVN>=et!>mg>@RQ1E9xBlBwvbc`A$xePsFx;=00+X{q)ke zbLBhjs4v)%UFhLY-`en=UUYSyI*-^U@36J)Y7hP37CBGb^rVY^z2`%ifF0vdFTf0& zz=*oW_}PaZwzH}B)ec@eN25Qxz@EP3T7Ai%Y``A$kWb`GIHdy}PhW z<0ErMIvW?eu}AG}jIhLyIL&+K@h#u5Ib89b@u;heonElTA8crR+82lH?;LvBuI3Ow z)~EQT_~9Gd#5G*N9J}jN{KAMB;4^yK&fj!3KDJ;R=fR+M)GX>zb(C08KidcIj@J%s zvVr>2xajRzScN0~u_67%LSxZ+Y{S;hgG=qwnNPIuSawt|v86x9(h2VEXAkycPv_FZ zKDyGwe)f}FwPj2_$MO7PKfG&4-D`fwH$EF<^(+S2oIXTb>?T%?ovr*i#x}Z&ckRFz ze8M6>_c-y|w!LSw@`;)U?&zvNW6};i&52-{|JYBTVnz^VhqlFW?!}uU+l-ewuyV&#kW|tpFilJUG0hQ|G$sTomXDd zA3W1XyZV3`ZRvyG)ONOM%PZeI4`=zTA2!x6+lxs!gm-yYZ6x1`T|D4bj9WY5Lv~_M zm}fWVi*ei8S8O{+d(P((e%N(3bc9 zUEihMN++F-=gZ^|fMtb2Rm@;l{5xVH3{k6}IAEpSK;UwqQ z25Kca0H^Z_VP{wnfBel(jX}rbQ5Yip>=lM!3}$eH{H%Un8Nt8S2-NYu+o4wOJ=Zwc zvF6c^C+1z&M{HM1;0L&BU+{(_Y=cw%;v%9wybtGa3wJ)lBE8|;80f4WSaz)Oie-3U zA9nCpuHj?x%QtE~00}}w*2WmpYccQ zFL-b~%&-rB(2w|o8}?*Z9Acks&5v+L54eM4F%NH(aSYe~?02p>)Sq+d+xo>AjmPoE zV*D^K1{&vVBern2V@NqgJeAAYpgi2TpcCFS9+)>?f41QtNo) zx_O|w!(7q)(>7~oD1Iv2bd??$JOvF{`9S1ScX@2W+ND7*V>n^{Nj%v z=5cF1*fnju3|sj)W<+CcpDD z?6D_a!3%K9ChWzw_Td?}g%P%8H!|=?yESm?(e2MbD#)vFQf}^o8^EZEWJuAFPNoWA(}}xQ?yamcPUp zEU-Clg9XQSz6>9ZV_$KDSB$|z`g=7tc7#cGXJ4GpZ+O5wwD;MnG38nOVLOq7@rE3%{=!p^gL5&!*Z4)7 z`p~X^_!YKVW5HB;cmQqw!6VFR!}&h5DKR#-G$zaq769GralR* z;yYu*$HwP!bcqqob>cg>)t5k>99_%2ViT8A77xrZ*f3ToG<8U0`zy`bZJje5$ zn!ziaH#ZKAJ;9USq>pjLR{^d3^0pTXZv)<{8KL z9Bpb}|Bi!=VxSo880{n4>K}dehac#qU)vnxJht=M@!Dl8+eu@e&K)CvR3Ez0xft#F zUj4C={r>brH}+@y*$566V{*HC4Tf!3d*Dwv^;#}p1+NJ@3UQo$1MT^#vWp2q{jQ z7qz3$)-mcQ!bbQBUx{aVNgUHdf9%Gd&TaqlnRPhx46oW@cgM(Qt)I2i`kUX_cL7Zc zYldvjZg`rV#Vg$#zvf|h0Y|7&<5jg`UMK+>2$n_1-IiYscub`3i2Di|Dq%SPR?Wtz5}I>?K~5yUoizYuu|S;f1FJCg-`fQOvp!F7vXpD!SA-gMr#%O)Mk8)|Gg4B5daPhtRGw9&lQwrryZJ?U7RJ6}7-WNdObOxT7`?1we@ zGA@7mkQ@4HAAWDngF)|$S-zB`*rLb5D7^YC{jqV2fkp6p0%-YIS+nti1Y2kTg7Yf$?x!s zkBD>di2cqb`hbP%*0I7s{lR_&{+h3hgFTIruf+!)=*LIwCXQgY^_#lQyxJUF?22b= zMXvd%Rn>3=SFpcxwWB@#`s|e+a3d$s)92}+cA=~JC%dTSt#^oF zyeodis?TabF|8gH%ho+y|MtGWG4J|)*FIcRcaH1h);qLgo}(>1&gSC8pO|Djc;P$x z!3Hd{t#LcfSoj70jNhw2TtSSN9oR~25qXrotq3HP>Jmm|(` zjC&;9|4yvU`ArVLapkvJ-RI%H3HR36rw!{EeA}4j8+y`DOo>xMN8@AzK4F8t=NIE< z3ptS8eWwa{vL)NQw}Sn}in^V@JZs0A6S4lp{={`Q-0PkTKGnWh>-`Mck-zCfH#J1L z7}j8n?by;fr?pV`hWPz2_q(|7g{}M!u-`Rtoa5P_pX51q;79R;2fgacdv@V}``HP1 zG={}$=NL|ala5hEZiY?@ZbyB7f0fb?s!5?#<%8WZ~+s3FU4=AxZkb! zgSmIh@38nS7rzHa-2dY@H2Yh8e*4A!J?`sqkB;ABSsPIouqn>)n=QVV;rH0!(pp>Z z&yicyx8g>=!-4Ef@G0HJVb|ATjV+ARd)To~ZyR1%8DTF1GwjLkKC`ELaok7aH`w46 z*7%6uU`{_cNIs?mUwdCH;CDQQm(>Sq3fRR>^n?Q(Wgo7_T?ALaF8+rdeKeQ&OvIDz zFvnkf1lRlo@8;8REq>iQ2iv}DtEku9zTg4w$~5Nw;e9T zMQc62!~JS9G1h$R9R4D5nzreTBjixyB)EbP*@_PMgH70mjo6FLacb>q{Oo0$yoFQQ zM$U44YdBniXI#g@PA?vE$GVT6?*X<`x7>WdG)kd6hEE&7>{F}!=J{X zJ^EIEwlfB{_MWb6W^C+hEM4EKZeESSm?r1Mwi^>J=QGE!hgTeAzgh*()f|pxALG>y zPULs}u@!rYMRsp~7d!NXAO59d{XlP@jnjDfw*G}N`@|eu^06_)BcI|t^F|ybC*lve z6KA<*gR9^g&hh$Wz0+JHo?wHHUd3d$(aAX2-uvQ+E^1dX#g9ZD<3n|(Hu$79g8EOr zF&n`z{cJ90E{``BRtFaTm$%FZ@fVx(4S(>Hqii>~tdF$Kx8jrVLFc7>;yk{xt(fil z1HbW~^Nf{`#G;soM`B!Tgp=S`oEfvRJ64>+tXDpT5k6)!SaB|{V|OtiHl6Qye(bq0 zLk9v^Fz1!t;!C@*DgM}mZP;3D-~+ZNFaj%LsqrS)=(GLNlbz_N4gHi0oNGIq!61Da zbK;Sn_8SxXIZv!;gKm68H@>7N-Qk#R2@F{mfqA;y2JenBX8s_?YV7*gpE&Xdm(GP* zV>M2`Q9r50ja6RvDlXU@->`pc1wQ3lHgRtK%(q1SV4rx~DO0 zDsCF@Z0*nae5H-{14sJntF{_r`uCo`&M(iwJ6ppxJIzMC_saHgULUZj&ur;Ezxd2I zKJ%Y*`H{>cX0=!^y81_6SjA}Z7@?i z%lELs{T&Zzel`z*EAL^;xM2SMLEHu%zhHHI2e-KoY` zi<`*0^7*<1WK?!_rzz^E8yYp>4d4}QTr_y$h!gnCmhfSJx+%~gB9 zi8iep!x6vJiSP6Qd;IP_-14_Eog9(>)cM9D-o%gj3jDy5d4=Ej_T5$UU-LWjWphBe zrQdg@mwMK`!<^du*<1vU)zST}Xuo%9yZZ+m<9zL@gVo>OTLV#tn?tM1l$S5*YMpQxbYj%e$U&S(fma{06TCDt8y2t@^$%) z&0x^|Al5v5FUGubb;O(!4%HVvn}hm36{Lqij_?v&^jph#g&i8l-eqe)t@F@Nh zOU9%vn6%AjT%#>*Ys|7<1B@o71_I>V9oVwrs$ zFLuPG+6J!m<$ex6H}Ca(p?uB9vk_yaxA-%!5UX9Yz!%2gI69hh`5jRl=zA-~`U{N0 zi?}jY@y9-}je80EibXXg?iWLJFn)Lvqd0-D#lCoFXZeHu@xGdj-Q1&M9QrmE_=5#L zH3mFU@qH1$3(xP?W7L*-NStd|t*pi~&umPI2lv+S3IB;tyoX=mOdHlXU=6nT2k!9$ z9~vinTH}D{RS`JHr@havw&qv0y1u*qWvqN_{My0wcvD|6?%pT3HWv{G#vm5i#QGQi zyfNZ8=>49o-(STWd<4(pNPG0*YkC?FUDT)S>bH*%k681-H*%@-`3s)-Lat>W^}qLQ z_BRo~jq5j*w+dtbhL7Wj?s-|qh5`(Yp4?t?>aVM{*I7mU3&;(J%d zV$H>M78v6XYf09a{5Gxcx%r*fFGp|)8`G^dJdBuAz$QG(yKn$w#_o82!c)d*t$|(P z%h)>xIRGc(S9yegoQHFK2ak`$aMv<%x7xt>$o$T)btd0GwD!bL`ob&x0i(XZ=XbS@ z$9Lq|#d;3?#DzLV?Qw9#_s2W57Ii4otWgjrmrJvNg^#TUJ;W8wBsL_QV~2l#@hCD`0p)f4Iu@o9}4AM;WD z&PKS*cl6lJZ=Cy0Xlti9NzT_cZ27HVzps61gg=&ymW=)~a?N(v48D*veGl;+5o?9k z4}AyJxO_j*I->6Y%Cpu9{mJWmsm7u!fo1bx+*e)k6wa6bVNTs^tw3F2y;r~Df!}>! zQSI7Xtd@f(dDR$BiF`Qnsfcm-j;8NtsyY10Z*sYK)28_KU0@vG_pbd`w(mvCS^nSw zU;8b1IDy%-B7P_Oa}n=xE<5rW{*VbsYt2_pAU^c@ zt_W^DE#fzwZNqE)C(p@K?~nNYE&k(QzX$&C$i5LAFDJ`yawqKj?Rme0?KiH^i?GwF z5xx?C+Q(t^?{$4O6x*+eykeX1J6!R*vG5hn;#amH*29hIqKNOsUK!aC@x5JkgH^e^ z*Pz(TT*MrNZ`ezGh)K9tldG3-k1^oCiz7Ehe23cir*XU-qHT4CKQ*W}@SMES-yFwx z)~@9xaViI>Z`FbLh400d8UaVZulkK2*pko09s9~D>IeBvo$Qs}^yl~2wJ&etWbGM) zoQaF%TJ6FWzjzPVVibR?NAWP*c=cUiHZmVOHzHPMBaT&5;Y0O~ys2i>A1sSCJSf)_ zaVJ;VrsiZX?TAGp4)kSB8o$d2Y^6_}ASe5S8MT;Kd4=xgNa_+k!&lnxycoZVVg6=w z^$mN$L2X1QbtfL7qdz$lp5ar@lON>(daJ>mV~oa17s5CAM4xz84W@o$EA7db=4#?Y z9WLfhiolkb^Br!ycu53~zYwtxPdlD%)uzTL?$tGT1|IZ9SN*6#&DYJhMx>t7R1Gp6r<~Zi(Vt-8ppQ%G^Cw%2xzJz<2QxoZ*$mho2dXq2pL5JpZ zYXj;~`-u1aQ*8JQi|QdUBj50y`H`{mi`q`y^xBRb$0zK~M|{(DRX%}tKIKdHgk>=Z zPx6MkU2Tc0@QipAN9I}l-Z?jHPtH}efj_hlPxd>Oestg;c49B~QPVq4y+Y^%gZh-y z32Yh*ycdhwqQAH^AAl`=!H6+*-a&sgsdWWoC}+VSKG8S(=)*QOzj3RRZ5L~}$2Pjq zfu3p@zQuR2s8)eNaSCgA1U3mj!G-yOW8e{g^Re|DB1ZYutN9Gfh&7_G$=Vo~7_aTH zrhNkcbh95X(Vs2Z$T-C;e()Zb=!5QRalY``d~!Bo48{Uy^o3u2(8IBGw9hLMS6!P@ zmxw(zhPI8nvFX*A%q7{vx%zRu^VmR~>Vsd4ZF6$IgR^ilG)RyXHb(?XidBqDq>QjvS^Ji;K*qa2bv>7r-;PgiYvU z?ED}`jYB`iq))go-*l`tx;l=09RFQ^6R40CKlXSU}9eqkRmLl6F! zr?lt2v9SGQJn@Y_i_x}WO_@LO3E$I2OiV|NMZZ21WAtjg{ODZ$X_IgK@hjb72^SK) zC03kYziY?1a1VT%SMyERrP$SH$FYIqh;wk5TETm^rlT09FTdh8euX#oQme8Fdo(tU zpY0uM+|I>aV!G&*=zXbuEbQbY(;Kfm1O`Pr}A{hHm!ho8FG~ zp8x1cU%C^RfkQFqJ+6bL&O7*BycjpXzzoi!S9zXo{plNS_>2y0fTM6m@o1a=*~+mn z4tMk{&W%%hT?@gFeB;kC#s(YufD7YxK3h0PyEsF;^e(T$iTNUKS{V_~-mAyNwD>SK zA~&)d?DD@p#am;tJjVa}Ew1$MTspIr{dA-^9q9^Fbg`dbV2$6|lpkSId+g5sVq6Tc znYiOC+^cOkrk7*k+*oU4HlQzi^MQCKVzuq@3l3x}dfKjS{rK!v4#bgk!Cf;E+qKQ- z^}Dfn?@t_75B}gUec>ni*anNZi*CkfpLY3`(52jO?8d2mIA(Ky^*wuuDK=GKRQM83 z`IddX5_OB5gcotWyoKlCL%cPQ;rYg-t8u8~>Pr2asUjyj$m2{yt$ zV&CjJb_5TgUgmnA7SOlQPnmP%K8Qoa9oCF>!A{A|yiZaiU?2H^uA7)c%%Bg1E{^tt zHjc)RCWm(Vl)(Pst9)P==w9L@1pr`SD{FYcqOr+-GHP8TWLlF;yz{Q;iGhhB>R6Pxf~d;)P&6DdstIDi|?#?p+u^+TJ_KbLoZPQOdBSD`A_X+ePZWGXA z(T}ku?2GGSE$C_dD$EzC%|{C8mFTX-W;g?DO3YwQ(9&NLZWP)IJX?=vOg0ec4Y7{+ z32R17L1RbT!>@QwAbo;)!aD+bHGNz12YXE4;dz0+2??j(rFxe-3G@xnjd@L8pIC&w z5@WD^uD_O1%h*$8PeRM*xrMEb)&}px+MpR=3)lrc0rnO9K|7|$fsTt7&e~zC@I}^@ zxPoq*W8@fhgu_)1S7~ZAH3kZ$RZ0^*l%J~nl(+_X9WgAq2lPA|3p`7Zb>ew~V+3L| z`%FG1p5w3dAHqi1=qvDyMRej0MhBz2fGuGY_zXP~co}QYa|?OyAbk~HpXYlrGWu-2)}y2dfyA%gysJOy)CqF zo^wc!Ats>(VvD~E&5h;;_Cp`S5jv`u!uRkWK8Q=iPoHpF&n`{5lyd2uch2Me_}XFb zu!oJISF=XsM`GzVp;)*mu+M2m8mYrEEu;qZNc-@yauA)}#h5Uw?@HTXdP@N@QclefvU1=i{} z?>Fx&q0yyAiC!=<9Ginv^mh0{)Gy5)+A$#G^Vw zSRhtlPs9!Gh3B4<)8HcT7q}&T!@5RYqlVB*xJP(QU|%jbE;qUg#6)rfwo2VXuX&fA zv&w!S7j_8qg$)AFYNg+S?~$Y7#N-8@BWfC^agD%x;NQpf%u?>*K$QcDek}Qt_=LWL zPp|RT$YOu>_6V#M@A-*z zWD3|5d*XPG_qK3Gpg;byKptmb;DqD?a?W`nUC-BLzxk*t;3Hha6oFiVjqv~i z;1wjEt=r;Ki%U-kJeQR|4*N%ZX3xnv4Q86nIZ!7O|WjCw2(;W(|mc^kj?l z$|r@h0yY-B6imcI><$isjl;3%Rnk|c??-@3F;WbkfomC-LGK!y=DoBrC-ij7ji26j2ePx8PkI$ zUs%F<@4UzS0Q3V9C>jt`PMn6cqnSt~dP=ZNUVa!=eF{E+?-aTmLy zUWDh6qu^6qGqnzJ9DjhLvk$B*H3|8W>*GG)WN<3@2Qx6(0e-=Iz}1NB#6+$O--YwA z-qiWjLR>rb3G2!0QcF=kz>$-)Q`Az}7+jA0NZmjVz#e(lGd}jXuw6JPq?u`EN8t|P zHldwxmB80G8=Dg`>|W#Eg#Z6i<(C8x#kYv_yf5=f>^J+)Gn3gPID_lCie!$559N7z ziJVDJ!x8b_-2%DoC*d36-Tz^NH^Cbr@bCA96~cc7a!AteiCui~T094w=bjV)iP!uL z_FhY1#)$pIuULQ93_qv$pWwTC{`IZKt;TTSDOkU5g%+z?zEzDTU(Iq$?A@-kls zIRc!UdxbL*xB35cA?C$A?v-^XmteExS9l$@D)mcJ_o1$()`ItAyKn;H3-$^pB){OJ zd>^|ZZ;}(K)%brtW9Rg`i5bk}FdINEim$<`xPSi5SwZSxw2ZC-u>*UA<6*btKh}p> zik87=xIXb0A3)0_S5RN$OK7j?6!0swJ2)uUz>EYjBRMC^wV@LbZ>U*$e`<1K3O>Yr z@H+5h?3imJhfy0+=TdL;eteDGgTJ8#P@AITkR#{;llQ5u;P?0e^$gcdt(VkYj!D-d z=3{r*1NsWJA+OE*a4+-;;ALYs)pkPl-kRn;b#T=j(u6!1v&A{2sMCyceAhj>ejCZPfATJJ=3;n!E?r zjyjpR#XWQH)TpcrxrQ15A7oAopWxs8KlaI9qtjrga8BL}j)1+ff8=rOlJ}+uj*h~b zab4U$Hif3l{;)RO2ls?V1JFN+-{^Q;1Hd=nJJgu$8GDBvCUtf01FeJWVGXc9;xPM! z&W!zG``92eg5(+MI&v{O3cQAyNd8U!fg@7`^K*O+j)uRGtFU2oGi(zZ<$c&o)*p_6 z?T`=Idul`U3-}=W1lVi#mi@#oxmRj6@)mPB)I6*=dJSKPTX6sUn;gqbC%`6H2ke9Q z!=_jdY>HYMu+Dr9`(usxH*1b|$9{7?>^-_Jc?h3Qz7E&P_u$xkz~^~QKJX24Dtk|i z#`maO*mq`zl6oD!POReV#3=ljHNzILMSO_YC)SZa*+aM&;Q#SIewNq9e))ak6Lv-{ z<>PHeGwzL9%?#loY%tU@H1)!){2~*+z-|Q-IP2Iuy4M`&)~CM8@A5tP#?ih*W(FT*UWQpZYye*% ze!*$rX!s1V0w2KlxmM~d^i=kmwZjgvOZJWTWY35_{F^o6-muT4-?0AZZTJwJDd|Ie z=HL7r94X0@_{{48))xEXp73j83SVdK_?(OtTmyTA%@7mtA#8;>0WT-NpA|kZKQJ$| zF0<|sUKO4cJkv9u5M~-PjonptC+;Ot)4Nf(hVZcSu(QlwW>*&$#}~&R7j6~q6-Ent zg`Rd#d$;hM^PE%Ht?TX)CVCS+=6JauI6C!Zr7*>uVz#&1Ti*$FeRX|L3!e&K2%if> zge>7F>nH1e;a~G#^I0KPm~G5X)Y^6xJ5kTTXPFr%&yhpO7px1p0{>*ausgu|VHd{) z)|545Z~1@ri=V+au>*1$JQVvNMxa;nH)yC!;8Spsi(+$s3I~MWg};PD0(=i%(m+5b zL{~s(l>8GV|ZKrKNoA}^5R z`91hb(pT{z>y(VE$s9s{r*5UzK<}h(qwe7|H6ru0 zXk*kvaCmYZ`Gnu+by;V8fa_p(i`Ye9fEtMSPrWchK%bxnW7eH|7!8jZJZeYy6r7B> z#cOdt>?g4YeuUq`Nyum15Bo>F=UVV}uAjL~v;ed+@-O#~-h}_aeONdZn7PKz zsKuyfh+FIjHqA8Ll_szCdimrnr7=gqjd;i+zzxk}(!Nme(T2 za)0a(HisQycL1JDJOSh$I4!j$^*(!p*3FDBIiEbw`|uuc0qP9wme)+?lVqO_%@3O- z&XPY^D|8O*jWwlTz+SPB#O^Tyb!u|{k?)bm(YccA4$qk@z^nK@_5@p`ABZiYqqFAh z8@vnc8-L*INxn$F;@|KyJ`ca!{y zwdQO5JGrme8TQTo@tHm4{dj+JE^z{o>(ScCN%ViQC2TCI6<{~419d4qJJyNM_$PfH zxDhr7=;0EJh>OG`>;TTmX8^~A8(>T9A)m3WB!8d|K}&!$kZ-6x;Dyvk*cLv^>)}`U zIrap{0Q^5OkKg5eh~wNVJOR64jj@SjeB%DNCv1T|V*iLO_y+L+KW3e%<*-v;6Z^xD zxeoROpW)ic)2tu&2#>-~m<1;Op!J|zc>*;pT9Z#`FSHQ&dr)YM@Y}Hhaf5xw7O*X} z8fs8_2FbHA)TLbobXoqNo(20vd?FUZXURcu7~&iL37^3JlKF~S5PQe|c@Jjt=@X#` zq3@G>_`7HHkLYKhsqorx5AKuPu|Y7UF{5p9kNkf~;OqywBlpEw2Yi;8$a-O8Nzo+KJ?ul`%3AzRvv%YMg{Vo@n8>csnz2UQ5AA3d|fY;&U*gY|lwLK+Z zQ#I9xxCF=-;d#_#a0YZlV#Gh*Ki+%7I|6&YQTSC@FVO4Z{^(V44frPe&2{4A^dZ?BYz;eW zA~X|tU#^Qh!_VV?=yKQ&dK)@Ce@_tJN)H1r!oE{8@%$}pksJZ{q<-HhB>&zXeI)t| z8R}KxBk0=PAGv@U0Br?M2LB}w;g{?M+C2Bc`=bNHd&phXWb7+;N-SibxUYEvIxe5F zL9}Ol5Uq_`0H5P`h@1EixskYxe=@(2rU%5ma-GZ+FxNp}nV)BlfPbU6!|%wYY8ZN%i-|1W`Fq6Rbz$M^yyf^ECjV9k8-pZP?p72X_ zAKrughWGP6$@`Q#54MDaBB9MdnP6jYq?Ki51fE?C5BRe0N$V1hA;76)HB3U z_!9oZHK2V^Td?-*0shPkPO`p0^J2ZY4`KrLLXHOb9iQP##907`hZhhFSp#Aobqv17 zI>1q|BVsyxj4koL{6E*h8o^=E-I6sD`^4|@nfsvT;X3&}UWeF&JyOFZ<1M{bUI$LX z@30nJ3)e*qPWGbMFZ_ah!Tb>O4(Rm!8@|V0<4?qY{)Q)Ug&GFnkHl_b3~`*-A%{{A z0rDty5*(k}mRgKGhJ$h)Xj^bh@)@-SV6WIa?4I?aX2nLy#eld)-o|&aGq@$(mG_0C z!b#xC+#|L`JR_Hpmxy!tC%OVTD*2l5AZ&rXhTkM>dCqa-kJJY26S083!)J-rd=zj0sKB=&)gl1Hg8$;aes>UQEkeP(7P_)P8t^i|&sJ#i1L6W2?;K_}sw z$Zg4UuV}dQ1adb&gRQWJtQWoo_s34*xvUMj5Fdko5NFvZas#}ApM|5rYw;iUff&JO z;v6}Hb>#J#v%|)S+guN^3(W&w3h$y{%2{!Gv1mle^Tp^s=p(lXCn4^TbBPORCU9JAmcB7{H}iz+1=gKhLEhzOh%4~dq+K&B zi4S1Q)N0gn#MES-U=N5d#4Pp#yJYXVcWQBB23&{Qg*=EavL5Uad4o8DouC0@f7Gt{ zB=Mb|0WqFEAcpW6+fM3L*fcqo`^IO{wur_2Ke-HlOL8Ub9)H8`xn}kW?H?N_u5dlf zO){qdkAY`0kHKeZCbTP_Q9vA|2IC&tcWfJ;N{x+e6NAY`Xc=5Xvc6?6SV#5%K80^$ zV`%Bg_(*IdW@BggGiyMeY$y;vu~p(kvR;5&6UXp7;u`jke`06MLSQ?|zC3+YfUTj2 zaKHF9u^uf0oq{zY#=$e0lYsx-EesdXdcPFl>u(B=2(1L_HD(`(i`4q?HgpwioSrN^ z`X_-p>RI7Q;XlFvfzK}sp9tRz2L%Wr^#p5;@4x}6@3A-bmpMSLkN0K1>Mr3mVY;wZ zp!dE@_*GafED**Bj|z7RTr(fU75=U^F`U{H8^XS@J=OzWK<i) zY#q%6uui-WJQ473zRySUz2SPqDBhdvB0j?PlD$^0o$G)rlGEUq#1Gb=YvOzSJRigY zxCFk19gqizP0Zu+Y!G4?H8Yw4It1~MJcD22pWHWbpKD0QZ`PUjVm+~cv{0^%^(H>> zb?%+(CDJ6&&d24&rG2%WnJK-*f;#1JO`gA&cb!! zcjO>uo3LAQJh6>?_KCd#>>;+wwX#0g9%}?o zrY3?*_zl0&NN6gg2pIx1vS`ih1F;nwTQ9JG#832$Oo5qCW{!xPtPyoBd4xO*4`!(r9U{7rqlh0{ceJA=eUr$!A625 zPp=3Kf?65PgZt+_lQkaNA=<(k&B^{I91_^Kt-?tG`*sEHg&0Upjo!z+Dw-cTW}861 zWNp|>Y=t;Ueun2Ucl4?EX+o#^>N-=wfNol+hNrZhVAw#}~Ob z_%{3sje$8Q<~o_{l8buG7P5zYpV&&xO70980fRNfF1i?9jJE`Q1iPl5qs}5{VNd9* z6NTo&bHd+3nZO(sd5mi%9;1C-X|Gksi(+$==D?>9EiMSG2ev?drj{p1 zzyZ*3dJ4^j9>N{rPZ9&lz4FAh;=8OZ_Qh=I^#Ym&v9_Dh&FCcXJg=LL zn-g3lZp0Jwg2W#9HTOmCAYbEGzj(hSIMM6g>t3Zm3`JLkH}iAwNcQ_N&5jQeEP=R4 z45KbWlOk6!8@EAo;^=-$1m^#^|IY+$m34uKBx*_NS6nAE``kNz^@}h=ctNPFQklp% z#1{AtJqdVQw$M{}Kw!oYKO?rm_uze8CwdtBGf!A9@b75?>w!2zNUKIWk$oJHV^}J4y3KlXj~?ccUe#RUgU4`G1oxu;(Be(vyxjI2>1_sLr&xS zLxdM77yoNp#dKxi=S{9q9HiBc(uOdz{+sUja@d{h#^~u}#8TNrc!!_XhoG&3) zqtVb8Cy&4riI4DL=3be}C8nUwu_y3i?t%IdyQIEO@)q_1-JUfh9>Gz_|Kt<=og7R( zM=ir^9@UlsuKJgW&9NeXfffljMi26ZwJnB3H6+XjokZ zo_)mL;ji#H@;5mKuFl@ER@fP9iM^xKk^hOY#Ax^sbGWPzJRR=N>yo$OvhXct0MXg# zDY0JMFMO7Dq{oPj(l3I?(c|HJa22@sK!N%EHb$F7FAYC}w~%A0A<)vX6F$%d;8pa? z@KNj@J%HCH*CgW}+<`t~mXVb>!+>8A2RI{xong;#X!eA9l4~ReBIK8LU2vq|lfGndrx*e5y>@jq!3y(C)Df^dD*}?w$C;Ua=qONz{MXKQWK~4ZII+j{9YOSbKUo)W-ZC z`JJ52S&U>Xq|eX%0QCrb75kz_L2spRNk40|fX@>Dc`w!kErR@xhQt{w_%AsIo#qc= zuMidR3F>- z6+D~13bB_pCAJffllz9|2zMZkP+MSQ^sBK$;xIOhouXF}N3aj(9eF)sF0qwbkX%V! zPtOtFM4y{88E`bt8}QoLF}6XRz<0?>yf*uqtlii%VjuUw|6|YC0sDnr(<|W~;1BpI zYmVKZ^Rk}&KQS9n7Z9_FyW9`?58vV6)W6s(euzsh0tMhRvdx;78Pw>BZmt2&!S~RluuXh{{UmPU5A?{;&-gib7CHd20^NvMMy}=_h`r3o zu)k;|*cY)L+v0c8D|jEc0QnTam$@GN6n~{(guM`7`ApoQ@4+>3J=_;@oEjcpMNNP{ z05|4*4)#Dk<7fC;Y9jWR7>4bkf5YF#^&Mspwd2|j{8 zj;~WkvX8_{@;~o`?I-mpd?=}v;zQ^|$v!WAR(zWrhizbg*bF%w-pe)8-{UjD*4QgF zXmTUAPfQ^8qv;S6h>h?U_%d;q+=;!AL-0rJ6I}y;!oOGxxC^!i7lQK=_t}fD`g;PtK__Ge&)kegJPIf7aA&7B@-VkJdr1;&;d^ z-Naj-XLmdL#|F4ahI5b7QH zGxZv^3w04a3N!@nmH3C>V*|t#;sHKRokEPjzPJW}JrZk(k@y~;$qCpNc1N89C*>aC z3)~yFhM(|(PvKkWkL(@$jo)!!aCP>P>%otSH~cPs&w3FHSZg%CU^)(iB)h6y(dp9tu`XnrGw=LB>B zX1~yg(J_fF_%m}j=yiWdM|e@VM`$2?>wfD#Cfq5s75;SobiNke5vB@X3de-2+^gJM zg++ql8D1ZOp1^ql{=j|1FNnd^aI0{KFi;pPJSosiM7u@DLJx<#(z7MMVypCjSQBb; z_5+>|ufev+dF&PY%+K;cj)hASXURw89eRHJEc?fPCi_RM0~{K=fKw#<0@SedR+9B% z^8fi+Y7Kgi)M@ZgxH_>Ajsn*w2lJj>GqDbTB!7~V$)|7%cp^RysDX%wa4F(8`T@U7 zPQst5>-ZULo7_d7gg?U9s7;BL@M-Ex;vV0}ABc1Cez*`eO8n+}(d^+4^m`i!#5T^! zFh5Gq9lPT*bDwZZxF!4>?d*(z7LO*y*Wv=&AJ6+hvnBRZ3y^2kw#(iT?}%~S4;twPAvs5l z-iO{nzr&J7&HR9An2F~`px-6WN@NSeuQ6fzsbHgoS*$>y~%OpWpXufG?@qSP2LyVrxu2HQUmZAUQG^XZFnu#nZ04p zum|d%Wc|c-P*)MV_`4m+bI6=Uzz^|F>Qib&Y?#?Ob_Hi-=A7OSYsh-S)z}X>Bx_3!OTIpw zi&_*rA_kD};DzvI;yArQY65JEI8UC$2Uv@whR2%W>kS0#g!?5nV8hrhage>@y|`}d zjJUg^vk{p5G;k|huzK6XK_pl%A zmRgQHi7oMU)|)ltdvGKC4Q|SQ5C>Q*Ku#r|0(euhCWq6)Vac`lEqh1pOzeW66GPxG z+$Zsi_r%xv8R~dqAK>5A8+@O2V?D4F?vdQWYq0mc247=cSugIL`(!=&z*dr413%MH zfKQ{R@EJcz<_>-r-(fA$KJfuS%}ouCKcHt2ThMLr3-Ty+5AhIQlGJgq9ej~|L5$*i zVQr}k#OiJh!7Ut&PJVfPrK7}R*E@R>Y1(5jQKu3MeJ{> z9zONQabc_wFazcb!Y@J}VYJQ!trY$iEYmVSH9k$u5-q9S+~1hTI^q&eZno0kIuBAa_vv;uF{cYsOk*NBB;1W{$XueZv{>3+$7a zLY!jF`5OC14T!z5AN)LPj7E%31o!$|edu|@Bf_J?l>$BWf82lEV?v40&}-=Z>;CJ` z7xIJ;gy#i5|19(pS_t=f_j%a$Ak72Zq2~|P5gH3`3cp#uS-HMk-(+jD#m72xomnFM zAmj@dg;XomI&K~}_X_U|&4sm^ovb13ud+W;>*E9X68sq-M(<<3g!wJ_da~Et-RtgM zAzUZiDD)Gq5-cGkG!nS4rUE}ZLikaDF`(>_({xA0Vs_?MTS!f~D6;cJ(_D^BE@Qv_`uu51h%o5%Z z*n_3QV&N&_c7Zy#qi~0Cg-~7C;p}i$3d@AE!j_f#__t43o{3>P`F8GEOZij2u};Egc5;$Mbl+IV}L+RpcaCc;3LE- zdXmi4(LY5u_)X|*_BDSJHVbbHcM8<$nZh5&A4VU6=YzuWh-=iA#2@MqW}l`D_Y0ou zx$g;A3$|lBg#sUCg5er&J)w*6pfFIlPv{}=^UZ{?aM(HQtP&;)?+b4UgN5gWF~VQM z*Y4LYF>Z;m#3(ci&9|(#tmlO}LWQrwmmA0pyf19@Z%pjbBmPJHT>@PKor9f&-Gwg# zUj%Lux(PW#YkzD1RBNimGp&ddXm`}0g_@gUjbm=i#W!{c#8hU>KGp0OcDc#jwBDeAir|f!V;E zAgmJJ5LyaHj3dTUVU%!-fd0e$9y1d3p3&W?L&(>}__w^bJl2nO?k4QB_t|TOEkaDV z%DKvUQD6`L5Oxa5{dm-Q)VW=_T4*j@BRnI#BPovr8xyDh2NEP2pGJEB7mRwl~{D zmm%-MLEwb+->BoM3*nwc!MMgLeiGS_dtk z=`)$dAa4Fg=K_ek9lQ=6{Dj#GYD2V(BkmD*u#n=VcvFR6h0Q|MOI0tSA9gl7o6lL# zS-k{!1UeJGb>2R2UmL$R-aFbm`grBzmG4%(TVV@3BReD4$FGmy?cD8@x}`34FM4yi zQEosCuNKajXUu`ZAR*hzwvGzV`kwXOCgfRpmgTd2YlIE{4gS{yuLm9!runD&Bfg05 zd*MxCzqQ}0Yt}W1&6C~9?rqL(PTY>$e+d(WM#7o+nfUeg^|s*{&Lcvu!2Ya=uZT|( z{t_;;FSB!n_3`!bVZzhG8$w^lFAAE7}#df9bO6xiGoSQ>8hgMcwS?!^^57m9K(Tk0qZt`@Kk&Q<-?pwca z{ZLLQr(b%%^j+pIb8~ESta^F%@=$50bdR7gSus5_Ju)pmEzWuPf6RZ(y@9=f4&e^r zQlV=~*OU&a9a5ciCp|4YEqh^&g*6uCEXw&rm{4Ovjcc;6$sU|OIDK1)mE382B;po$$2qAOC;+4_gmg%n3Aco48$KU1Fu>rR9<0Nb%0XorSxLb{F+3 z?^Qm>o?|PsbyxV zSvp2IRd%W@yCS>dQ{j~GaOK05wIj771EK?>Z^zz_RgG7T-z{7x{1N*jmLa?!c|YQm zJLSttmX&;2_+{awi<2&nx-jZObzyP-;{4<1kDtF+m@7Px|3JQRLAYpKj1|TT&s3hN zY~XL;za!_4oRrH`F5lZ>Z--si?Yizzr$e2FwHwxMQj19~I@ax2H#Z|UqpjE0t5IB| z`1!o&^JKPX?mU0z`3@x=N}i8CA1!nX-Ap~l5}PJoHV!uqS52#$_EE-18P&6@XPwVJ zpS`i>#+u#gbgMJI?)bV5>olyhAbUaf^5F8|_wn!Jk-|vfn6qQf_CL}8MC4fHn0vxK z(JQZ4o?T=YO^r{D*Y(%+_et-QKBnrJsyl?GnM*U5r7cSvm@+V>UbtTP^3dg>+QHhv zh5m*9#nxi$YCZFn{Ma(yGJd-Jba{`W9!0O`zn(wt+_-ah<=>URp=d+V-_gIL5BVPQ zy`A-T*2lRY=T2!drOE8(vzs4na!e}D1&i(5;!mMpGZTsb{HJq|~J1J)K^cVBlSPQ;lcY`3@DtK+NVPSlBxuN+@_ zwCreEtCChFZx+5;xbWh_i(g*&^1>itsnGahi8oVUjS`Kh}RRd@#H!b5$lq zVE5YHYwyb4l{>2LsJi#(-k-au=AxP<=_Tp=js3=?vPos{oqg|Ymw&tbyX^3?!+~Rg zW24WGK0ByrP|@Yl%cImO?E>urCsR(QOi!PleqLyq)-vs>@KfPt!Dhi111|>p2m1$? zg_eb;2y^^%{N${=qjyKw6t5{hl7A%s?Yy`1;%DP$+n;ZLzM`O_KqJ!SWp0^!edzko zy6kn?=W@^GR%=|X@qs1>nk;Czpy5rmZ>rrhvuEb5zFU1c@tpY2B|n$EaN&gu7xOOW zO%zJbmz+OSc&4yMMU9H(@#XQ)HN%P)M2-D{_ks7D^P5u=FNs$~E27&fw^iO;eslR3 zC0~?$RP<3%ox(bWnFW~zLoN=1o?hH?VatU-gu_CCzy_SiZ2FbNDCHPoy`}N330}-Ay;#bVH9WJ-Qsa=Fl~>Tg`4Yv);^lUu1oe zwawaQ8BrtJsi;%Y8|U9R-%2=Kc(~B6v@4krzT9`Y?}Tu-b+^^i>}gh7mDb4c$Z*}N zb*qlAHNMtc_1>ztqW+5dzt#P%ZmU|YYFSmSs#&3|kmq=gQfhI@*^;yQ$McU*5{8}~ zdUk!$`l2^uZ^pLiOu^@Y&jT|GGNa(C+8sXq&Ag&%}fLO0>1@Jr$Q z{rCId)^oAl3b*2H!P$b3&V6+5iM%KB_UG@3PHg0BVFrL9XFmOU(c zY^|}i((0$xpV4SWqr8TB4KL5VJhz}~LDh?ai-FEgXQx4VgYs7jUn$JEka6M0{2TL+ zT{w2ZDRPSLsJx>x*UfdWHLo@M`TF_7R@kC%ondF#!Dul0X62ie)rHj+t1DhBf35t5 z(ichx7Y{D}sqm-5l?5vc#tR<`Ukgiw2|`QZ{KfN$z2p0<3s)CzE!tYNPVftziaQls z5i7FBzsCP(oj>dBzH0YX4Q_03e^>Bb!P26oMT5%+my;vrx^vw+UL9|#z0~dz?-769e%-#>yxPpn$jlg3 zXH=bDO?x#xbJ>~8nl)|Kba?LY+!2{0GTT}0tb3yOL{}EBEZm*9JFm^@Hm4g4tIw@I z*QmHr@v_LW2;33f1-`P`*__~4%uU_tztjI<+Jk9(s_v=Uu6n!bL$Zft_e}4ZZUl_L zJMKHKzrtT}U%`C^_=dvc={wKfd3NN5krx`2H7Fwt&FXVJyY;Zf&Z-k?EF*nPi;N3^-Su8)C;~+ zU+MR;?_>1*msm@zrv$XSd*b)R4^$ke$SKb$Z&lH%;+@Dl5i4fJqLFCif$|5+-za*c zsNRKo7k)VR!?}w>lM78Q5CaQ~3yUu=y}Wd2$xDJKd4WdW z%8Hd0)K>fJ?XTCoWAl#vZ|#3;?Dp90&2Mae<85tjYg3e4l)EQ=Px_p|oWMQSJr>+@ zfxEyBL<7E}GAnmhZugemTefM} zrrq*3%iFYS+N$Y->I!-m6-HK$to*d>)3VMbolDLYor6LZ zU0HHvN&nLRrH__BT7EKmGRjQI=+x1vc{THDZmqwy{zDBPYWQ89@9Jb{WoLb=XA*v6 ze`DVlxi3P_hFj)DbE2CoH&=El?^NESv`6Wfk})NzrKzRmW#wg~Do0hekGGH0TN)D_ z6WmsHTh(CQVBOc6yw+r6vyIJ~Hfq|4_nDY7F@^IX?8VxWwIvOU8y3GStSDJgvaNJm z>A&UwmcJ2sBLWwsKBh0q92S}zI?Y-4tV==VkNIPxD@Iq`UUGZMErquf)+(q~@Tw3k zj3#2@FU7wUw-tzGHx%4Z@ZE*)E=7K_ zyV~is)9W{`-*|Y3;T^8*c4fD;E@@p}Z2Mx{fei;X>`}Ex)qBJDhO>fM!OsGp1=jl3 z`mXn`_l8yst@yd%=YmD&7MQ&UM*mq&yh5l#zpG_55kA5ZnO5TdR71?BOvZ>um^&F_v z#%W_)a9gl;R_&~JYrR`*S-oZTt`>BOIaa!r&b)#VGh(-t-BLEQcxLe|A-y!c^ttlq z$~#3mMaIX*$M(ec#Fq#=Vmo5D2>XOX_8}X-!pv!wm*v5?udckha!%=-Qv7UK$*_`0 zX{3}~c)QTKtaF)NVwdzS?ps_`SX8*LU|&H$fq2cH<(K7`eOK{a#UH}T$jS(>yElDr z`l3dQ8hP!!cJ;5Tf8CQEp6syyvi+BBt+ln*wybSgS zSvxa!W;7LeSZCkreXCOs^sL#l=Jy%jXC!7kD!!Gnb$|p zrjLe(`eXFR=$g_srT-NCQ?UEu?u+>Q1Mvsq*ruE2rrniwSJt}pb?N7W=Ys>x0VaLn z0mc9$+n?oo80{Dx zP%)t5@6x|Z*^{fvt}0twv9@AobZ2ycJ;1&wTp7PI9;=L1{#5o;*&C&AlhbXL@LXX^%9NDfQ-4prRhS!?8$gRCU%XrXZh5#eTsbB_Cce$x=Ay&JBk@Sv(zd13 zi>4P5$0U!$(sllheK>8Mw&=waI0X*%GTQ&k{+Im+g9n4AaMn6&4K;=)&H;|G##k%- zEBs#zN6aH8ebSH{a>qO4ofq5}lr0vxYwR_4L9`&68_A8hm2M?GwkTE<+bcAWHji$s z+*mnPs1dCZeK!7Ve4D+^t|Rn}^^9$ZY>2!hyc&HqIwLkC_LuO8kS_ca{Us<0IbCuxt7TSuGDR?-G?{06-+JFV z5IzuoFYUdw!QsJS=A(wkhsU|s?Xm5#`8t11{MjswcgMTuqvxYtBV8l4Vzpu)IUhMI z)g$8Bc<8+38O{wdXT%KDJe}ivL!eeeCw$3#iL%msRG_DsJZIxo@v2NVCz}<*n|eOP zyZSo>cR6=CLxkbpaF5x2X1VCCbZ|Sk58Dqzm+iUwTSINkHs%uF5}z#ugje)81JGuN zm_riWxrV=n|B&yH&oLd7o)>dxuQ;zbM+J0!`YdSOXxm>oUpe2}-`al*4crFqUY${( zPf0(Ib3qX|lF;@!%ZT1heZd(W<_?Z|$Glbo9PmehUhhGHetQGWyrD;a<9w6Q_}h4G z^cR>8dz`ODCv;p#6LH_V$Aw;AuY_jHj6)-{ky+iUZVeEAG=DVF9noN?_@?-_1-1pc zg}Q|n2Nwq)@IT-WT0v`@xy{_;+vEFh@V~*X;jZBg!41KCefRq4bJ4eb$#^Nj^9K0_ z`TVBeq{kr%!#Qprw{yK*kA4U}FEq;!?GNpn<2T1Iw=cKpaeOA-5nsQgVafVVeTOyr z*!|dLE|b0s+CFo#oZaWlBxji$nhni+gek@pgL&;CLWa(sZWNfY>mV>AM_-cjW1Q2a z4+odT519+6UrA4n9u9K^XxZ>z`e;@4_jl-H(fdb(9W1Df^injd$}Av#+a)^BI^CV_ zekpwHee5x3y-9!TX_`CDJ?I>y^l(PGqg-@O`f4A!AGtw+dVjw_PYR6+J^eTLH5n1#1Pb4qYAkGw^5NQR`8Q{xChA zvwGe(`u0l#GXnIQ&7g4m6MDP7 zU9{iZbjpnxkn_%Y=R5m5o4!>i^_96^$&3cQy?yRJ_a*NokH5Jy*cxoD7bHCy%#xt3 z(znI$uduGL{x$wJm<8JH?sn;CGXF&{p@+acOn4{NW})F^1#W?q+ERC+=15!W zT#jD;(kyRQVm9?D?ncd^NClTwGo6Ak&Of(*i`)$8XoTQh{j3T|ODjK3279AEnZJ)NE z)||`@`kPqvjJCwL#HYrl#?b1SZ&e$^$6ns%-R5<2Iyu-Wy&hu9&Ayv`%w?l@{a2u; zlj+O!y=T2=(VrlmwGuchy~0>wY&18T^it`|v={1o^*v^5n^;Y(US=;7J0nlrrCHfL zGtb;$ZIH@ww*`M&W-K#CS|hD08XURbcfYTb{@x3-9qjLE;alTdgSmYA3+sjF+~-_! z4|68``Vu{q_#QboN{W%Yscrr=EQDrZgA)^ zuW(j4!B{Z%LFEUP3xuk%sJCK%GFHEty*~`}q6#e+c{#c)aT4 zReR?2%*oOR=jvi*v9eu47pIHUC(tLbSm)h;DEpyo=f#~DzbO2ouyw3;>{;~+&~LwU zzjIqfTSXtSAF=D|IrckJccfmMac#yU;YY%)t=86S!tlWGz(b*jLd5=5f2topc-MK? zX<|3AGlhGEn}lCtzr=p7{JC9Z2E$d%;(R6Es1W2zdhDs_B7v}L4aH#`QiEDp{YYt&0I5gbd%9dde!SyuX9G{3}!1{i@z3s!}o^o_VnA+w}rQb zZ?$i=uPeH)=xD*wg2vItQTi6&gue+h7qQq|tPJz9_ly4*|Mbl1nFq5EW`CafdFICO z#_&@AQa??3^yY_s5BpfF&TeNns*exKJ}7Hj(zc|ythj7RWJv^lCdE#%&qdEghYCK& z=ZvyOSvQ1l2=`9uol-MYGeqyGw{U;p{yA2bZH{h^E|(6PW~bRl zVnnkp@xBmfe-v2_{WCEhCWOAEJfv4NV1}Z zricyR6~8N9*Qx7d2p!@b;`<`|BC{%IRi2HUjf}O&+UR!wb^hzn!yOeL6(285v!~f@ zown){)pM?}udv6)#>VDE=FlRJU=tUFKZWiU-7E4-^GlBvA1i)9s8L#@)Gc?*H&t$` z99S{1Vr=Qy(m+|D>|^_5J5?XoecAVA4@eo1^19HrdfVz98gyt-OZcwp zcU32d**_C~CJJxA&wro)lh7xj237;>&*-1gZ6(`Ex>a3YF1;ka9ixQ*vayf<&#S% zmkuf)RQ`VK{g}oOyw{D_4Q6_VctaBN5yY~agEt3{g^z`YhlYoy`lkAbrQ||#GiM4U zJ6C~!xN$d5kCfVAcYJre#3^xjF2f*Um%v;|dtZBB-$38Mq~N6B^uY80d~k?0#9}6A zr?JyuRvq737hf0uAoc;0SZtoqJKj6qUuZ3i6TY^;wm)?~b>Irage}e%=V{?q0ey?l z)dV==LHnSc>ij?U*n4cg1_xXv{44Ab4hZ{&8cq%8GoiKHTHXGy-6_Hv;eha>&Vek@ zGft1F){-1(eIhXDa>hDiF%Qut)Fnh8VY%>S=*!TOz>)y7E%?uWg8vED3DpS^OZWNq z`QXJLnja?k1NT188fU4^W+r(H^AZ&Tv!vu6&ge5U2{)nNzD(f!G0!$29>1sOAGZ`H zxD(uy&dJ0~0rlV2-qoJUKKFBhb%INl2=InabjAhlLcfrCR%UFf>G|#CJ?0MToAu56 zgd(FTaYlx-4$N_88`;L!!cpOnzgFq_vF1eX7MMloE<7$&*DO+= z00(Bjm`TFUe-_{gaRHuukFdmElIS5@wq@@XsD-%KPF5#tngCZ}Z(a_(9C$*t{%4`j zLeHi=oAQ&eF|;wnJjKKQhyAY#KMJdaxKK~%t689Y&1u4+;iVtyc|9|Q=>qeyEA{+i z_~r@y-OkVTEWwH9M3XqmTpsUpSNB(!S+h)m8vYCWi$u?RQ+!i=vAx(v z6Uf%NIxGVjQ& z0Wk?qi@%e9xfk{+)lE%YV}h5fE}=GErkSxHg_dqhcexPsg5C;ug*!sX5cu7V!Y{%F z;bWnxps`+irLal(O&H(|NZ18=1Mc*iKrNH(AEITV?=UN~Q+P^1L-{)Nb%?&yw$Qdv zaiBOb*gx3c&DYI$nf~4nw$R_#pEkcQ-^x!6$Z{5&xl?KeYTE*%z@X+|Wvnvr8|FyS zBbY&>&YL1IYfIcc;2dx|2t9=Rgl$4{o^FR`=->^tH23s}KrO=Al_CLOXAb-xAxD2- znmwp();6yZZWSb{CeC#EH7nTSf8aa~v$!WU1I(T>E5+ZIg`ZNhJ})pg^Rj@SAJH?> z;N92>wJY@p9GLSTF)ya4cAxVkn9&3GguPt&so^ zVy?+@EqAZ8H!*`oTwNpJkG~77#Svk$aR2`>)0wFiJD_gWyu`jUk270X=dJUYscY+N z>pLo-dz}rO4Rj554gM7PDe#f7JGeVIBs3)SW$?@3?}6XN3>pUT&7sy%Ym7O@%#|*B zzwoX3Ei}PgW2{Nc5OIcu{o9V2>ACnfw)pbAU?CNoI&De(H!`F>V9U1*63ML6NHBZ z^b@pp=2_X}jqXM%2_H#in5J&hIQMbkQK6qeoXQrC>5L=$%ig>!yd*p!5SOb6wm!(E z{e-s#e3*4PE;Mu-A~(D2z2Eh_O*I!tEluxqyg>by5zGjthEhZC2Hy?t3+xMw42}%m zFVqUu3edCoO88kA6sil@ zXS(pT{j?1^pr+t!*!WC6KaW_>ygdHTele$yW^~>-FC}nFV)k%@&fk6|;H!L%XDFfj zF`Ld_HW1PUv{&XJ;cv_zwKdzCZG3Hfhx~{9ZwKC1_qR)cIfW;EPx@+EwJc`6crDKM z;G;Kcb{1Xrv;a?{-p4oT<&Y=;)Y;=j!eRj*WDoBXw#B!_I|{GIUXLx0E{|R()D!qT zNO(;cC9Duy##+X<3fb}Ocu2SyyBMQR>STAa(a7PA#D}Ma&!nT)v+7yjguV&wPv4)O znU$G!DDzO}zKngE6v)ijleQ=A_mtmL%0uNL@~lcfAGO~d!Zp5Ye4B*Y0{e_MFy24j z|F+ObaDA?Cfxy?F5e^7Fgbn5fv%k^b;0$Sr&hR|rJ>$V4m=jdn&Hhw4Dvt_Wt*lUGFdd?p44!tby#S_nlLkHvQyxv5C8Rho{xCr@ehCp6>Q5Y-0#ik1L1UTA7 zf&D=z#m3OU(OJopyypmEzW_h@OJ^)*3Fr*u)1%(e#2k9ejk#+DbXMX?J2fJiPe)6n z7jd@$XCw~O-^N$rQ}`L&Xsf_{ICU1Bia1Lxi-z{CK(75-(9$OIGBJ(+PZ9WCG|`^I z4Z_vJG-sOgpk~Z_=q&lLz_7r8(16gh!DoYy3oF7a!hKTvq^=IH4o?eC3$_r_h5r8j z{(e?J>pDTS+FC07*Zi;9Ks75GTrFX~H9s-8jQ+OJT4>b~(93oRmkU4Yxrx(srUBcp zBjk8FUVFEFA`a7Mzg1vvnpz!=hxu|i=LDUf z22wAr6X0^c26v^gpt;{9JR!i@;d|tt-Fns_8YeZ$1@}Ut_PkGX{%|bp z3%ed7d@4L7Tr0r2m`7hKkb9X~rnVg}JTD~YZ23$LMVu#x^%baliP-~m-eIw35|0Ot zC+0|*4`J4-I8+=uAe;)E3XJiO@l&TawVGPk2IoNGB?E-v0(0KnH`)v{mJbS-1Zw>f zo#EIktP^;a0rTGECr5pwfdbcaD1Im&76uFCnX5EQf4k0|(98K-=itbx@K)x)$b0Zt z)*XKIz0LxB?R}ldXQ$j#?iqnT)`tSm*Yimv<~`wZyhf>jMqE`WGzt^XRV82ZGr7WC zopEd?&eRu0#WNTu-b2 z;T89l#7uv0ueVoMPbi}nrdHt08$5ve8GAH^9-0lEsoAL$&Izr=RS6EV(cY+Pcz$Ar z{WJSBo4pNy4V!rr>LV*8)3yJAAL1ubFf7H;UlO==T$26JuMVTcS@1%oW`czau_a z=Ttt?vpb0aSD05M=Gf~>Cnk2l-P@>7$}ZQvw99Or6NNX? zKPCQ*5YU#G73(Tc7qZXvXxa+f^!(ik!f=5cfWFG}4j&bW8T4#>>bxQ~R%^4h$!tAm zD1H?>3vZckC3yCDJqMvVXWdj6>~r=d;#DuFmpb?b4)qe;@)#~E8|CnT6QgUGC#CCYxWSX3i@>e=%1PTm?3cfak!ot3wQgk&XCYEkrbJD z&dN>hP3i)^o9HhS``I)0j#>;2Ns_=NxEJUw5O3!RJf{J!Z5ft2ys5@1J@=J-0at!e z=kHE=rxIrp18QL550d>8=fub@?8$99lUy#)`=4q~HJe$@th&O3=7T16G__(MfjHhl z=QRen0}|TQ&pNO8fSwbq%lD|a&`O^%o=NCs)FhnUgx_cAnG`-nt@`Tq5U=Su5ewfF z_?YNUbVE8vNGyQQY}4!r^_RkCLOY=jxk11uZx-;Oxk812M#fn^G|`&EYxZlJf^%&8 z8WmQB#SF{mDW9iYFVqm27ra-XA9Bn*W^zx@>-^;yRqfbhzVN%A13X)Q_iMFpwXavO zSMcA^zoEOrcZK(d_J@WBhX(KP-{Jqw{LQ4ky;slQY^!;E&ZwPsPCMv!M}#rnn8dS* zU-4c^oW&!qJ|fV&g!3#E$kEKJpN4$Qd2;3j6I@PuEL?!KfS0k}BlUdE zpY?YGMTd-Xv)mkJ4YTeOzA?W^=rrUgo?-Te{?-`2gB`-H(Wc4C@# zBlYYd&T_&{zVyEIs699%h9-&bPu(?LU=K6A3~!Er);3wFDSWKig-l_BGa->5+NxIp zAO1vO&)c|d)J5Dx8%f>p-Y)gcgZ6{=uK2Dv@rCn{i>yT!^VHv^e5dZ;hbe^ubMQw~ zkETuxO$^PjW>~Bj+7z~fHon$b>-?r?RHL2D_Rsb|7kVzVA-q8ysQKX+LobFt)0`um z?^pc|5_+ZVXLA94^1N`9=2YOma3?qv9DB3ofHL_cJoo9S<`ys2}&sRpK+Tx&75KOFnhYdeRIZ^9QwD;PctvW^?xiBm<1*|>;avF=6#8^ z4TT#7bXRiyYJuEA%|=WizI>tQXybeB1!@Q8GB}#@md;FS?AjV6ysHUhv{atgbzIM$ zCC9yMziYoIz@_1F1J%1nTSW_4DU1^O>8#sQomV90z}L^JZksHiYr^4YyR+RyEpqAq zpDBs&!HMC5*XZmZHP2hZPJw-=CcvIkb;h@ru+`n_UMGC1XHi`t%(dsL8<}d)h|h>G z642HIRRUG!`RDojru0qWJR1AY`6b`M=U+Y3u+|q^j zuqN;k{0M&~=8w_ey+L~?-r}3}1vvgFfw?E1!9kArMu6j!LtYYy{rv=d_zPjZFid~@ zbe-x2wDF)X=xePruXB8Jd^)0N!FloHB|0NY9mqMtSM68rPMSs7BHgct{=Nv$J$P7u zBN2U~On_^`hYq`k-I2~n2hD{Z$2oy`dyjjM+r(><@cH?gU%OV|TF^}4bMS#a!U6%m zMrR!@tP;K!;EgW{_X}urgM=^bFXi=**y+MZ;ivdd@y~^e>f8Ms{5d!#eN6hWtYKM8 zGM8ljn(=GKUSUG&gw%cJKJzyFHk&z3`kt#|t75a9Sq{0AMA|RZFI19JlF~4>Vd_ue zpTb9jM}r3g2gL@b2S)iv`SYcp_YmN8Xd|aIzc5z4)Mk-pk!h9FDtknFL}o>2MX$E6 zwxeFu<2h%S`!Dx90(B)bacE!Ym*oBy;z+~^^uyN$;>R}vengzDrDruTPc&KQMDMch zvhsX+K4v?Y3kQ7%eUDg=SoAOON!E&<5-}88{7UCopVV^+YUsIwjr1Iths=jew3(g3 zok8>}gt}h7UcSS|;Y4ghABE5SrL&3jh-XU&ZK|{WjWri{LKvv|D00YGdY%%`%N(JZ zDs-Heh273>O-Hs)aM+dVXRs$|Y|jYmg|W`qM9#d~y*Z(!Q{zn*;0dn^1BHhKG|6X~ z?lqoGXvtHoDb{A8x39Oav#{1&Yr-*k?gF(RHP(sfiRh)+r5HNrqnc&R3FZXh0eQmq z@b>WX!16#HJy+ogoe8E!jOn9~@Q!dn=xTShC+dtjdhTGIM}@0BqB*YCn&W5@Xc5Q_ z<%UvIQd5Gd!PI6c%~HrQy#u`iEv=RowG%ZI{l`BAVm7l##NZhMH9ax7Sa`>H$5?N! zH>p8F{*WI%qG7OM@YTSpfw(X3BR2HYb49W=uhvJ;)?4N-OZaPIZb$QJ`vh{;F9O`0 zb)t7lPXxZstR_0dtvZu6Q*cx`XPf^=(|HG4J^zotv(LGsdrR6|N<(EOw2%=ZWTl8? zMfNHc3Lg@sD66F+l2BHZ2pNs95m}{#l-Bs+_p5I3 zYiiB)%b0uOS{wWy$7PSp9uD7SzGL+)&zzY(GcT{(=i2A%yxoucfi|sn`B%ig-Ur9) z5WpQyRPvW>L9QULul30FAY#xo*8r5!r-MEj$J{mSzOR2t{YW|R4OD@9le*4FV4UY) zum{WKV2t=>cn8!o&7B+y<}CGvD`6^p17E_M|Dj#ol6*&d7^pkh6Tp4$2Jq_%@FA>% zXW%hd3flGS;7u@|-3_wAZ16?s4|@Z9^Su_epY-3ECuw}@Z~P%Ig8u5U@I1Kh8r#qZ zz8>_Q{Q%l(?}5HY{n+|%)Zg`;xYpb+y1+oV7u;9%pV~X-BCw`ey}_JapN-#-0&Q-6 z_CMk`*DwA$JPAHq{W1DQloKa_pM5Xqnz#@C0_#CPqTjCq^E1_bhk&nP4F48*37l8% ze}92{sPP#6!+ti-x`Vz#?veUc8o{w(&aeKbc3?d4F)$BR+s6IOaWw`s08WMiXb<|b z{Js6yjJ3Pp4FGLWZ6sgI@9p{JXZ>ZZ!4Kz?&&2CB|4+ZyiO>sNr#;|Cm;mNi&WB&X zIjFDG97k=VPMoD|Y|%CE9=R2?r__bC<&7_^H~IJ4l~;j#^JSo}ZCnJC)NKY$C7SQa zqE4wV&hgTJ;`6))T-%PD^T_zd)8Oy?{1iA}%z3>S4gtq7ug7v$K$toz5P4pU{VDGvsZ5aste& z)^GeOIF`-G7x(pg(+@_Or+>-ZfeaWsGS}U4egRIQpO*joC+L&XE^_@juU(tU80U(A zt1QvZbUwL8{2zOvm_OW^{%^)X)kR$M`5a@Ohw|8aRNg8Z%#U_X?IHib=c(Mh+l3+e)Lj=#jVMx77#CwE7G>@T2?#{6$%H;$`o$mgx!+1P>o zUzNw|An%Y{-H3CKeC0M(C|8mZPS{7IqFplgPXE6>Dod3rW zhjMRG2h7%FYuxu-FMWs+zY};T5ZNEue+FmaseAc;+9&!G^^>c!I*#dD=~}z!W9D4Y zH=_>n6@7M`bNWkHau%7+F30Cka6~I6jlAKvm!j;wSq4#(*&& zU(5V|b&MZ4f2W3zcENT*b6H#uu2uK4$@KSejmGK85yf^LQ`$TyyA8?f&8Oo<;AXf64h*7Q618_a)$7>AKag7$(6r>fWk+b}hM9U9{-rRbH2Nuy3cz}>ZJSma4%IC_=+4*ZE@wCdcL}#I*;>NUC;Zv7@WiA z&FS~B{z`vfU2@*chj1TNcXh3*XDH{i&z0TV>5Xj8hqax~boC98;<5C7!f;xe+RvF>^RGw`C^+s*zcfoz{PU6eXXRk+n z(J@tLc3${1<(Kk8UD(%Gw|3pR4?5n;kvHfc>+5@s>T>$t)%% zpRd1DR`@@@uXE9PaPRkb zUXSU~&$<}*@1QYQHv+$)ri zK3DHU{n}^iGfC}F<>i6*@6Yv%iC-%R8q#0O`}F@DC-2keq7LQ$?_TLxcwOGF*XDC~ zUikN3o8#*1I7gi0&B4!Jm)GiZb?p4wXYcR)>|AoJ`+)09-AMgGJy;p4PUbpxKDzGw z8}a{KC;D`JCI>#WSJbt;~ zbo^F>>r8uBIib#?&E)!U@ALcTU@j<2UEj;WweOtpb&Y{LUma)XmCx9(eJ^E$^VqR) zeL9A&ef1}w>4E2L?v#B#U8m{<%G|TT=V+`;ebndZGgU|P8LAt(xB491cYIzxfB)A1 z_caeZU)QEzyT|*rW91rht{oU>f3Mu_27dN$4(!+J_g<^(*z0x-eD=Plx|D0rdFNR8 z;W+xe^UwL~e&YE0f6ns*^XkAna$Y&+{*88l^V#R6Y;(Q%y>h_U^);Qd&R4(o_kOKy z?Ca{dEI_K@ZtOW|Nh?f>-#!yT%-Q) z8hRW19G&;hdGlSoPwfe1o9o-xbG|yZ+8>Uq&)2!F-m3lWy*j==AIH-X~&FAR6blrLH?%!Uw_wTcD|8s78Kh7Q3tm{zO>6%k7RfqJt zd>!{TpSkN(x#2o;e|B&5v)Ar3Q@8YWjE$=s`2WTZ+^2g4dIYpdj2mjls5k#hez@b^ zFW4`*narn0Iqg{e#Mq2-zli)^V}RiARcDL#R^=fT}x}f@x*Q`&a zJ9eBgn6{iZrSD-8wU_RF%2a&}`e3xz{zt!m=bNz}<+1k7{p3TdtNp}T*Y>-gS~IoA zIrJy_gZe16kz8B)U-JGiV*Wl~=bLtvW9Yp)=bW$FQmzr#y4UBNHs@IXq;h)^XGkcc z{GGlzWvJJitCh>gHr>x=24)5}VkDLb+7rvn6xpR1M8_pc$@Q-jnP_{ zV_tYuXj|QuY?f5DIpbfF`)!WG^VAXjPD8w1xm~#v$Y1mMJq^z3df?ysES=BhkZKF~ z{vT7v?mSWdRJJPPea=2FpRMDQW7v*!cHe^G!QuH_+TQf8u~y?RxEBiG zH7JdgMjj789_|UofzPIPK6>_gRjD_V8Ek zuY4^*I-AZefpg&?7?v59c{TlNdL?`a@4+%K7FPxrW-iQ}0Nc{r@_lm_q!*-*g^j6= zsW)LHl!0;L)xp)lFJfQBE{b0iUmIN;O~7i{7TXq^6`vK~1z*L!ij5DC5BvQ8AYQc! zjF(R(-t`9g`{p9Ooqe0E=_|6u_3~@LIKuC+8_Hoa=&x4aDWHdG z89A%Quh{;`F34q@)0g3RI1|=_Fm)I)}>Pp71^4m*7=c2@U8MeK0H! zFQ>ZvobcSx+|b70#^9gy6gUd>ZR&d*4DKz?FULzgMPJ@dIGiewfuOATgnB9Szm*^E zC$4+*&b}pU*!k=@s0*%1^MKu-ROH;V^{psB+#B3m^oi*E zRK9C(yN1mJHg`#`=%+ zbDjgnD2!jJSG`IvV|{|o>Hnkl^L;R1WdgM?gvufn;R>>CCx!=tGVLmOoW2FFD|2Y; zhw6vkrU%rgflukqbUED-dIsD-^hLPuDBHCo+>5oloyYn})M>PZ)W?*=>M!~()m7A6 z-QUbv5XZ;(m2xXioW!___KP~xf&55yFkjC--REVD!S!}9{q&6s7>Dv4>{9$u`uDv? zuT}rzHP9FwPxnN}#Ov2K(6({!);D4fe+?gR!ctIn-Ug?^8Q{EBJ_TSmeO}jrxlis% z-@_*G^KW2Y%oAYVX2EkX1D=9+;aB(v_JFV32+RX^9`^wKkw-%pI2By?UX%Nr z^C?b#)H$$@n!AN?7kz!q6+VHO{GHGWKB9lb&+sEu1*?LEFpu*ctZ_3&tDnj}Tl>Lz z<{mP%W@tX2O1Ytoaee##QRoLglWcW1pC{Ove*EUfjfK0QBT(*=vqrBjG=|OOhtz=i zWcnF*!MEVO-URwJm0?@J_}Ea;XR97J63h=%S2uUgpScHWhiX5nzd8Rt!xqv$P_I)* zQYY7*b)Kr*sV_Ottc~af`Yo*~)rZ#{j3KzED#v~$cg$yOTFygaW8V3+|xFN zHqmi=Wa!V}pTWHD5PmrPK;(hQZdeD`!l`gQ{1N^mOsntk?e@5VMX;TIQc;*o-*a_q z*NZ+=_a~pDx}ou}aiDIbJTk7KF0K8ik3joNzlXZG`m!=gzn|+`UxBf6?Izc%u{dR^ zb5yip4y;LYqbI{h;DuUi`a89SufgZA3H5cTa&FR2lYtzOxOKGFcQquF)!;um;l;W zlfduIC-Lj)Fbmv!eT^T$xjYYEgYRHBXg?@hjMchlFNT-l5paz;&&(M&XS;wLKJR@r z3=R$sJ{o#7bX@qj@EK4^UhP`=7G}dA^gL<{AvgqF*GU>kxHen^kAXSBUhiRW0ccCD zf$O0)3}3f%mIk={`Cd)XNVBWudzEv7k&)cXxmHUj4f<;QgzYDoUt?IX`%@NSX zalJSxlmQch6N0WmV|mIi*ZEE4mK$4F?rq9#%5~0m&d$or%IEPvLT;$GnERl6)a%rI z?FOIc*VYk}qq7$>!Ax))y}7jC)yu6JkB8!+8NnGrKf`s$|d!$yFzz`CUKU_Z7_^HGG(*>XTFPZt4c7J=Vx-)o}iz~ z-Q+=i&Uq{?11-tq{43x($W`ai5TC48-?$t-MpxDU@TrsAn zPe9wt9Lx^nlDekGQ_ry=z97E6XnWC7a8vxIc=u@c=;!gzG4jnPO-t%5$T)xl-w`#c+CZI%}=9eOlhh#)iBvGIWavkJ&D>w_a^mo_bv4~ zWvn*pa_ZkR@KpGz@WX+J1Ikw8#pd7YJ5q-^hyFUOpUB=GFVoB86L9YtM-Kmm)chNNRY%-MJ(Y9A_^~>bJ_X13eCq6# zdFDf%PhGY1$^W-co^f^8!?sRGywWqey|73P{cD4=t42`NAk!|~Pz8|J@-gWg5z6
VWIkvQDY0;S4V`@KG@L<92(C$!2 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 E9Mp?a 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 BFPv-+XFe&P$Rk9K=S%&tw`jUf|=gA-D zjcP&1@Uxms9mQwnChC86mjCs+bHv)M|7BJm;$ynwZ@C#R=%R1&DJO|h`{fd~p>c~_ z`|=`w!}Z2*-0B%Nl9%LtV_)=g0?!l

amMm-=N=;%Co-kinS z0kLkyrq(_17Tt|m4tI_GP6s~KKJniD33wG_^bv1tD&EB$yP7NV0X$kG#h=*y8Y{se>f}encuei{gJyy{$vF2`JZCzrhaeC{{dScXB%;1TYq8Tr)_zw5}3ca8YJ?)ygE&sAH%lsMrNw#RAiqgV&@ zzu|tz^NQ6Kt5=RZf5d%N|2ux}{15VlBaa??ba#IUUe#ab9p=pbhuzw-G2sGSCC~bQ z_3s}s_rrtErT=Xs`oRG>*?84!+EBa6tL}ljS7R+ly#;r8icQ%HKba568DiUf*>x~% ziyvIimzR(5jX4G$IW;1$O`6-)JLckIPwbeB_>DmKGvzO1;Xn7OPL4dZeQ0Y<8P@#& zBLBnGJ4WQ;3yv<>^=EtGi2qf0&k>(lKUEu;8t?8PSd zUmmocC~k3$@rgBgUGCDCwKX_aJGw_oPx%n%nQxn0!yKNqexd#&_O*{galDu}Hg$zu z?SK2#rS|b7edU|(1=F!-+T9;A_vBMNG+S<7G-Iah3&)4&D% zna{dcNKgC)%f1gme0X+19Enf%(6%*Db+UN(eJ5%*{>D{e(wvxn+Vnh#dazvMz5e7H z{H>R}jE%dihTn2#KesKwPwY8`om|Fut7 z_>+_9Yu*Ys#5xiV#UI+yCgE3gzB~vY#=zfllk?R%@)(SVL%AHEt7Fw;>K8UK26ck` zs_tV0Hqs`)T4Qlf9WRMfxeqs~>*$Yz;2Hk-5+8^!wW+Oqz?X1nE{%U-g}vEb`|PA| zwwFubOk23jdav~k+@?*nAijlj=ZXnD;#%X7m(+ZGO|&Z}tqoa25u4U>)KmBrSGnJ= z2Go~$*Ozg54`0R&FKS`fhEqOqPlZp_7iuK!tH;HXI?H=D!cTXN^bAY&8-MdZKZ!xu z!A~${&5AG8An}=XG1!z3;FC|`{#_$@+&qYwFWZV`KETszHSMZjyJsU;x#w@~#W>&> zCd|v|<68Dm7kOq1PQ{Zk83Vn|f7T;vK)fx7!3)3gH=N4f?)&2g{H%XMCq7jV;dtXQ zE;*CW*^4inhYR?C&DoyLI2e~{*P5WUK{bi`8NRIn$~ACAcU*}d_?(U8t1~0MBSpS6 zH)d~rz$C7Rdv$_1gI)dLSH6;?j0XngCj7?du&5qqM{`Ctf=h9$JwEU`%)qE|;Uqqw zKYYR-&NV+3vpB~X=x?3Gb6+qfmd%08E%?s7%=hf5x#bmk$-02wO1o?XXW$Sq;U15* za$}_*o>TW}Tdk#SF@}e5HNV3ke#2vQg?*eX=ENHNvAueQ@2m^L4$k*HtGw;Iw>;B! z&xr4z@f@D|*FGHZ7haN^_)?$RhbuXT-+gAx;(?Fx4x7mTnBU|yUUi(F^!?WM-IZ%x28;t!ULN6jNgtBK*vF?j>7`3YyLMc5dI zVL;wzcXfbRv1Vc%up&p8&&w@z^qi$S-2Dgfq3yo2k`9jNe|3XC=}1?YP>YK}wKj~( z3))sUh&6Lkb5rqXo~M2O_B|-ZB0j{n`>1g4dh;SU)UH0&A7Voul#lQs4AMm`!GxMm zo!c6SV`5l7Fb6N!;0SqNj9H(+iTKZ&8%(p4=OthmS9umx-7BWpSX=6I?YIVS7nf|? zIt06jE4dHGoG;dKx;cgUD~$PlbKiMpUaS7&Gqv_7NB9s%vz`PIVz^S>3IzX<2Deu{Z z4&q9j$Zv9moPo#14L-5XV0~4N!o%A343OvEoGVA-g7T&H2y<6)ATHDc=4|Q%{42M? zv6_soa-o`vsC~rbbtAsl4hLBC5U5!biIZ|`!w+fzW0XVG2XwIZ?;J6t4SB^pMIN_>W4KmR!6x0!zg){! zaw#l|8MOtD6<5ZEzu84><9RqTH-!=FS#pE=$>;1#oW~AcxF_7g8Gd3Lbvvx#c(}nm z@-1#+C(kgM_qs;jQ1^);Hr5Ax>)YCwbHp`#5cbxG7#A<*=4yX)VYLSyfd}=9e9up6 zB)EiKxbB{tbr5SHo^Qc>a4p|D54Pw*-?&!Zv=1}ZIK8KjzSM$jg=^>ppX`XE>FHb? z4l^)ro-bb55vRf{zpKgRb3Vl%xX*k3ll#=Dc-;#h%b|3@>1uW{1f#|*HgJL*hg0DV zuW1(!)CT6c)t_)^&L_UaNAqqN5)0;m+A&vlEN3(|MdeCY;ElnUSLCxYF>c{ z#I>=j@z{yrRc-PyUG&Aa>OY*P2F818Nbj|Sv-usLXp>)zO&e+sIh3FH!#xI=G8U4* z;7@yE3LoJCV}K>`0VlXcjKLHv;ZFTKU%qXQE$+>|_=(^6TAc<%a*?*_D>mR9hl>Gm zsSbdD^BQB-m%iB)w{(9={^Qr?ePUNGqOUl@#oE9H#fkCaWbKM+F~Bxr+&ILv7*eB) zDOkZ#^i^lr!W)dj8Z3%K=ku+4R$p?Y8cpr#Id*dbc}#4}X>5qc@S1kDDZleOUNkN^ zrkiucsoKc=OFonD)PlH;?bs1MUCvL{Y6K6;32xz#x7BR9!`@Xnri0G8R&{EiLb5^ls8ZZR%;5WK3+ z&^{b!TTHv>jI*>Q*2G+~<~S~OKCYz~fAOt8@TnXGJ8B5^cr`t~7W3i`j_Igx{gwOn zt4|-^F&@|xAN=Te@q|;^9{%~;`13UmDM#>`cKMBn z3)q$`#DqBj4DyjVntaG_;>29yU_=axPdSJ^=A zaU`zjt4&xkE@L8e!{2bl55@`4VqWfG2YCPv`A_X2-;{S87eD;%r7t$rPU~j43>V4i z@}t;*Px@+`|HK6>5*X1BOxka(au^->-FThDmu#R7=i?*#@eAGP$%b->>+=cQ@;96C zJ>6~j))>6^GB&{#`9O_iUCS}PfMtHbsm|B0@v*NlvMGDfo89%L|Lp5? zdg>3RY_%8v!4Vu}6UX(%=FWvpdh->(@x3@z_maaAwT{|E4D&C4(o=tM1iSK-xDrEn zLychltTk<0=klMv#En=|@8ArzIZjrusU7Gbro|oG>(jOLUyq1mZHj5NBOTOj#xDOk z&zSiY2K8wzt9pk2j7J}E&yV_IOZ~v5STr9q7Q7&5;tF#oISqf{d!M@(LkE4cYjq?1 zu$i%%%Mf~q8=r|;cvCO%6+DPfTug9+_r@%iVH~Di10(d!KJX}?z=rX7&v*LtUX1cJ z9Kk66sdw3r#OtuB&VyCQ<#-$wH^Gj+;S$d!+O@9_oPrr zjKj8Al56$LcCHZ*I1eWnL;0XBf8!@L2kgTFT$6ApXR)iX(t+KKj~-$P*2R_ir@Gj_ z8icOSWm`CAuWYHdVMlm`b$!s!cwvM7@(e8F3pIs0Tn(&OD1P z*amj^9Ny@j$S$3s*44*J2a5@HJc-PjSj0a3;3&ZH%_A zV>dZRyV^8%c9wgLl}(*n9_34ZHy-|l1>=V;I+SI6T&#fPs@5qm*M?806?aKPBwfs9r+~=~6WzKG% zWd33v-~Fn?$>GHUPVkvH5kJ<#nrr#r2hVh9-~30M!Gl~Z|MQU?&o=Dkxe4!Kfj{9w zY#Rex^PjlK32^3kJi$Kfn}6WBoNXWWag}(~W`2SVd0$?{Rq~X2y}5H+b8F|o0->Yx z;aES~fnUDX9?Y84s3+hSrsUt&QejK{%KZl;Vpn~GH`R4?XwAUB&$R_R`V@2G$+$No z>|ss@N9LsFgmMpl5(9FJe%RN%-5lP%66-m()`RhgwF5fQmp-@$cc^{%fbHNBck%~( z<6iBHD>22N-qV-xBipD)=?{xAZ%f1u{pqdtfKzpcW5(wkxQB6LG`DvD31^!Vs_$%D z8}d1CaX> z@|AkY+)gd(z3a;(JP0>1 ztW9~v{Riubw$?wis~=nZt9`X3ec8hG^wSqii9h3Wj6dN;KYXoE<73O>0T*ZkCc>3C ziD%gqmerT+A%3(Cr|hRMV}uDlgIRs@qhtJS-4KSguV#Qx?ZdY7=tmFnV@z_re0vr<~M3ESi-^hPuzrC*zvN}9zMZc%@JWGu2DDRD)|qd^h=-WYdX=W=0uAu`g;S;=qXW+&8%E_e#U<| z+`237)`wUTOX9{k*4)%e_Ss#3IDt*nT;hg*`IWuI7v1AY_^uYk{p<-lw$1DKRLpCa z55yQ8h$Yvmpc^Re28Kj|b#h$|vy;ksH%pEwae8Z%!On|uLN;>>vUzswKvg|_!A z%YVPaj`wTtVbI09z%r(ffCj?dWy*LjIe zSl};yBX}3CUW?1A6DRRcTv|N~`-Cs?A6w#70-O1j zPxyup)u+Zx7vpJOLl<@xGh$P&5?6FL24hsy$WeSN*7(`E+J`Z?VMjK@;dn)Tig$34 zeaFnx@C{wqBW^ZEM^mB9()g1?5I6s;4kgN4#7L@Q7t8Qjj8b!%gDcG%sy;#+@?8GErv-^R^9{2}fM4AP5E z{3>SoTFi)N@h$H3VXOpy@}vJ>QseR;Tflk!sMFcPTw6X=cgP*^%FgtK9r2=lwu4UD!iEha+O&INc}Uf0z|l>|?yRM*D0FL-b+;O zDV|s0Q*%T%r4K%YHF^>K(xLS&c8lBCfsLInCLJfR;~Kc3E1T#~ZcZ;T24_3bn3d+H7Lg$4dG7Ha{X5u+PDw99Ur5jL}~fm=MU0JGMC#5F&f^TUdM zj6coS5T7FE+G|W7yk^eqsfu@HN{Tqk2w_Y&}VwsQI)3C-Tt22>TcV-@}KP z#W8RXm*Uy=#sRbHbN-|g&Q!;+seFe!^e0AekgJ^Ozl_J?zRBe+6N zp*tL_jXi6Li_AT7yL`ka;+)=uO|`|>Vu`)k#g@(CmVMa=u3ibLDRO85^IdtF#F>)_T~{|Au)M7S|e+xOJWN96YH#ShntN?q-b==dm3f z*;lOLPTXj`@TWg9!oK2-K5PizxX^WYhYi^u9{IW4k0WuR7&1SQAL(ZvEdRl*cInFB zFs)zs5l>>Cjnpz?*t4GESw5kIxa2oF;Vsu0JG@U`_mrS!1O;4i`K8 z1dqnaHh4?Co7cipc}(Bz35W6?yWvB9@vE4#*4W&hzl_bj;5bo#Y>VSzLww?W&o`?r zVNV}0ZY`M|w8IxT0cWwBxuq>#=*Yh1YUiop#f13OADcRtowN^y@xe~= zIh(;C-odfPV2qyMp{uwQ%Y2MSea?^XXAr;`H7v_%RanVV`kU*k8Rja?CZ~Q_SYwDh*kJu4>2V!3Rn6yEWaHA`c} z0q{i^`Gv0Zrav3&PrWEE_}95|2wxco8}b)j^r?NZVVt-ZhQ$^R;Zu2;&f3Sn`ZY#8 z!w1@zvpm;{Tg5TV^_;CbnGbL-eZ7oF%!qe>p*K6?no}eE6<^4oY|X~7N`L-?GgwSd zpXp1SupQBcvG9%S#TvcoaX11G{3@s8UKq!Z#s`n$fgimW54hYja4=&%(X;Q?sP)a> z_(p%);ivq_PR1;DiJFt$_ztdJs|~Tj7hYnT-RPlzHqi#oVK+L!m+?E#^+bF*9}cXS zsMXYPjgg;?k)PR*{plyBPmg$x(HPkbpIZOpe>hR=8KXEBYq-x=9?-X(A)oR;9raCr z`9VLOYb_*@&}9&h3dxMnB5#-r?mtMC#G@S*iQal@wSA-To1YzjMgK#buD zzESJo1+jtO z>&2t3SQKma)vVfqJAQ!=Hq@@V0%x#;cGwV~!I2y(zrv}!p-4-K5c4W zoba{SfLlIPFBq#amjG=^gKPNHuRLX(uz?%dOsv_eg|w?)5W~jHPjKvd_GUxa zqrcn_Yw#-0*@gYsfDhS(-^3x#aUAyK8P8U`PRyGVxmV^~HoyrmB?kOY0$h8qJv?76 z4r_GeYyI=18WTU!&x?=rBM!y5dICnA3$OfRjQV6(_H{jbs5kJq&)JcE#3DP`ddVI1 zkrUX=b?n7|_Ss`Ut9}2@=4=H2;te)^FOL5^G(K%P*E%>KI+rduklp!=9c}TtxPn8m z-hAJ2y79Grwownz1rLZ_`Nn5#As4$Z;B&{|3>Wd0^I_C`xW!fS9b1VhxPfW*psOwW zi)H%w9~0lZ?YnQpEZ?#fY>H_)if(X@yN!!z2exrMU%@Z?!#ADaz%}~9Gvy`y8Xrut zfw&VN?ibQKe;p1F;W(TWo^WunPIqIZ1B@9XpXopQu$}*z@!c8zuNGGDJHAzOIuD*) z2N!(n7+&$d8b+UTHhkg{IA$k4#Xs=qT)A9a(g(KbsAh*x@oyf@4s_)&^$RgR{&qdC zhIw`npX|q{Vjjoi7rB-W=Duol_~0ime1X5i6fb6xm0HXO!gV$1cg0LS{`1Af$={*8++#>98V3d{Q7GvmS){O>s3 zae(oO5&qPlI+y?DNBk@9#f5fYK|kgTI2otG3|}~(zyz#`bK}y6bqlpFOcMAOH~L{G z=jsE0>K|sd(9?!uC9~lb{WD`ELHCER<4`#%lzQi{>>Kn)SoIltFFR`t@ z%`Me%a>2m}4v^ohhuDhOVu+pfLD=27&82*%J;K-Y<4gYPxVZO%M}iC0J;nxS>Q;7V zANmn^We4$Q9BgD8#QhB-PPu?;(=7hj4u{KfD3 zm*>PS9oZS)`CF_P->|7~7#5rSr*48%W04vRtKJ4RK`m;IQmCv1LY_5lC zw!))g$k^1oo-t8lv72_p15Qzk!82WqjbGHb&eOMca3-a_}0Gm zn%ih!Y_TgYFjo0U4NF(LmpAOgow`UK32(4$d~zk*;bgX;voYdJV`OLk_Ze4 z!M>{xP`!Eil@`CZ>TH|9EwqqL{x8xAKsy!HGOYxyk_<$|#8w0FrpPsl! z{tz$51czeIx%8q7{jC?k8w}tHx@%WF(UTqR;{tx716%4Bw&;Nu*e`x?oDO|PCwhx_ zI?;{)eXcz*;B&TR6S%X_mh^^e*f$O@`j=mfIeZ(R^W#r?Xp0TtPusAd9ev|>uk5H# zw&t6*#_l|NvJYL1ANHJQEafry<~RL0$2IB4f6j&DWnRyg^utH`^Kvab8)trlH9`k3 z}jkU#QY`ny#K8;Ho?88oC%6RC)j>bx~PuNR)@a4rf+EMG^ zFuvns_I1AV^y@l4b1m-28MZi%51migjSl!pJ9H8Ae8!e=C@$hf_VT%NU2C5&@`v-a z?;3r<8+-DJYhiRff*bU&4|vi({o*$m5ifj07xvdKduq?V@#c$S%No_;h!|r7Z9C8P z+UgqiH&$&I$NHx)yE)gje8Jv$-P~C{Wv(LcvYRonH-5rbbb|xqg$-@lvWvd?KHM3D zYhZ@1e5W0D+l<7=u7f>o*uth)IAVLa@|nK6K7H7R9&~aIj=eyz1NLDPW28H~7N^?hLpISidpn1SFV`D4F*aji z8@wT}<1&6@JLj?kz4=xDUfE6Tz?^f$w!YcSdssGhabVjTj`7%cjGeVXH+W@Jc%&EM zPvbHMIm~$20cYVUE8H^hdtyT*JLBd*}|*X;b-IWGB#M$rmc31D|*+LF*?_0UfSXlAKK%o&{%CDgtRIY+ zQ)<_}9`iGJ!k6^^(-GfO>;AZP7Iw7O2}k0?8j$Z+_Wg&xYyF-PYkAhY+}m>8Zz%ds zW#7GOoz1+;eQ2M%kLh=5eTR_s7N2=Wh7H-*_bd8d<})Me9H0CCF1A*Kse!BmsB78P z_pIGH;+bL3&-gwu__oGpJie37^9j~Ye6O(YM>K9VG5m_CcVx5=8c?=aJ*@A*&{!4*Hi7_L$0^Nsa+{__7)ek)S@um%I#_5EkQd-mH$zPA0^ z_E|^I+Wjsm-x`~orM|I7Am;F=XDwjNZ#3|q&pel4j%p6B4|6}fXdT%(K4&9XVi$Px zecy0|C;8Wl-Q6c*5AneEaL2AV8^+`ieTr$%kMoy#8*xv<=X~okesYcPqQ(2ZOM{PL z!}p%a%|0`a^tt~pqqk>l*c6x1(KYlC5AvTra0VW>R`<=3b5`f9Jb&c572mUL-<;Lj zg5M$WU4DMQ!}qxPPD=6MK9ldKfp=K-oru04%WrC5G2hP(_8nhodT zS9TV|IK=OT;0N`iwRQEBSb_z1Vt4;nX^Z#8F}|`EB4#&JQ?WN&<8M4hKQW>X)vo&~ z?CBXa^`AM2^<@4@*^bha^GxED{b@B5A5 zP5yD;)*6rBCBJ!f^UC*-yT5K72`7j->$hUZ_iXxJQs1R3Zp8?0vzE%{-dnepKk%&o zsll1J7oKp!sS!3|XL`CWPQd~C_6&pZ;#0nt57is|Vk=h7+g;xp4cqdM{k>|DOOeDzx+zdmyJvAcIR^1ZikB}V03cB3;r#Hsf1jpNp; z)ExY&4q#X7aWE}b;ljGFx{2O$7+&UYu_pG!uKs-2^ZoOiIG-7j&wQu<%SL>czVAW( z^7hNS-`}y7pZu?qb!h)<%07NW-go7*f&2lpxCjrCOGdu6{npm^s`{>f-_wsXzGuXD zIN~mOOz!YK)Y=#C_)&f2cVxt(yyUxDeIKOnY1M}{Pxm=p`->ym)0f``a6Vncv**0^ z>Gym*vv%8v-y3kfxQ2V*@z0mAB6qm}2 zbJ2WPzwfwp{~5oiX~ecTvu>?UA;!p;Z0dJ|eqaP=iZvV~N8n!dpWjXAXUE-Jv#u+b z$erc^)?dYy8cWQ|Kd>yOu325P`i_xvN9g|S`E3kwMt6A-PA{0>tCDvvncvBH!N|!G zaejPte1}`#5o~;(*V4Y{e~ruk`TCwvwqa{rE8gJ`*V0M8WEZ&U8BBcZ`4ja9U18n0 z-On_KQX`33IT)At%royeP+apR>{~DPyYarK*mq6B%iBhL_m$r~P#0Ri!i&ah-I^`c zQJ0OdyWjIt)2aDj%kP%>{dZeFbB&tHcQyNciJu%16Biv_wDS$DXcI>7+upbPZK}6# z-#));^~mMnJd zdR)xFqj;B3Bm z9E2~_jAB;Y$wB(yYh2~I41U7Fz7tkn>bud@COF7kN6kt{_1u?6;1VaEnLH|Is?+?| z3eFd6ey75BQu}Q(x%9CSn0)ZqgS+pohC$yCX+EK5lP7R)ze^!6u$8#R|MH4Cj`{z= z2;9Obo6*U8IQ6~A^0-_kkGo%w$6f1w8yv%``dR)Ht8%M2=Re1+GicNOef6VQyMA^3 z>gPwU9(l%y-_R11a-crNlJE0XJIby2UQLIy<5qm-dujR3Z;<&t3f%a__K7V_<7K}= zh6~M4%u{@avg22bz_8ExpTFTl8@Scy-hbPOIt(V%bm|s0kQxdPnO}=>wWhdaZ@hpH z}`Fm~hidpiF+f`4E@eQln{K2tufo--oP%9(0paqc-7 z-z`oL-zly=vCj79rhG1*)Ew#?v4nHgm0}ydNj5wx-l~>q6tf(j1QU35fS_N15o@aKDht*d7h6#IJHR3y=zi-6%HREmbms>~R+kB({HP8p_>W4qo-D(4N zR=2p;e1YH0E1m22SmK{N~|&1qKZ8s9ig$B%&)fR_202fTWf${!da47>ec{5o z3k(o-0?txrSfjy{a*lnmh;Q+woGNI?3ix132*}b{0+L4%F%ZENw z&xm>0;XAPpSGWbP`OrT6^ChmZUp~b{cpiV41L6=hsQ3JB{$V{(-ETfZhM z$84>~$-B4&kF>A;vVMZcttncUvK6Q1l44c;OecI~{Jsap+(H}~uR26cpk{SV^CCLR z_iU*y(Wbd(;<$b55qR!_5$m0FOAoqQW3^@g-?+}4)BIPiH+7n${YRd7zlFg(LWaEwweAsZ*V+CN(e9zIN2E@a5SFI;c1F zsWx>Eec;f!&hr^vY}G?_GZwg1m$W8eUwx&Hutub&ux3l_<9_?La&c>5xIi5O+qUKy z);O(m5c3AUhYk4!7WjhC_=PV>euF#n4gQ4*{)P|O?^%%U(RnYA!mX`qdM~bAFRrXH zh%47QW?#GTZ*B&6+SiZwj;lSq*N0T`2E_LY;Z@mQBri>uf90EWHz1&;AFUw2=Z9!xsVwPFU|#ErU`F1Bi5_qXt3Ifd@& zZ|%c=TjMc4_<}PSw2w;(JFu0y1@5dF#6#Y*8#{LI&AJqOb`6|rqx&xSfz7pJ-xh}9 zwsyTIc*HsS!6n+VufJkL|Hh*KuG6=D+=@T(mpLlzz(jZu6L1AHa0x?j2ZykQ4~fs6 zt1WuMkv@#WxbQEX-~(ph$e10cSNc2V9DZSQFXy_3-C@mV{D(K<2%O2EFem5vjPI+3 z@hIVc90LP52hS4sukedCx8=R7j`KGz(l616IVrqZPlQWz1hqK4!ZHqyqu~^W4@TNI zr^2b;!@0Ezx%||Kdd3{zn!6gunkydnxwf@yZLm4NafvVEB5YwS{GPqpnSEiFFWfKU z8<>Jexa2<~&&tgtUcp=Vt95#H8Bx2+nQ8{lDL z`avD&TJ^E@XZg49xlt#c9`r!x;#BcP3QTT;ZxP)tK!}uQ7i#0f6CpL<^ z;44hPLgE?%H?ZP5xeEsD!-HH6H)<^02bbLw_1<-`={kANmcNMgcO1o^xC@`*NcplY zY!UC_%f9pACLXO0aGiE=takCBKEw##)F&PArx<}*?be6u;JIh3=p}!{xwc>)?$nrU zVC#MHCN5m-T>E&}IWQ@X*d8X?2uIn^2jU$k;0`%kzUDWz6fEK=yn};q4qwA6?vlH0 zoh!e=b2XoKVBU)__34G%`JLbJ3LW{9Px;%vG4iFH055#$b7SJit_chL?0o06g#mqZ z%r(YNmU#u&;cHR7Ckzwu;JEYn6Sug_rFoh@;LHmT;eB>6{_MyH z@v^b|jE`^~?D4rc_TIT-+j-j2o_6_K4%QbutHo^PV79|KY{~Yp2$$M}IqjH-nX9=+ zXf48TCHqZ5_Y19ExQA~|(t3k6F_?f;K9Y~bmORKl)>N#)SjV@PXKm-v?W5a|kGyZ> zZ6mK6xq0Nek;_L;j;u#69l318@mG%AI`aCF-yQk$kq?Y~a^#$&b9VQvt=Y=|=KTC9 zp4kVEte3fGWUa<;2U`cRu4X;P`i!+X>)$6%g9Y5*Nr@X(p*!{6^F)(?~7CW@-D6~uEmG@h^`kF7*N*ngbLed@ zZTyb;Ts(_IJb_2?H6B%$;Rx-@JNU!C{^bBU2gf=G_o(ffOPDWsuE28x<^=7VL$t=@ zn0bUeq0i-dOtqu-)Qz^TGv|hD?V4xk$JTr2_`JD_W9Hhnu2D1MMZ87q<1_X%K6X}b z!GSdj*s(65_NbP(zNRK|9M(wd72*gc@w$5%ww?h{pAZ-}hk$=^WNotb%W4)_#{aFq zc<=cM^A_0GhPJF}nrqO*=l0EMtGVPgW3XN#U-7$q1`9CR{2MOSny@8DhATFK0sfUQ z*o&X-s{@^@{?nd(3b*1(9Kn}9emp&fXFzi`J_1Sa_LU_@QvJsiM^ z<9OMcpL^c!x!RhGy2oLy5NFFp?u$6)z2nvnaio1~-qsUai}zfkW1e$#|5Cehnt7~z z<$h}O8Caq-VI%plx=gIfA?)0`6<&Z3SmJl}s^=W|&Dt%oPt>`vgKyzNO@P~MwE-JA zPHh2u_zl;vwc5jbwMg>~$Ke3C@s-*RN67i|I)VN2zkT|{1%ALI)txwk7_e|(hj$AWx<%rrv&GOt4HAiycJZE|TrY6*YqUZtlUkU-yF}mydWJ>B5ndBTvjd zy~jtqjvpOAI)B7{JkKtDo&GQ%P5OYU<7gzk% znjkERU09{J*uib;23zxXeC9mo$kA|%$BY?g;R<<=E!-b-FU>tQ_t(^Fw!VkRJ&gFu z8XA7WW3H7OJzwU&htKetcGS@Bt@E$@z3&|Hd`9J{fy$2ivaK6s9dzvLxz z4j8fRH=y~{^Axt8&#(^XPqh6S|&UX?5O z!F&6yTgfN*Q;o~ld>)Ugcf_|fRQJ#Enz?{y3B|j*$8!X9_I&nzBjzjWe$U3-yS;b& z*^w`fnD4!NG2 z9j)Q$iw-ymZr#r(o->9y+y$d>=(!erT?h>}hMwgH4?)_F5BeUmQ9nCSN*YEk<7B{qVP!Ihk4+_uzgt z1zW0heJ0Q154gYw)>h&M`vfK&gCF%u>ufl$xdjZWA=Cuw0l86ph#_-a+^X(SWAK+8 zRi0AsHIJpE`UX$pRa-jii*MzqIM%+;nhS_?*UM)x(ws*vgYQY}s*cgs*1QL=%AM*_ zI(lzktz&HFLdNH~u`KH)r9FE}Pfla9r-00~ogTJRr^$2YB1O!T*E6yJy~d z=1VM_`>GGbJnYFo=3VM+{KF^m8(*-6T*mftFKn>A+{TW^0Tb3A7ua)q64Hy?7Ke;!zC1Hy-qoLx>n5@Mc`$Q2xiS zYJOZLM#PHt^eHy!As=_I5$E9uIjr1CUwMr`%maJI4xd<8Xw8Aow6o+G_SX-7Anrxs zIqlaMuD~O5B<`oPSb;A-5+{6=?bRlH0H1iHx&;oytb7T>u9rjkSq$4ZUz110H++hx z;>|n}C%DIG4b6I(XM?Q)s9{f!_}n~2ZAO-BWa^?~ub71`eHjNXp$oncPvXkF4Hg8;@6<#20MAmT*ecP51|g;(z>YE)ecu&wE^j=bbAb;9@ZX^YCs9cQ`9y8@}aZ zKEoUAC-xj;$1sXt_>vemdlr7=MTnZO8XG(|U>bbcI1aBaUfH-`aDo_-h@+xpcto@KhYI z5nI77%&}F+Y~>evXGi-)JI0bNy%!J0rG~U+-*CqW%lD3Z(cQ~?IOPWd!*n+;V`3Y2 zVec@mRv9k;NbRO&&Cr;apzzN}V z^)r7Pdt4-La5+xm1HRCfHnTO|U^ZOCt5W(H z(;bGrU=`Mkn?J-md%*%;j33#K-PqCRj@x&>SRrhx9j_(Vuw8ca8SdgI@v+Ra&Y_oM za0_gTgw(Q1U@DF>gCom`u*wFFzwL@Gd-qiJKHMR1=i2B-ovC2pICZ56x z%UBUt>?nrff&9;A{7;AUOP}7yRgUY2WMh5uU;eaZL&xwF&WC-mLcAwpg@_+pxE2fI z1GZty5$nctHDj&~X?kHkYy5J{!<0UpA-H7F%goJKDvs_TyOX;u``Nt~EY( z_Fmf^k8A6Pec%=T@nZI7TbSVI?99F};2gN(Bkk!&A8e~{<8WLbKC|_T`+aWQ^kpMr zJUD@^jf=e;bB^&l2S&WtrhfDvrm8FS(-`Zo+{Djp$6q*3f7;ewajhLM_Ru!bPw@;_ zVnH0qmtw%a__8HzhNqebnlzXwEEN%xk(AD29mIrgp@j{*5QhvZZmcKfy0} z%gfg1Y!gSYBVj)nGG;amcksm)j``eq@IJe8ex#=QB3)p3s?{v}vEv&o$!I_1Y;1!a4CCW^qihq245NY&EDnjgN?& zYhB7b%lzEFJYDW}o%hb&oQ*YpZ(P}red*p<*p7|(fv;@g99F&0fBeb5#>f_MB)*K3 z_^iBPt(K41Bdq~wcbPN!AYW%^c%+-p?9)wuY_5O0XwyC&@faWDFSye_-C)CY{9<2w zw&Kbw3^{IJpK*)6yd2XO%=Ni**v(j-r$4r%4|^H2vCF-2tgW%b9-XvhyzGa&*#PG3 zCveGc_!5sf4mWWno!Fc%#%Nq@C4T5e^ksa6pW=zlU}IU!!Jp5Fc8NCWqV@Km;SL4Qy#=zdjSB%pu&V#RNHTto$&+raAJC{${iS5L@KJ=ws zb||OoQ=E$3=9lHdVu+3Osa?Xi`I%kW6c&uZwe;6VIY7JS0fcY(MQ-FHI`S=h7>j=F z(kY+-G8+41+k-DVxN8ZTASK{P5Z_l$1P)DO=0Z(iGRdL zc~-oL1Kea^eA%u?9E+pH6X`yhHrP}lV)*ufat z6CcT0=9|_7VaVEa_haA+#>9;C#4J2jKf@3^X}do7fX(&eGv~0g>$FiGwFYV32ae^= z+7`d`nH^z^X*`#&V?4wo|ced(ev8R?6f6i4e+qVtFws7ef+;)yO=|>+ihd1Qp z;=y}%w>7@F4EAsnyJUBqSsewB@?7^Zty_0b(mJ;FY&bm}>3L7~=MQ$}Pkr(6lI!qE z93Tdq1EX!@3R}ML8IHrnaLq6LV=TBL9?_;T@guzJQyWCvu7y1@iC1AT?qnz{vXwSnugzjVtimV`AYuTX z#RJU7wf5sw_SFs>i#0aZwtnh2+ra?a5Vn-}Y<*6DeqaOkW-rGYn`2(CbzH3i7X&6@ z2X1izeyF~{6R-?xFjaoy2l%zkC)#kXm?CkE^Yp=I`qKt!pO5L}Wh}&4+28p1F?`CY z?ehs6We4xs&3o4ydu?i~J{r@kBwa8JzKes-(lW)bb|?7@3X%)UF&@KVPCOt z%=X1A{5odb##}yM<^i_k2e#vj%?MkvVfJ%Afmi+78XK{%FYUvEt@rlpUt8ja52|Zy zeI9SbS&nsl=|{W+BlOLeeC)c$tIup<>%~61o%zF#>};EFy!W|rIW9&Czw&|D6DP}f ziJzR~TsY`D`}wi>))(E_rGDt;#V5}5eyN{h#SDA6mLK`SxY@vdwqj5IVvmmJbK}#O zKJuUT>10a>;aQ zZ#pjR=zZ-thvZ*l;5%a9c3$CdL3Sbl0D;$a8Sz zc(H0fjJYn{YR~&{VvLT(QDVS8J#4)%_HY^d=3mzm?ZKG-=mg8ed-}#Rw%$9J{hUM3 z#F&i7XU-wo*Pp)GgN@i!{)16@k-#b}I+i%bwrpuU#-TlWu~}S+o8lf$GKihf3b7E)22S+lk}kzPN6eByeHn1 z_$JJ!qyEy5F8ogP=eT2h57%tT59}JhRy(o1I>pv!uRs*kv2oWly%sh8+_t+1EMQ-shdGy|_Z(bTF1g{{)`nJs4*L z0xvKG3t@;&*~c-mw2?LlJK_N^{gR~(>BOhDq|fP6oIB>6e9LBD`iryptQv-oiFkCZ z_wqq`KpYmE%Xn<9ptyn+*Bfhg$Ohrb`}WhrHTLO1^jj_xQ+t-!&)?zBx!ExL!-{bm zKm3F(zJ`tBBL7?WgEw}BBV%`cy8BE!#fkG^P(K}q*|^ksOCRJn=X>#y>yq^JUK{0d z{m^5HZFr!8kjkq!<<1l`)ArANqR`5GKtw-=Qv8IR5%}J^`?6*!0YXtr}=6ZZYToZ0! zH-RUZfg$)5U&ZNiD?aE+=*&O)u6X2Ac=H(>=KHYXe4q1odA!&vzlU3G!4ur@4}anx z_9H#lV4vUFo*(SHMxWu0U+JO^81PwmjB9Q6XMA+x2lkb}*p5H)i_b{;jh&12?CtYn zu{uUv8mBSxH=BCT7x_S(iGO;CiE;xxW=HmOtyqjBv`KHmw%TvrkgoERF%e_Zuj`0* zT$_HiTbsr}$IjJO98`UvKe@hpD*9m;Hgt|Q=|ykjGY(iOZ}AsD7-!q!k>A9&*b;yI zFZNom_8FYyd-l>^F(1!)?>e{%Q@w{FZHraU77#IS4cxuG?(cO^#yt}EV!ZeKfwgY; zQQU7Jj=6W!XWGFdxPvqXyg=YPJ&iy7W*@flTIMPKC|~du{D^6`=1b>_IkCr<+9m8$ z4A|F)&u#VNnkB|yCH%Bz%dd`!4cj;cE*!%{)_QT5I@G-n_cYv(_Wuvz1ZG?hr`mwE zI8Ix{=k;eFmxWoFf~UAAJK+#7JZ3CjICq(+;xOllH|J`r{ABA`_F&KK&)#%k?`%(Z z?``SDH};F`&bKA5E2j9%G3Po?XZjkCE&tfhNA&fgpFY_n5v$rD^`(8|kwf|3mf*&? z+HrXBUObg2#iVoTkuLNIORn*`>&2MdSv`)Ey|=BVtUvEbxGyFiP)j&}7yM*?f& zm+T{MpM%)RSjD@0mpFmA*J_J%?7Qd2e#WA`e65eL43oyl-b6q8a}Cj#&)Lp#w$PS+ z$Fym`{8`5v;v9Y8IoCMm9R7DLJ>yDSc+t1d@PjeHIovpA%f^I0+HoD7 zZJl4gJ~vjjA#BKx@NPeU(yy^;$GGVLW8&QT{E!s;wr~pje9eb=6lYp@@(hUQ(maRe z`6K_wqBc+m#JAOw;VXr4jhxt z?K(b(F?i5lxMokfc=4n7qC2~@U-3p)*VR5ec(F%#vCl@{m;a0xwwxO;xR&3<6g|Y0 zwqYy&a}L|G5B-RCUof5ogRA@+s~omCOE|*&b19w=}I5ACUj+czGipl z&}*r?&%75u{L8mqd;>%I+cEou4f!vg)+YOfO}fUF&T%blY7?gUX1|K^RP84I@ec9% zdW1iTWAZ&ta@>C6GrZw?bDP#?U;>xPZTKVq(;p6ujnFHeH7>fQC+=}QDVO0E?ZK6O z0>jx(``Q$5Yy>M}!RKDKe8X?J#2nT$e!fS-_aqSCFX6c@&up2idd|x;tLCtCeA#vWy$=9oL_J)vB!l!6ppA zpFXuEzS&CK_^H0(!7;T3JBwewT>7*6em%aIE8u{>`8Dp)PNFY-WNg~zOLYuCx?VfR zstxDiu($#~V1OU(mwWgwjIc4xi>r9R)|kbT^SszOKGtUW2Nr6}ws>`Y*S2ND;xvB2 zDb_C3Ah2Ow!*?ZkCe^-mkg#J7q_xtxLw@2nTR9Ad%yFEDr-=C|HL9J@LN9PW0-(TzK0E4BJO(*v#r>#cHmcS^BF(TfiDOh z_zE}LXJ@(+@4Z~dU*dxvFi7-E?93AgMiw<2abD_|I6gw`=s(HI6UqL7x*ZpRpnRU>d&4 zx9f>FSjU<6VHkGBsxkV^vE_J+J=lN|x~d8AR_hw^No%j=57;vv!rt(~Ci%{I2`p7x z;U(9*mVaI2TDGDCtd#5W8Ez4iVpH4^u`TyFZmi`0xw;c5%c?3(!0{q7$rMyTWfFxz z1r-yV0AA!=C;rDm!)wgau;hyn_VQ=z7!<&+>|BiJeqAY?;; znjlbsG%Ao8@uL3kMf_cFb^L3^oz6XHpS}OR&pzkAcVF`h*ZHo#>#O^X8|=-Nj)6Yt zulu+_Kgzn#u{z2HddF>Y(*<7QB)-wnY@o072m0PTk8asrAK9AT)hqsKL!0`bU+md2 z57(+sZOB7>j$9tn&yd^4{l2fYGKq1`3Dm(hj>#r27&FK#4mOU68T!ZX^`~)?{lph& zOi`|F=wHVReG&h}Msrs2QEc=%eedTnFX(*MSWsTlHyf#oymW^j&3S*~7Cnx~ zFMdJ}e!>s=EFIgHSN8drKlNx&ow(1wxCrdUC)ohBrLOuCdC884xMyGA0eAHUpUL4* z8+2cN(?9MsFQjuiWg~I0`H6dR24B=E202!5`>U*b_+ovFZRt-8s*mYU`9}}-{n_UW zxY#j4A8H$MkPh5WFJx3d`{M@Qlpp$`Z{i2r>7zVE9#qbei>&m_R^<0b7JlZKUGxcW z*+n^RgEHh}4}ECd;5THRUV?qL!8!c%-hsY5)qA}94#fWUko8FOSNs(Vv>|@#yFc^l{#xtd>zDY)t${Gm(rTMIF_HE${8pq|Ttb8=JX*p3|a&5jee%--^jKIfCy zniF|XAINvT56r%6`iC3pYg|$v-O``_>6di{ebA@AQuG);>Ksr#@W8b6ln~eehl?G1nZ>_jlwXeRrNbU;Avw@6^F| zI4U-fUHsE8@z6WKz;7z_{jS~xrq9Y)JHcx@B8Ps_H#yj^&q3Hr>=&PLOuWGtKG0{0 zw)}w{e2CA9A@wzFbZlTFb<>%4`J_J34ZmP3z6aul@mb&S4e$6H=m&lp4}3q1e|e6H zr{ceQ#(BgCjAej-eO9c0#sRX>D<5NfJb}(Ro#%^qu0I_^jMuo#KIN)&^r^naM*X3i z#u>gtPJP2aF+%L{j(9d>J2AzU-8|c{wFXAdVyC+KK3=d9AF$Owpldo1SCw@i?yHN= zaDaa4o_xyi7qQ2^_&{&v=7xNijK1V4>czp@i_O`a-SMO2Bc61Pj$g4OUu%A8D~57D+?Ff!mD z|KhX!8z*r`93iJTLkHr$e&KiD`z}WIy-DJd+>spg!bU*vVm|-Xj(&MBrFT>s*L)}0 z);lcCNBLXhCH<&V`|L)aeLt#L4RkBF_*pQ#6|VJjtSOVzqYp6`AQ&+g)SPPdYaK zkcTYFv4wn2AB-bxFDB8eSf)?n2M*L{=|+G2zJm8*de6T1rm7pq%Lo4EUVrLQU-J@u z)F*w^FL6S@*vqp~dL;wDbH6xFr~1`#lppYO{d69e=$5QvK7SS~@K4+jd+E#g#+G7- zn26hA1bZ9H{6>U#e|kr-@1^ROKI^~y1H@B#n0_^%W=XV~o z%iqLF?dz|&uN*ntC*JZ|w$eXwpB?GTpRqyTnuCb7pAGz8r1!OYXTG%%_7p$q%sqgQ z;*dE6pA+9}tL7SfK)Y;de|#)(pMK$Z$56HsOYlfP#4YjB);VJYyWlgw#dmt8FUQSI z`3D;qZ^Z}t(8u~N-pfa|p-#L})_9>jxjL5Vn{h>6rGNUu=k!Zl=3lOhp<<5mVi%vq z7aa6HWL%+3I_3-3nfM(pu_O7ksV?=fS;vr$XXN5%;wT>$d-0vG`CSNYXiGcgV{;Zd zU^kqW3-B@Wdnd7X?|av|cldih^qN4t6!-i7TRv|*Z*FDGp~HUnyubgVU*s@$lY`Fn zjc$!+Y$PV@8$IIq^b*7z zPv`d-4W6dERxfCWJo?phY{AEIn#^pe4}8rvWr1GA2euLu#ect>A;z;E z9|LO!w$2;Z_y_*#J00+Uc?r4LfsXhEUH~16<9xhuonJHu<}dWE96dqz-QV(T?Y#Jc zd*k+DSGphzo9LUdl3mEzXYp)>r*uc3@&j8s;oH@tzK~0d$9X&fc?h16SN>tGLtQw5 zcb%8vfpheN3(D|gFK&JQjOejm&QJ1y+AaA4p!d;D%1&eO9#&jfzc>-6CA;7<8Hq6Y^@ z1g{8Q6TC5aL-6vz?<_tc*gH`6)`?puejR)-I63h9D&FCbQ~E^r&4bvoe83OmHvhoY z#!O?0eZX7e9$U-?Vh_C-tN021cyGJkfdjwc0)5ZDs1%8(a#Cv0$-*yo1#T2nb-o;nNBI^c?W$Yji z;4iN8-^Epr#osBRCw?YB=C{T$vWn^Q8oI!5W0!H>Z(ZVu+!05-_up?};)j@P{FIwi ze`0QPaXP}4<|uRl;up{vPTTTZdMaPt;~btTYpbmL=@{3@uix^FjwKyO9`7{@oEzT5b$J!>)Aq_gII zHd)lHKZQ1Ix zc5sBA)q@Mr`MUXpIARWH&L$6cT_3eiM`RL9>6QKU0XOJc{k>MX=v3UpBm3nAU!))Y zrT&ifVv{m#;vTZ%F^=E>pV1%svM)}HKXkz6Ew6t1QXl@A`}w^PeUta=8}5q_+Gnpm zQ&5*!RnFlR4r-@yj2``w&3(Y9sw?elSDvqJjlRKEJExx2x>`kKmNRb&ma};JraiG`T$3IM_J&bMTwsYr%_xdj~(A_~~d3 z$=brRgD(!hINU$@M)2|AJ;AlXt-)V{gT7$H4DZvI+R@r0Ia~<1&9SSMiaC zoLDZ5%hrPAgShTDFgFBpAmhKWpHJ{zIkowuIKk)ns2F68Qr_Zs*yJaEZwiM`4gBtu z9LDc)`i)4x1*$Ba`Yl1fPbIIB|2QuPGJiLRGM|#`n=ipkAP=;rrmWw_H9yvt9LYSn z_46(7jD5nW4W&1c=tP<^umVs4t5Rr!gGSh1b!pbwe`dG zBcJ%r@H@j_2G<447nUy^7Rar|9=V?1{q?(~s|Kq^zo~x0;Do`?f)$f1CI`V?g6Uvo z@cY5<2R{zZ4Bi?4QDdL-$r%f>(KdoiU+s&87Bz^VU z=4%7-OO9_o^RNIP#IS!2^i%(>Ir355V0RplKWR%m>o{gCA_H02PCWBF@W&61AMm$d z1?#5PP5m@DDR^0M+vIJN7X`-zTL+g6E*X3(cvSGUiLZ_F5OcQkhUX1e1?%S5QNjF| z=Dsv{cyQI0tG0YFcth~iU{!Ev@RZ=;!7jnk!TW;O1pgeIAFP^NHFt3EjMM72XE}7Yinm82yP4>K6v=xVSzc^vBBElgTc3htAi_pzXp3w z?m79C;90>Ff~N)g`_I8~!OMc@22T&1droj*FcaXz{emrnErTlp^?oaOfAI9+;9$D| zuYMeSF7UgD=0@g?=ETNl+1EJz5f~D^|yjEgD(We zJ262#G2b({*9SSFxr+G9U*8+}O=7?A`HbMP!QO%2?iBZoXa4TKaQB5f2b=S|z2^G& zS-8(A7MlBC8rbfL z#-b+##v}2Z-}{YWeCFfU=)?%|PEKPT)O?Tc)1%*h_PfN!Hgf3uD+A|`3*HtO7d+20 zFSNd?4!;F2&e+$c80hy^t$QltH{q-kT9-4|k+1nPS2b?}^AEA!+)B=et73K62wjug z8jIzLo)7R(>p|AIt&e^t_;P^D=LNqB?g(xVaL#YN;va5aGjYv`>%W@#)x>OYb|A+3 z&0@b}jF)1WJjxo4a#sa^3sw$R4&*Gq44kv}^PK>XzZ9Gk7@Ley@&{|w;Qi0$@Ser4 z35<1o*7GmV#hl~2#y(}lR5`HR-WrHC56?s#%ejpM^kt4?Ey30pr#|DLbILjvAKWkR zmB(9OqD%7}`D*83_T|#%Nb)mr(0FegrEhVBOynWIwSKvPT$+!Xr&;#{>nu2MN??6f zzJWW|p773Gz}RITVk|bVG$$~pFxHr>vbDTf&Th^?evsq4$GE2s>lfB6jDOY-w2$lN z2j-*pFAdb|SljX%v4!mPU|wl1hDfilKKFi@(VT{%ezf-rd{T%_n zUlY6};QM~t-R};Yqv*H#tvS#!{;)A$WPdirL-Rj+!5#f2m$^4R@ma_8NgnGk@+tZx zm;BM3!`#U{$~uuXdh18z5Gy=qk%!=ccAm7+yX}y5` z*<7FK1HZH@mo;}2>pYw5dWrcpzUn8)4LvKe_G)Z2ZqkWkd8WB9eUL#ep#SWQlVsC> zyunR8z#Dv|BYjd9H}RG2%1dh(xW=})ZEa2)xW>oK57z~9UVdy0x9+J7ezJx6wmG); z>3m&ajhfBHYjOP8fIirR9mHpHbnS)Ct*z^uHgUpQC64PqT^o1tLCn=pex@G&>d%`zv42oG>Xf9Ra<`4@f4GuYEu;`gHQO{|vtiR)rFoyo88M0tGIzv_tY zjkV&6XKwtF5AspZrR3$fKu`E!?L(bn98QWaxQO@aWCyyjj)aF@w^dHuaZVY&i?gna zS^9;8##(tiZWw#z^J22Ofq2k$C$YeN+T!#2Cil{3`oIgimuJ$4F-AGMFpndPw#*I9 z(>&+ae?F-!+t5G$>9;>|fqldcoT5j1;aAomjra6oeTy7yO%Gy#YvK|8^D$hKbF2+) z#Z&e31AR8u(1Uqx=eW*U>!Azh$to6kzDRcZD`hEdbHKjhF&^WS{F45ZC#Nw}OyEcAmHW^! zdx5F5WbRYX!%Vs|@nXYhGy?M?aujlCmw(W!oESgw+}bf)u&?{s3=i0x9`Rov=vu62YxT&p#a;1`+~TCZ zkXPKHANs{B_M=C#%E9!VABbh-(N8v{BU}BHPq@y9@SyAb;wzsZx4P((uJOXYves|O zMRw3v=g6%u}IXfdHy9PDa#K0NPb}+g_~k4J<%VX>pvN_ zL05bNf7y`^`7Yg>pWrgR;E-IwIrXlpKqW<8IcEl_4IOm?qP(9%&U!ZrfkWJ_p zZ`qIj^+i18bH-ck=^KA=U98YP?#d~}3Od%Ndf1;l#vB~#7_AOtfpc<2vdNopom}ie z2D+i=<_2;YF@emu!-nkPPYh!VJi$x30K1R_#MYM4Z#;HPM|8#C$v}6FRro+(+QJKQ z#lAMw;krLDf{%(HuF*GHlmR}-M%p5a`}Em;bS|DdryPFhJ6~XP@e;?C(JvejC+XXH zI>5)7z}Vv0m`8WUQ!y8R)Jy)#!*1%=Uwq;su{m zUVFB9&Ns_T{nf5K1Q+njIdb3>4&xb}(-S?KyQr7H;D)yO30~kJt{C@}(VpwBIoGkk zF`lS{thi1;bj5!9M5pR|6=)f3GK4oeXePDY!BQsm$JzL>{{^^hQ+#_!J zQ@`@~hOhEBW0`dXd6M~zT!63G%4e+ysB=69vV%UcH=U?gpTsnM)~;)GqTkjtJU<0` zVM{TwdeT>1!5M$##c%z?5qtrD!?xmr^L(s4?;Jqi_?0os7$PQ$C;BUfIX@mh=?r)1 z3CJg=i&5f>97DVmi*3#4&7I5}jbpafR?TgU1LD6qj=7cjrQF@Rt6X0WX71$~iqE9T z%X}8avleq>>&Di$Ja_Tj$2n!p2R!#sr}=?ANscNH(;mIjHGk9>`sBNKz6H)M98 zUHVs+J(TM`Y$Q)$OEIxyi?Zy*XKis&opO9QC9u|EULg07BbY1te3fU3`eKdf)q%BG zYet?m{ZsJVz%!XQ1+JUdE92Nb)_dqd|IIyL8@wz~him4b)`zrXO;&Db{3Rb*=^Rh> zOZ*dK_%uK9C${quJ}thBIsAsNi#cL6|K`Kuse9OyKXmJy_`rwwnB3etCr;w1{K5L9 z&-I#Xn&UghMe6{b30R-NWw4KJ@}%)dhjK|&x4-?uALKnBe0Hq>JmDax1J7O`A9!xz8S3GI=dF(mT>Hmhbzti`wsozemhh~FXN{hfykOx43oi~l zlUJwbL*fKqupa6fpYl15V*=OsjL)<2MgGAztPxo|(hqY?v49@*l4ngj=3HSOdkcuH~%Dnj8PXQ_oZQ0PcD=XI+eMIA`Bl zkgeDccx|k3{?h?}QpbM;=LVMs*9D#l-g9uz!To~+f|=kSf@cP+gJ%RjL+jc@f;|J} z?;3cH^OwN$PyYA613t%JJ0|fN{WR|L3F9%Fu_>MV+zt+SZup?UGqz#=t_!XRE)Oma zz8|a)z7c#O_;PSY@Y&$Z;H2P$;5~uQbbL5?M{r{BslexKP6WnfbTf#c>$jh!{t2q^3}lj#>eo|I3(7}NyGu%(093ucq<<^?wU8z zi*a5KAkMP8tu;;KJFq`pil6N1Gf3=sMzB8key|}B@5H~~1>)gvgI@#}Ea8fYD@JjV z{l&*01mfxY19i(Aa0RCt6P*{2#c;9E=c9bDN=&roh1b@o^+!I-AN1Gw!q&zlTRtLB zllOLQ)qe9?aZ|1=H@4rgiT>n?>X6HdjeJioY8>-t%=2elRK8nvsYlL9HhSlO+H}r! zzRG9W!hBY)#wNgT`LFdV>#OFvV4iI&-;=A#oy=?0%f|YzZ_c|;CgZhOFZR=kKRLX9 zDMvo{8#~BvEYK(8fP6qcCXbfq$brN*G0&DCnWGpZY;jY(o4vR1MD0B z{K>z?SMxjVXitu3-@HZNl`&tD+nAr>g8T?KjG^)*=v;zM*<4Oe&+KAOAwIJ|J>vrV zxle!OUiRhp`XldWJ7YHf=_~$e!~NRDL3Nv3I*+sLXin)qG8)_UgH4r}+nFEf4;|oy zdYxAXU*Z$`z<0zBex^VAFTTjvwNK~fUUW*&)*U_L6JL#+^bgj-jgdG-&+5@P@@a=I z^qs%*Lt|Fg*Z2Tmcb>hJ{YNPWU{`k@bT z)OaBe!UNz#^hj6yg+I!_jH~=vJmt&ITaRIT{h?3wbCguoBE9t>@4o#B|pMdx|GM6gRl)=uyuXLb^0M69f&KQCzu;r3zT!qNsSAR zpwm_N6(E{w&VG)ef$uQ`>dm}+5Fc$f{)h6*ial5Q^W`SVh`J;DD%r!bSUv*Do9G+^gx@23vOUG=AJ9NW-j_FikltGw(6f)VXN=rAirWGTO7k*u|l7F-o8Klab10MW<5kK zVMl$fZ{R)skI(XIP&i!N~lZ`F${cq6_UN5om{X!vAb zn_?|{0J-R#T>fxDy?kD*H-@qk@D*{4ZuGb7D|~@(xJH-yu5Pi#wb_8b`y(U$0^QQT zd|%!r4mc-9DNj!J)Ryaw7kCM-;~yQ+mHye{KV8lQ@@qUKJ3aFieyKm&Q#addul=!) zA9$o4exV=A>O0@iKk*4S*`2M~SKlk2{<8u9VCRkr{F41}n@nWm+x(gB_$>X~vKy$Q zc`e^zBXZf&i(C>vw4+?@THS~>>`Xpm0$bsxe(A41G>>r}pKwAS^vjm6#WnGX%ygmu zjS+mzGah4u`JAyp>=&EmP{s>uCw$2o41c6!`nTnK_^m!%X>7tlvNvw&gL5FBkXIkb zLKpf}y_1uz^sRX%`{1c^^v15@1dfpfAH^W`u~Bu}d{=xIYjI6%r+2zy7yKqaedC%k z$~xwgxM+Nx3HYTrE^b=u6GQnno>od;ciDTf4fD2;UY`|9L<;v@un7}srOON!U9sF>e9q3eSHCEd zL-fi{Vve}Pj=<;nCjTO@``JfZ`M-u5g+JCJ?w2P z5zFo$PXw0PpIwKQ#)UB+x*auhLhX>@Li|UEqT%%j@KzV<- z>ppF%U;p*J@!NH>fq2FS{6t-3Xxn@O-`#7Ue)N^UjmIwc(;3^kR~*p~+`?&oM}PEU zJ=8cTM>o%9Z(OAdF-f1uhpXgv-B|5=ww`@hM|7W@ena4MWX5H2NxSq4?#DCyz!QAN z5oOuUSb-zaw@NuCQ>_qUG8zq_ttE@Lg-x|FrV=jMAB7foF> zb<(nvmc1jmW$Kox?Sj1~_nLfIzQ2ImK5M_^E=M(KDYbai?+OI%Y~aS+iP)k}ge2EPn`5nK~o8(b8; zE7&FY-tzA)KPI?$aPhK>m%TCAF*tqd^r?e`>n5+8{8*r$zIWvN7RGX)^MBj$ZNv5R z>*vY7Pw>etpWO1$VAJMJn?Dd76x?#hEqDAR_;~R8;HY5B?OSgDa&TmD_u%H+Zoci? z!P?;Q!99aLf}?|128RWQ1gnFSgTDt)xcv#YpBQWk*4(k?j_o#YxB1fGxGl$RxiL6y z?zp+T%-?17y&P+*zRTuW1Fm^C^R&U!M&Gk}^rsZ)QQ18mfd67n}V+d zHw61H-+%c#f{TNlx7vBDBZFgu6M_qatygTl;!(ls;OW5;!J~toJ8H#ID-H{$gKdHx zf<1!W0t5Y(TV1);xxxD2?BGkm+k%6F<-zsKuU~#qa8j^3*de%V*=5Vt2cHPo>`B4O zVB^%rsc!@y30@sMFz`L8V}pGHf0qs}9h?#z8$3FANH7(6-efJG|H&QhA6ziJV0dhB zm*A{?&*>Gxk-H`_{+3^Fv(lJxOyG&pWNR$YsPrV~{lgNU|FiaQ zEa=v=IOB@vZtU(^xMu~{89WoW#_BrvVi}qOx&z{WH>9Rs%5AyC%y z3GG}NtQf2q*+_k!N%;=Y9|P_FJ@7pt@!Rtb-|f-1=f0l*dY<7s*`9HU@1ARTzU8|^ zo@IC@<{5_md4A%#G~3EutrhZB&aiN;qfQyd!G67QEi&rS?}|GIiLS%9%t?j`lVfKh5GI~8TqsNeKy2a9AFpz z$?wTaZs*9X4Q0V|WI3e#)VfY{d46kN*qn;3*nr;Tw{)mHJ>!Qp8|U4}-gxK_&#F5y z0k`yxu07MC8~r^cFm?l-neQsgzKtvFZytez<`;5Rc`Cc$l)O?tFQ>+P`*K9{1$8$;dx_yP)znYruwF5b#i2%wUm#_Pt`B? zw*Fua+PXbs@3TEIQh7PQoLGLXFKnSMaE;9BH1G9%R(>l^IFIxEv-3{#1Hc{J!voLJ z=(B5W@^`-3=e<5}BG!s?Hw1g;xw`o1%cawU>A~iS%@dxzKRVe_sNB&z zv^>xAnIycy1AX=U-FUX!V7JkCejhM+!036s=elxr_TwkkH9RlG2{8tT$!N~5pK^cu zVj-J(4naTqLicn-Z`RGd*MfigOqgf&uMa$be{1mI;1BbEnE!2XZt(BHX~9>59|r#s zd?t`joE&^A_(<^VV9#LRCCtyw&ut9OUV`tA|0uXDxH1^b59X(X1A~7F-WPl|(8g84 zJ%;xf&IE4=z8l;Y$Wx5V>}9O?%w0~fQ@%%iOmIeUOYn%vM@+sh_;&EyVCB@xsYeB` z3eE_A6KuU~>t%-ouMa*QYzXFp-Iwpa{E*;?;7P%e!Lx(s1uqQN1cwC&2KxlcPY2rt zc?HF?>w;ef-wVzSo*z6m*fF?Z>Vm0Df_DUO4W1v|Dezv7GlI7V2M4zgZXaA6d^&hZ zAQ!?h-#7R90=$u*u|Hn>+@8<0`HYWuXZgI5Kg3oZ$^A8tQjLj;d1f#ZJSd=>t%ASJ{cY}w;QU~H@U1|fe-PmM?}AOi zWL~)P_~4DfsloZdje+)G6ZnkG6@l-}d;Tx?G|n2E#YUgs_`*pC}LZj@vHV(^Q> z_LJLBJ})>exFWdU)cvNO8N4&t5d0}vmcQMD!-H1_YlC&cdjj*QF9haPUkpwUJ`=n* z__yGg;2(p%gUwT$r_KxB9ULBPAN+dq*Q58#tj>F8Rs``UHnb?{{MNwX9Mx*8G-eIdj@}-|Jx`YZJ6JX+4uTUO#1x%=jTrd zjt|}xyexP|@R)#|?i36&xe;fU1&;3=+%GsRFt0l?_<1l4_8RUL&saTrKg?T(ZyCNT zI63%S@U`IE!Ow!f2DtU)!1w#*Ek1W&0VZo4nPUhIdBze!Dzf4lVIq6}&ij zd+^o3`#i+1Z6>#w+#`5Ya7b`i@QmPD!I8l+!3%?BcfdLMeA8)xG0Zb!IfBpV7>A5a*0S)yoXC2nd`{jZPn4s5IxtQd>+Fkf zawF%=yhMoF@Yr9g~4P zKA&k{Yy+R;G}eh}-p}Ek68uDL(=YIj30wEJKiXLn_^hVSJd2w?ulb54yda+`B9qup zSNc5uc~YN6a?LsNsn5Rqyw5@m7N7K=9n62(OU^GJ2V*lIm*2}*Sa6Sb3rI@=JN)YXYBj zUKbo6_*}kYpXKwJdp_%Vp0!e+aWJP`6X3C&)*Riu)V^!xeZxvc7vRpgqrF#2U{H#2=0**Y}LT zJXT%{oo|}E@IB?!XHA)od=7^W^v~LgcX)WOjhF@I@;=XP-N9$Ne-wN>aLybayg$Tx zgZaPre8^cqo;=8(wSm6|-UXtJbp>k{w$>`-*y{5h5jn9nk+%o6jdg7KzGtuI0p?v| zhw;*wV!mgc2Djx6e8an`LQ&0)UEc4238GPy2WBsy|8TP|}Agg)3yu)#y zIhi+#2d=vY^yRr5=%4RFclIPZSX-dwM2kiuQwd$H~oMRV0K~DN16FWI3YwvSSSzGpO8Ew-Ez2hLxSu4U3 z+!GJ*#yL8nf1FW{Y~WrxB`5imbH1|LvbmT5){NN2S{^PNW7rY+s5LO>ZLLX)f%we7 z!I*8!$BoVG&er@|-S|X)>s@$GmgdG}(O)(Ma_f)s#yR)sGd`-Pa`Dk}S6N(kpT0WA zG5n|==!rhqfsS#_K07O8>t1rvyLLM+l9w-#$2rI9V-I=*Iuo<$3E#y7+z0E!j_H?f ztljoGfVEfmSg#YWnlrhlW!0w)%m!kP`@}id+$-jYJ#q^%POOuQSvPggm?ZYH9h=f0 z-P41<<06Q)atQtdawWbapRq0{{>q80w|mCIzlkvb(W_e%af4B#z;i&zs^F{jvw$%X!4=ZfhI&$pP3wJXa@u zYriqJ_QfYLUf*$*PuI`Mx5%)?*vVGp_E(>Gj-AONW;cegp?zZ#8_BcrU)-X5{?M`B z)_LdX%5h_`7(&m$x8)OZ7d~wMWS%5%u~sdwat!82@>71^*ur)=pdNhSBjU7sJs0sD zLC$$@yRhdfQ2;t8JVLph9}`bQ_$jhicq5$0HOaS%KB8~XrzOfUH{JJ@GW_p$Fx z!2WcKH+)zB`SOOKeU`J)g&2oxcv?TNJ{^-?-lgm*fxO$?N{(&LWo^bh(!8qc3(m>W z=hpP%`?%J; ze7A93U{2{ezTgBO5WmD4V_tJ;W1Df1-f=;WQBLrQj;msx*d_jmhdAsWaSG>col`e| z5ZlThwv>~*U+ya&h`0FOanV?TpL76nMRo^#mNUpXj7`Qmb?_S;5kG7@2D+vk|LI3tA@zy_>?lU7)7E@MJz|MGfv<=k z?9Na41OJde;23{#z4Iq}R1dJ3oPzw?B0nD?7n#UIE_x70=?ZX4JTdl()%0b*KYU>;aZ_HQ9dXHchEL78n^%k5Y}v7>a}LMaP#%MESIIUV(2M-R zSfDj1Q%oojZW&&G%u`k{lZl~=xSgWtif#`x9%@yd&A35!lo!sQ_*hmiL z6ehDA&XaTqB#h8^gpH@{^_W689Jz#S}5b+61Uu8{&gFsf<`F zPKdY00(rxD9^yP0r}4bd7jkI7T<;dQ@dj_%3WxEAzS$idvmuVN4g0dC^72>Q8!0{i z%z4EYI;13-O{^;9vIt6{AXPhha-@fz8irMT&zx2!p#UAq@`ok0b zRL*^L=A5?pl`@rwkI}n&>79Iyq0RSkiv7d~;|4xC#yRlC1#z-DtT-qp z;U3+nPg%OM6+7gx`Xhcet~4J~m-EWVcf}aT>YNVLM=pJ+9{CO4*wUY^yhO~w89LGL zu9MV8bX0EQsbjWeH|5!mzO_dmbY)9djhEyRvt3iKu^J~UN9~K7{0%?J#opyV+f{z? zO*!)8oO;v;>JlehBb%7OuFYHAE3P$OiACi){)=bL;j}>x_mYX8+Lm%SuPweKrrJ6d zE6Bw+S{GjdZSx&5MOkH>mvc4lI+mX{pH$X4_bJ!w_LY+>kqz(BCa zK3n}YuF#*DP+u_)sS`JFfL)Ej{F+Vi73alL3Z=GI!%|qPRv6vt5A^wGTV6+jm-YU zO!1HW?AG}NS@owJRi^P)S@JrE2g>n1J}A!1Da3xjf4t{2^im%c546`fZmZso4fsJ9 z`lFxq|He}O&zAbku5?$f;iVkh7-zm}T;sQ7b4|P2VFP`z#am_cfo$xoUEFUjY0D0D z+VhR2d==OOuiR@a>o`aMY-!6r`lS!-Q9C=QyuOgBI$;BH)2BY*CA;Be`Pu%ci|n@S zODFc}h)nGhz0sw1)I$!spm%cl!$a^#cID{FpEk%>-ynyWi|=$u-p*af&Hm*9oA3u* z>;1Oc27XM}%?ZT=AUoaTx?{RF27$OG543(D?umI_vo(GhYs5N&4UeUceaS5l`gWVdZ>dSnVP5Fkgi!ZTf$HHFc^H95rAKKv4GwM|a z_?i2}UH9UIy40`D&L`a`F1rre)rZCx+|XBkB$ny3bNYju?!hnpQ5Qb2yWHMdOLKl} zHFzP`8vDpBU#k7dLuNA45s;O==ve)1Mkm@PBYTmB?rW?16aVFt&6PVZ(qK?#L%50Zufoc3d`IsEf>%v2r>mZxcTn zQ*3b_*hjtEA-^`AV=w2_OuWo6alKW9>R78-0{l zjc4_}<~+)4%T}NHf~`Jiw|ZzSEkCvEx^}fiZ~R34^e--n2jek9pZ)1~|CA*gJ<$(6 z`J)$LC-;dX>a)*oxY-zlug-}@+QS`uw#6wN!+re3SG?=EW}Fk(rUP74FZ<_Wcddg++YSO1L}IM8v=)^*p&hBxe@Ozl*kP$wD5?>;uim5yKH zO?{u7WEqb)e2w1mx3&;V>4*OL2pi)+`-zpxxd(8A4yz|}>z`xokh}h>4fl}UmY=Y< zcG%x_{pg=^bU=@|iofM@^`;&B`c6OE1oyBHd(a0xh*#B(ahQ%eE{kdWsXkSIbARKX zzJa>wT|aGW1AWCGf8qkpia$7tgVRes&M)xMIXtzcTe_}aumSW~UE-GdfbPm&TRN`J z$v}tnL0)fcFY}Pnp z-+AT4I(dn_2IMRKT(bDraYL-JKR#bFu0V4j`7$oxMPp;zW@Em=CxDL0&&GIHd$Ohe z^KG0p9^m?H;9PxQ8M_qGn_aKdl)rbxvX97(_Q7EQ$D9mW7MMOEq>JZn|*BE5Wm+8Fm#Xfl)^9ypg7mQQ&SH7y=)UPigxJouM;zRj{kB;@9{@I~%6EDPD z`etjok^`^}ofhuL<?a5PtE+xP=h|YUwy9nA2Hfo2Mx24>D0obM zl51nTBv+JVYPHagWuZLk9# zX@h>WM}PF%b94pD_B`3@3;L{nye12|a8`ZpYoEsNcb@J2(SPMpFS*D;F0%L=zpj2d za6eudbDCF+pZM#zv57wbPWGI89OJoteXU-#WuLC}i+$*`x+A;tAijuw{H(sGUNM~? z@Q3WpRe&R_qLzv({KHv1AL%Uvd|%rjs40qHXvKaBfNv!yZ%!?JH`)xY$--G zmREOl#b@ZA&GffAXDjkKrw;N!`OwytcrOZSe;A^aqd^R~EDo;v4#&<7lES#`C)wrtz_-7mkuNu29(a}9L> zKTt27Rp#n~FSB2LQ(y3vzWkK~^$q3S>ra`+7RTzKANQ0S)pf^RJT3q0hkSv(fzBK6 z=-WBA@<-Q=J#Ci^<)8K)Yu|nDcdz~0lN{RD#-c|pK4@p!AQ+O=aYJ<_QyyV>Fz z-8=6b)c@;a>L&-;$V9g4mrm$_OxmXxDDPaSPrNiXHOInDK83&CDx)6txv#n$w~4y+ zjh)$tEY6XYUI7of#XDskmp^n3`oK0lu0Jf+vN-Pa-qzo;WN10pItK9-c`DxGH^@cA zUGWva%XQc2pM8|)2afq(?Z7V1u@&C|cGWi7^vSU;na2A=FC7QV7cru7VVs-VR1Z1G zs2y#q7hKmK*K-*Y-mlWMU6>(C@g9u^svF2FPfPu*Hk=1)p#N57|te z_~@Mb@PzNV*S4`xKU-(Hqzvv&n;V663C7aWa@!DKnKdnXCns1wryQU1#M|J65ea9~x)qi!WUps6{ z4)XVNOr9-~-MWxI>GNzL9?%20hphC38+@P7;-o+N)s{BPJMB70K3jZX6MX2pgR<5b zJZH0R;PXm8ljOT+K4awBo6p}_Kj0_Y(l!~$>a#zdMf;qOXJejy+wW(8JR@gQzE9`4 zM9=i3KK_b3>i3yppPTZG&u5%`S8XQnnJ032pM`Ti^W8pL; z`SV>0p965tX8=I|*^r*tj8Cx_{qs5e(0{h+_~pFVs;oc$O;7ZNJGShsFQWqaXCL3# zmv5EBjf>8!&waS6P5bzY&vHQMGYC3Urm=%OVz9V{e;r@=Fq!x)PB(wUjgFnlcg!KL z{*y}_s=tsOv}bIhtLAp<<+ojPqf7hzosWx^IB2UJe`jAh&=&6bY(`~ZH+J=X6`xo0 znMdFGVn5f|S-t#Cy<#){u>n63+xQ5*i3^@V+c(~b3E;T%>aP7;Z|l07GS=|uxodMh zZtP_D#nJQjkJ%h!wcU_ryY=1G-@!Ja9j|Y6Ji2U3~V;lMEdz#WnoH4eiUb z$XY++`}~Tpc`vDVa(FK$f8%HTkU!Fkd$ox_`am8!t>5&!HuTS*T$dNHv$2KT_}til zCv?k4$j?8NV;B9k#ZNrM8~3|cY||gS2W9XNN7$CW#4LJccfKm-;vMdEJk$q$5+CVK z-E_sSY)W5v>yO^)T#Ug_{J|x09_T?EF+-o(P2cFxIA>hfPw<@=$I}7M&Z-xIKXDcUNZQ;mG2(<4xaBT9vgTU2|PUTdv@M4wNo%RoE!c* z@LP8~F2Q@=yu-x%hx|5}_aUisL%`6F0xg?zWs`<3*|JB;YYxqipddkg#iCGRMr1K)l0-XrfW^&S}C=fpk!AP$hp zcNM*B_bq{U2kL`&%=n!~@2mRvpue@}J+%7gw|TvX5g)vV*KhfG$IWHIod$Ory-WI_ zysvnlVB5euanBCc1)hr-2fT~^(ZSWjtA`&7jtX`SuF883*9Tt+J`}tw_)PHq;HKcd z!~2fjRd;57Gx0wI@2&A&Pv7UkBQa?v@SaWI7d}9Ppi1@A$!O?*yU)&wI2fKjLrANgaw z5B?ndI&kjg!LGrDlNV0DI@mneJorN3eR{V{+%oz;xp$R`r}$&6nhnea*o#f^7rZyl zcf9uv?i+aT|BB$I;Z4Io1-ArS0>_(z>w~F^FMHr#^bur}N(1$IgDEn_cCfawvH}eu|6M0*u+>zVEWo zrLnyGuE`IPRSBMmyy29!YtJJVHE@JIT@bf%w1=$zcA% zZ;d_Tj=8HXJ;+VG2TxuimU@qY>*m;eON#qxqpYEB4zLv&9AZrR(~nZuS&E_^Niq7{}Tck3rx0p+92_ z`-?;T91qx5{^t8A<{t7rF;>5QS4mvfZ}xF4M)y5vZ0H{K`J-F?*Pb|Oj%}>*eOY6& zSfbC4?VDGyvv-So&m*14k>#^;HP_W^yfJs@Yu?u=*Wo|j_vpQk{828%5Ba6~*<1gO z4|LKzS)bXAz2rUk;+*jWFO8+_WHVI6LE=c*Jg? zAM8dS<}i3bFYIfM(6uji?3w^ykw4HyeUbjnW68p1a&11UoV;IdA;%zxu@TJC^i{q3 zr<~l=eO=2@zjpM?+6^vG|{PNc4g2|1W`a&-_Ojqn>>l``Qtn*a+WW?e6 zu{y;h<1`+a&syuiLv6F8JcC@;q2vbUDaKG^o_AM@=g!M3^oPCWKKj5Y)@AF9G@46;noxYzr+B(#_!me?)j~)n56IeMK^qy{^>`(Y@~gE`im!Gg?hzL zvBfzybzUx`4f^6EbcRpb!8>+kb9QxXt;v1jop_}ke!wU3-9G+Nqm&Uks`_Eo7?g}c)88(f#1m9GmwwS7rZ;yyTSXuT{(?; zfO&=d!SB6zr!Zd2`^7MP*ET({AMS|-^gzGH5j-{q>nr>4B{7R`#7p*S{!8CtFK+N> z_Tk^^6>spG9pnp(jK6jickqV|ahBfcn?B`(@(%M=^LF#Hp9J2;YM$n|RlFzMJpEgN z-!}68R_{{J_yoDIjwPEX2P3v!Gr zV!!^0nRLeo>5b3IH>|73pX3;RFT&i~S{~kz0l)Z$u}m!Xryf3M9O?RovDUsAYF`dP z9&+*v92QHOH@Kg_8#9$LkHdL>;a+u_w;7-1lej0=SyQn-+G(HMs}B0I=1hO`3^o<(a7a7+Ro%*JU;Sj(58TuzdK3%We{%+L zL(U+!IFIA>=9vB+i-*QoJ|KRIK{(BS%^A!i#BcZ0GvA=o#xBR|(_U?0UzxV44Q;tc z9gel7UH3X}ex?rgRgUi2K>z5F-trbAcm=mZ& zU2J45@$5qVo|~|pc^2+ypFbGq=o#Oj{)1cWE;it(_yEp{Q~JtJ^`EbTKYjLxr}~MH z_T8s$y0A|_;x>KBjrqTLF2;gbLD%K#%u@W8?}^iFZaguLu$g`1iTEzBk`K#Ev<9U*OF-{rr&9QsbpQ{ zVmrQXe(rp)S$lC^9!>waL-%};uIraL*?229;vx8Jzw`m0I}Y0KxQOfeTz{x<^99#% znjYzt-8xpuyXYF&k{w)U2gmG0$86)8xYz6IYMr(?A}?SUTi3OtF7=baA73J${)svI zh3j%@@zT7}zO@@Uow0)q+Lt$qGuHXVXTL8eUdvbgwu#)-`m5L^{)k7`mc=cx#<)sO zdLaWHl1c8s*2Ww2S9a_Cl>X$t#t`ebeuK$8?S|nE!#@VU3oZ?A3RW(x%nJGe3oi() z--~m&D<1QAd7Nhh9}PSk5a<0KggJ~cz;im!A-#9i?@T)WM&LIo{LZBLkY`}#N1o@M z6PN=j>ppd!5O@Zv9nW9H9{J)-pkH*VuYABCU5KINWIHymFPlfuxo0xw55`5~=-UJH z1<#+1pWxUUd4Kbd4ZLsDz2bp+jyM7QzBz{W$-z(U^9g@!Q(x`2xfoyNzhX4o@dH~v zU@I2lmHR+EANL(?X@@T8+`*6_s;=1j0pj_h>dDu>$%VYfpI^|RRkAI1i>{`F9jT<}p6+dk}XB$2u zj*HvIV)?0lA8|2Qu}l!9^3cVvN);_)rq=rPaAmE{Jy7u~kz-qM z4(P-9)in=WYaZg2cx}zbu`Mp+wfs^!Ya;k;ToUWbdwyWNqF+4bALO#%@rs@49>~tN z=0VD`lUQmj2iKLub;q{2frsTn`B;C|HosA4eW-HKkMnJhUbLxR_m_XT!xoKwI$h|ySV9jt>%2DjL(3{pH*_dI z0o(CS@x>N8hO!5rXA|78UpumExh#*G4REkIS^3#q*|Bx@a$NrG7@wO0%NZ-#&dPKUmMzQ9*1{$#uxQv(K8qGO8pcs^}T*94v0Ns0DZWQgLp1Rx!--x zxz^ZASN`bSwmP)$TE_%i_jL?#UE8&Tc3pQ59~!^6GAWDa?&Ay4ILWTA^9NjTUd+S; z^|GVu`lyUL$lR@Z!F}aaIi?Q0!>8_xqqtda;cB^shw35+8SAIcRc<`3oRz!%bFDnC zPQ;zs!xj(qN$e0u*R^m+S9k)B%t5-c@6d&dL^jn?dW8<2#Y-Q_@PVlVUq8qYS4#(vij@K6S4Qzk| z;s6=6(`(vgOYup}63@)}#4+ZX8eoqoH0Hb6FcUyp)~Re=zWtacIwFhHp^F^F? zkNV78jBz;QUOA$=)GgjAhr`XUY{`Z99l!A$$m|^7ajZ<^hCb`NzUgmySAEgBKiAv` zjd8Z>v2~w&Z0UBq9)1V4O~)PO{Heb&pFG-97T+E7hxSPyItJMGn)dvW7uqNM0CK9= zJ~_cT_wzaWqnnm-tsD`1pc!i@tRx;3qI^0Y4w(pvL;<{MhJP-ekt9+t-=PTl+ zvSM`eK0d5WV>lW3w`1jO>DHfi>72d97JY2&G;ZoI{w`+Vi_gKxNO$VcpW2bG)JX^0 ztX$-Q_CefsERKsY@&tX=H?c=K=k;Cxj0Sn2xpL z%Q%!LS7oidY^1N?kKOnq`}pHOxXMPjhF5gdJg5AlGv^(b>&o;`UDdH|%i6j|zw}+5 z;lI9=^ZM?Zevn;%?dzj{(R=l;9#E#fGpiz$9s1ET!{q*9GeEhZ?ZU6O`j>==@ z^sAr;Xbfn~996nhuY2g4?rrPO+UWg_AN*Jzh_`smNAZ}?0)F#BTfPhBJs*(2Id-1k zt5-YZwI!c6ZQEDJ{`f21&?g&|hipXu^hlp#RMBI)?ig5m+Cp>s+K(Q(?t!P;8Rx9_ z$$=~W$Tr%^zi}N_f8CDTfi2rteRqv6?6U!zxQ`B$1-e%Tuj!u-o0B_kIrUbi`Vdai zpZ=7;^rm0sDZV+TOMRx7g6_lyTe_rQ$Mi>6J?Ff8oCEc!uWiyB;5E+Dm%i(Fd1zlh zo8O6zI0nr}^&Q{Jqw)_Y@eKc*E7x$c^9ko1SAW{lwm;mj&b2=to9UH~JGPA5y#2AI zXIr3K{io~kI6+_HEq>CMGWOYt4F1^8mOS-4va&fn)b{kl{`DvN)E~N4mwljbaiv^v z%-*)zDhF)~eReM{l0h4Mm@Ydnt3GQV$G{G3K!^0EPVH#F`f=QNqb>X7;aknCl&#O% zcRwCGM`z8MJD$mV&6UiXkZ~4n6JcBroLosRJtY76$l3*2cvbn6)EU-p&L zhIZMicH*b{Xp5g@)hGS4Pgc6o7f_CldYx|E*L#&`Z+hsTwki(}<3N4fRt_cavXxhv zZ#tG&)zA4cJH+@aTwgBSG84}o233)jfN?(E`^KeNH2WfsS5daiBgS|4nI&0SM(?W!HN$1{D$ zPx5!GZf$DcR{iuvzw}Cv?8Gk4v6tielQPa1_|Q14KHLQT!Qb}DHL}^3^JLd|W$@H> za?v9l+SeE8wf4F9RTtzI6ZD5{xL_+*G+s1*H0F{W$Xm|ilKb$>ed3F{8dn-mT*pzz zbmF>rMprmVC)#WKmCsiFfe%GdrKgJ@wbw}JQ%$g!Sg8TTnu>tSwvx9cn4u8ZycH_&H4Y%ymtLtRrFW^4c>D6Ct&fdzgS7jG( z$W$5RafN4q*3GSHdT#C5b3T2tM($pH(uc;Sw$U*Qcbub3JgBYdklgxI&UZZKzl~$^ z44e>q+|PdYoo7#egA@G7d24)3N*L7U${5F`L#m>B@EYl|%Y0HsWGsaUZ`>r~ct&b!FdQx!}BVbVdi{n@*qU zf?hlqz;!y{8+^z!0sg>8_y#?CM&Q_a_bXRFbg#O#(Kv;dWG7EKhFgtG)ge7rm-^lQ zJJ*=FsP)Bn+TcrlU^eUL<`VSFugod>><16=k)AvEur=4h(Ok&xm}E1GJ$${;R|NWZ^UF)*pSvA^HHi!83aA7)gipO1~h6IoCMmT4P@C z!(ki+^>kj%wjGyo-8E(Lr~JSXJjW~YK|J|?dj=ea?Zfvgq zVqpEjHU92AKGG3B;|5<4dyFCUYW!dyv4q{(nqHl^ZP~^v^{7+bdj&lHtKzBTMoEiE>T-6qc7ze-72FVdeDyhjhB_HIW!qTS$$Iv`_TpdIuGQ- zDRs;Sd{}(o)8a~>`T7h?Ki`6%U1zJF%5%J@H|NzWKeDZE+~*wG=#!50PhW8fhsel2 zwI|!M6HdCO@BYd=wpEsG*?2KB{P(*FU3af7o~i@1<$Sl!`J=Duj*iIJ^S0zEkJL$@ zWTyjTnRrTXedaD!ilNPS#8~>J$L0#`PEXoXmv;0Se{sLyM~zqd=@{xy{6=nQoDxHg zbH=fr8$Whl8D)Lu!L>f;c5XW0Ypv6B?>_r>ujlHHTaPgl__cfaw01!|#@)tebsBfY z1N!94V8G52GFvd8>Q#qq^#vi)p6GeRjC(E_&+v2|S_W7jt+1|FX&VKK8 zuH5LoWMy}p#~Ctfm)zum&Yk#xzOXgkv$uP-p?!6>K79}e)TuuE?rEQJgk1RIJh>`6 zj^j=_$~Ve$=Yh`UEP%txHh%L1_RwE)mEZQo5$$N3y!x%L`T~w!t3JtQpS=3XXUAo! z40vvzT$Qc!Row5`+?b#aGOCw6Wc8TG~x_Sut<%Z-4q%bDa}{cNA_c>9cv&(!!VjnC2Wd+`-t)k|-|DLEPdUdv_@&?aU;g4A zyW+NS0%zGC=nR}w&p031L*Lkmy~;!U1a@X4{p>pmd`H{&X>EPq*7pl%{)?+Sf%P^m z>pRYI#EJ@aiA2=UqpfklAZ}Q=>XZ3j$$9qszLwv$-1oDb5xJa8 z2G_9>-u0KS@GZKncJ&;S=PbQz;+=;Vjl4J5dlTNJ_FW0@P5UOC_f))3adYH7MenM3 zPmUe4AKRx7`Vyz<6kqH|-)w?k?*V#`j11l{^B#@&(!JB{{SWUW+UI>U_+&$IoFA|e zy}_fnq2I70?y0-UDX+*cFs4RVo8wi!?l~=a96r_a+F?U+)4C-r!z0p{n8T-FlYD%H z{rD9>;g>K9kA0)SJK4S+P!?dY{lb8Ejkf zF?gg4^{n>so2}>?u@U>=&3jVp;`kaS9^T7R;&omZE^?fD2^?dOZGg+KZzM%!oGdEVLcelikoyz7ei zA^X7$e6oZ0g1xurTW4QA@(x+=W&2jBZ?uV(;-+s^_%4rY;guZthL_t%eXmn2@Sd%B z;5!_?1;Q@g!-X++f;sO`ix<8<=Dlj~i_+BZgibmUu_zF8*LXp0TS81a`p zFex6>VKG!LgCTK24B?MrhIR4Lwp=ZqvY~D7Rr6Uk_FlDj9OVb!P^AM)-*@!Roo{Z? zm+#T}ejI&0VdQ%A0*ZHm}ebPJ9rf+lj&ZBP~i3xlgCfJ*N>S%W5 zuVN^lkpK7_f3Dtio%jyJj+eK|uU)xZyfF?bzLH(+v=ndYgMHOL&gIK619#O-Vjw^C zJhgX3egA@Q^}e+{$ENHqr^^xFHR_#v_VkXuZ=L?s$oFJ?Uxs~uV&q*+-#zsG81HIo z+xG_4aWG6b{Fc4N1-g-E$~DfRE3us~@FhC5-#CgtIYthCq#ZKyCAAQ_)qJo6=X6D% z&f#ZlAb)9#jqp(XrE~USH#Ls;K7Dt<`{#XUPwesxx_rWC^{F3AHjqEq;c_Gfsb74{ zP^^*beV4{|^K&p-ts{ z>hVv0F^WydLbuKFumRl2LuwoC%0XhG8d|J`HALQW0{Gh2WIE825I)Zhv zRy=Y&9fUz`AhA+TFNe#Id$V*3XL0|T(CFoDCk!R(T@{2av z2M*bbud3aAuR=b6LwR5PmQ(qWIu@}hdm2;W8Ls7dd|AS3V;O!T&%qJ>@}0&J?5zG_ zYfG_-OxDF*e3L_+$0lTe556d0!e?zcrq-%PbdGi8SM3CA>_?w`mVTXsckSU77R4{} zi&5UwmV?+?t*%}`bkzUNHeR74dgb%_!~=QRg-zfyyxC`4Y?WKAlegN&I{U#heA5Tq zt25+T-+=Niy>B_mH@@rS8)Hu%`QET^I6i6Q+tgn^vQMspeSK?RJYhe+ECw0_lgW4s zcD?)VyW6iFy=io|-)*B08a;OODWeY`J#6%-(ff^jxBE9o-hKa{Bk#Pwc=W6hpYR^N z`0jftz9(j1vEH{L!aB^uznG5H{b~l-Ki2B5gJIWM=Vx#Yr*x%l$N4?dmUsYH;*I#u-}nW4 zi9h11e4-so*ZCP+8kRiLE2Dzs^`@kFr?mx z#lGtU*H@!Aj9^o3Y3bVxYD_s<9ieSwb@9Sni#o%YPh3zxTgL}1#}hvBrKaUqFii$A zLR=BECidq2eQjMWDtYxw^ZM%k&8X>Z@j`L)pg>D{GqOc3wX9p|8kIc z%2()GyrOISjeErbxdBGRWARyzRD;T;`Vl`|hu9Zi{8Ic-!^?~KWP=+cwU+#+uJ`>y z{rJ8xA19}!>*z>bB<9k+@teBdcN}3rtw`Utl$F@d_oJ9GBQTXK^4 zswU(MY9$yYt2|5Baw(m_1pnbz#v0;|IVf>Qyb^Q71w0!Q=-YTf9P`b-@&{hT0sb#8 zsPBwb)q8S^@1&5|_dv8s559Hjn}FK&EkJsM8F7T4!X~V%>%`jd3^!^5`|vKms)^NJ z_%K$M^VFMaRq@MrSHxs_46ejzyz>X+D@$=mJfJsyzy*x6b$$W6VwKn}FTy6Bks0se zx&Fl-H3dv)r|~d+`nI&6DwOIv@j` zs8z%y*YGRzNn%OgAG7prQZY>b_~AclG2<#eU_XC1e?|u5T$qs;jfLb>-=Dc0`Oc>A z(7a{jdoyC5<8rNWl$w-0bg3Wht6j`viEs3zUL&XDVg^3gR$R2LZh>9nYwPN17!dbi z4~E&+JSx12A@VPqvx)pHMzOa#Tt0(mI5+Nv2YJnLHIQ0`o#~t1_&T2#o6RQ}U#ef_ z2YMo(nvH(gAAXIs#7(l0mwwsWek8BBo^I)e{A?-~lTBS~EC-*kg*SM^pFGR&;o3Z; zV`@wB*mZCt*U_PUbf_&DvfmPq^e0Yh)4G1d0C^VHz-Bc1aNvC)40!m4e!#e;M41gH4K4`0;3bDgJ_u#{u?`qhY^vKgCe$J_!vu%&av zqkM#4@d@=DUyvJY^B4G&o3!aVaYOv#<1hkC=B3~a#^8re@ogL>p30SY$DbUP-o-Nh zNEZDdx>f7pS*L;M|?Zda2NLSj_x9i}WKE*YLu6t?xC0_fAb^t5T7l7*hjCfaXy@iH*BLnKRQ!q z$d%fnTlv$qYAU|tdhtpwwQa7+d@hW_r*_2xOLYuCga`VD8TMc!7`lBVm%^L>10+BC zA0EDm4|8e;^Ps*z>HArY9gNM`GW*gGztA?_c zWIwS=4XNfahx&t~J4R|x`PVUZP&gFp)Qd2pE%gN5(WCb02cGzbHjMGi!IE&vAUOP_FTo380tjBw08{HcK*b1hrRC;GC^Z^Q~XF8;t6zR5w4 zcog64gJW?(yoFEkmv6zMIL{9pCqF;sNA#%;ekk{dCuB$ZirAIS%om9>_G{bN29J2< zAL1stjpxZAcF_+aTd@`v^{Fj!fq#j!c-9_YfDd^9ua>su2JO&?eRO5N7(gfD2;0-U zw&WJ|4%x(gIh@Y)yhC^7vQ2gbQ{{trU^}+Nn>NK)a%zh`jbZ6eOx8CaWJ@to4CXVg zb)6UoGjN12IDsSanO`_hdvv1@`i6b_lS|l=A2ik%Tj)lu&R9|##>e89^R(?4d*BJa#5~uiC-4m) zaKTn;hOkU-gm?Stiw7I%F5bF7%=X z(2hPW#dth82cGR?Tl%z(FFpdt?5|xh55DW0jn(OR#4r14k3RXbcnm|!9#6^B!en4CDH2mV#HTb7L=aQ#fB|hLmeTQHABR4FQ zgM7B>32yXj9go^%Z$2URh)?=*ZMuaI{lZvrM|;-!Bb_^kpBl&7k3YGC-5ujk{5mYq zhg|0z`?DYY@oVuy+xTEVyk<{4YLgDN0lQ=pOZh7->Yp9>r8vM={KqkNU@x-ME&tJ` z`5iHee%V}q*72?uWE1*>Q8}9a_2WFc!6VGz&5|tH>e|rz!@nKJH=gwCx^&C_Y$2EF zL*Mkux5F0R)rR=zJ7i#g`IRmBCmGq^5@y+y9{907$Uql(mq#264|uZA55H{Se6fzs z$!z{kUM35E#X`EbpH2O=!B1d-Eu2dZamjJK!x0(j693kn%QwY3deSc2RNKP?zj7}9 z;*k!J^I;2b+HtO2<~+pT)tl^C9Ob9@6esD1E$GZ~xDxm13Lo^KAG~XiykxMSO!*hv z!ml}4Hw-1*MYcE{+9eE82scxN-`vx&Z32UmE@*I|jzTk=O3 zbWXfmw;$f=)Om2*Hota#vFqq7c+fB2@q!OOyy6o!`LviVC&&ZpGcjGhw=T!CwR7Mb z{`zUJ7z-n6M)^^GWrxOVYyeZ_uW!BqkLoA=>d(4;a3~&?3+R`w>4co>9DT4mo9i3) z^@ksQ;Za}3&ZF(EYm+W4{phGZT+hGtg?Gzv=o-2V53aS1*gxFD54*56x!D4)>DD~X zjgk3f_qEKiST|?wo`d-^K1uJcgJ<(X=2*-V8B4f_xp6FS; z)|T28u_>SBk916K=d+n{NB2q8iN=zV*ec#S7hn9H{~MPX#~E+ASK;1-F@{?EVnkj! zgnikTUEo?Vf%`H8m56USH~ zpEzz`_nydVo!&1;{LVcY{~OrmG^wSZu>C=1M(}HzVD-Oop2yJPGkmcg}atc&mYH9KiXjMt~w4lDAJv9sJRuRC81$X52zqxn~`@o2K0CV?esSUwON_^F@R#W%E5926Vb zkzcY?*Ndh0!KVDg9`dtT&34YKJ#_{9x!!T-(Iwk_z}W|!edOr#M*nj3o+JL{nO}3% z`~s%5#}0Jqe?Nch=!-_~hkFJJnV*MKzQ&)~MnC+FZsj<-VoN$8o0vjYb}+B+9<~3W z!EWZ$*vj0Rdt27|1nkfWz42EzgA4Xz8*|(6fgEEyzO8>XnOH2Q(wn#^j>ED(n&*Ra zdP3rnA3u|G=pN76%2K|R=i$iGx%wcdxDO{{s9eVXHusXuC1ykZ)cDri6W-($ z&&~YR=%Hs1J$v-%lSj7w4;238e!9FS?~qOY^326&jLt`%tMETDJyY>7MxK2VC;g8Y z_mIgTUzr1^PjSor3VAfW@iFqiG9Eo&ATIe|hhk#S*s&A7yXPjCsB2)seIoZx+$R=$ z#lmv4|80o3p)qMR)YZ$2?oXulZiS=G^iY--5N`AU{wOvWJ+-7psfe z42j=JO~Z!An3~FgI^ShK=db}krX#VB&0)>9 zm?6ip8{LW*&esN;$y4g3;xGGo&gz>-Z0C6*_r%0X^3W@r$!GEvEU=MWrj8OP*e)LA z9J+)-d5{jthF}?qXX-vaq;5p)T>VJ*@|k$Yf8m7xATqKM`JGpL;*WmCQSn3E<4>O9 zc>9R`{C^?O#(U1p|EN<#iZSXeSkbQB!gl`8lBHPanI8EJ`QJbG%M1JlpX9(lxh%CM zcCZ~=$}#G7@k&j0b&JFs>vTr0%Mm@QS^0oGPLJZ0cq?|8_v6p%5ix@O+z*t~Y>Sn0 zo_S+Asc|7}s}()RB^Q%VUB&10r*A|idS+|a$cK1nOhh*R=7%pt_i`9}sF}zlKamNM z&whTzM)c&@Qv6pF8yn--HaW@S9fzlnJl`sxd9KhiYitL%Vh?@DOMFKzFUR6T{t}a6 zwC6tA&%J15pW27syU!pd!jYeN&yL1%;uk*>JH?c89vz`@ZV8`c6>s30zO=K( z$IJo32>)(u05|%i4_JaRScg$@i*L)dVy8K7b&|T)(!OFSA5w>inRw#I;-K~{@nu=f zS}vCxYM$a(w^ zU&y@;wz8go!>xG9ZV3NsWVo??J~9rGo8@+GXp`Q^2)8g({y9acW8cy*~PJUJ#5Fg6P;vv5I z55DL!TxgfB#AnZ$@mpgv<0g8fBkj_KSOVwbhq$F?RaY9H8LRc|2V0XxjL|p$5I4z7 zN7|8t5MA*BL@)TGCsf>4Yrrg9u{oZ_C354@J!r&tVcI@8U`N|*DxWyVG5fSpd*&5j zr1~qr(tmM_oy1>QmfyuLa~0y0XIj-}bOP`4y!i({&JKQjlivBTyn*xwF8`x6JN-7yy3?&`|#{|7{&+w z)Y$CG#`FTe{NK9$c;`3qEiM(m@X^>V*~Kfmc0NqN2E5wuTIcbD8bt86Yu= z53{X0O^l{9c!NK<6>Ew|Vh&p&^$gydgX7a|!C(FOFZ7!1`nD>6!#f){&MBtjCI4U>c7$7XXjs>-_1a{6IF|$HoF3^U zJ?D#f#WQ&j`_Tb8$(`){)OqT2vXb4ot|2#~>+}G>@S-37%^%1?hsd_J;R|mtLT%+CEsyOJrHKd!BJ1R1J2=n2_>XsdlR-=ntHrVMRQ^jA*OEs&Yz@2hQQvqYD;vVF zJVO6`j?ZToOL+_~;h7E3M~z41@^Ta(hI2X1KCxYVGau_bxR=Mo4{d0hf6yQPicS2q z7)?%bt~e+birKc+UdG7Q)g!Ls=P(n_$qtu%p`1}3VJld7431i7Kf3X=-+8Vrzu*_K zeSQ#T!>gqjA_o_9t`>LjXdio7wr)Qx9_`8Yu5pefVqbQpFSf)N9@wSYGTX34afeOh z8N^QfjZIz8cU&(Ydv?pX-T1wGBj#R=q09rBH*+5Q@&RqoCp^(PUdh3?*hk%LY2Jq& z8;4tFzw()7=d&?lU;AC}8nq_9@@>9C@A`*f_>`x`+jM|W*pqj|B3#mk7_7!pcc@XF zLpF2$#(|Eh!>Uzbm9F4}?#YV}ahI*g&VJ-actz|6m)7CbQoezKu5*rjB&PEN?P{N$ z{a_Gzv=6WPf>%1#H$7)px@JSioh#<)M_htO@7#G`sP~6Fe|}?R?8BDG z*vC?Qr8}_+$<=(DPWgyF#SeNnr+}&{VAA{_JDCG8H)a0YypHj4@^!C}Kf^GY#1S~s zrzKy+hgz=jEniaS7Omd74foI$zFVnox~FH(>_Zvmn^4j^O$SLa zWM?tdeWl{9B|E#%WG>1)1#FAG^dqj3S8V5h@<)8i0ci0DQB3=3p~ZJ31x3D<~ToQHSzi=4-2#mI7LK3(1vW8nxN#ldP^7-VDiW_vhb zTiDmXHW2>sK?X9(KWys#L^YAQa(Rb+#W?MXwa40uykY}cw5Jd4g-88aXMeK7s6N@u znBRP(d<1W5Ap68&_X+K99N;?bl9>;YON`Qgamh9u^F1;nF-#r7&ah4nb^5V>7oW|q zU5v^xu)$}<2&7N;*1tZ*D{bq;zUn3N@*y_oM`D+yZMGzny0H4sx;c;IT+0zSwX#F_{rxRD*Q9b@ALfjF18T=}mmnFMqAB zU`Lq6*D)T6XE2A4c+nQ!&_68bm%hTHWBP$n*N9E7L3}7atUHh2#0!4HyS@=!Ajjy2 z{*m)w`G{|J5hK}#ui54U&O@%}M|{^W9Kkjs1ODTc?wwOCaSgd_lbwF$5pfoF*uy@@ ziWhLBKQic_FULQb!T>$^ITz6#3^?u>pDnIA-j6)|n|~Rbu_1dRzJv5uQ_P&`(Pq(}IMFM1|B zKJZC*_=Htdd?Pbkix=qXR;(#^^3)QV@n{**&`LQ)S@;^MW_4x>|8{xfL z2qxjX`T$?}XP@Rz*h763ImRaB5Ks7scC?A|6MZ52f&)0UjSu|56WhT*KG_ZLY$eWD z(~J9TCZ4hp*{hf62WC%I%jtOr?br_I`p`boC*OciJ_w`eK#RUOFKs+r=XtpyLmZ_(IkZd0b21sCDhYhJCfw()IX@!YDrJ4Bp@}8Od$G zeI2t7o9Ue1t)ukM2F`PRc*3(^{L^K*(fQic7Ms?#W!skJRp+}_+vwOX`;wgw_^mk0 zACC2v_-p%At^EDEn9he>>$>V!I;G!qTP#TL_R}#v(n0Z69FkwkMb%T~qO0Xfv0L3i zHaey=_8}7+5Tez9s(f#UI2Wq%W97`m~)7&`;+*a2~4y>#@Z(Hlmu8NF-t;QJqZ|A&rT>-k~d5chm`&)pg$kY8=C zw)K3kdx7rz^{$lfHhQMqyEd;F`Nr8Fk8V4=?fN|diQv(ri_ud@FBpBp=<7#6IQkEx zZyUX6^z)kQ^!>Dv^M7Xa?9tbbo-+F4(IZA5KYHTmGe;jadgSPD9`rZY&t!Ywfz0N1 z-DfiAX?|0Dfl2dm=3w35^1Qp}dp%$8J&4DQK5#_$zdd^K=ozE$9sRq}SC77Y^!U*y zjy`(yk4KLfz2C^g;rHBo&%J*!di&^&qhA~S^5_+#myTXM`svYgN6)!M&%XCW&%5_| z_x{xA`J)$(obS5-G5XcfZ;W0)dei7_qdy+qJ$m;@-|sW}z!84_$>=eo&lr8q=<`Qk zJbKdT#)vFmKYH4TY~MZl{?QMQer)ud(F;a!`Kr-tM{gXxb@V5rcaCnm|F-+ze?(`G z9MPX|Kf=53wR?xldqBQN^zTRCHG*HyA-g|ip3FS~xmS$f=X}u^#kkXam*=hA8-;1_ zT$!Wy{I+lMc`o?Bk6t$No|$ivde-}0qlfH0vkxAfkKpAoqklen!sshUFa>YlGP+~* zJ){3L`Y$8+{PEF$8@+J!k`e5`Z1k!TT>tOUZ;swDdfn)^M!z?L_cx7xX9VAtzd!ne z(OX7u8~x$vk4A4F{oh-}5B}fiPe*?~dgth#k>y{G{(AK8(O=!7cb&cK?Cz1{e>Qr@ zEz*v5|IY|7Z@fjXJ$vmn&%beYqSu_g=Gu?%JiGJk<)fb+k(bWCkG#poMH z;=&V0|7yhNK5O);qfZ_^di2=QCygF85;OkM=tD;jAAQj1p`(8=dase?ZKL-XJ$PiD ze>>-4qxT=V#`Pb5i$3PQkGbwo-;W!KQGEUjN0whOdcx>SMqjNsC@Kc6uYcYLQFy=3&N z(Ql1@X9VBBJ9_iTH^2XI^p4RxM|Y3@a>O6xtF!&A+b3TA!_k9BevZq{-Z`>v$(J0r z?K=D3J^KG6?tS z@$gQP8U~5`-Z%4%lkXF$bG&oKPHe`G?u)Rc`y_Hc5;G9{tHrC;QW`iT9p8kK?=5-9 z(|e!Z@e~(*e;M&X?+$+VsCK-wDVBN`!M@(V_70RhZr|-A--E`dysm$_-S>|@r|(|2 zHpt@{cEpDfS=GwkC3CNvJ`vwWp1%;+Ej?St*Sl}peJT6gm!jM12y^1}=^T0%7wFo3 zDr2N-b#_APcr~G)ydrKGdo=#2wzh-^uCcwOVfAXbVsbBuUFFaqx2h_gq zcjqhOn(M^5p1rcJPrMm7@EP|m$YkB~0q&o>KY%AO(-`WJBRI8DH?Mk$cs! zS+0d^=NiAl6FX{$EyQm7`HvXQ_t*+H`3Zt|&lYOObA)O}zR|bHouhB@9%;AO&CdGb zgZ5j854ixo`Jmd9Ps9rz!n$_kkZ=okjbp+N{J@4B!scOJU$E&~e87xjoyTYFZ`_K% z{J{S58C{1xID{csvt$=@oN|%42utoym3P<^pZ399b`&e+EjWi!m^E)i7E5;5zWaCZ z2%F-ySYF(Q6Y&`SkFk~yso(iOKftRt^}`RkuZdr=Uwb`IVOt;YkK_#Jkq0k$!W-VT zDc0~k{qaqGvrqlgHCwYO`>G*e2WGw3?c3(&PK-^yZ)B-{>09vLCsxD!&@HNt@h-J* z%6kXC|Gl7osdn-Hbwt857mY@QD2&oipNTT?wC&&t*ORlVH*rtv=wPKez3Fr}$qs=8~LepIY2L^@Nxp4u}u>5G#Dc!BSjM2bg;jcRWuj|FW-` z%_rnM&+(G)#z_95N4hX(_bx9zs`2D5`l36}R61_yx#u4k(d#ou#)s-hb>u5Y#*U5k z)v#(>b+(#YJ?q%3N0zS}{p#p{jjC^d?m<6y{r_~lPi*|@f9t4et*dLiK%}OFd8Kf0p#^RQVc)#5qfGN33!`UC!jUd7!2@`96jD%8wgaxAdKnPa3(#w=2wv`X3kQRYs`q%Krf_KZH6d;hUo)iY;uq+Hqa6~#08P|QViYbg$k`_)zD7deMtum@X+ z)6Qojc}UDwW2igiG%=s8v%m2dd&?F4$noPjaKOjpD%Z#*u8|YvJ_JwIGvNUS)SLKC z20WFo_%MDDe$;B_B#wN+tT`%U9=toIZgz7#z*3=dXir{$9`j#<^%Yz z>+z*c@mSuqZfxTiUe#A>vc?Z&g+cfuKYUj6I|dV$^y0X6OW2@Sx}?ezx%fJM@U?&T%}G1@_dTVzse5{gKx` zxV3FRoLh(8o*Scc>qtAt`{d#Z9ODPx(tY-G9FfaUKi!|L_QmH>-}ng^ z@IV)IP@nu7X7HM9Vqv5oZIDf@rVlY(t>0V={TEx<3{~%lMOU}%*Z4xbDF;-)TZ%=9 zP1W~}Kk_ks@HH3_!yNB?eBr~jaN!!{nyz;Y53bQ4o#BHo(-}GGfGz1ZvX4I4+djYa z!6#u3;X(Vg>zIBVgCV%o2b=K)c0tzRk6pBlAJ=Nfb=t5GwQY%ae7l~V*bp}0%X*k& zckPEC*y{O(^Th<~d;vB(xAXIRIBX78{uejI5;42yFx3WPuG}E5i@na3Bbk6bCGwryn-9&L0uq2|wXlZiY{B4<^GeoQ7ku5T3(Pn6l0PU@ok~gMQcic5> z9!|&(7jOid$*B)M2?PE3EgoQieH<%CYTNbN%Ma)qpLh|c!=gT5AC>2whbQf^m;Faf z!+`VQ6z=iF7O(C-b$-ECWTyidv&1)E>Cd&6;(XfYV-#Pff7dzk)-|P=h_UD`Ig5aP$!RGMgns60vU4Od|;SK5UY9uZi z0~8=@XB|Wn)eAujZ!A$sFIK zH*PWZHAdlU^i*u7Z*7Pv5nZx@^YAW)@LRffoi_NhV|2_G?8lC-)t(IEA8d)Au%rFfE!ns2;vL>yk6${*ucdu>#2bIbAA7ScoR>5B8(i~I zF&s|VxY!LZ?CV %Li(>OXmQ&$JdCb5bRti!FJb$BPc7~!6!`;Gc8u2|QvwwzC&>_FeJ zF27ipSImJRwiFln8^XK%U5zOQ(WM_<;!!)s*YGQ69Pc@px8Y02`4u*GU3$?DJJKOv zBrl%n!CV9#!h`eZ7cX=LgK&)>7&kZNo`(D0rx~d?T+e6mIsQdX=kpObqYFIHBU_1` zcz}I<>7Q)Lq-MpYVNZ+sU?F#dO?zK54e!u{N zE6>r8jl6O}^Md6Nc|`nSU+2LQ+c+Qp*2y4un7`>efnt)j5p2V)^Tj5*rW5)w$9Fjr z1I?50M?T8u>FJnvtfT5YSYab}VN1R)-qE3R#1DEGbMP&W@pJq2p)d1?Yy?YTMjT@U zwq`Hw@gr@(el;X{*b#nR?;UdYc-hLc#BAjm3-jWhhq^g(e}GM0gAeVqBYlbyd{O)p z+r&k3&;@+q2_NJT&-oGm62HlvF2kOjVvg!rBlmvv%U|d~+=O9u1DmrQTf-tuu{pl< zO;_wiSK8ofbfrJ~r6+u32lGy1m3GZPhXeD^>J05$m($o&EV>wZzQQ&c`^E*#!56)= z17Br#@q&Nh2L{-l-eAkmHEJXncQ4z$9ry3_3FmMt&$FNF#UVZ?cKF^5+06aXAwTDz zc*tM*hxn&0*w!B1iIr?Ae#3{F#5Lq2i~jhzW8sIM@c;{WA_M>CAFgLBJm4|B(1m{3 zkIv+k>Ot{R3}!nqp54fCdSd6!>voF8Y^QIyGd^KM?P^2YmiS~7dS_=f4msHXiJQ)$ z1H7{Xo09XG3&`nw?ckp*Vp)9Bv9`3q*TfV$!xz2S$M>|!H^lU8PmWV{clzE8pN4b$ z)dlo`oNrrh^COS`wWnSE&;fbqflTxYw_>K_=OcW<1OK#)KQfX#-_eI{KkH=Ych09n zy5#rzq%&k6nIE{{wfJl)pYaDe6idh@CXicvfgSS04qc~bOFGsL-q=E{#Sa|N1O4br z?4&d2^D$V|mwlFwYgLK`EW@F*iFaIL9W+!Hr779;omX3s%F#<`RSNG=*&KZ zZ++02;8Bhv4?WUp@XZ~AZ^9kW&WT3h)jKNUatmi>6EFV`23U^fcyWYac#yG~nV5hLXS_qgP&i;>vx znF_hj{VjRN@$SorC+8#fByTd~Tl-{&3+wcNN7zGhi5i;>ctB+3KlFvi^0gSKHjvAz zljS)3(5d=9J%1@bsD~QU@o$*Glm7K17U~yHYccVVCUU zgZ-UrX}f*4otOW>Ae{1#`f`j-)2BX=YyDiGui(cv+p{-aM|iXzc5BBz_7T4kTflra z(T?_=uYJ5*I#-*P^=}(F4tuV##1Fo#cdq3Lm8bT#OJ8L56JNv}G3IE~*4Y5Tdi|Ub zefl0f-#QV>V-`d0* zx$&1>EXm29unTu^oZo2&2HS@R_@jr~CAT)jMfDq>77x{|;soCktHcIA<@{o`CDK1T z!BIBWrfoTitsJKxm~o69Z9B$B;g5Xj5s&thT|fMVKl4ZaMptx8mtqKABD&;@{FNT% z3$})ba-??X)iS%|iQgdS>5nb*Q+(kakFE`iuJ@yxFbebV3`gQC9r6WKJu8MHa|Ta0D*p4mBG%l0sU*bJW7FuR9M`X(RDA~uF==fMEqDX!;F)wlM;YPpYJvNv7J zvDui;=vKRaFij48mjlT{2lkT<->z|O^@`_`+0|It(mWA+!i09iy*9Kbrj%0dqc{CH4-FZ;hJI z_e`31?kxF(7%lFoIr)GbS$^?sm1lN6$1DD@q5R;d57?o9?_qlH(zD8*eY2lja0l1o z3apsJG4DuUbYk9-jra%I;8*+ni9N(?amQQ~-r3%JpXSKCk5xbVgb{fd&*m;+OS|GL ztoh$bo}u*oBVDm4dCbA_gWj+3u9RnJ>8m^}wwSlZA540_(zDCjgD3N(+80OU1pSd$ z9E2J2(6iXVANjQBUh%De_;SoMuk230;y7RMtY%{awx&1s@JusZl9_(BZ?4d@TJeexr5g010}&iRCX zv_=1LOm49cPuefniQRtc4Y`mH&<|UXU91;>#Y@ldStld^rzd@i0p<$z?K$CRjl2UX zCTLS!p#$-d4fGAOVq5o8IL#9;G9F^JV{AOY9Jj$>QBb zaf>Ycip>1lv-5Z==ZSxEEuGUHJ$rAEp4nV%gcEY9Yt?r07y0ndKfQA(p4~q3E`;aZ zJuA;w;eq_}7e8eqc?KqW@4$XG6f5K>??{MUa+Z839(zWe&EbQ73> z>IZJvh0e(!|C^iUpW=f#U*B!z$MPBb6$9YFH$R>_>Rl}Hpa0VrJi`KgdRN8!Cf;N4 zP6eCrMc8B)vd|5^(u;RNwF!4(se3Hi5d+zno=+9%CtT-3HiB>MsW;e!t=vDxgSaOK z$>ID(tR}ns?|lXDjq=ma9f{R24>M|OdZG*Y(R1taz4t8WR}6xA`V))Y`;gWjN-=o)ZurY(&$yec9KGl|M;9kBEC#!434SkY_9@NKl4(o93UW|7tyi4I- z8}BcuabQub6^F%9@4tA*rFVzu2~KW|;6UxG<`t9We0h;9a&Ni8dE|f>&+w~L*xk4S zUf53Tg7NSxC#l2a2UzglfSlwV0`VLl+7t`aMQkDNc*mGt{eMdD`|w@Z6|cl&SZ8PN z8u%XtY$mp;H^ozRC7aR(oY9l_RQRU*AL5N1!58V3pL9=Q)8YZ0z>oS5Px^)p z`h^+q+sM!C1wUj}!}16Irp^~D#aipI1Cz#k_91Pv8~cfYa-O=A9PBHH!#-X6{s26x zkBlG0M7oj7k^Du!Y$y&oCavwFSFk2VGc)2Ql54N{qIxb`b|*f`0k7 zw&VlymFM(}H?^r4rCsZIm0$V2oP-}aPkYGqa)`L%T-VZx`UW;(S`4KJe8`D(4A=Zr zY*vG~KMSLDMFx2nrnIA$WjFa*4wdu77tG!Zu;P46K7cnkM|{V& zr9Lg;Nq_1LF3O?{DhdV9?x>nqVUp~TKuuc~G zvb-7@FNtl9IoMELtImL1@fbGLU+m)=cA3C00xkK`qGB>)VcI%i5GaHL-AWY=3B5&Hhek{ zPjp5Oa~oym@M4MZZ5!U$>EsE2a4nO5@ZP+J zSZ*%i{MLA$z45JYSU73w^uHtVghw?Af0qB%Q{)j#lPB-LM(m zz_sy|yaUtl%YXQ(_O&A?<5^4)qm7gJsquvzV4V%fDQ3_K?7|nHCy#w(3cIjhjDaWo zu@iq3TgX5z{*4cQ$xp>0x}#rtPA({hiVJ@E3j5NNF-oyU3_Tx_$$5TcV>i6RkK8H- z!jqUN*7GUxO&+ptT+ip!b>ya3ydn0K>tGGfbVvqzW*_|UDf38Sg{|Sg+zngo4KLY? zF4>Y@)##RNNY}|;TqisIcD`P+#IQT(GBobinuN2!_Z6BlHTRVwQ0xUdnTHN>1`3 z*U%w95{uwQA7qtJUg zc!IxdrVZHUr~1uS*TC6@7|5Z<~DLdb+0**W-h| z_!Hl>6mQvs?%{&&TvuHNpK1^JL_8;-dJXA^Uh&Q@%{ zVF&twe|C2a(L0;cCtDY<;4}Qdr}-A+F7aJGV63V(P$L+>m?Jf>tS*8<`UvmUVERRV z`~xoFUHfVa^RDKTE#(mV)FrS}-BI3xcRFEj*d`}G&?lX+mt1L_WZY~X*c^$uMdNW} z7wg6{*4^{C7|9FOg2hkv$aXLyM`+u1#=qvb%whPRoNpjl`X-lojP79>BkR|ET=fH6 z@fEgWOa9H~u)^kW%^$@Z@{7~PKIn4f{)D*<;~=qwf2mK6f7r$t(p;RmMsudd_2w_k zZQUH1?~2TQn@>abnPc%xu>XmkZS~6@c!7=lm#twPX5fW8b5b$+aEHg{axp2FBRtIn0Nf+c4L`mgZP3&6}BrV|Vvq;J}=f@wgfuFZnYbk+$(57U>Hg;yL?^ zM=(r&KYWp)@jY48E#edZri=6_Uh^fkQE$P9`93x`Pv*N@efz|`q`4S45u^AKpDz}$ zUGW}I>?s%0mHqL_CVUs>^vUmGkni(RcpwXm@KJRK8zQ{2H$3A(t|`AYCvkolABs=- zE8bhe6dtrA-Wt1*Nz4#W@Bni#L!DfwV$Q>k597;9FR4?EZ@?JI4Krut2kTj z29InV4lT9E#?GzAsSbiiu>hvv$h@ih-0;KBbU@GS%V+4BkBh(JZTAk?)LfB!5$06c zoUaQ-QXZmiI_eiurQiUE;Uq1NpFX+m1= zMQ{}k>03UQ_x;F*Z~L5UA6xJ@wuB)*M@Drm|K?w=cMaLJNuMx|FZ{YcV+j}HkDT(o zBlnAZo5{BV`{t+nmf;vS#R~n>DJ;PQ-CNogTf`5?^#R9fO!k0V_=S5st2xL*cXT7h zhzV>R@8oA+x!1XHM<)1$4S7b*0LyZOIZ@k)+;9bFd>Pi{`{Ipj*^K?miDV-W{b?Ug zTnpdw9_{ zAJ9Hs__00wi|=eyZ9?Zr9ZcuQadr_?$`|5P^`jcb_3{|I%7^;HFaFg+^d+~5_k71# z)%=1s%=segYMsTe>Hmf}sdmwwp=pKPaZd8>R5 zBYd(rtoBtK!K9qn9E5fCuiOUn_#}5@EcPa|_>KpDCJ$Jbhs6i}NH)Gx?0^A$if-QWJjs3}HAAO07Y^R>5Pw_!K5I5+ZUx{C0DS67JwEUB5; zmMkzTu4>1#U!K!aduC7ZAAZF+@@Su4*du(9HSFU<4iO9J!ZH2OqxJlr4D_l!lx)r= z2fgws=hH3hvZwvpb*-2|SK@QE8ae44_MPW?K1#>*LZ9L~JNv=4_Td>$v=2MtmvxkV zoy%YKs|~dcf<@bK!&a!=Al_(~KEwsJ3Hj&)kFdz5bR#y{uYGOu1@XuDSdFa~5{rzR z$jiR=iFI^HUwl&g?4#at@Ao+V5*z73pJbD-#1Xm0vjplId7^vo>RI-OKROd1=(k)Z zzUmvU=)y7nO`l>El2hnTe5V&NMa+_O;0y+h<6xG2>OL`n&Da_4_(rup{{6z1_V^LK z&=Wt?9-XVnkXi-~_`94TzVJUfXA^OZec+r;*r5LL&W_q-7uSnXY60hJgN{GA@vmGJ2}p4hP%Z$GSB%KPjozbF6sd`Q1+ zz@GUIp7A2a(HS1}L%;lz?%7v9buJR0#FgqIK1dgQi9YcPTl|lG=myUSzx*E$wTTy` zFTMoRVkBK6ah~1T5B5FZV$Mh{%Ll|tGVm!nqic1NxWuRMfcSqgRlZjnYR~obNq+tS zx2~lF{K6smU_k8vpT>yVN`LGI*J20E@(~!~i~6qqh)>7-?6-tD`j8{&RbTW*r|FUH z=p6>dI{KhTSkVssnw$ELk@1VMiT(8LTys3-Tk~vW#|Mnb0iNCQ4*iW0tdd*IV;k4u z5vJLL9vr80xPl-3INv$=f}dgqozMl$it}))4@=jOtz4;n`W9QX1#d7$H{u>l&^;Zo z8yV?IE$f*dq;}S)7{$JqBRtc;SYiAiUXficQDHV>*%V{K_@@#k1q|UH|&jpP22LG~Zk0 z|1gyg)0KY2EIwl{57uDaT%~y_WDHFYp4}2V)NlBrJGsLcla1I!K5$IC_%-h=Zon+P zIFHTb3_8J!I6_u^in;Uy3v4g8l8rst%-pSK-q>31(3fk)2>if-zSTdTMe-c3u@0N_ zSvr7ExHmrVeQ3`Y8V9o(o6w6k`K@>XKVmVP@j+t%^T+hgSMX$PAm+$-u*^607uLu? z9!t5%wR}fkcrwSw?tGPv#SM9z{^SvM)fZjCpgM-^^v%}#(I?;b+#!FJw_z6VbgSm( zGx+55?1m3{k57>q@A`Btp2Tc@@gw?YV|?>D@sc{#eGAGQ$p#Z>)}Kg_`hT;WlS5{KB?9FKVsxQAJIhApu} zOv9758^htKK-_znAzJs;B!-uaDn?O3;DFEu(Fr!RfN z2)XSOBj}oK=pF80TutXZST)xR6L1D^d{5q>UpS(FxWXIVosZZK*7?6}Ixw$@?1Kxs z(x2n}OK#@_^h96!CX@ciA}%E#AAuFRh9&V(OksZ*k$>}LOLo5+!5Y7JzBXab_4wv1 z`qGYgiL@oQxfWJES7eS;+<-r03Hgo==m$UarcHK{H`4)KJLbopWEOYC4EpfHgSZEq zcrxaq7yB&XLQG?S{n3eY;jim$(+^z2D(vEm?p*6SOL)@0^>~E^7{`zE9Or{Um>A`5=VMsB>~Mc;T36SYSV_}2%X@J%n4VwSj}4g0L?UmMP68@%G#wQLFR za4nXK#q`O(Y$slc5zfKy)rcI<=Wp}|hjg1h*d-odkxcl7MS693s1V2DHJ>*25{BkewbK zXM4xVL>6tb1D>-BZ1QDzAgguf!6+L$F4oZ*9@*bH+Q5?^J`kDN96$QTj~Im?ZM$CE zx5PU;X@`z%Yny$^Y1=V+C$D2_UH%34#*O%4e@lF_1KZ$N zzBe8)KPGn@ZwH=*we#qgZ;=Iw1+YLyI>1jcRNwTRjp>@+*woLt>;V_B>3aR)Paklm&-|tH#Q^!1 z&D3v~BRSYuonOF+dR#3d$FrvzSFI_&z>zk@e!8Nwe)`lu9m74_vK?FDiEZfs&#u86 zdC5x0WJTc?cFC+>D(2Axo3o4d>AP5^J-X1pKE-La&WH8E-gv>6zSs?D544bE-c84mSxnu+_gzZ=)7_s#jKC5(CfPY+{%+v+O${d~mFt`?W%W%`s~ z-5)j%l4Gs&C$*OQaPll$upzs#qwCn8z2S)s)L4ie|I^9;$oBt%+^hDU>*9G=_kE_Z7(k%j8s>+9&QA ztCCIKrdB7LnqEyOmh^l8oWO&+A2!$%#^{_+@pJ9#Ph3PW%J;NKJxyt_bUCLD(@qD&(S+|)?w2B3-bSCy~E{y z4SA2;{~3DX$o~+6Fa0{-`{n+(kax88rEl*XdQb1kBkz6bM}OYovhDirZ^Jyy(G6L} z6#5iT;EoT8MeM~6j>Djs&t}Hz@Z^1)-m@}(Mf_f^$TsE@#4WK(E>@>mBJoO`(Z0U< zHVlZFVg?eAE=KxtKSBFFpTP&5FE43BtU-K2jALVQ7|(FU&*Vw-Q|6^SFJ&C4Z{r^G zb;kb2;_w7--bv#_?I%}xU2G*o<8ZRN4qtF8ue;W^dtxvP`|wOIxtgrH zHlGs1jE!JfoZ}N>mE-nnk3HE>`(mQ!e#BePSiq`p6@)*ybBrH}fqctx&zbNe^YQk% zU*%jmLZ8O=;zYT!`mTBnUgbUY6|)vY*g8DGcR3kPFvhR&V{ENYbLx0?Em`C~ zGQzm{#dg(j>OA(4f7nl5L05dQc_{W~ce&MmOSLV#vZ36@HtdbqLj3crCi{9f)Vk-q z*wz2YWj`@bF82(LdxkKBZjPMqJn>PEHJ{{vaQeS({m(ry%(o51EzjP#=cp}x!<4yN zxgBqEFn(cBJ>edwrTHqg9gM?`{g&o{t&8vSfw-;>F`urCmE>}BM)HPQh2Hp%KKY7m zc}0yR9`a-MVJ9}T4m<4Be4zRXCdCJ_Q(O9`7xQUq7qz<@N&GecE)V;EX>jEG1Kt5v zYuz#O9GSl08@9zZwIv<#b+w?{ldp(P;<0|oBo5;pro|X>#XSzVlauibm$uF4!j$V= zgFpFF+v1wJay)w9`t>9K@7w$M-p%)awa@mu>p^#2{|`gYziIEr2tRyC-N^UEN^zUq z-q%(`RyW{N98}YY-{vgH%Ln)geT)5UVLyBD2YMk3TjVRwqX+xMV)==W%K_>lb(UwO z@j`E6HoxSb&Q&Li+1hj5_?6#@KVlCIsp;hfHrH3sVbO=ArgFATQuVQmJgGs)~ zcljvX8N-OTw&6!Dqh85x*;+hjfB1Gjek`5Cj;MWNss6RYhg>U;tHsq4p0Vb?p1qiT)EkBa@?L$|K}QP-$tEd8%V>%Psc#zDv0rT^`y zrV5#B%i3=yqoJ9ImWv4#0hhXnXb8cf;xtXu255xrclFQ`+ei!EQ6TZT4@*jCd zO`xv!4GI4{(f@7rEeUY~hMm**kvtC$%Y2O=sV~|VUuwe~xVAi->OFj9Tg-8cUushv zlIN_eJ8a{}xI%mKp&Co>(;t5LwsYi0_mlM@hVXCqUhqVAV+3TM7|{Jg>tdemo?jGW zPZi&zuJuTt;sU=E1JtnW#(xmM;BUrb@}}eL$)Ck%v5jwPL*3XofUWr#U*TWu%J0Q( zZK!YIfK9~~wUe;}Txb^$uHnCOD}3=a{vx-+D6GoEYAx5opZpGcFe^5Q8T?jlWSk7+ z+Jk*Q!B6F8$DCtKn_u#8z6tl*;OEZK59~WnZk0dzz8uakoG(WqIg|YI0bG+`oTUpf z1b^m6=vsc}4`fn1$h-1yvBkLDcPaQE`RIi2xR$=fQ*lu~RKxKdF_f<9Ro`q`>~)P} z^zG+dV`t+RFB`)!jgeOQtm!8}}(pB>1pjpoVd125WY zK7p^wt8k?D(GHv0W)E=-uWAZ@gHQeQ6Zy3K>p1!F00-qY*E-jaoZ7Q3kE^%E#)D#q56|=!>DnX_#uDF&-NRG z!!0|(u=C*>Ch$tOYCCvjceNc^_&j}*5fh zVID^LioRjidGLu>*tJe4;+(i6j^Rz5u}=TuD7@kiFKR{d%UN`TM>@%WiZA$MUpi%D z7|>_23~%~pPyG4mGakrF4|t#x`p_Sr#FHgov7|RKv@x!ji|G4m#5eS(zJf>33DE@| z(GR}ZjnD9JI^n-;$G_==Pmu{Pe)Peo^+_-IbG-U;WWLf2RX{lY#HCfiWGNz%HHe9~j~< zj`Mftz>90)ihr>YU22Ox{q)6`)ga;qpEd5~E5^F&A2#GmmiQtQUlh;bP~1>Ys^#Ps zwWjz@KbCwKp5+fbtKay!93mdem3}acFLu!n->{zzU`Y&duH#_~&uVdgjXxNMU;FtR z+0;bo)wR`1_K6jUt)1_BafJQ(2wxFPss)W%jAdY%&K$cKY15BB;fM|3lCEKn?qL{C z*`9ptX`ge*P8V=XZa&A4VFU)Wp>5dVe`0Jkpku`(ai-eBxv-@_*JzjRU=cR>3+%9^ zJO|hKWFwf7Gx-@i;S;{#TwAVzG4_IQyy5}A=z(9+fp*Cx-sxX|{6Zga0WWe64Dla1 zzcIW0#y@rEhqXi(v;YE=Kadv8=prpPB%{DqM;?{0i>0sb5&f6JGc@|0XlrxHo7U zhVmgc^pk_g%-&+FKJmk!@dC%F@w59D=Ch1X5ImbpE{D>cScM;Q(*+%9pKW1IpD@UO z_!6DawS91i$Y_kjulQ{9ipK7?U1OhX$W0#DLSh#AJj&Vlp>N|vyod#OP}A7Pr|rfY7 zvt1q~1KZk`-?RnO_|zUA)en3JCfVM74P^etGr`Xuy=e5zk@+R}naml%VqU_0IgGe>=|1OUM;D`iJ@Oq- zbCTv1U`kFZme2=1i7Vu$KQ*)c#T>HJq4-%Xf)BVw)!1aglk@4ex{ZCr9dQy4$s%v4 z@nMbZVr6;3^{_1V>C=3W>*2=v#u9YI-hBPW$Xvbenz|3~{=B8{#G9ux@5a~Z)(;kp zwJgP1Iovu7Sh5G(sk7-{>@vq^{{Cg7%h8>qSB!pkWd7b*#5|q21Fywe*kUU>AfNcE zZX~<-(YV$9D>>F&pm{-jo42$LgW`y|LsxJK3;YKr>87}4T}**Lyo+n{xp9+r=w3UH zg=_MXozATSe3LasYzU6M1P5_OC zmv30=gFY@?$OZHKo6W7`Lv0`qu)mrI7V3Tx zAKS4zUD26y=?uSOHquA+6j|skU3Na(^L4~dFvUjNwa+$w;7M*cA33gXID#v=gCEN4 zFs~MHT<(NVKYC{?w$C1HBHpkgT_ASW43ac341oXBW0)FURFCx*-#J*&U|foW5aE+jI{9 z>=Wi-kT2SgH}c_)4>*QreyBgOm#x*AFd*Kr7afQ{?2jk9)~0qWVU3RU0k^g-#W6M( z=j1+1`qC!5zz`ms%Rcf9|AHm*SkfK4kjIZ~FevWhm44_$pRkl~@CnE03?J2#=@4el zN3O9>F6;Ket9|fGFZ`2@@GtK26X&E0{jd)op&K@|q%Zo-7WUz#Hr2ND>RN47pTcQ& zk}Jg>@rQr$H~So?BLr`j_S2bKN$i9@ZHZH2GCaBt7M%l&bPJ1o%YOQ1N3q9o$6&?! z)kvF2pT=_94$H2A3H#&=wt^4%5=YEMu%SNfXGhoAhU@T7N3iXjK^yD<6L2Cfz>MSiU=MAHD|kk(6Nku?tlA+9dpfRf{MhFlGP#z% zZ1c@xCjDw(KX`ygJUO4=!vWpk2j2Jzeziq@I?+!)&fePBCtW!YU;K!!#0?=r@N+$xoL4+f|Kcbe(>vMd#JYCLE#9!b zbNDB$@Gm|m_Rx>x`m(ROC_lpwndntq(LR2h%ctzqF22MbdM77eAs;=FS^JJ(jLezH ziN-Cq)mrdtTYLB?D|^72JR+~CUF0kEEg$5wY(iVwAhKBM6Om8*Fs2U}p)X5z zr&oGIe(;6p)A?+p&-$SY{oz5J;LBnZ%xYH~c!mYGv*h>TgYD=A4iP@|#}CM^KmC%~ z&k`^Bv}>IkpY}VSjC?jqW^!xOHeERGeAnquTli($>kjuvANWN0a~>X?M@H8mZQw)u z(72RO#j-TFTY}!C7Ja_Z?MWQ__(WP`t41d~t%mAZ;V-Y>RB`UweM!BQxC4yCr=b@lu|Vd)S4Y=*qeDL^s;; zv!wsF>w}&US@6k*CsdvO*C*K#{^%$@S<;{QB2MvX`c0pfsPoB4UV6|6{m_ly2_>h$ z`gRDPw|H@GO!b( z6BtQu@}>)NI|eVwEk1;!^lYhpKRoaiKf1{duG5C4{m#pG$v_rFuA}|)E$5Pp9$gCq z^c!x&gl&W$OMS9ieB<5zYy)5X8V{CiBPV7fyf_BO`p>tWi?@ipc!&>6`p^&kzzjW> zYw>g9^n@XD(VHcnTDPrVy1@${!JlnB{ViMf0cBZLr4PJbL2Ag02MHt%*f&m2t z1rZP#5mW?>BO)S-7!Va55zHcphyfG{I*1@)2#S(L3?LZ=bqI#PLIX{AS9R5k|NX0) zZ}}E$?za~A-gD2{XYX(Cv(LHbzM?@n^v499mBp^Kr#E@@3s1PBV>qHCzwwiDoaJ8K z_?VtKT!$ZLyg1W;ft3Y+kq6}ABV#IkM5l1q&nH{MH@o5^d}RJHFM+XS>=-X{i}8ay zzzbRQ!*k*(`sW$j=z#~^#DCGBuJr4V_kMoJ!+U?M^xGho@a9ZLe3BT&k@(fG{1vX~ zq934(I-aYSw)9R+u|ph^&(`=)zX4tI+%@#;q#ry0yY&9(EbVeWQj5T$w}Vd?Q7e+^Z+Gl(`*wy0^|Z$&eR1euFQ1W#6M4}Z(z}~I4DT)M z*4|o(ztq)+4EB4M$ae(S%GqQ+YF{w=`EF;A&36*-Lj0^g8MyLZg*$t;uKCCN77qBG zfB4y$!`ljJ`!oD@VtRTjW8+pT=B#!kVuCtdf zhV;cQzEdB(BdVjF*v3WPhxPBB+II-QarPSkzqJ;FzDLsAw*fK6u8b{q@`W)bj_eWg zxxGE{E-uBOxWuDx0scmVOn&jroxaAfxYpjc72hrK=qw(@lJ{ZrgS{_yXm6bGgIvJB zWZA#x7Z4-fkHv}j^&Wdqf!_L~qjqd^DEAvP-(-B>=2v6dw^w6b4B#NV;XU&qPUx(? zeN%EhQ%4NoJ--LOvc6sTJ0af`=twVp^8xxyf>T63cyo)P&3NprUE+?21^ew*W?0Y;8e6Pos*d+_E+JgOm`#9zRAMF?60#EvoW7sa1_#zzOL5`Ml z#0)*eg*{vIthi6y;hnGPtsmb!{hNzok00byzp0lC@;8d&Pi%lT{F3}7w)osQwO=g{ z@HN~0{fgh?n@9OY-F&~KkG_l@G0krC0NwD*Ps;G{vVwTvFI@16^@1@fH_1D40G<7v zu;2BIKRg&0__nua?!zhHu^0DjGOw8na8yV%Og* zx%V7b{BJDlTa3wh=3X&qu4k`%`H&9sF`xP!VEjpzdd5E8#H-&1%N>6A!5+C@-j*Y* zAH<%y!SA8`O}5{=h*P|2FMlR(v=JZ1VD^r2V!cf-e-G&Ial`{XaK`7xn=wU>zwhuj zBK#mfng@)3I*0{vY;W0jdGSOKxrFXKgOxw!SnsnNzY}74!0}KK(wG9_9;rStsH}u8@1>%&Z}ed;R-etG_k#H>Ca! z-a3X4#IWC#$$fr1ay+^f%T1KPPg5+>8TU$cx6j{^V0@An}~PZIBndAMmYwCWftF%;(lk z@|yUO3vk7M`Hi9&HGh%oZ-&K+xlMn@xj4u=RgRDk%-Q^IjPnP1V6GSYd}W?DcVtY< zb;g`rqzzrgw)v4=^q`x(A|HuEoQg5;amwV!ti{a9?6)qZtG>z0cRFJ%f5WDoF>8GC zrx*oepRRO}!@XPhT^)VAdzmNXY4wZ|a>M|i;sUqqrMFl&Ka*#^rx#A#>z7^lqz8HU zqocgaFY<=*Y92AR*eN%VZS09va|6H1k>+Z$^&!`ocgUv`S=N8)H-AIx8F{!8w{*}> z{K>I$C;sRIxR+z;EFOUl`o=jw;@sGwpLGR4l4Hz?D{B|N=0o=4(Y!$px#XveOtv`a zY7Q`VaIjr&B}aVG!@QiaXYRCiq7PX(r6-ujj1jS}Z}W>B?BEA7a41&gUu!S2 z^lgmuE!)AKha4(j&_nF;qx|hmp0@0eo0YNE{Buu%4{*yj>|y^V_5PV}+{UdoVqF}| zFWSo;@{T+z2kDz#>=W~RZj8&L<|gY2>o~s1*r7x65WhwraYqJw`Hw&S9@je0Zz$Q~ z9m_m{A9;{|?4ZB)+5eFT#FuAz-{%XmGymgAdt*qx1=nIw9Wf|2oUK*Z%4d8imia?` z>%(*W;8o1gPj11f@u4riH4e%2&W6kW-x-=`aY_!z1@tif%_-J_`R$oJAV27vo%ABh zd}>Z}7Gu_M<|@3>$=HzF#U_qHo-?$xUS75Z~k& z7xJvwVKX_#Abpj^U+ffzp0gX@p2;=(!=JGzkD3R>mot0B7QbreUBlYM_%bf65v;rL z;rF9*K=OgHE?2RieECm2Im9zQ&CkZUoMR0rZslqB^phLdE3R>f*R1{VEN7D`N70@C z6H~^E+<_N7;Q;TR%OUj9j*f{R_FCV_clgNu8@_SioLpf{(UJV@m55()XRL^OhkkL) z7P`}!O?cs3abunqhw5oB5A&mIoX{DsV%yw`TXxGynZx8ZF`-X9IK&g%=}9N?roA38JF^&zUU&a zi8Z+yKjh#>KWx({{lvRx%H$Dxvr(U7T<*r7{`kZA;v*d57Z=)O9+A7nmA>h~4!-i7 z?b;ZdWJRXtC7?81eZqX%2XO2z_N@*Y0$#4a(4H-6KG-|(9`k!;t= zKYTzha^&w#3U~(oHBXukaH5ac5#P!;^kJ{F{y`pwJa_G23mf@^eR3(_0K}wcbYwf- zl{*{P&dT%5J)h!5OgW1qXFBQE*pchB!K?LY{~RuM=ztR(iYqZ|%)4f*Yq?fA;6ZM3 z&5y1V|MDI_jSVq?7d`<8eSp4MTj-YzI)_W`$adDBvx85yb?v!>zu6pa#30}TKXPxz z7$0PehbQv+m%e<)UOpFF>=MW7&{G`hpIp8XxA??i{NpUv^slevP3^Q#TkXYzSRf<* zcc!oU+Ov_ZbfgQv(9Ia#q##zUJ(RHlhd9A=Y}GF$E{z|y0lDm!$H?bHWr^pU<99re z&8PHYpZKIV9unKm_Y~v|^O5{yj#DOIi9KsaXKiuDhZ(QV_~AcXh-0?tmrh~=*t8Hi z3x8|RuVRZVT*qHHQD01pXPn7L<|Jd@Sl^@|7vNSMeBcx}$?g5~a(Kg+@!+g3U&#Ap zxONs-siPjb?1=94OzeswcH>qoC}&sVR~uu&y>@&nPH?21xJ=H*IgWu(@QQ2kr!Jn7 zXTq7-bxn?T&U_o+XivxZg)aIQ7p}oI--J7H%WnRQ&0;CJfqmqqZDKa#yuXcD#2=r8 zQ`dMlc3o!-i)ZjmyeoH4FaFa$*ZL4UICsVmo7pc$0f*u}z>j!Vo^iau_Fv|C#uNXE zMQ8Hx%~t*42oDhMl#A7jIoyd!F)O!o%qBVo7t(J9F$nl7u$?Q<>|*cV-`2Am60i~wSmk#{0r=k zfAL^!C!X}_V3V_Zvgn&Qi%qeUf9S7&dhoGWmxq8&pdJ}yIrNEdgYqf0DaVl=#GCe5QusDX&XD7-78lw+|tkZrEk_Ge6Jjo83T!Xvc)%_ zuocLPJoSww<0?5JGW3ytw8tO4*d;c^wHQxc5F>al&R=Aasg3raPxmR0PWn(rHl&T~=#w~i*1x#mYd#M2i>vrd zoI}Qge9Z^y(3h|HlMjs(&(&oE8LlHQaj1_Rbm13p@b^N*F8qF3Io;S3uvHm;l^G{^ zNRIYQANnUNdf?f;W4^QcPsSBJT;qe>{xLuY&y~5>zQ3+A{m~s_d-^p#@t|-0MjjcU zJe<%Gv?T|3pbYPP;aZt%W$q)J9M7~3l<70^Nq=Sf#udBR7ad$Xa<4vp0(~a8WIQ?R zgZ)i+&DE}`ChsH6BEXX_Ri$79msI6 zuD(Tb~9F-)uW#}piSyI z^S^Px_Sm18NS?q&4%axvt@{0K@ystd=UP2&5?hG}oYH}8dWFmWoPrxX^yd>?;lMM< zHF;!^CvJc**^`)}OMg6ME)pMfRF|IY5=-Ju9c{>>XSfsxY;n(y9Qq;yv=Kw$IXQxC zed;Ie=$*RGWQ#d=@uRac{bu~ISKahSzW(Dw<;wEhGyTz-9PQN&U-W^riN4N`*q#`2 zAAgEZF`u=ISXO2{*njcfbWg#xcs9p-PqoI+cU5KD@OOOgoLIppT_CSzzj z5>N3BeSjX$i9=`g$#kZVeiQrAA^K<^j{0MR%^4f~A8yq(E|PE63HN!1XHd^Ga8rYPx|vUK3slR6o_KavPA`z_$N+hc4E5DXANXLOe!~Y2aUQ>jTaZ)4cjDP| zT;q#9;odzSV!vnZJzm+moRW=WtI? zU{l5`K7mc~h5GF1_gmVrR~+L>JF$T`am5#S$MgR+XR5$Bg6#HKUf#+TxiZFF|MFbe-QU$V=Q*h^f-FYfWcpW>TelBf6}IXnJxhLo!t zUq=?7B{s+uFMOBrz(20TxqCK*b9S&Dl<@($j-C9Zp7PYqv(#4}zlQ@l>Q^~9JWFi3 zCfk`^Y)P!SPY%Oh#;y9`=;xaZebCEueUOKf#5H-3E~6b8@sTr5!j*gd#UA}h*X-7gkH~PJ_;8C9s7^)NCue@f6-6Bp5dA9ps)1jK67h$i(j-? zrhoBe{J93#3p3fmx>_Eww=F)Cf?_rb~(FOj^D&9+myQ($B;1}Is8Irhq~Zi zc{p;fA9lo693%$$ApDCV@#LI&Rm@rIB}d5fsgtw%$rr{BzmuzamsI*q{6!A0?i{hdPOy^qDiR7Fhh(x1n&y7I}i5?8QSk za?Ut(mLD^3CfBHAJg08BR-Y{6InTqVbL!2vmp+~Wy&z-DIXMkS@wJwG#V&T^Bl9AA!<(}@`qf?={l#wb^{Wqudiw7# zQ(rwc82@SO`mwx)J2?g97x9m;aE257xW}>Ua2FpqXO7XwW8wR89&pA6i^7i4IYam?pA=&L-j*J>x24*}Zc2 z@d56{q%(L1%0L@@W~@e6`T-sE+s|h>#ie)=Q`zfqZQW#FIrEv=^ISY8mT(hW665`R zE7K3eci|e(i9vcL2Ivm-R-SR=8t)l@_)DMUtEZ3Ti^z^X>0h}z;z4`*!$P$D>-S0e zcQ{A4_$B!=ah@@vJU)t__$2-!hiz<7<{V@kc+NKV#{PbN=}gytJK2^v4G)QT^+9=T zbdR%e;Y@~d2OY$W>zuV;khCDnHQwe)s{g11Tv4YI@w z=$|h5#IyI9{B}()au0Hi=NTLFnd|VJal=3A=6e)hx|h$i*DijI4080(k8EK>xN}bK z;G6Kx*4V5JFYFLk`03{)ys(>Wc88bvJAOzV^~jG*auZ|pRGv5@Upr^ziRakIHf^=T zQ_7ta+c?lJ=#Ou0+(Y_ipFV*e?s4E6*vK|^_Q#`~p7~xrN-mOvG8bkZH2=8<&!K;P zD4z#>B;SE{LFQBQr!w``rFS^TEgKU%*~1ny;wbZ?a!71tjuc~wO&s<6DshS5@EDGB zP7LE#?1VoY@+lR?1~#a=wJ8~93Il3zg1>Ca2%N|2M}q2w8{4%&io7P)K;_%LHce~#!L{n?!u zb#||g>i`$w3!f?P=jX9)Qcs=!YjQGA$ocYra<_86hJ|du@UE{v^20YDvJro5#0x%L zvokTA*v60N>ZucG-(M&4`nlAXga7o8xA;?;Yn;XB{pZ*&KH0=R@yy=5_hk-qRu1Zj zZO}H{JChkb(l3703-GO8IP3SZGWU+~h)XtugFNGp&gK%naE|`Uqn~>HI%*pZ^b@|E z_3g|@d?I$O*R0{M{qeJUt~0*)mTYjHXY6{c&1sWZqJwcrFV{IIzQ`0K z@jH8Bld{B$e&~t|P)GlCp;N{u-L=cJ#2-0iur++T=2tNgnbDtIZRw8BtXb$Edt9?a zy>P4@ghTy;GP0G2Pkb0F;nj1#VJDpudtxIwTf8K8`r{|Dle(T|Ojx4?o|BzeOgr_} ziR{$#T;Gs3p3wt5ColTq6V&w#$G|4G1q)tW_^-C{2_N5k8UHC$k6)Fi41a79E3vcxTA3J2yd|b^9QzYn?!}QdiRHvRj+NsOXK5qW z9LXj4>(|dcofm2?%v0LZM<3CdKFZ0-Svw$OftiK%c0UivO?(9UPJiUECvg=0Q-+Ih zpiEpi$j_K@PoCIFtT-pH=)*I9a3&)%o%^rVg_My&2Z;UAA^p)k&*-SGGaWp0@0@Ek zCa3+54xg||Ux`EIv3+%CO>V-ab&zFrtux#6T@W|U>7{ir&&)J-q#%;mF^%Nq_N0 z>=Hxa8dr&<@S}_^S(h6Rkg=g$uFf2ocNpcF6V=tnLKgbh@0b&pIEk&!co0|p@rS4A z?2JPkDaWIOfBJdLn&AIh|0UMR;>-Bfb;cR}T=QS_=kp-G&N(@P-~01~YaFBufA~>` z-~TIy$xNSg&}Ve<478g!y#C|4d*x(m+b>sHV%?daw98pp)^pB~cvdHU>esb#Nx$gX&k0^)mot7c?(xA^e_}KoWW0+#ao5iwe%vc};6G#1y>d{`7!l)mkspkC zIU!>ox8c$?p7fpZ(l48?;!*5EIAB-GlY8;i&spLQcQ{YHh!K6!m#yq_R+bowjoRU# zEZ`qHk?B6q=*-XkvRnhXcu8K+uY(MB$Vb_C@BckBAF?g>>5mQC;}6GjY}VWPttOs5 z%eusUKja;pvzZ+Ja_=0(Kg#?4<(^HMYaYuN9r*x9xWONY70+Dbsvjx$3?~@_xUuhq zAHFA-OdM#h9pF;gLQf0-)t~y26%Hd`x#!7^i6!@G=L}@C7hlG6zx~P+NBuEmyt_|a zCohQu@j%PO4qe@=qn-YMjj7`t-JR8U=pWS8Mm_R!sM`;IVPoQ$ecG}icF-?&u{Ck) z%zpLAPdnH8B-2?rkP%tAW@Bu320m0jv6ScJChuskZ+TYyiqGgp$3PuzKppoG-JL;9 zC-@J+YyOHXc>&~)@aj5#QWhWRoBaN9K)1-l zUE)R=`}CKyK2s;L$Yu!N;vC{X^M<&WN8}T8qif?n{Dk*#&(?72>`(^rN3Q7~e$`FC z(MunEMi1B8s~4MNCwtfzST^Bfd$T_xnD+Q(t*(a&|=5^pSYWeV(%i+^a)Bwzy`4Yr6K^O}>8l0Jm9J;MhIR z`^S8IkadH0uAP&2;}^2o9lO}cCTBc&7EUuhVnf>IIh*){{>s!(Sz;=&ocq|BbAOxg zq75uW=E8sRhA;3;KR`}o)5CN5#<(#ij1OxZXJerMS-2;M9^y5zY%QI4>zw`n*0K&X z994$(f#XK*BRrk?NM9L zu^9(=<0G~@hbz3Xo4*qS{15Kw*dITx0Y{L!&W{~a;)HEDb$FgK_pX&`tN$GC@uDox z)OV<(9Mp-<&h)}Bu7U4>ANa|cZ#>Hw;^(Y$lo>DVB0IW~tvt|=u|fwru}|CsUc;|@ zb;wZ<_xu_^Wp6|oKPgX{Yq1)?@sYSDLu_Y$RY!bhEO_3({-#g#;7c~d-o&Xhp5&M0 z6=!wDYT^|y><;hbfVc*^2v>X-@E5)5msq2_7-w7JoxR?{#BP57gbQWHfZt7tdoTvn z%i2O)Z4&q44o~>N9X;Zo@W@Z$Cb5}3MAtx>_H1J#9@)pI+9hvhtf-TE;VX5Ni?hUE zuJM>y%r)L!tApQM^OyUSC)TY?$j}$P_$fY1tg;E`;T{M0!GmYGQPy7``EYE`TiimwFEY0BJUY^Y-LcJe?8jkpG=AK(xBt3-j71On#!mX{ zGyQu;H}*w8XXT(gwAJ@xc~O>wPGX4e$-i=~+zQFf$-m0PzgRa0oEKJp3u{01`elh_b&M5f?TslM zc}Bke>8Ol8^v8MPh96>YV$VI~9$);aZv2*O&&UGt3jFSQe|z%qjJJLtxu=tuq*vC{ z)*^C@x!V7iQ=Xv%=&L^;X%l@?hhF*%(hr?H<7?0OE8{u3;VGQ)TYSeivJ^jn>-aHz z<6nK_hHNq+dN?PhJlB^pda=tGcg6)B`+cDdzj8r%P#0G?cOBp-zVJ+a?VWL@o@-p_ z8~^c9^a~GS$RY0Oj2kd6*eO@W=Cr{nIohbFTw8~;GIg}W9U1O{?Brf`m5FS{|KxYq`!iQ#aMPj-e^eBi-39MDgFWq5MdCU!)2_`;ul*qZpEZ)_yjb8_{Ib5J*Z zksZ0=-ZN!*U>~qOys?uE@{J$Y4(%O@Ke{Bwv`sz;C)$t&>PGkQr>!#iBWp%JQ(qsR zB?esg`=4wF{gkVxog=Z9v5#w9Li}R<8xP`JJZJ6`*Xno%copNy$x$CKkQh%+%02&u zH+r!tI`-Ry^Tb)6YkFy$c*GAI+2ooW{V8+r zNL##UhX*<&F5J6LpJZsKtUu0_;X-{pcuuF(PyA`4pV&la9ILAjHnY`17Vg;0r-=;9u{R<}>T+{2igQGJ4}w+_OVl_w3U?Jdv#|<3fy( zVJzT5JZMLrx_rcTGChy~oas;R)b$+K&i(PE9(^3KkIiH!p703za>lv+U3*-~@mZ7L z+M%ubbRkfWJDeB*>|KtD&y@QX)s@#-00$M4}p zdGbc`4E?pYPsT6wRbRjA;N88xv{i@y>E}NEu$6rFYb&p?jURBXKEKcjpW0=O=sjM! z_{}vQ_z36Zc+T#~VypEfIrx+3a<44oSA9CrN4?BNY=X#hO?P&%87HoBKo>TJgS^k+ zDn7=4e_b5)k1N;OhbKDelO62CC3!f)t7prLOuRb zM<1Tkk#2m%$M~nGHV)+uYgm4zKRDDUll~dA`g3?@EUHHqUk7Zmho&#>^+9)jCx?98 z;9DElKi{evA-@p_(XqrcUCXF z^1FMw=+l8GedyDHV>;YZpp&!r6S1RQ4i=04-6nEyp&r|miEr=we5j9%ZFQ0}*lcWQ z!)7r+7F*aE``PK>f7f(VPaE~Dx2DP){4ab2QiAF_p>`lcu77k6}2AGf%{zkj2IO*q7@ zw#xY#=l*?8|Aq-U_Itr||NarbWlrWh|4%~g=@b94S6}pX#)o*JpEG;>`$}S7tQnhl z!KFA2ZrYK> z4)Or+@sU2+uZ}o0ZelmR=#3{FlBF+P;a3~LrF(rlv}YGxaltli^(Ch1=9ze*hZqPq z^dyIla++ssO>E^kd;Ob>`V~v$i5YF!Xk6%943VWzzUCJ(giHFw|Ita#G`9WwOWLXD zo(^nhuf7sbe3{rGSHH#~4)m>!d$P=NI8MIeKm9xB&`zH?W2?Aw=*K;uibFEg)7CX# zvDdg$rcd0^LA&I8a`D3ked3yJ>d{UAI9H#1v1h#TpJ(F07-FkF^yxVr$-|F6Jj=X@ z6EUV=V-P3N3nyX>$Ls>W_3!I}{1`uq!|b8T!(vI_+K>m)kzM+y7f$$>UG%^?Tj}Z` z!!;PoxMVxI#yI^wQ;#40`-$%Poep^}o|KWvR=kqM2KDHpU)-}rUB1Er-LmJTy?T6* z^$u>`^QC_SPMnhsY~vq1(N8@*hzsq)wR;EMmD5{%u~mO`q?3cK{DLoB4O7( z(w`r3{b)-Mb~^jF#FXnxpX9pt?_?RX+JTrg8mi(1__ORWV zujt^~n8d5O)tpLSXSU%`T|QFJSjLru{o1KZu0GWd@3>G$yvPlF$|icbPaF1&as7x< zT*c?g$iW>u{5xUp#RmKF6CKGT$2q>DH#@`@hy`-Qf8tauv%@oW?LHAcgT&n zR)#;iJL`|G=~rEP$~j^H56)R<(VdOvK5+utlBdktLK)wSNp0Pe$rXj-=*V8Wdro(D(iczS!kK+! zyQjOh`qRd>_Qn=H>7`6Rsq0?*#Eoa#vqxV!#FrSwh3D$wfPKo`M}~Xy>7)%mk>^lP zoQiq(;z1eUhCEy-#|7Zg*;pYrV}@M1C^NqF@1Cu$>7P3M=31G$Y$lUW)z=?>@Ts0d zJgBD)p6JCkb@8jMYwg1$PQ-Pf4|V7zKIz3C2c6iB2ha3RzH!JVeb9vu#h8PB^wD1Z zO$u_D^7z<1<(~d>o3?x*rs(5LcjHz6;eoAmr5`;Uo{^XMO5gnHxqh74r9F=LTz&Hh z-L+wBY%mT|&$uT;Tk%Xcc8gguwNsw<^iCY&7$>;JJ3i>bCiU2$fAW>7uOId3=DD_s zk;oD2uH|4c$rik*C-yue%UL-&SqDWv8{!Z8x{qyiqJw+yJbbMkF31uKY*tQB>lb|K zPnmZ9T}QTxJN5ZP?h`v%_ZesE>x+DP@TY6_$y5ioWRN9)v!Bg!B%6W$+R>dJ?)9%8 zza|%X?mF>6rv7oEpV&Z8{m>)hNI!W_zH$&R>WODE`uoIL;z}F$=5O|>tA8^1Upw~W z#2GxJpR>Mkq8)wtLchvg^EsWxnz_w5@r+!$eN zo8&@z(@EcW0CmKjcMEOx={Y;_&Zp6p9J-RvMmo^Tb28l1pIq0tq!$j2d-~DWGj_Sw zpE|guv$(?--y7@NZc@lQs2CSZ%EdFeV#F9HLp#0;C;AYF_+_8Cr62uW;{)Gppo@I2 zJoVY7JnIy53QoW~5-#MvtWng*v;NsZC!Da|HTytpv4tJZY!qktw=3E1{U>8V-odB1 z#TOZ_!L_#PI(x2fGU$Q>da*5Bu#fNff=_Y7zwE+CIAS|K$pgIMOx$Rje88W|6AyTD zO^*Ki<+;`eoy0Ki#Tx&+caFXKfaCzYW=!D&kI5tIct$6@;M=u&e83h^FPzYWd_IT7 zI^8`}Kd~O0$rX3{;6MC}PrjoMA1D*2$~@y6@tRnt52)`P9bL1*S*|u8^VRJIb=*7X zNiY9y?e7ZwhgY^ZwC8W@;jB?`!IwD3f%fcVBj51{8_BY!N=)eAz1YEtHrmobJ2J`U zGu*`I>V2wKB0wAARY^ zHC+Sk`BXh++VL%a@uhQYN*j4XS!9y|?w$1k>fuf~-;ygH zv7PVmgH!d@#ie_Pdv=mbhj5Uw%m!ub!W(_Ws<@|@IF{qgafxeXa+I?Uic*-tU*_Nk@me&gy}C{-!6s<*3XB z^vs;hH^w%o7hkYZ`*4o~2U|STPF?NdYtQK@*2N3|hxP2%<}Ll3hsd&r zMR$7ONL;Yb*z$gve_!4{lJ7CEC@9~)uw~&@h36FBP}sKc(t`8ug&hhnFSy>d@W#U4 zh1V2bTX!mS1Ty9S)|&11`y!*2@w z_v=FH-q^cw{#u(n|5fi-^L~r0J9>BYeqV6br}FflzO@H(wZE=#MISEjUEaH@AXez$ zELN`VgEIHZwY{?7Uimcz*Usd4My4|N>N|U`Z+*}M*u`eo^z(fZ*n>;lidk!Tacn&C z1DFfNX!4V>V@%3L8SB;^*)LRnL+wZ8|}&S{RCXoM~spsK8-;+z`b0R+~o|J|D4Sw>KVh% zcu_~Y5#Gt*3-#0ial)S<4#l2a z=NdLCh%0gGS>Dyf!9o^XcyDq|HaXX6fah=a`a`lC<$P3K%Yvnf93 zW7p!0?c~Hi&bXl$9nCeyoG}e@L&mr98GqAFJkTfOiaz2{Uv$8qGIf+Y+=G5&i)Zv# zKWlC=nz5ojdmU*LuASKfkt2?cHDk}7inH~IYh%%#i{A&hm$$*5g+A#Xf9j9?oLvLo z(+Btqq61#yH!;AMiPOY>#)EiBZcENnM=SuY6C3We(<|8MD!y zPU1QD3zjVCPJiQ~4KF-a%-&>1h0O%|D{s~wvYZ`ws~d;?!(-ZI9G4}Q!u{)&xw z;S*6bju>7vYY9E1nubY+JzKu2IlzmLSNm^XF;Wx%g&(k}UpEcQTj(igq?lrPx9 z9^*gxH){lI3u^-30F}wv>WgK$Lb-F^wHBgy;s1rip7e=Ze8lG&zhcjrwQl@j;p_tY z@ZdKE@gx4kg>ri4U6Ku36!6F|`mt8AuBZE33%eCQR=BX>z2NS`8I3a<*6e!}tmmzl zKU283dvEvu6|OFv+BvoJ_rg`(tGc&$Ztr}%a6{qg-KTdS=seJQYWJz#`#Se^e%t+R zcgsSn)9UQo+qd^f_mS??dr$AJS9oLLU4>%`M;5$WysvOq;gH55jaL*-EKCkg4xU(2Xo z@9!PgIj*y3chBxM1&?x}@i3LAAc>P+?~dzW`E?|iOsXZz0fTf1-V zey#nr_6>!p&Q#~j!jB5x9ezLb`=PTN3pjH4$l*Ok_ZS@-8yf44_r~8d_MWlrC$^t> zWc-owJI3x9+j?^A$qz63@S^p{)*suiaK-2qqX&%~G_q)P(dbi#o-*|2!8Z?X-q^hH zl3!ilXDTe}w?Y(LnZY0b2DZSUINqO(Qk$E_c?I_*w-@7~_M zw-&^-I2OCh2bT}tQYdwXMu$g-?;gB+@UX&v4*loQ9|r$0cyi(8jh8pfCGzl2y`6f` z?>@hKTj#dUu7$H&XSEJ4JhA=6_U~K2Z@sUuZsCsR9nI&qp4<9IVY)rt{`bP6twUQ| z7Fu(yxrbX1x8BlzOM9$2*4(7EN$cjho9Dh-_+a7wwfC>xcy8ml^QO<6e%G3Jt@+99 zPiDo++~C~cvevTJj-4GlKO6no=&d8Sj$AW-&G-|RK4Ixk#(y$?^u*B<2TmS1xy{rz zQ=eJ(nPttX=G1M&w+(MQx$WcuV+V|#GJMML(nU)biMLC-mvoQl9MSpt?9XREGw_*# zneI&YPiy|P=GfU|XaBhNk87`+xo+l(ohNp_)BH|ze*Eya zd*AMTaNvUj7dI|$tY5fniVWXmI(+@{u=Aym4ZO(H%x_8oFud z$Ado}JZ9jSfsGp*H$Gk1ytjEzoZLBg=iKiKOFBzBOWRA^=gyrwcX(mf!XC{%nqO*v zsa=${-c-0_?vAM=bfrM*rC8N9+A)z3(-?*SK}btxI;C+;Q^hLr)*NXzHS=KXw1q zJz(yDxlP-fws%^+)9TB*mvt{KOg%jH@XOb{e9hT2XV1K2`W@4Eb?@r#*xIqxneEK7 z@4D7?t?8lZq2{9IqD8}thQB`a^`YmFJ%8-Ah2g2;sUH8#-6bT{U-3;f%sb-IKasD*Sow z&vXA?SlL?H>UO#vd2sXY=H0zod$nF)*r|Z~?-tIPJ!ke+)32JoYv!(*rxrFZ{C(Bm zS1nn&WaUW@pY-snA9?j753P7;#Sybd%x<`J!=>kU&hLD8)pu8YZSmI@AGY+cr8_L% zVeumyKeF*lmcC@^lMAPAc)V}qp| zEIn)Ntg%~%ZXNnm;laTN2fsM+#fdXU&KOy*xn7gqzv=v@b6@+uw!D0C^Wx^cGxyH? zdiK||7tUQc_s#A%yI<>lt@oU{=gfVn@W$>NyYKD2x3^zozlPj?ck}M%ds^>lZPVVS zeS6{N!cj9v&Aegt8&*Ge`nl8HHQhC*tUhJ+Mvrdv=sFLr^U&uX{`|w=c<>t!ZaKZ> z^pno;25STa{p%IKUh(7R zkDEVe{h)Q~1E)Ul*A;(V@rPA^Sas|4t#~-;k84M-9X)pGu}i-* z@tuj&2Tvcof8zd$Pfvb&a^J=KEU$kG}d3|TI_GayK*POfNXRCg;YR~CCrypGN;F|kZ z-M8whl~=92=AmmII^f|09-dh-v*MX6pSkk3#kVa!X8f4(_CxK5HXGY)?C;C|zU&K= zUzptb$y-0UT)x5B;<3fIJ^r@G@3nZZ#f_&lp0e|%J8$}j?jO1rj$Jsm(c+C3UoddN z!05#2#Gl)LZvTAM&sXg}z5DdZD^6Z<@Y;jdp3pv_{l^FY_~3UR`0fL5TJ@$?;&SiS z-mM2a4|YzTJ9+Nr=FLs(xL=R_dgQ}PKfLsdlV6KfL_m6@}?XrXRUz#YHQOp-(UU z^wRTZ&YwAJ_N>{hmu&*bAS>iy9X-&gq@gdtdu~wL-Y2-6)*h zIlHrecmM8Db4SfxICJ65FAAS5++6s;nh&g5^ys2TZ&-Q5%0mhtC>;Oj@sF-(tY~aB zvC+iiW*#@QRd=iIrt56F&Mk{>S#;R4!6~O%{yoBoZYjzXY;bcx4Yl&K4ttV(!far zM-Lu7_?+HzdhhAJr+aDR(uP=Dr?XC{-E22cm^)$4+U>WU-*)~u_s6+oTgSG3-~4@Z zht>|Q7k6LWJ-%~%=kE61?Mqviwm#7OK=W&zuXVm(_(by)%_kOqI{VYvf2{q-T5E(Y z=C+u-W$i6%pD^=;nH8&7tiFHx{^|ACuD^DCdVKm*?N7CTH}<=+Bil!|FKu4h++t#j ziEoU3V{EdHPc8Y>lC#Ip9-mk`v2@F+EvJs0ICA2q4Q|>%9u#}mOC;py7jtKRNKpfrANUzwTOR^Wn35 z&+duWFAjZis4?0Yy?XHK!M`^C+Bk0LxS^58NaM+aPagb!VP#`wGn3l|j33)>dfEnL~SvT;J;b%oYIt7i2t4!pSF{qnoL@Af`b z*tT#*_loYW1v#iw$0dcM3Lh=(S=hL+f8l+FHy1uz_(9>G!aCh`YP4-tk^k-PUkh@< zHw(WkJf-%$-(UD{;eo<^g*AoE8k;qohZ;kT*@4-CiwoZ=>{PIR_b%^y(`O4?6};DY zCz4~l$6eF8rgLUFFkN`s(9?!qP`JGC%Yrpaukc9WkA>eBQ+QqBqV7et;ybDP`oc|}n>rU44k|pouw|i97%FU2V8h1? zKP&vd!p_~D=iC0G`-|=ty)Al27p^S4VBiG<2Nu3v=oM-R4J>IaY3yEjPGPsgwuOHV z{Bz)sg|8HR2g9*_w^Iw=DK{xp8m>3w-*(R`e710S!FYLg!F%cMh1V3mQsCz+3$q3J z$~%T}>bu9c3O5z#@y5ar3f^NjC_Ja|*1}PR9~Hbmw3;(|Sn>k9W4MtUQ?=N9%U7`yh3 zoOZwd!K$r;qQ&V*X(m? z<81}+fNax`eH-)iYYR2?_m1lxHy;<9bvNr;tJ{nDbm3Kn7Z|q7A4flq72NZB)|L&jy4p$Xk+<0+g$HMyy-!9mPu`l$^!bb}4E$mzn@7{0k7`S8L zM}?0TeAo5uO>FYx>kIn2y?gsSzXx{@?!K@vT(E~^-{{uDKzE>aEuPZdz99dLb@}=W z1^Zq0t-ed|Lt6R~7zN!11jG9A8*CrSOTu%L>a1H#cr> z9ADV8AU|JGpu4?~yXzbAR|_vK(EHBro!uW4tVN7R?}-~0)-P;SSYCKyVUvPfen{c- zg>Mz)AA4qtdy9K7DI8olzVO?E*z~RZ*aGf;S1`tEdEVHmAcwrL@Nb2sg>?&$3_LO) z>!%K!Iv;<&*V}KTvpMmj1^a6Dq@Gz=Qs~z4&%$j5KDeQ9dExqkeU4ui9Q7L9UDjLH zdr{%v3-XI^)%GKC@16RH!cPn4lqWQvP&-YVH+Cq9{m&MDSh&7$OW~%1^PdZM7Vap> z*QXXfS$KQl-wV$!$d#8Cybt+JfPHb_lus+zlQLHA*@=l`3kMe7T-c@XoWctV+ZA>z zD7R+&WWm~jjpi{j>`#5XaC$*5w%7a2!hVI%7tDt@6z(mw3u41M|EYzI3Y!)z2p%1H zbbg#%GjPp({`vC2m*@8x#gA{CmlnQK;PcwX>)8+aPC;x~H=4W6F@Go^exy6n9W1=4 zpw536CVCU|Imfqrd(ZDESW`Wz@ubFE3*Rr?Qy8q{xrIFn?<#mFGB>`qutUL`W~MRI z_(S2G!eIq-)E0#ras$69SOa{hAaBaI_t!U}pA@W9US6;!ezf~&?U4Rvey%#9d&2w} zH8;JaV6Hl-U=FhfBZnF{8}v4qk4Je^9)97#3kTj^_*G%5G1Yie!Oo|=XPr4TI5haA z!bIWR#<`6@5BzyP-o@RKg+mIs_)zad^EsKn&C~zU`H#+u){53Q+uv+I)Ox7(-0pL` z_F8|~`eEz9_JQp)T4%IQEsVBD=ihPo;zNaxbw1XSU#uSvD14(JUf(hJj=`tYe(K(Z zlZHQ5uMjPuPbL?SFnHo_{QTK_N49S|F*!deEgGvpA3kt<-O%S`TWhjH}|~v zct^gf_B=k?{b=`-y-&`sm7dvsX7_KMzjciMfhz}=4=*3StMJCcioq3wcMRPz^z4ymkGyE~ zMWZJbJ~r~Pkqd?|7`}Sw>Y*15zhHRVk!?q=u06dC2R9tNW#E>9HxqrJO2 zcXie;JgZ>+AU9mly`bxTdUIl zIKSZggZ14z3lBFQuHCHt=HtLZ=hlH+2h4w8FL-uILH+j>jw^hwU`;aC8S6Zw_l({d zoijQgYJaHhd+M)RziQ!mZFg<=kk%nB?~3-EyqkTw^X1M}t*cs3Dl9KNx&7q!1I-7T zjY4e;)~?ZMvl}%xn!h&}A3u2f;Gyk9+b4HV?k*i#I<(8^E~6WcZ#e$kk>`#q8C^1Z z@z}*<*Nt8`ddI{a6R(?k-IRCiSB$)3iGe0<>0g7t!Z0A~r zbokIO27WRBj$^L&TQKXObq3cNd}rgGjV}y*VPOB>{ypoQ`rJ5tO5>EqaRbNA$GCOt z-i^KIzt_C9@zREGG|f)4!#~!qzF~QP^geNL=ittMz5ROP{HVg4+HYzfJ9q5ds@AI3 zKb!w-?p&~c?Hhsp*p+KnuH9;OtJ%L5?Abqi&9m3+IKAWaRWn!3?A_VBbMDBwBQNc| zv}3>3zWvL_UN&am#mmd>Kof{Y=3O#V>64_E?#@(?3J^JwGV6GQ?RFXRP(6j zJKOJUUr_MfYWKn^y;FMLp{-9Y9KCS##IX~{_8Qu2=xv2PhW8l0VCaIO9Y=Q@y<+%^ zVfjg18v8d7-#mQj(4|B2?)MAcxy=3Mx9`<{@cHfY+c&muw482vSH7a&$i&%t?e*H$ zhJP;nuKT<0sqItSS2V9^ezdSnYn#@G3SVu1wOyZzX5LpgWbGkq-&gqZ%$H~OShdHh z>mR-T(KpS!Y39hmBL}Z(T+?{%+-v7P-u-xY#qf&Z7mdGY{KmyME#x^Y)>(Gg#9*dxpw|L-goLzZE1Q36{i$_F z`;NACwV1uId12H3_&*BgHP35qU)Xnc-`Shj+`MM0aQXD*)30Ci`ZdR|K7RGxEAL*p zu&fe{GXS(yq%p)@+ z(<9TD&0IEf-0X3)GtHT%?`)?O?2){^U>*7S;m;4Z8m;;D#cPIMGqls_PNS>FSB)P! zcIeohBX^G6Rycq7{NdS=+4-FE_Mx{AnZx}K?&FP*H_VULroL6IY_Dve&^clLokLt2 z4|g^1YVK9vSiV%>tgNlyQu_$&x7Kgj>sH^o?f&-t?LRgDG`}bO?B=tZYvQ~x!!>C#P?-nHIc>pgGD^Oh{CZ>IY$+PA(K+_32Cv8%^EHTw>j%;~eI&t5%u_1u3KHk#dN_M6Rb zHm_)1(Xv1Dm%+abo>B0d*qsJ<8a#F6)RE1{Hy=NJ?DVk%Mh+M`r_e5ZxUl)y=3~b3 zmm6Ph>{YOCruQ*}#|(O(@Ga*v-OqG?Qn;q@y3Xr5|K0rW=0{r}o&UDt{Ykt%we{52 z#RYpA){&bRzR>(a^Ua0v)_7~b=6=nM<~Ex9?(BDGKRErt=^w5B(Q13*A6xyg)rZa; zI%BQx`{wew<#W~u+m3EK`tk9PkN;)SUlz3{S`)`CI%d%(Q=3ffQrK(Vz1H2Wu+R8D z;~S4{Ja+t|;}^Yn;>8oYkL^BYeQA&6?(W^)b6V%LydT-y+i&fDYb*Swx1Qa4ey?`p z*2b+@&b@MO-@-Rq-$BrF2cI5iu>xZ`<*?Q!k z!~Yx>j~^;58Co*r{qt3Ya|h2IeDm;|hplbj(tS&J+k!m_@3rqQ_`dw!)_Yq&E&Q|n z&$hYFcO&Z=-}?NpVBOBTon6|yv=46{-aM)B!ot-B-&e0(d*#|qXEvQVdirRe4CZZl zM)w(Adum6tj%arOGjQhvf21%<9{yfHn!W?LqiV@S+Dt>mUl?sgv_75i9UVy>9f1c?J_67*%w{X zTGAS94mP)}Z{)rcd7rocvSA?s%X5LE+HC4uwMs-Vv?ut?jR`75^Cp z`>$Uw>{wV-nC;Ha@7Z{#@C}x(*4@u4tnI9w-`f%Ue=D3;u!m@$$o`4LZ@liS-@*Hh zlJ^Y1Y5scQ+Je2as|xmKz01G3aCpHUqW!FE3s)EJF8oj7_l4gU?4fvOpWB|0dBDDf zeG2=Y7Ztu*@ZM^E@Ovivr}p>EQBN%h7JF|$EPSExp9Sl7Ys=RbjAie4uP%I~@Qnh$ z-BR#AYM;ZNw>@jW`4Y33{uk8WS^u2!D~2mYsUdm;OWo7C@a z`P?3X{Tln~_jT`^|J?x2z3K z*t=k_-P+Il44&-)*@Lq0V;tBQc~=3?-u-ay_fFP^_F~U1;MY6L(%#bEQwlFH99|Hc zd}#klJo`<(--&rIuowD`f_K{M3x3CCjcU*02L*f7-s4=`^LlSVTi-?e*1le~2JWc8 zC$NuY@5J7+_h$R}`ZvF9S$K89xUf$0zU4c`D+=~!?R_0lun+dhf^lWNdr!e$kNsr( z<=#*HKF6N&$p!DKe<}C|v_V0<;ME+nYr)?BF8>RAFZK%dExe>)e{Q{ky_CNetjX<3 zf3~oD!QZm@eV&-I#^19bruaqtd!M$?%s;;>h@IaSep=v*%L?{`>`D7(&oAaT@3Y=R z&n$R9mp}aNgYRSFz&8i;sd?4j&fx`fjdu+DRrXTp$afzu*jL!G@YKR1^;=jn`P%q8 zs&H5VzkB>I{9epl;hottG~ZPo{dlMsjCN8SGIj*e$VlQffMHC+5eHlYCsMqE!9@Q!~xiYa;IO@%KNPA-TWzk4(<%boUX?6vw`q}Z`v^PdGV?>8%Q-7gBp zp?3(jo>##0(FOB^xxikd{WbH4JvRHczG+&kTwB1Me*aeZpMpK~zZNW%+6BMOHBS6i z6zE2tYrpZd?KmLe`>-0lKnsWXh#n^ zkSo8)k;aiZSIqdEE_sCIfpwrPK^4yIP*APxyId0!5*^T-h%lK_xhEy%+t#Gb+q7Gf8_YPCV%U6QvnD3 zf+OS1Z=&$zH)h73T;p24`ds0Jf^m>`E9zS$zu7~xzVe$}abv&LzLq$#7iwJmtzhrj zy3(9{TfsLVxk+9%UmLFEU#o}k|c3i6`wkLEUOANwix z8s&F&K40)%U9P&Ia9Kgj{IT#rK|g*ItzZ1%R*rMcpW;L=;tx4bPQSG9vx0RW9({`= z-~O^O=Njm2juEG~7Rd2UTC9m5>#8FQ^0s-zoGst}ynsjhp13m(FE9A6;v4vh1#`|v z3f3d?lD|hJm;P)qUi@a7jrOX6&A7b0U|zzb@gXOkRA5hRVVAky-*n>anu2&T_lrm4 z(4jwjzUDpeigb~y{f(s@tju^aPIf5ZmTqESZjdkhmihYyYbm+ecTG7^4zuPk@0&NR zFa5^aT7d7xt~P$dCkOaVxw+gJm-CGU-%b6F{6z&E(N)gdzhFLd{mz2*v2SMP6Ki0( z4$tP(?-$H3zNv^=@0eoNZxXDJeMA2LRJ{qj&DHn+@0|B=hI_ATo(U;5(x9S3ic(2~ zp;Sl|B}Jt)DYGP`QYsB3lvE@ksSp`cgd`-D5cl45&U-q3ujl*oeLw#G_xX6-GrxyD ztiASHYp;zgMWzDd7P=|@zo9_R8Rh<$e~W%dzh-SDZHc--E`2U23uG2;i+ZAt7=w5Z zy&JzNuRjpP(Bp@oeIes{PTh?clLUR6`sF>!h)3#~GUNOB30@QYj`MI#WGLeh*GJvb zH)u=rcXVFr7@d!Men>D5Ctl%tJ*AueB^$Fu)#s}j=-x>bn{`vm$WUdK)n~Xh-iL@ttleNTH z@r+m^>c;EF(VOvUw~;RxUl?;6?9u0mLqfw$47q`hjc;I*V4lPHT`WKBnF2Z6BGw|t z*oOQ;79%f^Ka4TxDvVReeA*p#%9w!6MK?sRrVlfIA}8p-$Y1&^zsH9X^>5l6u@?N{ zucwbv-}pnZt24)=4w+YCFU`mX$??$@(IJ^HO%$|QK12V+w~MS}eny!wU&9xBpI9c| zmOpE_cwT%U{t(1H?TGJ)zb{sa4uW#KDt=XbSZr7fA1-4q{kEt4GU!`%Pt*#Mbz;;1DW}bOzaA~kUwm!Dg+vzdKseYpR3FdP6#K-&Nea5VxgP#NZm@f)s zQpV5tM>W42E-v#g^WRhS!nImIahrde|DM1ObB6p-_=D*KmGYHB+dDot8sW|2Oyf*r zygA;SZ_GEQm{UwEVI}$r>_9V(nZ{%0W9ArZjFlAE8P^%i`;xI_jJEV_xo68UKg19G ziTng_2z-guJJ*6eW3S@0na@#n$W;11u?N=+=BzROAzPMdoeOa<=$qKvI?8U=O0jB1 z;-YdFg>5`-q>Tn<1Cx0@aR>(mb2#S7=pRgSTjyJc^Kr_shWs>3f+YcS@>Xsu_jmty zpYi8_cfhNiubpq?HS&lFEAdLa{r-M`xz@vMa5uQ6Ua40@v<=z@54jJy^~B-a;oRrh z&$C1PA^t7pZYkH<=xqEE{1MzIxTb0LH2aq1Ey-2lHm!SUEY44zpXy%Fz2MBEGmB13 zotDBMTVj{k3la+w_`@vyF|VL65dZp!Ko`F$xGCtG>zaGfdC?i5*u%Dd+puhZaer~I z6}!A$-l@T<0eTjG{;cdP$jw!;Rbk9yW#S)=tBu>@x5-jDJH9~n@SE+MZPPL>;?k}+ zt~Xv0P2}skLNJbETfHi{Dmd;R_pyzp{FMKx;_1J2zjeoWW4sD}1;2-AE+{|zT9gH` z4cOiu@gDK&$v?Oy*b;mw-zGlo4bBFqwcFbLUChYNP_%3+J1sL!QOpZ6$jX_D2}NJO z%)886YA!X4lf}s^(pRL3A>EVuAH)}*UwD4uk_t;Iu%_d6^L4XYqFUm%)NQFP))s5A zz1U`+zBpJMIO2Bqc9(uh+{L+>b2Dp%OsU~I6l~P9-P!IaXO#15@M>_6e~*vsU1zQ{ z(dGUt_g}ecMm2+a!S_?as$dlwg~qMst>&4E;hAg9H3laJC;pE89b>GbPa>l#DxR_^ zUz8u=kMN6w;=t8kN57-LRB?Lr=kJ~Go#XCtce%gZr|tjf3&lB~9h@C(@wS9M*LnGQ z`H|j8uY=pc-Rf+0=DG7+CV>l_1x~|U!`#8l!OWSWgP1Hjmv%1gSJtoWH}f}hqCL^> z;C1jC#~a6=DtM~kc`>?pbn%`Fd%}g-(~GAUzgzTf(a?%RD~_r*sv17Q#pYu3%=DS* z8deQ!wERxY4Q@-b`weRw#xKrHMz1O{Ef^itVuu;$`j4e~QS4o~N zNqsE94qe5o;x(6drc0*36ihC1p#>4woD*nRk5N@t)$(?4MZz zV8$fIB>r&za5|bD&2NgoDSo=b(-qoRXRsF8&-_`%F zewuxny*a))J|;CLHQ$_XRuhM{xS>oBJ;KE_mI4-G5K(ebB@4hk9|5_R_5qtrC6AK4ytkVzK^!IDai~N@E|Vk1)pJ z&&Jn)tiVQALvgNy+(GWeirYaCS>>#9)`}5=wm38x8Z7n~`+sRI8}?>1Fazd6En_WX ze+PdD*xHEEBW41-&Sr13NBK8!8aP98LlninEhkrI_J^_`%I*^DO4pU{EZJGoMoj!~ z;(s+tYm~M~v`F+T>{o~!MPIqA_^#rW6<1blT&;1np;d=g9aV8u#fFs{RvK4+T=~x` ze^z-ztqrwyr+26Eu}`t5*k2o8%QJYDfzOh)OwQP6vKtgzgz3Wh;yL--X7c@{OSLx()-Wu9I4PG$cl{!RRx{5jd*>+gMRd~7tR(4c}_$*uHhl~1cYBzjlwU3priX_Z6h)7ohU|@jVwE+ziW?QOL)lfpTr`6k^fxkxzvwZSJ~6==@W~< zx~wIYmsFlnbw<@+D*jS&ZH2WJ`ipkO?TTksomq99SYR)((Y@N5ZOuMLA4N<(VpP-` z(2V{r&t9G_JXUzDOQuWabMJGHwRKZUrj)c2b>v?~7se)vF1I1JA%;x*#rVZwonjX; zKn%BrTMvrO1)B>lN?(-TpV*%`+dkVS{_Q`J6AQK04YiN3C zT5kSguYy-W!(34naYO2c6mcgLt4yrYwL;elJMEqJa&x)K{WP)~NqfA^V!nzlj2xd( zI-wL@=1%$3xi&B7<+_!2D=lyeoIQ#;`NjLiV;)GrEcY}+Yn8D%5&!aD;=KfMn&|b& zK=jpL6Tc=7+lOu9hq{Oh;upjZ8V3#h|6a_Cp|c+skOcsjftsx)_c|? z&f{*yO}+2D?;KF<&Y$j|F23ZA0)IC0q_R=jU`~X;oS3Y&=33KBcnRVmSoEGtipV4~eXX4Mqw+GvUxaghl9mbO0 zDW6&&uaC!?!gsxQwd(EWFjir`VwSi2+x?ftEdssn8m%FnBe1^_1C4FqEX7CT*X$(j zHt&{)zq$Ey{O9;v##@RmJjIx)wIj@*W}ldSqH?}+zFW{Oj2-(I3 zwN{D#Po2G{wRAdEfDIX&Xd|tS$3JzqakufE`JLI)ZfSQk+GR&^&1F65B*Q(N*Ag#-4#M1>YOCVC<;q5t{^M{j=g`h(X#Y(BG~R z2gE$B@5Ar6RxnRQcH!S6UJ)Deyx6?Z@6Q|`TLku!@>=`wm)0yXk0!qF8NoUaPk+=4 zHZ}C@T#yU8X{|!3)*vwd!)8nD@WfzZfK3aZ>Qg74I+2Vg<4*@q2eaif8=-k+EFTNw zTtD|e_umrC|F$?=oae+x*^jd2o$?O)=wtGw^$dCjZ);6rWyMqXl)q@T*0l_`hubX^ zEfcNf%dRNuioeo-rHMv}>&)v+d{fLz{}uSV zu9H8szVyV4-HY9>0{!hH@rn0|_m42eSa+;@zhVxF1!69^M_>=0U2b-{_ObS{m*OwQ zYnipox2(6Ut3*$uXQ(4EMvXQ`8~caA^DZ|XJm@RdB`KjNeJRM5IQVtww`dU^CEuDOTP!x*!0}(y*)= zY0kRPUl^{3oaxQ<4!MUyogI01q5QSP2dxmS`S@0ASXY~?&F)rrE2XuW?^y3xrz_s| zV{y9H_D?h?ng_HN0lOe=;%0#!bDLoN>8LeuPkT>$#1PSs>GNCNt!{h2eK>!?#_)~S zTV3d1=wB0D6TIuc>mz>(6n{Ys+HcNp4&}es+3U>8&dPRlIyxRu<1n`IkL({>jr&e^ac*($mCP%dm1Qf-UeCOqK?m(%b}+G(z2Uv#p@&_V zxG-^N>dw@v^s015)G4e}*rlLL!2_uWQZviXEZ@3f>xx$vTv@>S>q+(``#!DFeORni zY;yzUB)LUv0Z-Rj{hyWl;<#dxhvbLkoBB=twb`}V5rS*|K%6J&JJ?VmOiI44%?Gu7=t)0=%*kkSq?Mm4181pYvjO$NgtuTGl zALb47Dv3v&M-=fp*+EvIe{c1+dX=5ZTJ<``p$?g|NG=bRTNv7-;617kbc?d|q<20H`%a}UQKj;}G+7}zHdi@cFHj@U=+50f7zDLeGo z^To5~vxrS|kF_VXOJE~CB{)S{KpqQ-r@cJ5Jb1!;!dvaG4r7`|yQ5uRQ)cK41C?uI zb#8U;P5({b5Cg?KiqrZt_h;@=#g&~Z4rC8xcjb2Fnq-<}${#O({E(<$TECPzBlZ^b z_L{eww|(y}`wP;<=vtPv)O+9ry9<@oX*SFKO+!R?qC}H&^^% z3%`ZmC*LQ3L^1C4y{dNAFj*XNKc{Og_3i1~(-(@*6Q3vEx8AqTw9mAUT1TxH#hHQ_ zb?l+l{A&K)!QDX@t-0*$_4Rh#jbHP-5*IGMXMcW01A!xF<1>r(4d zg++x$$--peyn=ZJqYFnDu1&5@4k#W_tV^mkv~Xx4Hd)HKwbstJPqt6W{ACbV{-o%s zwbA7G7#Iu;=7|2e{<#-QUMSgKy1f*;TnELDQQsZ4&W^dzrviTzapS})zHhv5V6Vy; z8RMShJ;~+i<>{|eU#AM~LVJ)k$RhUhW$~N+n@!C2ohR-*L0dU0ep8$Ru{gvt*Kle$ z0|d6VMt-AkKK!rNwtV4yAqn5nspHl0XeT@T9scax>@Y4CJA$3Hv*%^b%k(boUHZ?l ze~t}0KIr&J>D`lzNk%=zIrMe0{2_@TfO7G;|&z6x6jyTd|`iKH%T=~9ZVif zG6poZ8izXNCVP{O{Cv=S(0r%dJLRxDP7*h29prnme|Ppf`y<>Dp&fy~hn!^GL$96V z%+Vf2Ah*OV*`r(xw0p+4!?Hya zPd?k8Z3k9hO-xNpbxwCqw-?6*fnOIEU077PV&#gx(!J8e%rd7~mspnwuU|3d$707~ z-zgr1`2jwI?#h#bUOC5|akG1~yH5P-{OagX*)C;WWL2A6)=MxpevYo%co*3+1$z934)?TZY zUCW-7oRmz9m(7>Wr{hn@iSxlPi*E3#P+02;*7=}IpjUMFx_hZ06*LvtaWjfv-y+-Y z8h=d~-%k8g;zT0M;f2kPm`Z#@*Tk=hKWjW|yehB(HZz)$Ud9-sya{iMs-lWf#keqj zVf^FR$Dt39cme$F#6-}}YKXRCzIa|RuA$#o7Rt9$w?^7_M=9k;{$Yv^mE#Aq=_ydowFMc z63api&mlpq5&q`;1u;a#MBFEqi2}te6RV0Zm$?eQmInkn&#U4yfzEWVm@G8IH?9$9 zh`J&rq*jLOvOkP}7#||AT@p|HgkbJoS>WX!!!$8VEEil)nP5##4?+LsINJnqI`{4Vs~-w@2f@e`dU&?A}ie=I%_pNjXyWI+xUm@R%3 z{9)%fUoelHAn@;Vk16>=@!g&;x(aOj69q9u%+VhelriOl{d$1tAZiMkIl^PC)_P~k zWxSwm_Y}-6h$CPO#-GYL7l4sC)Qr(m@xj7c#m1)Il;V{I$_>K{qsmY;s2-I;Pa**VrycK zOnk)jiwz@Akk7_*4?Ahz{&fo_CsB4+ATL4PHF z4Y|HsAUBEmzy`+ovELH65w%(5H?cXy;t-!hyXKMa5`Q#95W_)i47${c{{x#CF*_Rt z;|Mlt;>3Ow8wBt3NLexd5Kn>(dPWQp-Nj{sIZk~+>@1DDMBqRCO<*hGJ;s)nf;bN3 z8Dk{J;+i-oG5(BCv{%|L?GibL%pmTL@1%013(C7c+8QY&|ANE&bV~`hB{}1l3xgdWEZH3P}3hX-cZN^c` z2-_{?g?=BEDfdQO0iILNjMHlcvJ{z4tQprsonp&=P!MND89gVS7Q~Z%EPfD-{oEUI zWArWJTRI8KtDC^KNtqF2#~Kv+Ha@*cfF6z zBZiZ?2laZ6ATEmjMobk%*M}_Po{5noR-O1lbRURf*O77PLd3yQMwC|@flMIY4mnBx zt155=5R)X=LO9OR7ic^5m#F{nntP|e(6*@4{eo*p#&GS#L)H_>T;Lq&X3YiT^JRkZ zoA%CqT`jmT+BNnNUNcTGo>K>WA6qH<8)bsreT94Gni(s&X3Bzd)E7MG`srKfo`5dNyp`V(J5F2tM{o_)BjrLFA!mrU zBsP$8B0i97K$oQr5tD}gN|^!2qm2;{$+h4U$Dh|h@%<#5V{Bv{8u4du3SJWf8LAU$2USBK%b1)(EeGj=z z{Q&KRI7$Avc63qdo%`W)#x0221m(kP`Vo)3rp*#JPdQMx=<3LB+BI_%9_b&vM|ts@ zc1T;`{G97#If}eRrZdK&V=+#lS27MFd(iQaLyV8e(I*6QmNATRl(xWUJR)zAUC5>= z7N5RDU*cZ*Lytm6&=wytEDaG<}%1Oh2Yy(>5YGL|aAYqMy-Tc;q{@C1ex7p$|mI;5f7=%91|Fd1#BY zF9vNMsb{W%eu*;0`_UiIsaL*78vx$p`}9ZpFptP5;P-r=^D%dztusa<6X>(VLi5OV z(~s%5d>+YEjvpO6l2MT?;*s*BEYUHk7s?c9L%bi!F22Y6v@5y@ADYRI>tM6 z3C>5G=KN9FP+s&~+9PGaeIX-|Ysd#aM<#Lok<8_D#s}U9%AI~hxj=Nxlb=&3e1~&H z@`5^`Jn3^$*+%`3>*G0njlN4iLsrw*&=V*t9=SK(qc760I38m`bS|!e*AcwtTB0@) zT?6ufbMigT%du#?yia*?eT*wy2j}9tXiprEvg5bB=8@OD&ufka9D_%WLtG;AgZ{xW zxj))jbnK|_@E&6?x-{qGT4_I&A$1mwJ=hA+rFe|$4p~oqQ9qOg*TlVXT@cCbsGK-1 zpYz9cN9DzH%8NSXchS8@pGUu;oT9SgH++{z%K7B7;rP*O&KI*G`+JtT-3Xqc+QZaXucSb8>x=jNl%4pL^sQqT})y zfouTkk@|w@8o9Qp{-|%@T6v#3<#*g8*U33J7iGfr@EDZ^pGD=%b#Q&OPtHj>P#&}o zpd7dc-skvHJLWsl^;1TaFX!VNlnZ^GI-m{Fb|^2(Dthmr*1#d}_?*w^|51D6w;Y3G z(T<`vO8HUOTs!p@BZ=(93toh@S&p9@a(QDcj*Fity9=I;rJ=cqTh{}R%=QW@6 zS)@Z#$6Pn(<(QN`eTqMh&AF(vsNZofypHOTw!^gp#{hoAeeoG^-zT@vs604kR3@}T z+5>F`Xg{=HVD1sMV~)cyX)ByFItR}=9>?Ij5RF68V|2|NgYR;UTr2m_ACHtlbnNJU z_%6TYx+0mx_0pbc;~by&IWE`1aVS5IMHxnYoU%riP+!3N(Ie0K3@HEbg7lBid5?PG zImh6SYvhsda*pV8+5zp6@sn|r`lqgud%ULoqIaT)MsrbgYMwKvLC*u8qXVL=qNAd7 z^IP;p+7id(xDd4~`cL#eZ4o(o^0i0z!h8HtzLXbbN!dp7f%1-I3hzYj3- zZBS;B?j6Zz%9S=sIn&OVBhl{m2%ZD=!D}8P_&&d*{Y7wWh~yoQQQx7j0N2NLMrB4D z0r4I5&M5S;4i?CV37#rwv7A z7PVU*X*0B==)R)97nLdH%9s|(6CRNVlzUVrd`?+#F0KJ+M^Sz8KJANh(T*eeLOn)p znq$(oIS%j{-v!Re_qea9k8}T&2jv;H8=muCR6bD|^2leDH)Riek81?VHu_E^Gx#pg zPnHEypE|j$DMPM{Yo>g;Uhd=M^5gnXz8AjBZ}{Vpy5X4AHP^xQb6wOe?*sQux$>Oy z1J2EFIbT$MkuDOI*~!}9E)}ul@nz` zSww9*k~Nea@9{bs4=86|Q)ZN7q^nYnz;Ae;vZP+QAK<>ZF0PTXisUwJnDL7-ZI3v4 zo)XPbY1h%%$a|DI{hc!4*xXO_M;Y=ul3P((QWl(_*OYZsj(nfr@*da7>!?lh7|HFZ zT}ARcDl6_4_?&y@bIO+M;{G8z#>vn59_7z>`TXQ|8NJW<|5tkd)62O&h_0Xe0bcVL z9iMyPIme_vfV$x|$Bxb&T`T7Yu7%%m-#q7Y?upNMjGpru-{HIbaSgOP%9u6_kzPZ6 zQ`giVbqA5{kwq-vGxsxzAAElylU6xDM)vHW&3(t~KhP zC-({NmG;eh+#^u7Q9I^&L^L)~E>SsC?*FTS|9@FU?IdcKlmXWm_4}wDQ!df_|Eux; zZ*IwVfp!$Nm8iXN+^8RN-@rZd9z^|-GT@$~w!(Fve7)2!_YmC&<-~K|=N_ob=scV| zx<<|yT?@~-KHziSkLrNF!nM#2qBhTWqPEU8bA4RX$>q#-^B(OHXuFYLY>(s?Z5TNg z>EDbIQCpANaCA@6y-=sXvEk$~mFuBSqB%x1-q8;68Q?Df{NMP+BEJ-V1K!71fZu>e z<~59yv|sG&v~Aifbxj#XZG!TM%8>W?qpWFXltpyCypHOVN4`V7M1Q=docUhVU%5Yi z&v7Do!E@RHMD3j4@ZIRQ^lQpJDksjtHAnSDU7vh@u9^FY#wX-7L~<``r<^0|6a0qz z=D0j^Y~VTYTjVEwoW9LtbX*=eS9A`(7qvUehU=pZ6T?89)Quu8h_mS^C@1U-_*L#cI(_c?a=t;cvoMODq_%F62WaR)Lrd)(a7PHChl0fZgOa zaiO?a5L-rEQa?cs4RUo5_lpmc^2Gm3oCkR$iAy4$l$-+i&56V0kyu}R$Fx&oXz_i+ ztAbb)WDve){F%fh;M*onn0%*cm!DS`=pQ1?l9yTZwNWmIvQA`G@eS^BS87 zVoX>6E{JdAm#x-JbqyMA@ZJM zL}MS#slt!`sIEi=tEpP$KV<$Gwy@(<2zg%@{9Jx zBliHDo8NLg?vMJXFGklIor`mGJscZZk1drrMd}lMpYq_`lsjd|eMEAWd*(I2W$dHA zXfOPZdZ+AYf0Q%j4IGDS=bm`v{9F^~Kt9r^kzu_ApHrV)7xJ3(a6R;8`Z2L#v@`A# z`NHprrALm_Hn={@gf>LIM7k_}pZq%X7y1v!q)k$<#D5`2`5o~E$U|ZwIW{?Suh*V8 zk7@rmaiS<(F3gUi-#@ocKB6zCm@BC++#z^D$z3xi`k9 zUCN{Sgt%SsctkMHAfMH|!#udGEym{0`iq~Gk&SrtMZy!532m7;SlSHZE8`px*F9J} z3QZ5DYb9M=+1M*;H<#1HJq6FrpBv_V{#g6n?ABft)&1)JbMABQ8``^IjB+Op*FMIR z3nv#YskEfh6IGt5GNWilQGcVqF->{d*|R$#+^m~DPwOg?8QtUE-UHsdzq zY|-uiI7@p@upZzS<&k2I&j*E_Ai$sgiEd+D%` zX%nxBcdLJ^KTNP5qlIvN*B=rL3CPEOU;MuKhlvjpN76^qwNtfIM~oxJQsq7x>r!sgI?rk1NVy~B z)+<-Y`PTW?+o`uxtWP7)5qV`;Q@A9%B>P0!6J^!2)w4Hgofm!QBjx}9Tbw5f1^d9a zHd`wz*8-DuAN0ZJv^VY@&K=JD-2B|f+LPl^?Xwuy-wtDkQ6g%Id$s1ghB%}gfOlx` zzJJ9Z+8dOy{D5*24E2V3&9x5jLFM@VS$i?{kN1xc5Em%N80G5+ez@oTUCQh9j#wy` ziBd67`KQoNki+PA&6S^it-sc1?}#~~zxM29y#xKXj`kTNS5{xGtNBa(p}jp>bK1%4 zv^mpl5MYD=n-+WN}qFk(f1n+b1b68(E*O}{3 zr|4G1KC;$|_{yfr;e5V%zIm5@m)*o_VhxH9ilcAb@89qLr+raYDqqhet?S@D?u+<) z=4b7+HwODbU2R=$-EQ1&FkW1uJ&~Gu&9u`&Lyxki-M5Xkjr}T!XU;0;HG5uAMxzD$ z@Ub4VoAwf@D3*)9`M!DP1g{IqoV9I>w10V4dkn;te~mGie!oU*Nk(Z;O7hi>6pNMH zjP?1%5u$&SQ;*ywwFT?({?vYhWps7*>T)!#@4cEiEseiSX4*ApeYTwAAT0?T0U>?AD)J*)RJWbDQFO`JYEbz@D z5BHjTmD!<|d84E`x;(lhGM2S1?ZhX+C(7V(eXvT9SAsT9AFeHiXkGf5qNn&yED){5 zJ;6NzxlWcU=L`EMu$yNkHwDJG3Hcv8h0A|tbNwkqMlLDXrukH4*CcEjPeGN zb6~dCC^3&gRv}xNbG1~SukzZDWQ3TieZp7|h76zTPxapytgqW4?o=+B&f;G2jMiQ- zS7Kf3(^Pwuhr{`>Af=eTp6HOPz|msporrvB>3>&KD9kEI?B)(PuG!+67RFI38$^?A$12j&OnU)EpBobitJ zQ~akm>oyuG_vhJSnD|NS6(7>RS#hyMjLDD5BWvm7%)^m`b+xA{dEc>3u*Tv~<%GRi z+%Fhok;7ZGMstDI+je)myE~j6&NpJT*6%x>qs&OZcpthSy5ER)LA!u82;|M!pmlr$ zwT6G0a^lhUM{3_VavWZw{CKBWr&tpzO{nx^%^z!iRq?BeR@zEmpSnI}6<7rm3MUk@ z7WPBsY2;i5Wd&ttWX{M`QnIn1mG5SX_Cz{I`=qoJ%=OB&F;gy?OEwZ$+E>~fn{~2N z1$h8ie^1?`L^6i07rWF_P^z|QPpW%V(=C-3bWeOw{B-3V>23Dbiu4+0ZIKqUjoHTi z+7pr-Ih5bi+H0Hk%)0;eg7)%&_keate9x<`TtdjD&&4t2>7g83iug!ed&l<=&FJCD+Vp=2X?bPUrgP`lkriUT=4{JH6fBVS6Mu%QMxV zsa~&kz1sg2|5MDG>L1fTraM;dSoz*+_f|W-;Pe9Y_6g1e=j`m+*~hiMmi4yZYi~NG zHq53=(j~dFT-klzeI8@Bi|smsFS3^up3``LE8j19a>@(V^C3$o$0o;E z$JSG@4u||j)CGCBK2rXPtEC0()!yo-D&ND`&esm*vroC3{uSs}A9)|KrJBe1ozh>uD7D)ji}Ka%#FY-9COFKc)P8jna+MTZ^|A7Zes0 zzNDOxdy{*U_m;o6{Njp>EAA}ZS@^#FzD@pt4`LsL`?a9!V&|d#p5~n9P&c$0^bM}F zM7ddCbzgOn&)7kJ)t*7uDGzNot;cI>G&N{PjYK`Go^@B^uEYbPyV2dihQs`yaviVz zp$7+pg90VB>mhpjJ^i7|iOBtR5o@$Y`z%48H2M^_x{1n1d|GgtvMHVw=5J>0UM=ys z_C05enIjqm4YWJwFtz+-c%8NV+R9MT!oO6UFP=~?hC$*E?R9l$?#|q*?5gah+@{<< zcb|)1$n{>9ye#>p@ujkkRx>V2UX)x}er5RvqA*n$<_}^``jNzu#OcY?lLN&g;(6nF zgZ*8QQ zLh-ova(P>JAjaQ@T9eNj)K5gspk_e3*euWq7iiDEi?omPC(8Sae5d@#$4O4mZsI0E zUqy$v13Rc9t`t{mUrFQv?WvF3$NgTp6>Eu+*^$|rqC~9Et=xq|L*m*9E5{JI*anOB#(IOfa;a?G$l`9Y zuQt%$Qk$L4k|5iil$%oa)_HCv<*#WVjw|=;t%C7+xpEB85g+>>`}@89-ZFogPu`ku zl+mfBKMwR6Wa$3tBJIYL68LCzp&bGgmsHW(WWbZ_+Mk=97-K;eNx@)@=- zY+rbxSSj8vc)Q?nL2d(b%ROK}U}O7X-OjG~uJ{b?M^);V`rDjs&R}=2dygm=A$nLnEb?%lE_w@WVq2AW z=1J#CXN)_>y+Ao67CH;VT&z2CJ915(rp^pOU!eS7@Luprozig3JLDbm7Ab!T`ZnW9 zL*>79%iOYWOTR7cp6Q;sKX-qQHdWoIZfuKhi?hymUwmKu#?+0eWyQ;iJC^TQp6tQn z3dR*2E<9W~OH>fu(%sV6C$CSUw=&mn5pNN$=SBbE98YGS%zo{DjTy?VA?_E93)di9LYv z8-22}@)vc^bk5w6y&=0iw>(!~dD&{@YUCcxKAL?$_r6;H`rJryj&qLFQ2d(xHG8@8 zU$QseLuC(@J(Ybb%RFmRVp0O#WVqIU?KSoqj;q zuHvksvx>T=x~8N?+SuEEQJya+=7c)skIs+Igpvs*?aSJiG3H+;sG~>40q1~2F8le) z+e=#`r|JlEg!zX3hD}b@g+&XCR;E^_0wo1mF9zBJZFDB)h*v2;-WT2%-dg3Nt?pJ= z2B)zuI_|=a$qR`glXm*u}K->0}w z@qX<`xkve7rpKnoo>s2BQQGI>fcAa;)BDqFS=zGnq2mu7|2g+_4%s~=Hzn6B(=78s z_J!<5f204f*27<*J%7=)J<~HOZ|pd|%J(WitYBEdDTz}Of7*ZA4U!F#RqQG@?a2+? zfcaL5lD6C=_B;C>a?b27-Cc@3p=GvZ_MhB8x#gMVnGK~IN)MGCDx>aQ@kZv2Ox@DD zp~JmeNwt!~Okw7jlHhhpc1dn9H<;flCnY(J`c>>#u|~BT)!J2PSK*V?C#lb&FQp-|H>?L+8nMyWKH%~vTyf^dW^WtS%zwRjS zHuK(Rly@}eA+(Y>sD*~KifOgJM(tQ+a!#wHirGt)4*XF1q4esa)kU9H{Iue9v7l%{ z(fNt<6ZFTQwQq9^LH;r7a&%^NW&BRqk8(%3$8yJV zuZn46pZ4^vm#LSzuk60E#bQ!sk}|cuo_Ve8wX&+ERZD*?`LU!x49^bFGG}>TAnWi4 z4NDJ8lk0bvxU1lO~N?Ts){{Hy#ty_3C@_geQ_o#LJ1 z55yjbeQ$nm9y5*^wUpNao%nmrpP8>W5yNuBas#phvRgA-GxXIX;#lTb=6ms#_*Hz9 z{U+;_Ic1NRJYI5G`H9F~GDP`G?o)pJM`Dk}I;1+JUM&A&d2)n(ll&(6bivaFwA&xV z(!!;Mm8e7oqQBZ*CSe3%Yt;y;qgLoi(q2N_%-n zU<*U9epwu|kA-=D1{ebje1^3}S-dR1N4^32Wn+QvyHr$nsyk~lYcu=Af8zAq>A7(N zS=>#qH}YkI`~SD}-_ndYU%6@&46O6l`OLLhJG?~ufuNtwip`4sVEkab zV7{O%k>{Aq7p7QKtU5*=W3%=`U{84VJxu4*`K`*&*urZO=1o1_J>7jwdrVtdE9{5o za5Q-fTCu+3J>R?D*gZu7F{W#h8rvaCyPuD#-4RIX;`yPsO0TKA^!Od(mIH(H4li1UY%xTl;r`&W8rD+;#nbasIa^H6O%L~^pbsKb-&Q`?NB=Q8@#1V!{<*f=4`W@hE@&+u8opZc0bLotGLBwc)v9U@7SD*^ z?cZ%|M?I50liS4%!Cuk-ihLrUSSw`GOI)PfU{6|4TK&!b<|CriC^fKEP)`e$mwU8W zB_9+q5Zuq^U~^DSJSUqydh0-Os(4m=rlT|NRld{D1iI@JxhHZri^JK&+4kb+%+HzX zg4}L+_n?#9V9|!h{o|&4NI*>e&yj{#l%t-9B_t{TqPu*9|SG7aId~>6*(Kr%668~N~ z?=KSA@X4h?9z<*>EBqB|IR$6S>afNcKqfWkKH} zKl@y9LGFUwQ_fS)M0cXw&+8ZZXYf1Xha0Q?HrV^&F7qyPk#Yy4Gb=@xb_V|`u_3u3 zd1>m>)G9&ld6^zkEz>R2=cdk0p#zcE(Y0N>tJrF8HIEy|!?t~nagM>9qo?v1&-=gq z)H*1q5@pH!evm)Nm$||_OT6K};l3-9VzqM9BQM5@f5mNLZ*FgHgXk^Vi?P|U*+ZE_ znN8xa>|fdO&UlA$W1Kh68=?I^?#|zxC#L4**vqjO;xEJ-XfK#?);MdGy~?hgsGWFR ztVpg%c1m@UruGSS;{|tYOz(#7ttk8e8K~`V({UA?r7v&SaPLO}|i{ux{Qn4_# zF!ikC}VW$q6GL(3}dTQX1}Te^xJ*&W%tMR!rf zsp35DKJLzuFA_WEKmI>Hu^99_{G7;ukIawEUdjng``lsgupd><(^rzOB(bI4BYs!D z$A#j$)O9Ixn;)}|yuRqp_`0w^U+!NX`aQ1puGVhpS9lBD1=7yPxI3Ml&TqNj!ukEx zxvO(=ab@<(Y^7YK9Cm`Z5ed0v12&KRmz3_hy6zw;ChdJk9{C< zAn|ze@#H4qh&lotdzSdu{#PZ^%f3ka)6;)98Jmo`vAN35JW*QtBQf&1H4)^>;yybm zZ%YH^ox*4Sj6l}hEMzkC(R+RUO%fBuZsjn>PCHlNOD*r0_s4tVWlbLL-74z3bzM_n z!>%B<=Cj!}zK+MCe_^dEiWR>>CBK{CrhOeTX zcv<-pUlO-#PjK!Zp921zQ^W(o13^da-=wgEFvoRY-mWB?3v9$)w7*3!vzJ*aB(kiw!q6W%Dwo8UgnOhRM~QJHu8>$j{Mm~H zv1`OS5a)y+^10Y^G5q}GLL|0``u`P}h8G0qX2!9D*i zKJY*A?-1y6_*jwx+4H>fyi-?<%8klx$!^I$>ObngAG{whz82?;^SfksEH5St@>_nS zy*)-GMk&lNt7596FIHA7}1U3_T?g;J(ZWP1CDMBuv z{GHmb1l{%Z;C1cP&{(~_RVcfeM@*Nmgm?>NHDlA6&Y8}N+=|>nfxe1ece%S<(JUj~ zj`5D+y%V2xk8w|EgP&*5vl}KFhWCuHBv*P(fljdB+;5_?ax9^uN7l`oPbE`5N}- zt%_;IPQh!|L+n!yVPwluflRnnv5{v9WaS5fw(^spPvM)NF9s;?j(&5x_Ccb(Y|~yq z^danAKlwlTDdo*x;w|yM6ca@s`33I~v=2@9+|!hw_di7`MQxy0nEEw})ndG%jgcRfF&91J^b@Ct>krVK z$gSK;aYu85xxrE80Hhr7M|aJ4&C`eWihB8a`R(#~V%K+eTW2$kdb*GioANldWwZ63$ zCl-hEn~B=P2RqkVYi*dz9=Wp3+Gc%aer0ZoZ;F#27aItF=nKR*so87w%4gE@x98Cr zj%r_k2l5Z-lda*JmSy>6c|-J8OfvDy&nedBHu007e70#F2Yu+){H^(!iuElPwwR?{ z$H>^`iaC5%{374fT0!g(<1soJ{@c2O@uZFDEwFW6;a}k|QciQmp?}QLnPVzqQs)aAbXJgtC*dfog}`qVxnSVy!IQr z!Med}r9Ao{TOV8K9*nJW2gJ4s#x&&Q7r_@{&giEV!!}sZuZUBmZhH!H*wVhxHRy-T zooXu9oxe{Nr@UJb-%s4sxdOSweAp3v1#RheK|E1E@tEMalut*2d}Hi;L|`8vu4sfn zcfUj|_m<0|nDExS>qA=`KBpDV3Wt97Oz=z?=RnNE7x^#p*qoVbV2gdxd{I59v3W(} ziUf0tnu2+KBfF7(UgEsOjmaC6$L-_c9Aln2&%8;r5%^~rm)_HUUBoEdq&dcW%2$u< zXMAapZ;;0hoAtAP#eBv5yP}8qS6nP8FLHb{hVNH2K4Ua8`ZC4%wiUF;OBBbA{HZ3c z6w?(qzC&QUNGs1WGTs$@emH+Pe}Q7)7b)KRp!i47Hhv9$4P&u(`a6{w{~CXtw=Rsg z>hJb<=R5PA9rA^46m_((+fVLK?kmA7!64=EuPKm?mn%m$F$2@AY1Z}P9wE0`!V$!D z;3sD+8z#1j+1j^Zwl&+TBL*pieWJ+#@oHepE;602$MN6pZhW2-?*G!B~zj5n04{>xs46yNvlPy71LPZfqSb z9memoCJX%p-JqPnSAp#_CeVq~0=rsVG*nFNTkcybt^O{tUr&jB+Hd0u=L!dV4KZcA z6q}E}`Hk?(dF5IfEsefbU+WY56MMI~F>zy}O|nh$Hi2(yV`5{tH_>B>#}X^;mG&fS zl7-(H0W(4Dmj7h5?6RZe&pk&hRz7gX^cNK?+DFg_#tOOX^PdHu1!?(4_^g&@}q@Af-x%lAw2>kun>gGA~oT=Va4?PsQ zfbZ)oft|CuRo!Z$eSvU9R2D4+`&A4V=ZigwJ&CVHTTxki;VspkiANNZe?W{8XT;Bl zlh;;iMktp**M9fZGvgX^rI)x;P}hu2P4Z0?8G2{_M!}fHT%nTUpI;V_3FZ&9H+0A& zg0@3^1!JnFwPC(o`Yv(S6}3i%`eHuDoP}}Vpx7lA3d+8s!2W=L79AXYs)5+2xV}5Y zdT+f}30xk|IaVv~yoZnr*%=}z!=s8ZxKS(?e`pUlbP)PKYpZ@0L*$q2W%aVqpOij5 zIYg9*)q*`<*c%6%0x>T5{F~X$?5s8$X)cJfxL+KP9gneQkh;Nc$^A0sGxlF3o)*Mt zAnTCHv^V4q?=#1^TzegJP3*lu8>3yBf;NS$V|@+t71lj{qIG+$O`0aisXI|zCy=S( z*rS~D7YTGD@;5J+=0V+3FP1<@sUXm`>9?!3&n0%MB2m|?D{E8S!*)DebQ3Q*FNOA0 z(=nZ|a$kk9C>W2ID^^8a#-%ObvnK9jgZ4aq*m&63VsEkkO8%9snyRW@&(BY#_4j$| z^VDH6K%AO9HMG^-k+>tV)LLrIGH03p82=bu#2D?t@w;;8qjU8a^ryd+*B$vMQ%k68 zf2TO_y@K+~3fc(ehaF?N_K)~QApeO+P>4gmP&t-Q6X?&B9Xbs0PsGh$p?#q032a|$ z1wIM@#<_*j%8G|1c^mp{>S7NWo zQj?Lk^R23BD#oqVzAhzHAZr;c$LKz?Keqm^I^pzoTvTQdWy#K18mD|%TyL) zb7OPNNt|*{sDJGV_Jr|J)soecZ3@~Huy^m$#L@)qwrOG0!j459i{44UlOB{Dlzh*A z&)zEVg<~7KI-6QA`+$zox2eqaEIdQXiP%w5~ChCg~ z0=@edagq4l``tSzn7dhGzq>!2&mM7(IHxNHp_9|e8J`=UD=)@6W1R}x*9lwYn}YWA zuVOc7!xd5$QeP*(#;uYZD`pnVEI=W_XM11jzSO3~rbN!p+2{mg?XmU%F<*X7#(Snafz?wQFm zllKbZ;PHPIqzlqdiSJY2r*?}k1b#sFvum1YnwVx!vkz!*Q+$47jj=}ic>DMzu}fk@ zm3si)XtF^6Hx*p_s{gA0rdEd_GwIJ0+zH`z?s4~oa`Q*6zxhsF;$7k$5crT9Y2P{g z)!3!6F{8t`kiVC?6825j03+KkQ%uIaS~quGJZ(J9^whY)ydjLm`Oy5(94DBs*y2jX z{Qj!=a$*|R#n#0-i7v`l@SNtc%-gB|0l|P^j$*$LDQ*inzsubfw)Okm``q^8a={$* zDZyvh0=I}VQO&F7)fSHHFeP)(QC!n$qPdtLuqj`uJuQcel$_tp57{H_%h;E(#}s=? zpB}EYL&NRiVO+!K$c>HE^B7Mxn}bo%LZX{t2EnvbtiU#04cU5Qq9Qlm>6rFg8K-X)eIBs-%Wb81}UmSK1yIkv)0$t$@?~Krg z_m|cJUEp7!o!d^ASKxy%W`COY+isd~8qVeLLsr$AX6%Zrcc#xz71T}VSm)RY!Jgs7 zS|g)g6~vYxyO3|4CABSvK1Z8HH^2_}aPV+2LcWRuah-Ra zO1ql(j{M;rL{i{0zF3SC4~usN`r}%0rgvuO<7w@+4%dC5U#=C{F=e9j3jIRAmAF(q zCWx)Wmc@P1e_7*=ACedg=FA0lLAVDs@u?q(jpB$Hn;M&Hm2Q>Zm)e&aFNkws|2~Bg zr;vd+C4_yG{e$^~Nh};blVP!8G4}32Kg6E9Sh0u9RnHLEJ!n&l-No*FvF88a-VFKH z@WuTouGfBg^F(dM+n3A88e@Oc$R}#0&W9oWtxK599Zz`IJ zv&DG=zZ-4uZSjhbiCn9kyNCYddVald&B0KAsCEwD#pJY=9qYPh=g!{L=c;T5qqn^Wyr%^@(W$n;9`T#MSV} zqnmIwL*1CTM@+US+pDZq)(eWy``q~4V6E>ot-m9;2xAcCTuxvMdcl7o^dENDeu0dW ze+lFSu?#Z=^;b#j1}2FT(bw-A?)BVQzNfDR_UAc*{@O-s|L|p?fMX2Bf0 zORP)mPSI7M<9;TP!_SIIV!rr)Or3X_6Xo~zcV;q4Hd}!Oq*oE83euEbR1^Ub6cuTL z6cMBds5HTXfCUs3>AeWjL`6_Kf*>GYl_I^@h22dyJ-qj4esW#!-hXUMCNobx=RWs2 z&s>4;Qv`Bl{?*xx4+{9zca+1){`Qi1rH$fx;d9>-p8OB+x3qb+c(u4GOcnS)Yx1es zDJKV|a=fy`+pUVNQpDs^j6OLi92HFEyuult7TB-hC-AxPr6&sbmvaQTLwKL8|LR6O zqB4-5DeApu>+BH@Zq!LFcFW4qa}3qu7oZ%u^^;a{B%|B(=} zB2w+W=$w0hLwVL^gyuSDgBa3g)zm32>{d?d`$9v(7WOGm`cL6I0egvc0^bU5gmr^` zyM@5o#JugO9KBx!c+lNKg}W6TTZP=~mdanojyxz34{0S3tKTBPHC___5-tb|vp8oO zW=pTIN7yKQE08<(g5VRdL-7;w7vb-3spiH~0Y0OnfZtzM_)E1A@J|;A@VW42bA?}p zWde3S`$LugfE~oW6E~+1;nIkmR1@Hn@b`}j@IAyN`AqD4_<{+-I01hHt^i(uILldq z_!U0~1!~VwM}jZ>+g<|p5pY!Fa3rk-Y{C)(bDRCTo-jao zTVS2pD#QeMuUCZ8!ZHE>9Ik{l5zda7a93fZfbT@zq;0}h0iGG14Re~`mk6H;%+L1) z<~(O0junOrLxn!VYr;zc{mvOMr3BH{PCXRb7mjeRuuI^6;9i((@K^LvF9F`GiGZJh zU4^k27vK)73;eIIK#c7@fxg@-Fkj)q{t@so=vQJT{0u+Dm!wntKbLs6llM9g-ODAfw4iGeS$gfH#11z_y1wpwDT8 zzXjTyb&mGNx8^(JgMAn-4Gx6)fltkR`Ba!I;JdRn@}9{8J_CP)Yx_>vEU+i=8MHMv z5^YsMC@K)Qa(EEcgyMb<3#_e-h3x|4fxlf8;E{KDgHp#IyMueO6i^rfmy}yZ={r zl<%x*j0gH0tsQ;KweZ0i^Yj7lp&b}=*r4Gp0UxG1sLBP&CBfxtzPFM@*^LxL;#aZpW^p>U~l1>@E5rc`i$|( zckYkA=Ck=S_X=^cS}X{oSTV837wt87*_UsgXCLRY0rUI1z?f|;&{wn#wix#f&%&D6U10xU zpTaI>o}qW+i#3wZC6>Y3`jx=EM3?ZPK;N>D!4aTWLaX(Vv|Ar4BE?#TkM*kR7UJ)H zA$=yC*WtwB1lrp9#(abE@wxDr@tC8RW_@Bk$H#1 z)wp8v4mE}vthH#z(7K{^pdA(&iwxps#2k5c<{W$Lc5}N)O!RT(-DA6Lwl-VDN3a#p zWet*U`-#Z@0;s?KbsZ@0>)ZY>Sa^XBs=KGlQDgT)`_GvN5vNY?TR#^xr3L?YETQQWmMEPo%jT?Zcpe=^K9%yrIx z&i|G2DX2F9N9Yk&dRBUJ!Z~65kxSCz4$K{xi%@u8Y@V|zu$R&gze>l~JJ36DQQBQ> zH8>>vwsP{XFX{~M4CV3_OD>i?KQuqINqU&_>E+W4<`v9io!?{cu^*IHsY|d+@Ur)^ zx2I}2<%jY^2VDnU*i7&$ck=G!%}tw|wm~`EE2YV$JqIf9`$zEw4I>RBn|zym{X_jj z7j%*{{@;(vyFRb@awEHu4Tt!)YFLc4Mq1>+to5(;6K@*i8|0fOzjR7yO6ZJz#wJ)a zSv7OW>0}?>lfEatz4Ab+$EwH5E7nyay+r!I;eW$J^M~e>t65j|SU&cD?0-A??c_7k zlc0k+ulh9=!xh8-v;Jo>FUEPsc_?hr!{}iYl~Zs*+6?$YkvX}i;^`m6fS zD%YTNymWlIZ@F)>G`8@puX|tj9tj-@?J{;5!+pbjpXPs>|ARFC`RV!T+d|ty$T9l#u8$T`&e8YQ_tq0SvwUc5XpHxCP>wNec)zqi&-J8dAwK-x z{k3q_^@qgoUU2|Qm<$a@lqpbJTrXXRCSjHFD7Z!fxqsrH4sd(IH zp3gk)ush7N?zQ$>zo>pKw*7k5T0&2_D|1)oDdk4L5qcw3D5X#eW1^;FW4?$lLM@Rc z$^&U5;Ol&)JjWB!6H)d}_L1`O@^SRH!<46uZ%KTzzo);aL8w7!uktcmnXSyaI`bQQ zl|(7xk$I}6_PXkZl{QP8+Y;LnXq`F=j0gOhL&hQFUF%(|MyN(;xz2&l@#J{+ntRO+ z`5W@%;dq!_diM2i{ond$>m2b>-ceq7sm;O&dxXs#*k$f=IEV(~tKosBC_fpSVMS;~ zsFAOckGT9(fu{ni-K*X0lG`O;S1tp*R$6LWD)t#;lzd>G4`Sth*ZofI81}<@Ry~U` zcS_p(s4MEas+b?V@qFdxF-PEOpY}ZMi6~HeMKPRp<~nnsu~44xaieRnYjBG6W|&VbI3*TN6BRGf52{*L^b zW=(UEy~w^ExE|OiUCHxzpT7%t2*=e)`8e~;c_#c&VS$(g_SUr6v{*l#A!$*z0wE)0JZC>=le4s2^|bm(UxTf|IGG?#$X59zhn1s7oDvSF zfiyt_r0985b@15B2HYLsJY!eY&N`+zaT(S7nWB1<#24qO4#s!ZcNTmw`_W=^vDsgF z!_%YFqb;T1A_u)zuvU;c_k-&P7re(Xp_%e@xb6mXgIQYot`(};(b?#1_?4T2uM2-r zELtoIzXHEcyyz#@l0dT@*Vm=|OZi7tE94`^zKN3#4-5~WBZfO8KANl=BE&OyNx!yH z+#5QKt@&H?iQBd_+8NBArLyKC_l4_gv3h4{=oP5q|hR&wHLs zccz;deA`Id2zDF$$Zx9Gb1MH-erKI3%-kTShI$={bUzAz6h^C1z${=AV>z01G-|OUBZ|+p!yq!l~=tszBWz{&b#KjCUIzN z=-gOt>>1UiYvOL=#!q@M^k9f~C3loH={@NfKN8^G*e_oUy%@ru>81Jt2UN=n{gFb! z(RZZLWZ!LLv@uGkj^8!q_muaR_dY5qDJ_or2x1?oRQ1bT1joD<$>@m&DIsNtcXo0H^teG-O>PT_eOl ztJqcS(dKCLo8UJ=`2FRo-SM9CSS!RU=pe?s7Wo=*)5LdH8>T{ad*1 zUaEUJU+63BvUXYPjrGR+;rGLE$3xvi-KV70`YH5N=rifB7Tb&MIj%V_o{_lNQqNLP zQ)vaagtmm37meJF+$+o#=Hs!)9sX2Ht+mCy#Z5ekoH6p5hb!OiDd`;_QB9d&rG4LG zZLxa9dN}px*eCE)9uVN9nLmwHzpkPz(PyQ>x~V+R^@;TfxYFMh7f4lZ-EY#zU{ez3 z$rT1F|A)Q)X!L0G!N`M=S!N0&xhPT1z!ajXfnutqDmy&)LvXq~VCZ?rgkl0x1cDmi%-Q4}0 z>p4feb-})1k8+Q4Z%}SF`e!uo8|)3r>Z)g-QY?@0wM&5WuHmZT`bl|--33wXCNYVD z_CT9hc@Y5(7M)0-)e(VygZcvp1b9fax1n}WxI z`z3~sJqMRRMPSdJ4eKvkG9)l(;KH%jibjh@n<;X$Ke|8qq3YVzRgD5-JOnCevlJmC znh`xC)Q!}QWGUZom1;jQ-}Q1ANA}+#u`n51sC?Z@+Tw?imVkwMo;(LeUhg3!M z1E;Rr66MzsCuc1zD*UcG6K|`Q8S7t3K}%nL zCG~dt?etFzeOhRFk>y2J6GGbD}v>YTaB3TnQ`= zEe_4EE%za5n0{5>N*U#1 zeJmY3u0l7} zew!Sf9IYf>3hyrvE)eb*=@`iu&I;R94{xx1!B{jFEvh=sXv?3DJRKROI#%p4Xt*wh zE;=wUzW(FQA8)2h`}}S3Z;RI{S*PTpltn4T zd8y6%R)x1JAlhDAU~PdXlb=lXDNch<3?Aeu)ja8&-#35vt=+e(Uaxw6X5P#^+7oRH zu{=1C37!d_)df};_^0SUMSBYk3N|Q6tiP4=tkE>0t7RXnY_ToH9R#ul~XIH{v$k;@=(gNsn4eVmG)QK(bS`0U5s!&Y06TB1TIg1E2gEfOiLq$X6*B{S2p7*)1J$HNVwmaMI)Df0vFVBWA zxLM|AnVsc!mh0l{;v*;fXwjoZ*Op&fzF4_p<@zP}OO}~qpuu<``+;os#2rG3>=M}z zUVrfVt&6uVmd`1lgP!Y!v=`D!CYMZp$NP?#`c;jKG%m8K3wGRRx1mFdjhxm)=N${;t6g*Mzy`t|Gy;$gCA#{0J zt}GXIwJl+UYVaKm91R3+1#bN#G|z3GyCAqA2!9W!Lo5Q@^Fi-}-k}*oGn5LMdCYyx z{giSXu`BSY`biu3i}DFG@-y-u3_KWU5o{5}Zk>~uBUbOxgtnweRy5100ShPDUE1Vs z(QeTngFgmG3g}{A3ceJamNzYr!0Eti1Fv1qxtudGZDN}Fp!wkYrQa{DkM*2SJ)e5< zzKi$Wu6VoR@iNED5Hr25npInFZn-)6+T?4;LdQbXVe4|O%eCc~mR~AFT7bp9uZ$^uKdlI;8R`Z(R7Y1(zZU(4jRWMjEI5vN5ezrf`&wY&&xK4%K3b|!&m$_YB`H<-a z(+ifZQMN`}#k7iWIP22ar4Py+lxdf;OYJMMuLL!#R%WlvUVmx*rT*vopQ{_J8?2O9 zDNoYv?6rAo^N!^l%X!-MwChBP6D2N`zEJx4qR$sSm3}IHk8h7}e)|0M4h1?CIBlJ_ zsN+-rdj0FWFYLb1|7QQ2ujIax+cwZP@VAiT&+#8rUFcWRUP&8QWL%Mj#TFL3n0_&R zo^PJ7nzx!4n}OWx)#26QFK>N$i!pNH`i1NJ?(DmRE&F@q_ecrpP0+CI_3rgv%)FSX z(pH7XXO7QY;#=ZtY&W*IsXhR{YNuGISgv&0$Nk6s6$2Fm)OGnZ{AqZOxGH>Za-es) zcDeAsP6+IY=y{hZpMHmG>L{(_e1Gv55y0|=STxL+dtbsD0@)$3qk{b1OImA)x&S$w@?!cUu~&x zsSl28dg}Dl4ekwY_;>tf_#L!;j|#4kE7UvOJN%;1S$W9U&Fkh8&k|3c)IO=FJf}Qp zbapG(q@9o|t@N{zXCr3=X9F%_d~ke_ef6Mn{>Yah1{V|1jg(f+>DoqZ1AFhA@HgRR zp=PR7St7)G-Ymaa{!sr=|E0jCz_0#a{pa$|<-t3`y=Fa-^+3rAB`Z*?lOPE7K_(QO zQ1J62pBH&3^iXJA_PFf8wZOI9%ej}o2z?R4CweXawftt`W?=#i)Y$8r)i>*4@q@+B zXPwU)?;Y>mWN)(FLPgboC3e%x-^)Mo`o!zs-1z3k&D@*09|b=Oo>eV)Z0`oD-;Q0; zDy>x-dnfh&slAG(j9A2M)vTDS+8Ijo4Y23z%--p&QSfWTWb3N7-{aQfR&94}_k7=c zU+whT>HX9Cr@;$nnOP=W!3x!;IH^3mCBY@Z3BtR=hsprnt=!8utv6LsZ;1tuQOZ-w z(c2!BcX68ygs;IRjJ8p@dA+32<^DJr!{d?!%JFnb&<<{(*vv1zYxs`J|d^+6F-_XxGG$%AC zG};(#^i1oSrt(8sOA9S6M14`}(mw8c+_x)vS2A;ALu5l_LC%7lhi*S~yHQ@FJnFEt z&TpOnW$?@3;n3kwmAh5$Hc4)h{7C8}siV?Hr6EjwQ8~_AJX<`UxIb~vvSwLmX+8^l z7BKvV|Ng-Jj-8RI8WQ-nomJ}u+oiSL+CJhvqD1ez$senJ_&Dhze-hrd-?js)u~tI$ z4#?Tw72W034O<>s9(ptSW^|qaA79ugEY{<^(aqJ(1>gI!fTjiwEHQY|2eFaSk*far zv}3#aRG+D^&``J(zvSc;9aj8lmVp2Jgm7BgTr&O~)B+L|grSwXfmO3qUddl>aY2ImG{L2Z-9mD@$9$g+ip!_VQ zV*4iw`26_s=&|1v+T3k(x0LcmEw|+kcmh)Ww(wMNS8xw>4RoEi&RcnAo>^4qkl{o0 ziu7{o3oQ>X4_}U4mKQuNvM9VLjJ>Qa-HA7CmVUmvx4PHw_Pf)B%ffJBziOqySEDCA zAfWpjt(>vr%Cm#BXR%qWvqJI&bP&WxXA8qsZ7rZPameMUq#Rl_SZjoz1-R0g(myv5 znkq*C-(O7>|4DWGUr@gF%-GD>6yc2UvUKifx{34R1AguL+EqHabnb~ ziZMWS%`YkMs;P8ln+2|MQMuVUW{#u5dqB1C@Uh_+j;pT1V1YT`Mu1nSBLsvIs#i@s z4u9`=f!Zb1h8pP_>Ds88sL$w}p@RaX3D+h@{E=#@6VqUg7%a_Y&sa}KpN5Yd7O3Sg zK=_~ZUgM-AB0d6-j&Jsk@Q?C!`5Q4*;?*+}GZNnkIRY_>$;waIr(DGJM7oo2No?=D zVy4>!^26}4;fdj6dL;F5;=b^{=u@z14+)5;UK1`WD?KEz)}gUMOT*t)Qr^)qmQ+32 ztEz*;cjCVI;1h+vjlUIbQM^Tfd;CkF3)cTn zv%6iI9k_~^K%9{G5TB46zMu@|{B`g)(Np2@Dj)sfa4zW$*x$A}f!aRX7gcg99A?=HXgIt)O zh2I3m2)dSgdLP=4I3sO=9+I(uR_ER`qRH4Ha4*9IxEu18(6PYF5>G%A!u=B~_(~vF z4u1uof|hHoz`eoq@Y>ZnHxRwV908uLn@~&WDR8gcJI}%UiS@E3ks}5FPQ0JI6Yih> zz!&~WK##y&K}&(2Zmj^{gl2))qGy1^pD*y7Xz{V<(CBOyCJAWF89y%x_?&1VWD+^& zIig8m%<_Ej!Ca5I(?CEE#JHd>xPRIOE*fpjJ>YjfA)xu7@96`s4ZlR6Gw!%&+L`uc z4DdhfTKWLv3e6E?fO|&whn8@kutz{2hR$uCz&K`}qk~~?pev~-+}~Y!SE?u{<A`iypAo^KU42xvZ7vzVidU*69%v9^(i$#|umxKHxiY6$Rpv>Erq zduTiU&ppCHGk*CTcu4w!@y=_w4!>jbac|rsuS18!b$Bn&z}Vo~7$=Nl<_KCE`k!{A z4d^$n!5pK{xnHi$m?XaxpP;co+wmE$B$tyb%=NDdj0^gfF-~8i^FgzOzKHfB-p+l~ zw_Jng<+VH`+9zJaeV-9%L*@(bMgK#)aKG#m+$UeeA8A|G9_|HAC*zyX=6<*y?aEl- z^Y8`uJDM?G!~Nt+Pj*b;Z@iXgiX^cC}mHJUzUEo2U|ZWH^Zy$=fHU!X~auVx-o&n83l zGMGceXSZq$vgVk=7X8LP1IPc1z@Ew4 z`h!4w(npLJ-p6&=3;3ds=ufV}+D4o5UarMD$Jk}=b1(E8@8y2!H`;_Xjj1xVO|H*t=%+IRF%SBLvBG!O5#}`OBenr+EBB8k zlsU*}G4^O@<~y%vzr5G4e5XxmbKcMWv)<93yq~$nHSXO91a!5+hBuolop z>}j;~z4oE4=wtR%uEA$A-WX5ZKVS?pSMII3d^T$!_s^WA%^4qjF&AhLzVjZ&4&#Y7 zqdj>Re&(J4uVd_U@3bBBiFrjFjrq&k#rS0`@WohQOtZ!_));f#FLRaa@Yy^&&%nC%2FB$MtASuETxMR*YTR zl0Ag>qz@QVypA^DJI_J8(}&zA{lnVDdcl}tY%zBDnP;V~{{MN!dudnNgf^xh=?`8{ zyU`BZKfm)ue{zpplk0E~yoYOWefpXA@qa#>w&gi!dp?_c zhkI)adkMZ6YYF$vGqK*YC$X=dQ%#Jjs=Ywm@P^Kl$2Uh)(;N01_LDlJiO>8~AZ`kugD-{;4F7}%I~i!ZEco-jj~+leW4fQy6E`erO0)frE^)1Cmnb6>)nm+26@5c zcj2SE4YzSh=Ob4zDo8m|$vCK-xN6G#>Lb7#kQ+zroa@v#>Klaw{5||K{2+3RDoB^S zO;;zs2Hv2#a*2qglSj5x`ed{Y*xcM7wy|Sti(CCzIsMo`JS#pf`wMe|HG;lo3^5?e`k34q#KXfEq zkN*!9@GH@q@IL0?fEPY2V(G_Xai9f>s!`+bM z7)?YIFDrilo&ntquSfR*-+J%0%!Qcp+R(VL)>5y4`{On68nhjL^fSU6!e{|sg#WRQ z;9HX?$l8bgg0^GNqmA%e7_+oB&(Hi=a(9VyO+EwLi}A*M!rowQ;b+={`On{2JIO!f zvsnM(7XY7&zfOPPN0RG|9mDlUCyjRa68=YCMP+I2*&DGf=o{uU|6_f`R>8kxTyxK8 ztQhyKGcPGG;NCc4Zm`etKDZI=f_rluPU17wuSUDeIAv_038Ecn?=O_!a3^sm!FX$+ zx(Po^v$;mO0lXF)lzZd;`F!>j#yvJI_B?*qSk?I?H-xo>K1h|eq?dB~Sm$O4^apl2 zYY6r)8ar$!#yRr?pPall`Wl{&cIMvUK3K=Fo#EzK8yO?(rTKzOV%=o!;v;pJ55PQR z4a3HQf5G2^S7PnJh9bX_wGF;BByg|fJHmx9mTMWc4Aw0;HlCmRW$Yy@ev1uG{vjHA z`j`9__TOnjw(3jXRILqiAzn}}ENcV*`&}Bh*L42J8e@&YxMNLWKC^x?|FO&2hr5aU z;r_@yfsppXey`OQ|P<3US3TRQ`*-8rhjl59$0j&zT zBCHW;L|J3tE#SA$sD7zeNL77GwAe?DqsDj2(QaZjvGR;OW2N+3=|Tsgx6Xk(k#xdY zBe7o@?~KJh0(q#+;at_3=`7?6GlfwC_j5~pGO-xuD}Bdvu`jbnG6q=7$Sq(^W-S~i zFs9h6SVytJS&PmH-w3QXtVOIPZh?IXuJQ!|{V*IBbA){c+lM`cerBwro$agoy{n}$ zWL&XN@HgfIJ`Ofep5g(lRpV4cAD#6J0@^cjUtSX4Rjr+%&`J8lv#Oc*tm>6LAdve% zPv|c!6&4EU)^-Vh3WWvY#Au+p>Ad6Rs$=n;YKA>1lvbUA=Bj;5U(@IC?Msx~v`ZTA zOUm`wXYI3wB@at}-}}C|h1J61?AgOQe~bFG-*~?9z-L#N9)|O8_>2;&DW5Oh+>6q5 zHi|cj2UYuUf$IOG?_H+2_gLw!7z?bA>?iM=@0;v1#0i>8Peb3M`Fue&DAQE=+p9qI z&*sl&W1*+f(|}KApE#o2riX;D6!)2;xCe3M*HuI2tUzpJtU%4$D$3`cFK&-{-b5O= za8fvFjLsuQld?v5N@r30sag-&$}#5|<_g6G<^;8B(3zplTqd34V*+^#Z>jcPPAn(3 zRyqx8;V}lV-{uQ0)8(A`@Qm?{(MQ!h*n`UpWdzoWCd$(y=X#$s`gF1}tvOuhMoZ@qm z%SFbj#{CS{s=BFjtkD`1OGd}vR5hSf!Xst5P{CKhN1GEre!=~MdzsFw{Y&^qb%TaQ zhednEdc}(Be7jE4JD@|qntwGP4I_F-Pr{R6{byd_CoZxUIcLER7rZQlN&KYXD8HBU94%sF9LIm_!!qO zqw{&gR@kbbvw8m!E(tsnbrUBm@14C4djVUqu|VEgUFk8esusoY=MvY_F?Ab zZ>m@Hj6mBAluo0qfHpKEmJ!QRJxgp3)>+3U(|cIUvFWf4j!O%4C4R-Jv+$bgto

Q||AGv;PcKc|nYkLw))`+~VmzkU?>D9~9tBJx@|yRK5Sl2dQ&X5?n%Vb$Mae=Mpx zjJLhF9j)SY&vXxU?}!(2j?F8obB6{U{rUR%`Z(G}a@NpM1%iQKIiYrb?fjp^KZon7 zhSouWb&dU_tJ&2&Xdko}xEHu@{0DRnnZg3s0#^y*+M0ii^{{FQ9Tr*%nF3mw`oibZ zY&TZzsH=*<{gL!Xl2{jd}(vvo?%$M$M#wUg(Btqqs+Kg9wWS5?{1_HYx` zPFWIO5++8#x`4K_Lw<++NqLj<_UG@<$4-7xIRR_UwI+29sb4eOJKK9A?L-=9x!K8f za#__Q$3ARhwlT?7D53ff|5Kg&M+1)rD*G$@YlUj5vfRW_!B|13#^T%3HWPb2tbBr* z?wM|Kz~1z{=^=NA@q>n8nm{|QQ=Lbd-_fh#t5Q363cscLQb(2lnWyu~zYuURpHmH% ziK^vt#5!W3<^IR|$2r%%lFrqhsG4X~RX?9RN$e4HOQBdu3iw^I{sMDmpw5+lT426! zQq6X3$N|Oxd1PN151S90EA5qb)s(6!Z3O1_U~{mEZONXG-J8(YCDq^>798g2-JXd& z6S)?@7XLx#aepc76qwTws)mePLV`C0){ecgy-vR$)|rB6v#BrDSNUW4;e1s({Wg3< zxsY{Lzl-&9L2Ns-;#-9Z+CEflm|h zlp0E%ESyyxn8VU#9L_(S-&FWk`4UrtQ*_$p>LB?O9ReK!hjorI+K*qAlNt7feNj); zgU*pUKMy58l-$eP%czyBS`Dq<0&DGPp@GhfJR!W{dc(CuXPe+dZdDDm&O!~Lmhi3WzdaXuF4A9My(y*| z#kZ1fB~3ObJ7?@+x1d|!BjmbrUFC(UI{)q`N)IlXSj}1s%m~n!hq><_cqWfjdr%##RtaFRwi9Q*gRBHAXZWRpR{Z^G-U9YiDwP#w~KLK*4f7s!TeCcG#xm-?$t-KxZ@1i4%3(xJaE zyl%ekoF}(J=Ls}$HE^-NR1}WbN9<2kGY8+~w(`Qxs-EK)0&B*k|IYJakHyX*mJ6rT zUKnMLGMlT8A@L%36XyP80UL0e>XI=QzYqmzk~j(>Z< z>a^k;;g0~g8teybM*MI4uI=PFlu-@S<;p$0oOC(qmT}9dVb)M3-=XG{)|1vVu4h~& zRZp8djMB=@rWRhZYN4{Xzb;@?y{UYQ_f@kLzlfN9vUKY&MPG_$#53Znl&{O4!)K$< z(7&yj(zwFSZZtP43x1W8)7e@zvgYVq=Vx8dx(4dp)bFHIlVr>}JFlTE6~E5ZE~#@= z@afoZSZ8V`Y9_FWez1SAKkq^qv-5nEfWt?~lj$+MegOf%rSQ+003m#Q#5JThEX%FPJ&{R-v0;Ai6d zoE4n@lb;+<#1r`9*#4g>FRPBg_-iVk6>giD40HOdzUGP=&__@Nv{~M7{pe`2-xuWdS4n}8t9Q~OE>yc(oae7UlAqqU{`)3;D^Bj zJtTjnoO1KZDIfl8^K0`P>l^ERojZPAb%K8qj+jRrea`@Cs-6_!RN&LuxBt=E4DdVH z*~AK1m(X=`zwm?b8*swh7taTm1%J>&fMiTojrK@M+jY@KL43)xl$h6Jh7v z40wVa(gDHm5F^0fW{>o%ZZ&p3ydv5O+JxW9)qxwLy|D4%Uhs!_cGj!qI-7{kYoW8L z=o|PY#y!vTp3X!dzQ@?br$zhrVf@25zAL^i^L&6gPryI(x<3?$ zAoeptxd`mn^b`7^-O@3&v)WnvRr70B(yXL3E6rjZfcF`s8W!BU@4s4NTnpVyf1|&V zo0OY0$(Uq(ubQ&d(xScJP_^Ir!v6$nQAxh(XtUrCt{7LOJU{68de~0zrf{;f_h+hU zHQpR=Dm5xWp7>_fT4T&H@8Ey1%WaqK$}}=+mp5@;Vb{8T4&h7_!5&nlRbTvx5&JITW2-S49yJf)48D7Y#Wj` zB(Y{5ln%O`ay*{W`Cl*VjMyQvUVqowOsvtL=^U3K-XUJE4qn^o+UbHb!N2)fw)NZL zx5MA+JcQnn-Vt=Za3+<)mBKqbJ3LJSO#+%4Ha-k}dQ*5V{9L%F&c!6BsFcoZ<$S*h zI%72)3&(z!?*5=^OI{6K4gIRKIq+p)HC{DZgCivOiYjlcu0jjfH9 zlwJ-EZ^Vcgo0X&Pj=SS<=j^StMMvd6p)KDU*&4xa$M#MaPOEk_wq13dH#{OTB0_t^ zP0;>mpU^9x)tOAEBc~&LKK26K0e!Gkd1gUSMCqj<|Pk3w1_f-FRK6 zCL{fOQ8n7BJ8&y{D+;G^H|cKDV`lIC~}>En2dZsuxQPvWIF{Jf`}- zRm7*&R4#llDd_OD{gq38Tk#Wg{>&{jTIg5c`q(>JL-04?p5R}yq%ZwI=Qj><4RNiL zPLn;5m`A}x!Ne?cmdSmS-^N-2FVxxWY_5?8c8EE|WRDxEGeKAzv2U2`@RP;NVkS1# zRGquVJ+u-h%Dv9GJL4`fnlIyD#%m}aU{P#Qtd8p8zze|D-*4S-u`kY54h-X_q*>A| zCrpv{AKyc=>${_jQL=hg8~D!qrR#<3Yiu>PShtADz+;|MjOumkb!$R&LbQtVjrU12 zid{8a_A<3p$&)@FJsxH6h67%tdc+|+WG{&>iPERc9qKHebDeYHM{ZFqMCwHP1>%8s zbQVo}S9{mvI`=td$Lxp_q0j_wSACvGbOuaIo#*~z_{Z=(Yo5j4Q%-e<=c-nzJLZm^ zP~OQNok7C>MgGaC$f(F?I`71*^TST4)haR_p8|JE5AIDqUc_~iT_ehr?V7y|nb>o@x+akN{pTe0WN z=gf<-i!uB!_Sq)lhf6BglRX{X2fo1#<%25(8*i*LOk8(ePV5O?3h@YR2Ksh}YOnfq zHYRosT=AniSDJZ{YNcA(huGW`6-#7nk2S^``18c|*jM2M@F~#Yp3wPXaEGjQ?-}nI z#H8x!j8giMahqvnTKLk~bnKIV>kJ##cURmMCvL+&l&rivav-oJiAP}Dc2x}^Y_xju zdU0ZmO$BT();z`rygi&h@hI$tY~}j%8e(Uo0hYE$z#fEh6`oifS1NL!j7A**du&s8|C#sCttmYQN$oO6%Fp= zsuML`XMyZc-P!s&-v)aD9!blwQ>OwOrl@KyqE%);pC`@a9f7?Zof0+zvAsb8ng-%; z+XZY0_G)~GFI5W=+X0@NxayNSg96^Zk?PA27l?~d>*IN8wF0VNPK;`Ruqm<0saZvv zFwU5_*a+q*yT zC8WuU%TT3@(@y+}?>D7IU>_%DW#|jP=~tbj@|Hl1vXN@XGIxkMu~xE2V;`0kh+(f) ztP!q_*d2Zjb{P8~V}-cm!#aPE7-E`{X7F5$FKoE2(&yQVBg4bsgAtQIsMrkq5`D?q zyhgff?sfAp-TSa?eZ*gtb4|EyqU)(=`LxV-EkGLN( zI6j}Ti5*QF;72e+qoRzOF7Nm>{BfO|v7f##F(#ODy} z9H%ok@|>Aj3Go&&p`&mz{u9@$X-CHDhA$ap+2-3q=e+DGhV z?vs0GjL=`a4j+lnVm-n)<7c=Ju7kgT-HNt^_Q4M0^OzI#J^Hxr>c27qYbkM2`i1r! zB+ze+Kb{kNgtkBvKn#T#4L%NYf#)MGhA+YM5}&2-7(Y1zbA*28{zs}tDY_l{11=AL ziTlA9;@-F~o*8?BYx7*ryw;j=K;W71Ex0aYmGQ*;wQV@#mbPNvGEaydGM0Z#`q7CQ zGd>x&Z3ONWojT9Q_=A^XjpOH+1$Y2#d7gusgd+vokJs?LXf{}H8FQ?0{Ee|z*{E#5 zInoA;R7dYm`9*i6$7i0S3#eh#Fj${yQ`SU$V8$!!;yTssBBse0{a0sHp%r1zr45)D zJ#;1%^ACHCvCX|v7mYSNuXFL#yA>+Zqm*_U_4-y5yx^{^^jSAiQm#M+%NrjM|uS8 z0rqd=%C!`m=lOg}s^vOo&9f$a2J0kT@_jlN25xVsvD0`^x&z*aU(Wi*Goe9X{iI(G z=`7ws<{%T>sDV)5tZx$YXPhx78mitPZ9zO2KM`Fqag}M-Gz)%WM|?+okGaPruJw-U zJuH`=r#)wLN(-`CHKL2@3>BVhkMLvS$3#2DsIThuck%$qU&20pRp*9b^DHx$ne-Dj zAiO>MEBo16olo$s>RrQOj&_Z9v4`~5xqOABEx;E1$oR+@p!(0L(ptdLVGrUXvp*60 z-Jn`gUnjnnb+j$Pv!Fdd&yyX^j!w2G+wdj$Q!>L`j89R7QR2VXR2%4w^41uexmK=~ z9!ZZ}Q{5e6&ws0)Mp>(@h5w9gcSUExu%E-t;D=98yoNO#yO4dMnbpkNq1@`{Re$o9 z&eu&-On`g2=DOy>2FHGb+v~2gQsB``tF{$B8T0FN<)~r5zO5Sn)pd3S`~Pw4xOF{z zJ&Z5)ym+P~syXSE?XcQhZB9~6sxk2~@tdl#7l}n;Hc_tL7}ppVnlw0% z71F$$iX+jE$HgJy3w0G*>MSy}0_DUD5xZwTvbI-L?3u9+w?X_9A7P1V?PEjtQOy|M z*WPSzVu#F8yoWe(V^3qx6ve~0ii5A{sp!dyXT^`I&QB+ACvSylg=njItN1$A-0PX> znP5!8IWWJUh&>To<6h&&H{pKSN6<9D2M|ksRy9+w`Pq}!MAk&$vY0DdR2%(W#kmF~ z4@f58_Ofy%S9w->&=7Kua3}1a#6;lhzL%B?o9}1oeHbTjsEm_8RCj5<&Ou-gphgco zD{DX#`NWSHj~K^Y$6ZU5i%2_F)fu=ajgtoJ1Z$Y7ukRJdWu3+DyexDxyP0sVl~f1i zucW_{Zdy03HgK~MjZvII-E6X-f1w;ibQS#mgyMbkl$* zJWcq2)?(UxbZoS9h6OfLUFBmxqcbgtBVhZ&mDLo#&YE&Hel<>P2U|WSQ7 z%w^^v9B&W#?AVW^lq1YNd@o?z{48J#VRt?wodW*C3W1t&*eL(#JZxgGhZW0ek!XIB?#J$r-JjZ@+C9bfzz?Mh1H@@! zjZIH5DzvGuzM-zv5RhkzcGHG@5X^%9!|n-Kd7 zJGZZZe@E>)L+G#g0RH6?fw^%_=en0wTz#s5pNG#yyp=OmrV1f}^_2auidn_nptB^{ zS7|?TFxRQh;3#3L&Ss$>;D@hBUx+@Zgkq!Ana{;o4Sx&L2u#wqdQ z<&ou)HbQ6RVkZl;RD%ou1&*#ra*^aw!Vu38kK9_HjzLPzP0vl=o4Gf0VcNp9Uwyyo zq&30&fcFj08=h}$34UqRn{;0j_-~yQ>f~#>TU07uT#X*J-yt$+(YakPW*y(o4&+nLyyV+ zhR=o`HF8nT#`~J0ZnjaRPu%58`>s+uS#u4XCDzsvZ zm8;SP;Iog=`6=|p8R09ToUkpjEiy&t5&fZaz8pP`I6Z9M>H_;FdI0tp;yCd5#HeJTx>kbTW7{SWoZ=`~kPH&A-imS=bWT5_l>9rTkvPZlP_ktzLODctG{` zs)VbAy9mV9*iW_#zYB1XGlY^tDd8odrtpEVQP>yW7k*3V5$O@(-s%4y!Xv_Gifgzm zmsQ+T+_NWnPx5B>X7^?LvOPL^v`$6(HTmPzk5h95=H8Y7@g>x3tn93+f`8gJwBt3K<@WS)l9?|OBKKL zvg#C^5l#uLt2cy&suj3MH3f)ytyitFYt}WZrch3(Cv;T375EU=Jo=w?;R&5{I9nh# z`Ly}8*+})u%1Ar(vT$Cx@TF9zqPaj_m@Dop?$?D&LN&XZop0qkwaj|yd=1up{9pDh z)*ZMvbRF1Mth4wh?AQ1!`1APMaG%5uo)y?%&|}sSh`FKrgCE3aLl4Z}f?dbD#~$KS z7BigP7qKs#GnlYdCJF3`@I4Jx!xYW}E&_h&0$ZSzz`c%8tOYH#Gj|mGWWOsTlo06O8v?P0fw6%x_)hSA?0KmIgU*>oYhr6; zMNQH!x-wQ!H8GC~AF5u=Q~~=2-3&U8$E0VRE_^A}61J$0+w=dOl|4m#?K$C$@T!2# z!@h_<k)~62`=j{L3KKOF*8D9yk320jJ6Y*p45wYEg zm+>Ba+ndV0`{5Y!g-q z-wC{b<$qWz4dZFyCxMvEV*>Bxn%GEX1!5!AtR^QOTOFSp4J`3VG}P>u@DXnbaK`w7 z#E`Mu@!NP_YVpt>#O%-`WAozw!FjOnW8>hbVM7pagWrK`_(WJK>=*V5_>1_*v`sUi zr@(!;6R?$g3r`8G5BKgJ-|3XFPuMKX6Yzgt6NrJ5&r(Hz@A_9D=j=m)7z2JYKG1jp zzMALb{^39P8=O48E@K0qm^OfK;r+~iG~xVhwt%0`wRvXjN`8j}*efvh7z^+<*q(3_ z*yHdr_~~#X_~P(l@H~v)vjSWsoCeoo4I`#dTcG{m?$~GHkhcnOl&oFUg?v{)Px+$& zPwkb)E}+`IHwA2@2L+#iExubo8@Ev4JN|4zfwd672aX0mgIM#g0{$oV-va`+?Rmw@ zw+pKUxMA#3e9@l-_J)lD_Q)jxKONtjxeAxTIQdqf-MBU!591{v+~aZJiD)PE|HLq} z1h_%$5c(C3{zb)Uu}$$Q@ZVY2;fdhv@Gaqeh=s$|T^HcNXlvS-wVd{*jd>4%Ph(%e zkAh!f9AN7(ud#2K1LUtT2jC@&2&@IzvE(!r6AU3)V6DI|DJ{TTu#UhbbQI7Nv*xhI z;Kwue;FkE@1p@cLn#H}s*)bk?UY-?S1D=v+X1)?LC#Jz#!#u-ZVEi*)=s(&DZi@Lv z4A5n`oV+D`3H;Z$1om9k7;+|#3r;*wdoXb=;^nq!J9}z(#c|pSeTCNq))eAnTni40 zd!Y|=1imx=c|P)m6hd{{g>{tnV*DHuw&7C>TZCMJ@kMMRp)dSGUeEkwji--@7tqgV z1m-r+{BHU+KStZ(U%_|clkq?DYZ!Cz z)4YbZg#X5e!4@D#4__bc!36=H>tEqD>ou#2>g*7IJ}Z4o9p#Lm3n!M`QRl3^C2W%x zsfX$V57BuS8-%=Ap5s3}r5eKQIh~ao@rtllC~>!hbJjikAY20D>+!_niOs5IYbR_e znoB8j?hA(}@=NQ3Z}Lt2oA?-=OZ}N@%+`~Z_qfnpIRk#%Z+A-Vlv>nN)Pqfy%K6ERG;={E5%`+E9%&jy$#X(Bl5?wr70*V5IJl6O)rb#|rbd=I!Yx8=6R3eO8`jkU%xYOBk(sU_fB z5?8)1y?#|`iR%gdg~F=;&fd@X`dxtk?BVL+s;u+uV?r~#nT;*|m#|NO|H6OYPJB+f zrry%>rK)B#Ha@Y(h`x3RtD~!<#Jb@7u}xU_nknxCTZwgqHQ<2ajaA}R;%ju`WKrct z7F8Ww{M$ML9Gq7uquTKJn8e%hJ>g~WNs05~11}S<3G~B?$co5Roxyv`eaflj)i%9t z`k3S~$(?mp=?lp(B$wCu9c6{jQ$J7r#r2De^_=!#fx#xiPHPix6J8it7^v&7>!%M` zpVO7wv)$P4oMFRWAy?eBK6!mIHNCp%tk)a%4f_Y<2USF!Zal7u-HcbQS1t6f54#_Bqoo*Y zjy0*lkFKBffPGk0UwnRIzGGL;jn9pl*X(r4>vv@P77V<=KR7V7S6l_ZT25f28 z5c+p;VsPS=>gVGBE|9Jg{-Bq%kA;QLL!XDLOS5`3`Dk+ejQSbJ(~qa)AGP+h_8d(= zn*M6$tC{a)yp!>f?;{_v^&yEN3H&<7730Poc88zvKjGh)yD@imV0M7G{$bUpf=h>Y zDry!ro4T922l@v3+NHHi`zht8l*OLK9=IaE={NDaHYqm;JAY|-X?RIsNnl?7y!>rC z@8oRwY`DJ8w?)HrGJG=pp)_LbB@^w5cDg&=UDd8?FIRo{Y&+ZjTIZU+B`kFU0bE%{tD<#6dgKD00-nd*kGWG^DXzcGzm=i1 z()>)oo@BqSC0#Oe%deVgE2KwEF;mRb+GjT@<_rf}SatZ)RqvcHct!TcEsCKqwmvjI zG=5W@=YZ;C2Bmo#B%o>7Cv8O~;hbuKv%c((?T*1WVFNuaFeaGSa8GD*=<7GdKR>P7 z?TnSl!l1+;XWf5N`OfVGd?IuOnXydgjCuO4cC5BozQeH$)h4fCRj}%%)k_R{_nQJo3rIt(mLT4us7s5`5kLBJOLvIJ(4pj43^Y;t%3&5=q z4@RT*yK2y5kFkc&OrDwCA*Dk~4POo4KKDL1K7B1=k1)zL%7x8RTy@X$gZaTXbY2Qv zNab+laP?sIVEz31`R!Ey5$@n!9h|Ps9M=l+45&TNlf5z@q#WYhDC#hxDGSSb>5zzGR5LO7q zgijRPZ6Ux}mJ!+tjGt@LqSqHn3faOzp^0!t@Wp-cro!h!58)jF-i$a1YYw*23(6bp zr&`JnD~|^ou$=Tjg>)X&WYwu3FaEnvqEDhgtU#=>&Vc4x6LiK%)3l~(<5I_^=D2cP zf4Tp1Ur)K7GB|B;+H)DtWvuhA^L9`!<}m@ktE4~-Z*F*QxOjf?{GP#{&K#;Ieabpv zQ)E*lPiOnSWV~dchq~>#?U^B9-Naph!T`=J--9D=ExMwl_-H zEx>!6(0RJM1lBJ2xbKBF!n?vx!b9S)>qy&NQu(f|_1J^22n!WQDy$rS{3dv2SIiaL z8{HcnDIL<~_~m#g5lVb*e{G-lo%eC>{fE|v*7M5OyP0w`rEz-W^jc}P(sHaE>ymlN ztn9Ar9%>DBxVEY~m*cqVSc(>n)Ycg~V+6+Lv#PJ#N4O_R1vbQPLhpro5eVTHviJijFR*h7R)Kreh2I)875RM4UTlQvnC!Uj< zdFZd0UyoRiSQG3C$_kpQtgnY1o(rATIDtNdC!vkmM;l7hHc&wSkF7Qb!hU=MI@uFH6MPv^5R4!AZpCHvi4p^Lb%IjW;xKxf$Dqt5Zn@!a;^_AM26OFWS{ zU#XN*Df2StWv)(Hoq|u+SGkbm>~Z!$&p^+U_LDZ8U}xnF;(Op{T@$KDsz+uAX9rnZ zu#dmfS%|L*_k8A%88XSwye#ne@Fjz_S#Fb0qK_u!X}}!YDwcGz-OX6ykp!k&>8j+ zP6|D(o=#pG-1l_huD?r-hOy>+692?m zFL^FF5c~kz4o(LD5Pz4k^sCTD_*!wj3##jyDiBMpth2{|(Yc8a3$vAf*;PPaI5sv` zr(gUYJD}RL*b`YgTabMzB+!0vb8n~)%4y$eUr}#S?=jT~A1Hk8`P?%kV@O8bw7O}B zJcm5L>)bcELwNnLP(r!g*qW`BpSV?cEB02byYN@!FJ*WYb?T-Mk#_v3Vq&a$mxOZC z)9y3&86$Mg;ZXtmfqnm5p_D{ zjyhYTt`OH3{v5GSV%r6Tp29MLwGw^+%?h?Y;|}|e{h+#C-7e`W={jegbI#|UY0fkw z!gb@i6HCQke?oEJ8u1$ON#eO*6AlO)g&IORf&4aX_cs!6B;a-M0ayd(33~*%nF7Kj z@quurv@3fJ>v#tN|Ao2F+VE5KCnrBDRXIs#6!R)AtW)iD=58b9tGyI|$*~!+&+=S( zu6I4}dcO32>HSj}p|dqwB)3SOuz;i=+x_gzkfbIjnylJAT!_^sz zwH8z^=wO{GQdTG~u>U_Beb(Xni6#A}^M}T$mLIxLIFilMs}!;dDGD{$V&AST+%L2c zR#~g8MLJW07&?0_yh~RB-X?>5_xKzsb1f&&mN_*_U_M|!tQF9q(2nTI;6t%h1`DE% z9iHiwamuj?(Y=rpT1_Y|qzJR59fy;F-~C1?DZKw*PRcWh{{yxP_IIJXg&b`goYyx3 z9OxN=u?AN@OsFZKXGVX84+4)1w@*IA!T3QZ?o~BjH6D(Ioo7Is!QKFevsbuZHKfN1 z_-?I)MZ$TZyUx9MQ@~$@+rlTn*61YE6X+ZE4Bii?L#zZ}2`vF@?0v!u0dHPRRMgZPUzeay(lmaQ-oyYqO}m(3D{$|1lsVnuqkO%5_*Q_W^?m|Aa~pPPW3?E z5{e7hoQbZ672-M9P1zB z>ZAa-2Dh_cD6KOSD+*_&3lc5n@ZJNJ14k?Yy~svs8__2+r$t9P+~Q~ACD2a8*Rk&7 z-;?u0?j?R7{2y9ZbQNemSVyq?(M91Kx&-{XxdL;#xIn+)2kaMQX2p9;gT;P}Kl#1z zoq#3+j{H4=oI2hQup2K5DdLLRQ{dV9kwYmkrmzo63g=_zoqZO2psTP|;4|FHlmF8E z(p=?QrM*T?3*FL7Uj z7%#jE``+t9cVU&lp7lul5vk5E#kptf2)OyD1vH!REhUAZFwPuj&JcD8Sf>&E?|qlK$w-_dZp3s23uM*N6<2D_Fxc6s5dc*J*vfa>0`|1egt|CU zupgt3A`XjPg)XJ6a6Wook>7u!`2w8Xp4grk;}U!Qtaa9US~o_D=S~%T@7K zar7cP?Va{~*Li;g_PgIyAA?-{c{*cvi+~@BO~f<(DA0a8 zrJ0;BO~`oZ9?9*Y&smeU3jK5@1U6TP|A0N&Nnm}2t7q)+?Bn9&oU@+cw0;z@5xt7{ z;`_cOFlW;4ra5t^wbHzol|BI9-~-iG$9B6c+!Y4sytokpzw1`+XcT+Lvd30hTZ~m411RM!uzffHVEjy)(UVL>>2Qa*qPbl5grm|>8!sugkA#t z@(Lk6mLB7E-1|x8gH3f$b${&r*jqEXX7b0rk9`n?#k|G5bKP^@*gVfEU;iDQ?}$G4 zXT?yCCXPDe4&I4t{w>YsFFJqnN8wMQzUp;gFY-C8MXbI3jD7~bAvf5-YGCaa8VdId ze1A*WBUBZLF%s)0mdxIMEOso$eIJV)i@dC}XRtq}3O~dJGC!r4Ck9O}F8Vfj%E_t^ zz%}m(gOva7(}7~-%b}M#tuuufb9p*{lbGu7iQgUFSxa%?*v$_JjIXxBlLB^qx-_-) z162g?ig+h3xb#g*Q2e<3XckxW0!Rz^V`n6 zY#nQ@iU(U`r&UJ*Ka?09?S&SVI1{lv_ItP;)@>Ft_Pv!twoo)t)X7g|U4JR|QmkXN zV{}hsPb4Ia)_D%QjJ#h}T$sNwzjv^A@UQS+VTd`_ zA2cez>I}=8c1?S%d#w8#`y0ECFhyquHxMpcm#x>8gVaR1f%rc7UBgwE0sApGlp8t{ zJQ8$=+@TZ!4!F5$-;{`zh_OzRYm=QC_vT@VC0k?&R7(E01)iwbSChOY6*TugB{- zCTtW^gfr4SuF=^=JOgV3?elZ==jdjggZ-lLi;x-3j2;nAs@BnZ>AIbGw$_39%8?$R z`Xun!=$94<@Z{Kb{o$5vY`hPIb;4AE7#B7d z^TjXR78q~XqGQ}++`ChDrxZ>voc?0Qiy5M))3Z{uQol?7E_u3Zx(hr19i5SpDPV8m z3#G-3 z3cCtx)J$=06I$3UY`4Ci5-zwdxZvE`*I9q?K`JQ^8J?v5eoh(y=D|M#K1F@S z$FVE%&CqBN*TD}xC}5+YJ7CYQAFmHJASLc7N8gAK^{DbZup7_`u%Ba-v*v6Oc>eJM z{%3umb-Z=lidnJjNOt6k0GG#Fg1t|jDdu|z`Nhm}*4j=2^RQ&JWR!gv8;Cu0W$Mb* ziUlhc3=7)}Y%lOo+CypOedT?ByZ?57YkX_q>#kC*)Zzl`$KcT5kmy&Pj#Md+8bB|H zUJe~n-7M^}>8c5JI^}fA$+VMcYW|cLyf1hQsvb;DcTM*!)q`Q*M)Qje^GW2BNZb6j z`ImAp<#P7=uX(@bO%6>C;mcva!2|BnS!oN!4ODSgaeIZ^0_VDK5|+7_xfu&fmG_qu z$%%X&`Z}~Pe_#Gg;accgXt?Tn^@HKn{&G^lfA*Ljvxj1@tL@dc+vAp}`>tn*dx(3v zwcNsPzdv?=tiS5W{1N^`RjPgtZxE6tU|lb4)Hy$ubS7{I`PW9Nw4$br*%!k=BtJ@fmUUmnAwQ zYn8o9%;6oI^^Z6J{11CGJS20xjldizEF9Gt+Q$U$>uH_SG(d4@?q`N-T;flBqP$oB z#=2Ha`L6id%>?EaaRjc729JGaN4ZrMUaBqGh-bhXTdNaQC*jjxpR@tS}rZNzOS*`n+G~w{u-j-hU)b zPrh>BAGdp$GYD6ztkjGFPVAr9)UDU#{2w}Qx!&b^ckSA>>rcP^>9>WaEj&%UKW$bs zFDzYHy0+umjxz_HIcR8*qa!;GFCShWn!e%T<>BS?f~AW~7k5hC!N#?XYieTWpFaQe z6{f8)ZPyvQ&JZ{LBDG@mV!ilw>Fv^~$+7nYyH|Fv%%1b#_6kM>b64iBsMVLpUc6`V z9%rpC*1cHwUbVey>o?YKpu=ZUKQ8w@Ds^CbB-sxSR34~AEp!~*esKGTXh=7@~Nd$ zOS|W6#O;FPGb2%bIQx66cX_lxD*q>-^Zsvd_-eJW9wkGoEa^CeraajJrvv%+!l-v#NAHI{4_SK+LkZ-zHIvP zKD$P0BaaH$j3)&A2=UAt>o+#v_2A4!6kin=I5}rwA3FHZ!6(ge(i|gZ8!_AbgXbUY z%yaX(#DUot`y{UNaZqZM8rAM<_XATOn7YAl8~pZl*VkQq)YUUvf)2c^WqRf0dcFpHV)e{BwHJ#j?-JdCG@%AJ#oCC?^nkX)wAzx*5}2E$807pPtKa zGkfFG(xoN!$UC?1+&-~7vAR#rj6Sq*XhAP2`~RuThgc@L)GO*&H2G@(+WxhPf!Yne zw)m!8&v)q+lCRi2I5e}U_AKsM6w}!vGts6Orx&j(Tva$XwSA}cp4KaeuzpZ%6dPNn zUxR!)DsyEw2_8>f5&u#=(sPJW%OCPP_*v{XJy2+1kId!NXECgQSigE!Hr-2sxXQ7? z)PQf#$73JK3BDhwcg3%4eSYD6nUz4-i#NK4+K#aSo6{Pg4RMF>JHGE&agG(|xOTQ{ zXFFiX0YgR)96fMQWl&{G&hlD6{f=VGYQ4l4*kI33eSYfJ!4ut2bidmBYVRv;ue7b0 z8i*g;e{46D@SygC+Al9%Ub?mY)^;-o@6TDsUlhM6vUTvqvE9dZzcTHWY2?6iJaF0I)IM%l*sySF`PA~r%E-$3nOVZ$e7*X5_3+~1MSf0uUwhxjnODGn+@QWe z{g<5edUXBh`i6}S8<*y6wn>?rz#bHjpgVlY-M<;UoO7$yrLUG=f-6$DCAee#cC7DM z->jnUP;SND>|Vi7m>-PEkx+9C5hp2_@3{?3@-@zm1RQZs8N5+A)5;9Yww9?ZU; z5im~Kc5;*af4=NK$%D#QE*78>v39h>|2eGxu>PZixzi80Qm|{lKJ2 z>03|RdK#U(Z_mCxZ{?&?z93#5RUK8mG;{uTN^Q{k?d!J>?;PHVHns>3Djih%alnrQ zrsnMV%M^K0kV=F9B0Et1##H1*mO($^}!DE54J$K4$-R$i=Z zTiUk74!pYU>gIf$tJ5=eZU42+7!R9o)}C2=77o6ueO04N_sM)zb&7n<-7+)gr@~Lo zc*4WQhl_j=`G<~DM`=`HR6+fnc*XsV`y02^Z>ew9*s39ha8mG7a$RKlW|_}+cj|J~ z_H9|*vUo!K3GI({Jl1hp^|I?C2n+Ty;Eaf7BGJ zVNeStJ|J!;-t~HBj2xO7LpP*$LJs7z^Z>B+zDZx*qB&1c{zKizEtzFPu9uUyL~H*E z#0Mq?;v&W54b^#xC2pJ9_}`^A=ee|sS34I8 zzNmcBw5{ufdMbA2ER@Qn@(aZmii0wr_^SF<^#y~mwXwC2xkI6A#nz_{97QQV! zl%Cw1gNw}@2^K9cT3)ZRUb=)B6O9X2MdiKsqO$|HmisBW;_fqrmeBw#hCB`OJ%I=vp zn4^D=X1$}B6P<}K#a)-o9GI^Ib*$nwa#Zr3{GS~IwHoUOY<+&2x^O+c>^5;-a-Kg` z4#ebl362lcu(R>?FnD%?9k4aX zDtbmHAGh4|h4HTl3* z197|w!MNbDfDNZ6`l|GR$hqtl*yFzj_U^Mlt+3d!9tk$#JAqhed+=G}!6yg12XR50 zHQo>QKbS7!9h&iYHGcL@JjZ^^N3I>59H{GO-+O=gsI!Be0`bPUq0Ri3by0`qZ{^42 z2c8YkJz7y$fYP?1KB#M>>%LBY>E+DOw)bS6*gjhD z|7;y{__x%KZ_>6&+g63G(t+Dnke|`xa$&#+K^MCReEO3E@vQ;D6#-edc;II~>LTeK zxG42hVy<(hhv)X-u$%$r_qztK1nT73oBR>aK5uG9jw~M8tYJO3?c6q>|7U80*AL_X z{+PP&`{Mtfy_W3a!GO!V#xdfG_+W-a4;>iJoQfu z&v}?fq#p38)OBAJ_);TAPml%I1nUKCF!7HDOQAI4`ny6@;dw!Plx^-AkCYisUGFY2+uX~FrazfwoCN9u0L;wOSVa&EzL>CK-% zb7fbrtzKKGd!cT=HamRT{$>09zj_xl?cPZr!3k|Av@KO!s<=gYi!xn(apmHQ+K^cb zvlb?0e$J7p!DWZpQ~KbzfRFHp%+)G4%8lcazgj1~q4vvqFPnU^8e=m;#d!8F?q5`Q z+F9x>9h5%Qw{oV;qlrJ0=hp1-)RNv_xV<3WO(&AK{9^Y1cfpgv$LU#B_b{n{Qgc54 z2Fd@do4HAHOmxEC0U13mU_h=M@GH>Tx&7z%f8FePE9}2v*~ZWZ^nHye(C!^-V9p)0x)-hX$T7<4rS84s6HE>C4qO94N%+exrJ?qGx zkv(U3o!vEC&ul%F?n?J->7kvHJR+G#W^Nb!oV?6=h4TuxmTxWp7~GP+(LIAZi+2{~ z@%Zhx1^QubPK_1YM!gws!g*hXicC@#*WDn)w#P3d0JEqz?g2|F!tn;#$^GU@0~y_+I!v=@LiV<#K7-L&pp|^b0BWGWafRnlp5V-hAlH} zzM=CC{cGo6J0I$JsN<~aS=GM;TUEAdo-43bYU~#;E?!(ZJqRmxuhhNK^o^$9*nMO7 zD#`y%OHT?r_0-fRU7CEgTs}LI-S$GxRX@4&0X`xpsE_?D{g9f%d1wRq?SJ0ksElgPJ|O*A%ZQ-d4UXQx9G! ze_8snq&Gy3*#_zBxiLL}js8Y7-{fYEi1@5{iQM)A!7srx!H~>!)7v12DPK(Yv3=x* zuZ~~C9%jFhr==tDCTfDbEv`FhXmJ$HBC-Mx0t+C4ASUZ{yr(#M|X zh=9()7jstTtPJcJn2z<6JH}SWR^@KKE_|Jg(S$;GaAGiL&SYOGby1t7j{U>LLggLm z-SzH5oRb5SHS@gUfF}fUTV&-)nbq)p>HE?HnROzzuNL*L!d->`r0z$2e!+lVHQ!@! zvX{H}?%q2`V~%Dl;l|7%8I+nLKBO8IHo&35bHR3*1KTJx3SyThlujsJS-i5DzdAK@ zWnM~W*zo~-^6AtbJ(-weDcC%^TwfcTgI%~x`aw2MP1tjRx?%F|;9!Z&p3u9&E}Rm$ zAN!y^pwHLOERK-@z8oEl599~bI;f`+BM7^4IeQoBTcjBmYVx zex4Q3`}Dw|;LYNjMe&B4x^Lf5XNTyyu%-ONGJJ8bHsGPj8@ zsGj7T$~To&tE*P!n9nbrUlQxzylwL~xlc8nGZfzGd8g;_%oiV= z`95P4-(uIYtJTsUn=HTjwnb9QBk#0zW@pL+${+dnu;8QgCBB)tDi5b;n=eFPvQ6m% zbxc1teoO}7k!Ecu`6)O5VR~rUb*~2VWmez#;Jx&NSO>oGvB4ARU3nzAM*SnzU}WZm z;!pd@?mIj^fhPs*O!=y-`>u`_e6sJS%mtUT-Yk8|W*mK-K2tWy-vc#X>Ri+yEEDi8 zU31NVT_<+Lw`T+6VLE8H0AJ&?Yl1t1UjnuuT6rvxe?Fx5kY=yJ=9wG&QE+GS$Yc#) zf`4#A^wwGFgHQ*iE;#AEAr}m~V9=QMG40}{&!#5lhSc$imzqt=2K+v~v473EF;Db7 z(KB~2y*9m;&~USkQ+(~efxHF#<(%}RPs%LbeTw@Op9)?ny;AzB{8d>Df8F4!%$r!Z zux?Yo?$N(TQ~%L->L$d^7EJx*M)i&A6KWG`*VV79v)9}(nI1pN3Pi-2=_p^t73El|AYw6Kb0{laEu=(Zro(#-XI4Z#B zXhTo*xPYvY2U|1Hd(5u8InV>7Hc@>t{ms_atEHx8xAX~LAE2271GaALPKV2|f(kGiT<$oE?O&)=oZVp3EmM6-z}r*_!ZC z(dc;r8BS*1nR@rVf@6Ybf}Vg(Qm49T=I^0}Mq8szo#B52Hv4C(3B4tFGZY_S8tx5#sRjO=QtWf%oH&ew;ke*1=1e0kU&2DA+Y1C(p^8 zJ2iltcWmDA)WD|(ULG9Yad^kSD*vi{n3=!w0qy1X@~Xk>dsH4dg^;a(?Ou z)U&cVmd#AkHQx@U|IZY{qG+b$vTHIS^~HW^W}9E_V4^utR2&d=`jJy&deC zejhcfddI~bY5^KYbDsp_zZ(STPV7q^JD-rBc4gv*>jag+{;}Qck3AE|Wk;MJ@FV@* zZ8^8#veefPDGo9Asd#s0kGpm?z)#{EVqbLW#mRqn#TP}tY!tFW{#-oZmVnLAu3jWH zLSjr!8#J|V7Y1aKSlM2|m#Ifq-_X<7lgjMtQ!TM&)30Dp{5`$7FVtVC*YdS-uzsLs zh>p1-GuhWqE$PLb7k6Gb@WO!`c5c{tQu|5m_f+nw{8IiU7WQqK)U!adPH6Mu=FRvC zy-W79XYZ-sQ=if^rRRd+iP{sjdZXUJqxxr7O<$l`3tR8cg+DiCK0B>asx)gBuP3qv~Nl6<0`=}giHfi7Ap(F=KngGJfd!p@%LzIdhXnB^F5@)8pz_ zpegMg;hw}?x~WAF{cwEr5gyRHxT;-3WvB<6BcAP>x5XM^ya z$o#0WwqFXrG-vO*&sTxGqS^v+iWQTaP*bFik&V4az#k>+zmJ7~X+WQ!ntsSP12MyM zgUwPG#s0C!w+Hebj|Sfdn-w-I>=lSv(9M$)H$(TnZpwTS@n|vScav-4r~eSF-oJXh zr+u3K%9-ia`XL~5(DRvr+Dtq_F8(Pq()m9d1z!*Nx;bxy-|=l~r)~*W5AMjhIP#oy zFxe-*$4?eh9+R_X7sy#c_D;<3!or13y}@2tC)hQZB{({L_GCA^>5l=Moa|%Q%^vW5 z`O%e`mFDb~mvZ)+*y^Z2d`bLGTy)QX%#+KpwqgYs;imLK|21dIJz9IT_Ec~}a=Sq(RHx+Mc(jQx&E_o@nn=kgf z*i%UH!149t>vS32!hn(^WIJw=+?YBOdqZD|Z;HwPK0V8?mtSw%PQv+Z*^XyB##hHz z{}6mq`6Lw-Bb)R79?VP@acR9t_;az$LM?Tdx*zF!q-*J(rF-70zg54n_r_)&#;mEw zZ{`?dd(k!IAAf#W&I~meW#3?GWoq-hDKhBUoHf%wvp-SXy=T(9;*)phERECC|8rvf z#QN^F-7{5Ti<;Vu=X;;;l?$Di`BHi;ehfBBe?D1BZ+ga2!M}pTf)T|L#ck53w^U{; zvla9#@D=6{h6ml5gYjJOY9L-Io_tE;WpX60&$iz)H9PYMY|bMCcEGa1jLff+bNn*3 zS?q6eSp5te?#iGMkh}DZ*zil~zpD+X4OlhvnmdXeO*+{&b(CtBP6;*)*jZns7DQYR zFS5VI3nr$g27iqX$VI-_EC1{3Qm4Uok|P}xsE0DYRzB6&xa1(^ejiOeI~g({SfOu) zK65Ir3+N2>Az|yr^66v0BRDucHWvo+V(0Xp)4NS(k}O#NXAvtF7C;Zue2a8nrcQQ|eRd%l0nY%psKf z%gx*p9dk!!P|I!ITfVn^dG+$@itQ`5tJRp8xhV9Kd9v)WGm_&zK7Hrpz(=WTIWF@i zm#QsQyS(S}o)v2=)_zOb~WDoBo-+Fug%PslS>(`R4OdlYDyp^!ni1;M&yG`F~dXthP{Np~e&G!9F-sfUOM~ zZVlPIOB9zV4k`~SzZaYuJY9OabVBBINAe-S-5>bZt~&z6=cFc1A6e6 zj$b;i8+6^E)6(xDrvFU!nd-K|H^HFP|LxblUn=L1m25Bd^kezpE;eQIrLO>F3v_@7T?4%gK3)Miiodgb-XCkJW;<_wMsz6xe9 z&R$#~C#21i9<|weXG`b6E4@oMmQI!W@0+!_$K~ATPl88-8*(-Mr?Az<_z0xO)o!MpEsXQ{7bxnoTdlx|J9kQ8*`%6Rp=_rlb$&8)c>hnn>!Hy zqW9KMu4DJ)WPZ!M7QBF_#U#1|J|iDO%!eN5Q>g9OA;6F1VHsrA>IwNJk! zk63N1wyD{dfBQ9ky`@5_utw&Y`kZy6Xs4vlZ;oJ>^vcVT4eTG-KVN!^f6P3BuHyG$`Qtz>f;xjuQj2E(B0F>UKwRs? zGd$QM{b1?>#kPKkzqe>&t8)f?O1we-J=J)s!O#39c?Z6gd@3J~@8O-qJK5*v1gXE$ z&npHiCeG)W5WJW^Z}BF1FmxnN!QW>4o9Q9OFeWw1GxH_>=N|ODxRu(Xxzg|bRcff% zWqM*M?bu`X+*4&~m=yDg-y!gG_yi{#t|@prWc{AaXmt?6lTUh!u+!MQR!ceeq% z4Olrb9lpdLlP~oydWYyo{<)k!evum`3#O$9gx+$GwbC1SXwDg?7YfBf(VmK>oSE4& z&t^u8y+6Kue0kOM4sDR?m_0Mw+VhPmjVYa$TEA!FgUuU%hA((;@!q0$JvDjAM{-t} z94}vt?`sXe%$$`K6C04LwvYFx2Uh&?vEpORb0+_ma~KZ|UQ5l$wwd*`czPD)QddlW zpxBF8AU(EEdIQi3J%ca#Mr`wr#9-)wQOPTaHKBPr$nVfS{*aqHCApK8X09}o{F1}s zqm55|L!5Mc@|g?vE!g)|&OTD}zCdQmZJ6_Mi;G)GP=^=d{1U@9h!MU<^WurS#X`boxL|C4*f)CEM1rx zBi4|eu6E|))XTB?(32d=If(;#{^`MIsp)fFF{-h_Y&jcch5i+qxh(Osxsp%)F7ZFI zpgrfS%u|}D^jzjQvRT>8WY`gc^Pw&bSse!SF-(*(2y?Vd&eo1@>Z(N%GJT*@875+_z{3U(R{Hxz(p4QKqs5|2qgrPsvA$8D1CgZ_y=Ro}A#%otpUD4Fhf%AnvzLzz+B(_0WIJylZ(6K1E0BJx)wt zIeB(%>IkciYU7{ff0pgTg!u6vq^5o0oPW|NHA-ZIxRLn2Sh_VLE56G)H0vZ6V}AW} z1D+dT|M;orrq@Hfex1bP?@LTiPKeJovNW>9Ke#`00!~Z+u>B$z)#llweUopL%ef#u zi{jQt6^|cvx=;_vN0n{(;ZxATKO=>4E~YI;-f%~HWU znTIb=q3`2wsZF{svD?Elt8mNoKL26B9|q9r{K2l&_@bj1a$Y-KXAMRdM;FC?I|?1m z836LD|H`b+>w?=-uhpJ>Ao(S)YwzsgJ?Z<^t3kG^C3+&WL_SLm5^&4pFR4 z+-g!lC!u%tnwllPaj`8kI`VgXG&ZznVDpNr`kOCOm!ubyer9KUmAO@H4>1)wm#$}1 zvD3wE_-%J)7PFYe>FJ9joBiH?vDNW8|M#}coJ5aeH2lz&1G1@w$Lz6S>4AMI)26SoyZAfw3XKLq$;N^n6yuk*jzYx14qBvS*nntYLG!W-hx zzt0S(LjrR3r~pm-H{U_5d6j@~^{0Rz|YasTzb+ApqPFyY+6imq+NVQIK zD+dN^1?ZB`e0V@7sbQ9*l1H+CboxHQY61Jo+Fl#Tv4~x;i{%OY?!3TW$*YJJ?i^Sv zYx1x3?#mmf_1r(WE1=)x5%^lm_b=a!p}GEinUhb3vy^x z;~xaRe-``{sF{!#@m)>`uU-)x7Kj!7KA1J=?eA^Qe6P%`H2rM8Hs8&9?HZstaj9zq za)VEFUmzDZf9y84Fuqq0K?iLcuEZcA+iJ&cZ4%e_ z=Z}^iO$F(uO&QC!X1kt|89p;Ie@U$+dGSE%PS*_xRXmOs`BP#JM+W?P^?+LhYGW$> zm3W7RrVQ9LwV5XdeDrezfB$K~rj$cP@8T2U`Q|}bH}Qn>fO1n#^HKH-@bFWC+55N>)A3ufB2d2FE>Xwo!x(SbN~1g>MB0(`@A{lOdg#-!DsLe z;;2gme+o_u&J6G}najr&^Ra(;jBPMy&PickKOOuQ=ml6MwZrV7o&i0X-2OqTnZ`F` zyF28(Y5G)*L9B+ayngxyuM1uZ{0&(n*L`##M<5Qv=AifREW1_Q|JT%*tr`Dz!Qipf zZg>yz!M?;?p9)q8zHNM)$yzTrLN?9w&BSIe48{gig7*V<{guJ!U}Er}z~B5DESlLD zdj)F;%Lh*e*Cv;V{>jmIgO3BYfM-9kcw$jp!c3is!K$h0y1sIKb1yH<%-Ro#l&nO^xVJ0lt5(_*_nK*r>Qi{M#FX(E;0Si+~?;aX{DL zUC%+*ZWGYAc+*}!8!VdMp+f`up1p2=#Zax2{GXVfya+q~)PO#t`}o*=ocjZNpoXj? zeLQNi?g;Rr7{gV8nFea~)(QBT;(Yk~jDQS(F}Nxar=TnCKiiXU%?EiN+9p`L(taO7LWMAL`2SL)}6^Uh+n9ynrFZ~1AcD%x$Ta^9fjdJ zZQ{_*Ue`Tin4wW66vpwkN6N6(a$25Dy*Q%`5><_)Ye0zDtoXNOJ zag&^!ut<@eh|jI%**Vu){S6z%yOS;St@xll|1l?5u&K$pV*>RAV*;@R{`l4ZtCJT$ z#}5+&f6K-fPvm#n_X)v9>AxUX#Z~2!*?Qun_C*Y|Jvc59Po=l`?DQ}HgiN?3U@LfD zF+lvzHxdU{lO|RnhbPa$590TH9*9-&;Wr6h%j|^h1O7C>MZ8_T5Z^LlyqU{6DD{Sm z1X~C6IUe8_pzW7}Zv$~sxkmqA;QJPtrxoq%u@aLS%G&ArnYX!>(!vnhTi3f=QXxz#r$M4@>O_-RJ$-ohQVn zTsOcI<9f$6YnCS^cX?c3KX(i^4(@GfDeZ0DJ=gvZiorec!wV&1gN%fQJ4ed9y)9Z%?y{W-pv$SSutKwG0 z<=U2O!@GIZrcFp!lZ$)@{<~U-SyFHJ`#|iBAMj!zXDgr1?%gptlXKvVx^-Rx9JzwGgY=^1AO98&n_pxVc``!=4DESI<31Sxi4$#5qfDO2CVd26m zrB%}1J+Jn?k{+4wQin~~Y@D2k8auYjN2#S3FR<@&6znd#mk)b%dVtvxs|0B7^ngDm zX7F2jwD`DlW}c&coFnH5+iN-Z!!y%;gW&ztx!%#ZqcLmdUyA*Shl%yA5xf)71->3i zkH4J8HmOmgYsIwKKzz8Nnc1~N&V88FF{wi>_S(Vf?W;HEC#Bq}WP&T zEBBV}&7||+m)Nuyrhi9VOv9obSf;;msNRF7xYO2-Jbek-rc;{J(x*b{QXZ-Sh~_U&=3& z0rzHpv|8Ig1>dxN(~Os}ib2QdQvzq|xKroZJHo=qM3 zzXCA^IRZMudWv=8i>HH~(uaXY$--NL4Ku%o-?l{W63zYICbcf&plrW$a;6WzPEEn^ z^l*x8y&drJ`vbMIderC7%ya#a^H%4r-qU$c=g@&e2af9;*Li#U?d=z&4q$A@*p5-{ zquSR`jef$0&6z-K`3*CtiF{f*J-+%Z*pFgc>@>Q^-kH&HP{8hH@367tfj&%)(97wF zc}@Rwuv^Zd-6)V}x+<6u-K{P{-TIL^D|=dMxb{f>(oX@o_E4}>zz?D;(cnYrAwE7m zm;0smN{nGlpbmt5K0bIf5FfifF$%FtIo3xq$NRnX4y_i51Ah?Mb9M%ssnl0$`n$8I z{)%7tW*{y!Aw8+zrnYu+X>z(*PA|P$e6_e#X{i#K!&j}h)tPy1XhlB$i1fL#!JRN)(&_!e$ny~Mu24uh$0sH8>{B*(ORfVNLd zEsuR7zwgQ!e_}3VwD_YrGE1fIV`A`J=2Ozk>`?WezNVz#UOkE$;w#fzK~C=#@VDMg z?K(eljzIj4Y?FJLFL7M;8Rz9J=lN4lIz6B>uMNHqP7NX^i+?TrwQyVdZ|FUFi-S|+ zv3O>#@wM1C=<46W`2jsGj}6u2&esTD4#b?qs@Z~UA_7#5RIEv@FqySSAV%;*YA*P@ z`u1RWz+UjX>x0h%y5p>XJtCIAK;XUS$y~EfQYXA-=bD{M1&enq-f?>M^y&`*8*sJu z)!Lt{K382hXsfhUo-I9FQjdu*-%GtM+ky?wAGs+t?@wlS!WY2-jRP`?>%4{-l4q~Y ztj&~HlxyO1?H0^dn5`+JAIy15iw0@~)$si-=Mn3h6Ng8)@_pI>adJp&zZbRfsKZSY89lx(=WGPhb?lvwp@!M>Rp z@KkDVtTDN=UBJ%%Env&b3fg8hTvg4Y_aHQvvRvpdt<%vR=C|Vrq?#3eb~1u%BWXY`{VNgPMD0FCGsT z&g?IIB7Vr<6f06wq7F)aRn4K8>Yai7pzp;%E|5;6TQ>++4#cqJ+2m%ey*LKHM6O%S z{r17OIg9q##P{W-%vCxm=kEO$Ob@&xJ69e1lF6~RB|d&xay2`o4~0E8DKoQ=>^`!4 zff)E|^6z3hx-XB^vgY}e!6k9QaA#kyLA+k;(ucTJ}I z#@zv(J70S8 zhgM*|n%Kt6>w{&Ou z&hohGxaORTN7^50UozM>HM8QJTLjw&hXi6G8wGO)11ke7+myFy_I+JixwJC6I=XsN zFjuf!@J&F*z8`GXzFGV8!NnaHcdQkB+Wu+#E5UCazjf@_xnHMq6MNcw+D{Lj2~G}{ z3GnC}nQbv|FrqY~v|)M?7D{alpG#fMyaAa(R;ra^J5J9Tm46A=t*u*|);+De9K15) zl^GvQ|A6|Oeq^v}_p03&q_1+j+IF>p!8+aRbYC8PA8Zy}5j-5+9#ncNJzI5c)wRg< zMW*jCZHH;61`khvc={4EmYA_ouv746aDCVHU1q{;(z8j=@i}`BKd+LUJzZx{$#Fa^ z2J>n1nqLL?=bT)A{c!>NacW^|yoi4kJ_^PZ#}v;F)X?F9WM(R}BUSXVlMV)<=)7jZQbr?zN+WErQoG8>K5)skTz>kidEz z96T9(68sd53oZ)o4<-lmWi1Mxbxk2s4w{m_6eVaxd( zKS~ba$HbM{Kfc6PtQnt9t38%3ioB z;5V>~<<8y=-VeknZwY*-^A}E!t-rr0{TuRDKBtakMu5-cH~1QSrtO2RgWWUV>7fA+ zHRIOuQLm-;`>a6DKrZ>F#Gl1k*oSNgKlAl(4dnLs2*gx60=Aes0&(jv(~H2T@Y!<% zb~gJ*?S(w*OF>uQ8sbpmG5ZJl*~F0OUhzwPY}V(LfGzv`0IhUp-lM%=H`pLJBUm_d zXyjknzv>N_4Tc5c(P&I;$7jS}D50w|TWUmQM6-`^WO-zHY+-C+rJNItw~x-;c4hLulnemp+|mxU;Mr~bATOcT?S^R#jdIUUOnebj89D%|4*%gc%YxjakU(3_z#(R zNV9+B$<$)`{Oo}kmfX;KL09ro9|!zWF;u*VcEza=4)`Bk$vd&_)(M_U?Z2eTvcXx6 zvl?uU%W_uC3OR43J!fT~Qa`1BN9~TVOY}dTGo^mXEbw9VVfE47qq}bjw#nHsovH8EtJE2+<(%Wl zgFSLSFde|QJ1z5U>773Zaih}la$)7&(z~UtGQ;kIoEa}pA%{zzkk8|Cb_v>8G&P_- z19}FCTTLiUD1}Wbj|58uOIDYx?o!#Mazy!v=KKnF^+x55%2RUwsd_#&ba=~mIY7XB z?_?GqnIrxuPr)aZH+nm`Jy6p(cOVw|Yhd5-HGf}T!b=C_=BCM2n?EI1zIO0(z+b~B>Ja$_@@hY1Zq+== z6`m0Y45~9?XWpM&E}BuFD7HT?5GP$N7@r*K4}rd7z6D)}XFm<(g0Bta**DLekHtC{ z>l{CH{Lt-(Y(HdF=0esh^~x&ktF%uWG;PpYgV!3&KG-9!2h4nc1|*wIA31N#`e>M|B+4F+Q~@;&zKy7Oy-Le3%(Er)PE(+5K?i;YNQF z;B2j}>s!|o&TF2Nb#de323zXAoEJMXv%JI-4PCb659W{=ECAo}YTy(tGvnl~ZXx>ba?YQ(c|S8_B<_X_&Kj&gMCJuP4`W zRWLqh2BGTzNRLoo#(_?c$o*?USZXntD+%dB)@!tM;tgvuUtqea-rEnW_3~ z?bqfxT~DSb`o`4k-jSIL*5jeBhq^-YJ=1a!%(KDzJ?r<}*mYx9eMWu8vpvuD{E+js zS8uG|@IH@ZX4;-P4`WL3Lrx-9hs*b!oVg~?H=b`?5zqnW23Leu;{p!6eAwl~)*ig} zVD{U0mG3GWb#B!8*s#Zjy*%XQA$upM$5*6#=rG9^bu_PKp2ef7y--7=wr|IrD}KPh z0|w4Mc=o|Jbl%Wes+Ov^g$tc+eOu>kosU%?tKQRgPn-Bkv9H)i&xN#`=PdCz`NVwv z57GyEN%@lUvhB;Z|FQFrooBS4(Y{*Fc|nKwwBOVIRj_|`|LVlz#Nq|1W2Fzo8pW9Z z8HhI>7`&MC%;+(>l}$P}>DVi{wt8(dXHH%$T3xjITIID0f5kO6Og-#!!Q^1`%)L_= z!#27yz3NR{DLs_a%G1h6SB|b6Q$42ocIVrj9Rd5+??_VB@eC zy904deW;Z}rJ(L?fy~VKL(XnYYj8nrg!~OTPM(WV4rvT&+@5o2J`d(eJ^3~1OQp{@ z3e+B`r`)lnx0KDpj9&OQ+?SBK~g)74Qm_LX7tSHdB664?dqJ3a7X!$^74b1 zA3U~mZ0AKecl5NJ)qQvM?rLR7WypntFC5&N^IERTjCr&xCaT`-`_#D~TRXOPU$9f2lv+Qtxc#;$mwD0)$i-Rult1H zp4vS%wNUJ$opMIU+`(t*?~&h@?;T$p-?R~aaYkwSl5bD^VwKFr_%*RF_R8w@)uVNW z)!%Kr+qf|^)P76N^*qttVu5UvcY+Z))7bm17Mz_L2(>Eg?5zVfIA{9p#7xy#s3m%){!H`i-5nCIvF|6P zMsC;43X!85n4Ul}++~8hgK?RICXe%VW`C%SXXCFHSd&A04(+kdYc$qqY@V9b{ziX( zTB9MZ%bsQ1J{O!CjLocymx2=lvF#<34;r0bi~d@F?eUyN+@5ng4oE!$`WTh77H$}L z!@&Oz`tP74Do0c{E^S=evVF_;Q-+)}WdGoY^vf;WyKwK`1NI&uuP-NXaeB4*#edKF zesswN0U7r}>O@^*VCs{O48$-`2*i~yORphcc~mMI&(18wSsJr6w(i-w=Xc$|>t=Jj zo|z=arVmz45j#jd!Q{+vnv&Yob8?2I+*n zK>T=mhMZ+n^VjV^f9jY(9>9go40XH@MCaJ z>WKZ{EW!K163O?~QeQMP_*WoifCu&qHVVE8)=y2yn1D|@J^5_0@8tryD*e0TlRrML za$H3`b*JF*)SXPq8T2DMMs(brGts6MrxoYS+{jfk2bM20D0R;Z1_{Nqv0Y~mJivtX z1;0~#rx`;!F?FeYv5SKZ126MQpbjGtlz@DbOK&w5|Z1EuVS52d7qa-$1PL*+5Ool>wjpfj~~B5quQf9()_9^Rd4m zr*&wcCrj*u%;HNd5QruG5b!6&rLGK~2yPFy$h=ay*G~$cG;`>mmp?DhQ<*2zpXaQY zTO@XPS>>`yS0J8!Y3habv^-XLtnfqehax}vzCd1Q#q=j`SlY0pf9iz73C(kT_AKn# zj1BX5<#*^{>$rcg)y%DC?vit6$T4}jl>&N;?q{E}bjdI-I|lTtJ!ea*W5Db5$Irp^Kpo+8!PtN=zf$TS)U5C+^^B2^cg23u zKc#M5tpa)x*HItBCV;8IJn6AqCU`tRb8`CRlYHeT0Y8L4G`-O~U(|(hgC~pOxo87rj+dgewnFsNF&R9L9bV%vz;F_ST+|{f--LkS} zWny_^^Sq{Sa$f9&;Lt$6LqC$eXSW|4^tSaT!nj|vrfBQ7t(&$O8rVGGH>>|$H+{0Z zr*FZtquI>@d3SXn{1W;2A5t%iC-8yT-95q8f%jJH#2?=>&@XU8&=b5L==YFg!{dJq z*bdhPX&XwX^jA&4`N+&SAQ#wRXhL5vpW2#S6v%_D8%&Phc4Ht9etIAdr@jh5vxmu5 zz~lT#{K^l+m*O+42l$hoVwZ{CxrP|=HNkVicL6&lZrIFXfVR|a92$6rzXV4Fw+0h~ zyMnd>ZOwZ4!_vzN10U@bOmCas>|I|g^*;**D+FTjpQk=|a$$0; zrUi2f=Bb6LIhXspV0gMM)eBr0h_#_va_a72&EWDtU$1vRFE}b_#uPKdX-axuXUmM< zQVJrN_)vri`5W6$YlF|r+l?SqYi zwSx5mI_|gtP3#pMADkJGb@1 zLuiEE%m0$g_a)9L=0>l}Yx=vBg3|-_h5rcfI62IBI3Bajs=uBU&T41`u z+RTyphV+rxp0!!!e|-aFJlkNIz_a@cz*O z|7oA#rhv>q1L8hxZE-h0zZQ@s>VHlRe125Gp0l<~2J9y5?%(8$dJ(a2IvkDoe>MAu z2WS^foFAYyx{b{CJ2bsnU@!UKXs9u>(Od)f`BRYcr=|@kCSYyE5ajOg%Ts|os&)ET zFl+jt*@Noe<_!4zI|bw)xem#%Bdf;->SM%^ zZw|yo_Y24wwv9OKxPa`DGdkmcAd|#X(S1R11w4|RHouOHDVSmu@i-G60&ej({ z;1Ti>@Cte+|8EJ%X0fop1^CN%dRG3yGqSN)4(MGxhG(rQ--}#CbMEWke)c@AHFAIJ zWIfRwUF16U*;=`_=kq)Ci3WV`%gh|`&d&vCjL!CsWb9u9G7(SFd%mMLGI>byB})b9 zfW5%pW3RC3thxJn2el<+3b{l6dj_%;4cSvaqigGr)~z%7%9p^yYz8(M9_EkS9@rcH zBYwgA)`n~*TU^JQk>U25oN|B9=-=dwJP(~o-jG-50bTJ+y<6-4a?S3+&&9LW$l6>U z&`sn!+VzDm$ZqegX4-qx`REf*(aH9~J-s(whjzTXee_=57s#8d0y4sTlWlFlO!9GLp^eDMZhI@CpOn+l|b_#pNXY4Qe zZ2j14_Re+5DE11S(b663G(DMhn(JX7(1PdjjOfj^+|xSZD>9ZI#B0|D_QCJ)xc#?J z>@x33Zn!VGM!upc_a|?yExQt}k#nBS{?ldN-*b}-Xa~&z{>d926$fxYx^eCd9E_Ivx#qH!@4f9pBW5P8F9jeAZrg2k(Uj@G;pY7H1#OfLI>;hs?K6 zevePkVvFw3k>^Kmu8RkNoNd`eXpU^Leq@DvxR>|!PUI+CA3dNmJWV!wK6}A7v`*H{ zHCuFT@BH3AxCedI@<+%abY`#I+w=KbykTEG3mxIvea^n)Bk(u&+_mvj>pjGI+^2Ov zYl)UTkMGu>{euNB$7HM7REi9BA>Uef3<{!QNOidyXH`0(nIa zunFny$$`(cbRXH^J*<~&c@OUm-Uls`lb&~xz;`@K9+B1f#{csVTKqz1`yIQ%XMKh* z;rA`tx98S^U4gFbp>^~O_R>0gMthCE(X#K}4Xu+k_TOi`4>?E|__Ds_BiZ9;_jE5b zU~gOW<(<6`o#I(N-|+v@z5Vk(^aDNZ8feBfTi3voXb9a|f6s_FtudPSGyY_!u$Ay9 zx<$+Qg1v}W9u34x=n&6FXQO-XhMv)sdypA)B)wt%Jli_|1HC|hk)8FK^>Eq`O+IVc zc=pq^z`lYtA-jB@tg`ObvGoq#hYq#g=*ODl{T3hkw|8TY@U5%?8Hit6JmJ20-1B)} z_s0`0S=!ojzw>|Av*jC-PuAXdb}pLoGx>zxtOq`D4`0>^4WMUyYyHSVyg*jAc!4}o zKSYPy6MDlQ*dssVo7OwgCHUR-t(Rv&FKiTa%{HQ2&<8sL&7f)Tf|tCXXJL2aHP3`T z=xf*Y|7eta@OR!H9lDP9u|KZEj-dzrt@UrckM~1s_{F}V9ryDyAJU%sd;3a;f&1F? z7A^aKfA4S6E84_cEqb<|{vO?XXEa9^?Glh%^fk{AatmqHDSX0-q z257~*yRN;lCw}Mu(WCwJ+}^>x$Ozx*O#AM7bhK-bOWw(Ma;hb_@P+rZ@AeJAe`%9;^=-B_;6EP9`6m7bX=XGte#2#B?dP6K-u0WqCKT(Z_nlb(^8(&Oa z?8ZJ?Lv%|1+F$$4j$+e_T^=M)-!l7mu}Wbf*2czG$D%N;ZuPP7K5+{~U-t%V*gW{-8Y}&&X@<cd)~L@ z-{VPifJWB}@L|iZXz`BsBnMjlyLUnB_{N@*f!35PMn80-J$7I8;5!?|?>!G4)3Rys zJGoASrTlyOGT#EfzH#(1AAQ#XZIYmF=8My}amT1DyhXt)% zEIo(5y(2y8USu^|;QyZ%h=q~etylxyhM&nla=|*;2Qr$kg%-p()r^Zb$me?>x`P~| zudE{-MkerGttXwZTi|E+U`x3^{6L**%;38ZP+LJgB}?b(0ks+J?J^{ zBL0*6crMRLFS8}wNBl!P#D1Y|zbDVhHMDOH*xB~Sb;z)T0{lWYpb5XjH`bM3;cv(! zdSGIpA4?2K+|9kj9sEul2(7peJAtl3>+Eqc2hUD+`tIM}u@z?^XYGsoSQC3fFQavQ z3a;Cw-py8 zbFH`E`+suXb!4-tU=4k-`#mR} z3~T^8&pYyw_%CRR?4p~=7mz!Y(`6sBNxX-BV!!*mccoYDt+hfcE&3q?$Q^kAIRJ4V zJcMukUrTbcPaUkm?>(b47dh2%M#zvXw4d;BlH2EMbG_S$n;U-Te1VcqCgd+0v))c=zk zXx*CAh4#Z9+IRHRk`LC#p0wx_@8LV^>izMG{qh;~YwxYA_4D02`Lf4kygj5N*)o1+ zqqX8wo{fC;9O%Saq67Qu`C8Yv-mcx^QT%4l?5Q>2v$bLf_7AVM{;x$R{vTb?VZOYt z`=U4U0AE=<`-ArB-cbR4PZzTJd^?6}`_NBqP}q=*gbpJHNMg zJ`Z$^HMK8znSX@dJp(?lhrZi0dtwjW6a3B^k(p=_FIzuy2!D&6&@E^gjkVSQJ=Xrf0sbei+4Jl}G5`&u5%20*ttlO6J?)?Ox8{EK9R7`;$s^BXkH|~wZl79vVSnt6 zXJc=oHF_Bjy1x6MZENc}TmFOf^&V)@z3d^mKnApAgZ%^Yz;od@|A)q`mv{AVH0s@b zCrdmxJ?Osd1kXff*e|(t{+?Vrok&lz$33Te&^cs4%RV8;CkFPA3~kwT*3>$;VpiVA z8d)1_M80??*RuC~DA)9i)_|VGANUXrqfa`*{qP@twDz8z4T3+cDgO4(=-X%cA%5q* zeOW{L(z@Ai*R@_~)ANbX@HN=y{CBYdv_>adFP}pP_R2F_M|(@(lA}Ijzq}t>vL`-k z-#mwXp@+P?Yq>vpVGsT6xjc{0khgw^N30DRCf~f9>!3|^hW_}JWF`HlR@DCCM=_3; zd?2%|DW0$vo*#{&ThC8M@%QKe&tUECxjk`jGM4W~Kl+YW#aqy({cY7ptrNM<&%vke zjkd*x{lC2;ds}jfZ1rwrHrk?3+?UMs(y^Jv08Zmi8JQ*;n+3&d{W_u%`T1v}Vu!KV9noT6)iQ$Vq#_=Rq&{l-{G8 z@trR`ioWa}UF)3zz2RB>%U^887U&9V%tpYE*~44 zICM+TSR1_Vom>mgxW9e17rtDlMT6cMZP;`A61)@N%QK)K^hf`Z4fc(UBtz+J*S9|Q zw56-W6ZqilG4I^+%e*VyDZYkR*|gS&>_SWENbH0@R9k^Y*)g7v9fMcBvu6PE8vVGg zHSjKIPYgyZTb!&F&*po#>>;0LOS8H7L1M9dAkXjr@DrJfPSCpEBr!1YBmHcyk6!S) zb?_cyteyvbvk|P7ck^82BHh3q!1t{8Ka@Ts%E$9V(q6h1YuF(@2;2QXbJ%={?+9`#P-9hz}}GTQI)gWutEJc=fK zk(1UC&*FVwuInAGFZ*`Ovh_k!jx3`?;TM z_&mDvOz7Qx{hz-@!}gXBiN44@*YXVHF}ua}{XM$_J(G3*-g>bwy^A&UIoCiJuIc~C zO0;DU@s@Y+9P~FDwPs{0`t**T)jh45&*B~TvPRa5&Ek8DF8v+4L`P&Czns5@@9}%9 zR)eer>)N^pzOZ-p9KHL_cB4l;gEgc((5^LOyZDTC@h%es?_y8zDjngP?qNSY7dp33 zXpJpGcUyCNg;(6e+WBsM-Pb$0p0)OGG~vGPZ|!}a?(p4n*(-nRT|9%|gP-XT`-AVu zE_*XPXwe87@Qyy~%Ub&zU*6j@*gN-eZ|~;$*pqnFbNO3*-io1EA3VUnVxL(jd_fPe zYv?hu$GWxTg8R9?ePn}(pRk|ET>1*1@?Y?XHSs*Y`)cteny`;(1nqejwi~)Y-(zP{iyJzz*{_UFf$a8oGH0!h00zFzo^zU8y64u4OSQBgE_hg6l zwim8#-O#sxyT9L&wd9KRv=2USuk9~=#2?_>>eZE>Vqc$OS*sIrtl`uoLhZ8u5E_%ys^MUkg3b zuinG^xIUW{jnEr-5`VVz8rhAu=pE}o#`_!cpWohk7whhwtqGdLTb={0cm{ickNm%V zXkCX*ho`Ltds9wOUx+>tJtBH{JQq1@kE}_Hx7Y~wg&t(5k&pJ$y~QQaH`~DeSa<8d z#$lIxf3b}t1Nl(3!fZS=hgR$XI|HAHqqED%b^Bz`e7WA_0Da4)SX*mD-utq4>}~7d z8NjvB9GXTa>^h&bpLB$^!7KL0K3jY5ZeLx~TDpHrrm`QrFW&JiXb5fjnZ005tUJ48 zoq+r$V_NRQg%mC#+$)5Tka-Ltgi!oV*ENKq$aLTL?7h!_eNWcsCCP;pD|-A?p)8$@&!KV zS8k_=+$;vf9(y`R&7~$Kmw6rTs{Po+nw&V|dp6FoUY-~Gc*oZ`C0Cm#_) zTmf*G-0bK&anDXUHjq`GFjg8P;sx7!k8|o<=NX&Gz#ihyR$h}E+19vWj$pnlR*f&l8Dlmb z_*Z-4TkfzPVr~lTs%>K_`{S0a^%nm_YmO|2*~p8IY8h)lu44}}_?%-i9X!v0*ZknK z|6Pz<@l3vvhuG2oBv>QFc|7B5e&r)MOWqT2o)hsL0w2pE;#v-254JGw$))_wK5S|{ zQKQ+ifqbStHt`~dI#R6ALG8qbe8NX`lVkW+pXS1Hi21tp^&BgWwd~E$_Q@Uii5ub_ zN1bn;AeZBXS{py*I{L~r=JuJtT#qkoEoR9|Ci2jct*k9LN4z^vUY0A!Ew{^Ee1O;L zF>%js_N#Y|5o8dHY9-?o;4V8kM^2Eh*}!#bD_o(6Skf-r+8RsQ-F!(dHrBGKxF#CtZ9kNBMLabC=szh%v2Y;}x|>};$fD_O*f8ikx}iJSN#2jhrX6-)G| z51oxKY7cdT@rgaOi%aytU2W@w&H0tgY8~~zT8bX(8M296_LBeDKwc1o@_)|Z3mv`4Rt|W89Lb z_(aWygY;r+`9s^b+INgE)IV$>*67B*#$MwUpR$`VjEwB8AO67^zQHp*&N-*}_WB@4ajNM6?& z8;srZfiX9ED3Xu1)QQGhGHOE(CzJcD@+-TmQ+-y?h&^$PV`5s~603B@2m0Zj{OtK7^BDeRGqzz{ z*E`qPDqmPX$Xb=}jGz1`K5z?1*oAy@w6^g_e&92C${1n1vQ-P~5saL$;|)@Mev zW$qCF#vz|^$hmwVCfHaGl()Q>>zt2EUig;lK)K%GJmWh)(AD|)ApfwXw(yJn@Wa@w zJ$B>=IS5Dii>x>!=GcNR`Z0d9mHq7IWt z#0A_?4@?UfSH(!`O$Kd~7YEq_jQ8v$PqT@>#2C)Lhj+2p3$woid^O^Sf(zvC6<3i56$f`~9;u#r1 z+~AQm<+{w>Y@;1HO8b)n;$IHo2mY0BU8^5HAsan1_FSJYZQD;yeb9?c;tZ$QE#<=t zyyX*d6&Tm)O)Enb^n{FW3Zd$93e9Z=BEO>|-5*PwA-!WedLa8BfSBhnm~r z72aq=yY%8u?dzXE$*4VcOdDuRn>Y((b`F2=8K2ULeD-TYj*?I4thRc?FsIT>q|fd15u5Wj?va7)@`q#2HCD1MKWT%%9rvCd{N}y>+0%P`!z1tUQX8(bUmwn+muu)i zKmGE(V|eB>+3}q}_>ZpS*0ycdyRNa1yv}zW_^f?0pO^v6Tz zh!ZyEJIC3NZjQ^#wywcFvN%@^dhww?v`1!KR44GI&-S~{d33O~&v?v-Uid&);~(ET zUmwN-?WAw?jjQzKBj*~k@RE*fL+)Is$T(Anl9!L@qjtbC(2r~AZcLKbGB85XXVsCQeC7iMmugAvumL`cK{*Al>?0ew z$-z(B)1UV7Ro-A*KGiqB;R!h3d_XQEA3a=0cDjN-*ql!M<9hOIORnN`9HSfA*ZID?EkdJTZ#ZLSN>VC)MC;lLl>&QqJ_E$HuIS%j>nQY}_*O7(4B+FB!F|4QndNpS%vQ$mksQ5F?K9r#yq-^v5A~6JPkvNBlr`@@5>+**?Bz zTk_h+W?t$ia5B|xVjp_&30r7O?!+g0@wN8E zzn3=bqrZ8FW7=d(@q`zyV}Bfyw{`zuL)hkDu5v$5!XKj=Z*PrtjI2f7l@RsTGp1+MR4;b-pCBsD0<+6QAHXJ#YhOUCZA< zZ?+{jdHBhetayo|uETk9dWjS5I|m2Zjo-C_H{{?G?fNWV**Xs&AbrB;Y$2ZUfzRkY zJHWTeG5h(?b#!7Y?}5F@qg}oiw|t~u_Mxx->6JY5Su9zP-Ywv{Jon=KZ;Eww>sYzY zgSYsSx!N4r+9@AtPrqbyKLYRAhrg|5g6pjlxi2ej%w70MeBnMndG5mhOuF|7?vePe zL-*S~6Jeiw&GH4Ch*>@%7Y>rua~k?EhO)KK?(4|y`ge_3l|$8jxa2dv#3Nns9@n** z&otmNKdWQtBF1pX)^%z&Ag?uZ{?w*(w9hv3q!&)GyDi_j9>>*`{DlMBO&$4N{$*o! zbFb9@ZTNnBI62@xIlkc?dytP zPy6_T|2XEk1K%U#`FzhtxR1sExGRRW?L0Omj~dGTBlmYbTj2iFw1B)NuH+)T;ZuBd zJ>B(_-+$n~Ag<#JS#T$}xlS$)wMlONR$t;=a**A%pMK{TT*VJ|)TVn+_~(9_=Or>G z>BoL#m>u9J^9s*5`JX7?bL;=yJnN(0m3Qb4`f-oV^Ff;hw1tPB3GkgY?#ZzOKky-r z;D8)JZ}+f0HzG#duk%@5OJ2ON{_2?r`P;n9v+=faqga#o=tUp*esNVh^sxplZgGt5 z+}rc4({%yQqTUklT&nxK;zEDoE4htVo)>VR59d5TseQG(aY}AxkF2BlSq_tX*^jLJ zB|hX_cJMy)oBELK?je%h_l*1gmjeUtqp~ZG&=F7F6FeqB2ha5QA8!9|=>JZ9Pm_Dp zbYN?GdsfSL$oSuteFFX;#+W0f`5NctD)}J)cS`$wCpX|MAIm3rK@Q`rn#o#{wv2P0 zyYy^>YjI!f=_Js-?NIo2ZxQo|K`wD9uoteAte`hj>-4mc!rU$*&T(w?S?+cjG6yMJ{v>o8SlAC(m6k zm*Gl&SAsU!MGS}yd}Ay688h%8w{pLG*q)1U@04%kFmXXY{xs&hR^ELj;P>&y7vl@R ziR$+w=_BXy0Y2>=@O+f-_QGBK^1V{NM+l$gD7nx*de4r!w=G|}m(51vUp|oYaFHGO z*t08m>bD^9m%if8b9=_;tbdF_xGOJ;S@Fw9d}DmnxA+r_&ShJ<$~eSs<}7TI|Ici{ zd?}VaXYRQGz9p|54#s@kGMce>^Cs`7#O zlKYM0Vox06uJ73Jy;5*dK)k63*jc{S9-Y{don{7b+VgbuWf!?zzVp1c=UCVe582%~ zZOr65&o_7`(Dxh3Lu^lea^adh24YvfBZsk6uEs-r(=K0X%d=NxGTz8J^k);c5tF`q z$#>0N8SvYszK_ZC9cpUh1)CUG*cQ+HzJlLWc{zS3%x^HTpBT|Ld$`WMI5|?ge&5;e zP537pamfy(sn;<^3kD3Ob#223!@9>ZOo`qFc7<*?0%A)N5#^B?v$NSH8 z>cg`#o--!vu7S@7%D|jvPV+&)?}hmtHNQ=vrjdU?>No$NA?My6@Y^hd@ta)U8)w+c zGd7+n#(R0n_~dt!o{!(gssn!O!tb%@UrtkpxQ~pZe&@w+@UV|I{YEXjv6Gx)j216` zpGBJ+2fQ~JRmm=VRGTT*>QlfOw;mv6Kw-XESX(M~;`X*wT0>ckz{4m(KL1w>(RJ;~I{u zxyU5$ZOuc-G&?{);~C!@6O1e7P1++9$T`M4@o8)_FEgL<+eXG_0DAk8zyO{O^zaC9aJVe5D?s z1F!`S>)RaOcqHeuf!w5S5$E_QcglS@Xnf{OKikPEII0#hHquefkvHT_ITGX(apHdk*j*mLH!?b|ZQ~R!YSSDD@IZX{ zKY6*$SfrM~8$K|nv({v-f!=CU^2h`Blihi2#FqT2)}@<#g=6@qFS#90`AZz*mghC` zR-VE)$DGSY&cPdV6mgJE2h<}WakHV(jTy)IlHll@2!`}Gjuf0nnSC#$tcJ0k$MTl zpWiuKJK*=QJ`wO+mH4j?m0QIg+wg-i+IMi~_oey`Gc}ZaPX_1l18&fRPuW<0v!C9$ zV9sfN!CvYle9*peN)B;8uCXuu$t{j>OYE2v+2SnU+p39i&hkQ^DY(qx;pbOrx0UqVLD?j)wm!)lS0r1N{^JTK~ zf%xPj@{!m2tlWloY8UY-UfDz*5sz{ZTNvkznS9H~@(~^B#kcY#&eF*mqj5x>iCemf zE4~HegX0+w#zSKf+sF@WDt6>sb3to4WR_EL!ujHgjl?}&*~ysgxO2%vF1}?0deG0j z$T&l8`PR!8a9Y2(iC1`&^M7*DkAHI=A=eQ3gCFpVJ-x_oY{oS&cI5-U;1|c`BK%eh zTE8{^+VZz+aaSLiJHAU8#$tZ(-iz*@^B0fumwMb<0OWJ-Y()N) z%~+u>P#?&T>L9s8-J-UWC!H&v`34W!+nS5MR7 zY$8{&F~9ST7-vHq+pHDAuLgC53hxq;7d zM2$-B%+qRbV<`RDT3nHX&SYX6@$Q&@aMovQ#QLENS&X|l%>VS1Q?*GqF~t^S5S#SV zukn}9i~*U)?5DeVB42yYPWrPJDQ4+FPnYnQ$VKcRXJ_u$4mcMtK^$p||0f0HGoQt#JSG;{ zl>O<=#*UdA@r9Qd6i4=Tej%6s*ugpKBx4SL zJIDFjVQ>ErW&GkZxd|L6EB^ASIivAi4MiqA&KQ%U@I^bud}|u!qWI+;$Js~Tl&A3^ zYd!W+YngA0PaIY2<-I#P;0T|}L+V}nX$!CEC3ma4)Q4iiaq-~2zV$^HdDgh19yA8x zEiTYUAN;P}1S zc}QLoTPX)S%L(!WJsj7z@tlqM(s*Eew!Xp+>J~iWN9%=RNKDw`p?N0$SkqN|iFL6} zRvf}N+>k%Sid@R>>S*uzMC_^&&z8;fg$v1Z z*RT;@k`uSZF@421o%G>4KEuO10(fW3$9!sR!Z$YK7r9lxwrrC13w!Xb+#q(vl+W&i zsL|L#pL~LkKC=}r;Cg8K$>Z!IkFc*Cf-ATuCgop!$`f)Dz2p`?5NBe^ zdD_vhTnqBDaf#o}oA664i8ZwV%igendz6oGVv~3w)uYxRSf+q~`D$ zpXjFz<0KtzU9W%hNPMAd@=w3=16zt2zN8cVy*EFx{^H&>U&@s@YHh=QYntxm$$N5x zwFvo^PINHeV`Fm#eX}+0;-p-rO=FcjMlbJ;-E63RV~xC{eQg?-%oVL$Tl4XJiTlFl zB=U%R*w(k$LOjz|T*-y%0I|bv^fFecw{S7@*R+^F$va{~PLbbShqJ~}$Hbz!jO+Qt z*dTx63J%EYa;V&bPkd->c8(ap9b%IXU_z?&A6;HK+qjbV$J{3#G z9rcemRcBj&lTZ0jywQb^#gSUty;gNPf4Pplc+YlZqK_E6Bfv-OC#R5=pR+CyWB4l{ z;T!(q6&d(ct>Kuy#H##657*0`V#Z4x(t&*1=UZ}%Eq>=$+>tNc@1VbY%Qj-mn2b;Q zmFKNb;;Xe9V~RLqC->Ogn@b)zUmoE@@hZmLW3le<85^IC(R{)l;)5OeSk9K$tqX#2 zT27<~TZ%Dbo)~p6SDfbBsx{YK=QBq0KUvg3Kvyq5COg0K4L-<4^pb1EI^Ee-zs5=5 zxsM}aR{Y|eF+mMY2K`z;cF)&1y>GyM0r$m>pX5=an4`$$;zK+f6Hp6SgO#sv3U|Z{ zpVC!)id%Cqe(~9u$%o=JbuyNykJRJNVU@<{pUer{@d( z^Q-Y4m%ZdeK6S52?c>=2_iuL%s8#eKUU3tb)Ihj0E8yOWnu<^Pncs0)Kgm&fj;+Lq zxW!Rco4*Zzc+o~JX)?_gD;)`qY95LZKwTV1MPI{A*EWrM9nK7E($RQ@! zoc-8cjN_D?BL?JTaJ?KwKRHQm7r*+|jyAR;V22kO&4HaA|8QQq<%KXHrv zY+~FHzx>TFY7jbluYYTV?knZmubALBFXN>1@ksl|yqq7V9oR< zE9cTa%M;EKkLGsbOU&?vd5c^p=iv$8kd^Pmzw_l+{kHjLs@gbe%BJqXu z;)Fb8kw0+)@PqB}P+R&l28j`EvN2h4P>v-Z&N~;s$nGVFkx5)@FJqdWol6d~iCJ>< zy%=F1d4o*qKe>*5vu~f}O=Gs$kP~b(H<5==^k?kQmp;Wr_M0&vC*zwo^+i^;qYvBB zL9UY@jYszDM;=f^kOLnb!*efftMkMZpM&>oZ+;=B=!v6b%KDq!#!~Yp`Er%q1;2~;l zBY(=H#`b)+)_5Vu^NZM{i|f=>IKUs;me1MFXZ(;u$Rl6j2QIi?&akDo+(mbG^I{j* zkxwqfM?Oz~=vz+EzU#F~7ItQLw&71X5YOl%AB$JHh@O1LCw!0>K? z#gbe|FJNo3;-eQ%Yg@l^koUOEUh=R!XkN$8WW^Iau*ElHDz51ZXVvxWhTD9ZaqK)k z%eo=w=D3`7A5J))oVS&0`9;j=M|>D-je~iA2u~cNC%>{S8QE3Lh*5bE?{Jgec;`Iv znPcqi$PM1J5&JlY&%9?dv4ZD0mh(Fq`H@fX0w>s%efS=K$S&tOU!U5~T zjSGBDX12-p^?_5`kPq2Z``HIR@Cm-^o85dSqxShQZO#5-CUchlGN<4j*oO!58&1*< z*pN-|Np8kLV1K#HdvS^f?8ztW$0qCt{K6mF&2fRR#fJ0glC`UA+0R%AKGWa0n!Y0k z|A{|#u~q-b9qgkm*Rcc0@%q(2{qSGR`HY9)9J12Yct@@r`?ZHV`qdYC9M?C0=bV>~ z$WC|dxK0~nNpA9qyx{dwU+LeAzg@%sVo*EmqhIkQ=HwXhCO+6++|%80HuBOo4&x`T ziFf{|zc}Y>oWl*r#UdHmi>>jNo@CV)E|LS!=q=~*kC?$hFKviFz835HpfBCBeVoG6 zm$DJgfO8$E6Ofx+_Bju?X9vWO^YM>=*`17h@0gg-7Lbdb_>JCdz+U?2 zL+2*{okxD{krj8vm44`^569`^Me{(;xaLTl$$E`o}wV=R-cu`d9uE=ki&`IL^|Gjr64tHs@P)9Y2eO zT<0QR#xFncd-{Wo*}ae~WkLu^;)!o^^zATfgLFH?ge`FMZ+@9y=fJtRdndUFoMy zaf7eUAs3mm|Ku9q+D~SEu{rC^$w$VDFVI!CPA&v*LaXL_fb|nXUhzqu2 zXL{hi`J>q6JDkjQ6t#wNi{5OeA9+9@`qf6-2p9FkcJ|RZ=P2~kSB{N%h6~!(AKz*Z zZ{;(e*;$;*7y2PLunBIY-sF*otg%>U_Fg-wGdsBkFI>adQ~I$rdHEgWUUPi>SHrR;d*%8Gj=cd5+!PL$|id ze&iR2bj2e!U@P&9%huJbImk`U;Zt(cL;LvP7+oFHPs%M$*$$WO*B4#+Nls#0dRh0T zCthh&K6S12S!-_k(6@TceLvUBhxn4~ZgiuMcx7jKLM-ru*yD50srp|!oWXZ?N)B05 za30;rA%^tJHqH|>a*X3-=Px#=H=W2Q-;hb1upRweZ=Q&wY#>f?+p}KQrrFAM_`#0T z0-kTNjw#mp0#B_&^S$%fNE>vci@b$tZsFM%dh)H@%y!=A`kdIoXwIh`7S!VG zY->H%KDyY)hT3kIAjS0caaiwxS8YjS+iH^1A` zS3a`l$-iJc)D}MDk2s;bT9%!~hPLR9hkPbCkd5!;W_>Jnfdk~kA3D>W z&%DQf`2=s-h0Zu3wgLC_FQ+*#>qT}VkMR+Q>1dp$w^(2Y_TnELWl#2{ubd=5(G73# z67=>DeXLET&R9FIA?_%mMPXy#*bk%Ht@&`ukcmhY$0cg-Dv?ec5;~SPD8E1(Y@ z^ktmapX-w=;*~yPMO&^>Ul;>?W+T^;8%J%OOLzN04C}-B_~TmrvX%by?OJVlrJUjg z*q_X<<4dyPus-;Uy)rh$Ior$W_@Z6)DTP^pw}+Fi_H~F-w4Z5*4`|3M=@KJsFQD3eh1G!x59PjOCSGJRX`hNP@~1wv&3`zDXZrA&ENq7lwyp!`i34^aHyeXK zGw0Etu5>iNa8E}rx6e2#K5#>PxQ;Ario5(zAK(LhB}eH;57z-5lTed!ncYQ$e zioDr&axCr1mimF@4x72gi!9zJ$Utr~lR+PH4tCZ4qn>F zVK%@ydeKjO%RO|rWe;2X#ir}XqYZlNlb`9TZTskJ{3AokWj}k7ogB#pI%6aX?cMN>iu6Wjlw%9WDu#a7RW_L*5v5(J=vmx68ne1~O zKJpv;$@O?5C&`hs1Nf8NVMFKOne#J;Xp637(_iYCw$dkE=$PC#R*7TvA$TvpgF4kd z_FzZ8U?c6Z1AFL`+|J1w$1(oGS_M}81HnK#r6>TfZ` zE{@?FJJ8j&cT@(o|%7$5KtKWNiF^5F&9z4XJct~bZZn%^A68kA?Z?DM>#d4YK-j*x|2#9H!@ zfAqs2{FUPd-xxFL$Oh?W_DYW1y4H(r$whYW^(9x6*?uqQx}Gld@|mBtoj&lH{n?q% zamg09*aW|{`BA@W-#&JfPw0vRIfi83aUL$nFUe7HseStDGyQIhkH$4Hev^|NY=lE( zrWYS(%+p!F{3++zpZudUIq8qn`p7mjx6qxQcz|2_U^6ea)t)}JZ9Jhf(9JP^B?E5I z(>XrlqieLKZN3IR^dg)7$fbYpQ-+koXSTwXlm&nIBI6OayvI55=)L?!=agNaVvQZy zQ=fFg2YorF59g8Bb+-DXt3Kqoi~;@?W9et-u(RvPM{hpT9-Y0krC`YY@~t?=GkvnNJgja>?s;#&T#$K~Ecz!G{n#1b^-Dkd*q27#!-%VF%Fy6ek+GUV4cBDt z?>xTD^{nK0>O~eZX(wg2k4)k-_p=+F@yIs0?Y;9dzQ{;!*Lx+W*iXA+iH>CC}O^iLN3+oykgz(Jf~bH4DIFX`)g=aDD<$*#^ZM&(+tT#29d;gI~CxedRK z89BD&HDB|y7$6H9kS)2*wm3EEL(r2S$bnzL9({ezSIXN;DktruH2 z^W3Ps%?^&q@AL%nBv;viykyabEm?4Z{^X<|UHQ)VVh-uOW6otG=klfZ=DF@$c(Dul z#6;Fke4roP_a67OW&Xqe+VojJcp}%>W*uQnckjVEBDvTpZ9*41v8%BJ*Rvlw^L@r8 z{*y_J^Skrt?L`LtC zzpm4#n5WC^fctoAD*9V5V1GUnw|u~M`e1)@lP_fy%i`9Wwd=HpyY8*AgP2uQ`#&82 zL+Y7zYX|r$X91bm)3xGXA7tZuHrIaU2J)~I?vRh|GG=g9-{Q%Oy!@gK?b^?d^kGYU z5kGj1GdRSa_B-x;Ja8{ce_4amnY`@CpIKw^NAk?E%nSM^Go66U>`zZQ!F_?B27G^l z*v1pjI@xc19GB^cHyN{dVs5~1_Ukuu411EFjpa!?xjy}>4cFin;2AsdF&h9|x<;Gi zWY_FN`_5+r*K3Pj?3}!%A78N*u846y6kE>6eYT^&_t`fartS41kFcda9m|{}AM%+t za7=yUJ)hCX`PwFvK4*Uju}elik@J9juHzTi;)poHP5qNk{$mGQ=V=2U@FQ~+TO}XF zqW6GL=#lm&6CTM!`qqv$O833o zyS62xe&h=8oyVtqrEP6!H~pv|eXxV`?Dv@+*n`h;hQH{VoFYGc$(DR`Ejy?yXs#Cx{VzJAC}CowDrAjczeYTq^Pjq1~9{F1Z8 zHcs$O&XpZ^y%ezcF>Qns`y-?AaQvza#ZmE&5D>Dr~A&$*8c za=ao7-R<*UyZrAu`^m!|;!uC&Nn7$CZt>OZK-!MY#ESiL6rafvxQb8mmHI^7kd5Eu z9UP#K>+pu1UBe#a$+)MZ>&TlqMcuSs61cj>Bcw$YZp=5jOK&jqjH6|H_^N z(588^^Stz_Ep}!zb|51?$xA0&dZka-yNrebH$Q&oP)br&#JFIm*l%O{9mK* zX%T;u0_4=L_Swc-kb2E{BKPQn{9gEr_w>dK{!mxC&iVL(E9Brqwv;pYmOi*iR`JIU znIG%}$LUVLkH!=~WjxVWi~$?iPY&F|8Fm2eh!;LEeu)?U)h-#mS3A**jGh~r7Le2P z83r{bpXy)Ra-93+o`F)&dGA>${9q6M6#HyOF1%+OTbz-{`PwlyXQ#AP<`n0!v6p@1 zBzwjr`O}8<=c8P!(>Fhm#WB2R2VBsGF;_c2(~A%If?xR`&-Be6a<%%#HEiPfG5bFH z|3=#UC@0jnVhq?v%-|AU@K@TwHT2+1zNSy|m)tqNeKZd76rY?=C!CT8#kV*&*4ig0 z@i*V&6Mg9*_FPYIpqm=rHO}>3&R`qo0Xb4mvShAuz4n}+$lNz6VoJ^A9CEU;Ejx>K zKBA*I#RGP+wGYquA3ym)-)u}iKB0$k67Yh2`oSeJ$-dh0IXTO=Ui2X&9oWUS8Tb0b zUA)z={ba(`w6*K#q8)Ou8yOtu8}G#kxR!6(%zM0Yog9$7PEO*u_|5!b-YA~%29I2i zo7%J0X8Jlgp>6VMn;pnaC+D-b7@-&0>|<9v@|kST5i@L`F~C2LlMh^POW*8|Uw}RB zlk3UECwUG%z3|&U{$P820CH&8aa*yWZ#s}EYccsP=VgxZl`Z?YCfm<`laDE%zQ~dG zcOJOTIch~*qXR!{Q*Oc|_M&%knf>_^55f< zXiKbVKgUD49{9$&`O*(w$W7KYtQVLs$Q^Qptz0I?*^&*scMW?wC+(c_vLC+i4;knM z-peVryc*k==Fnxkmfqo6OGFM#`^G=V{ZmY(NGv<-FW_?^woI_OE^M zs~vVt9_Wvba*8cG<+Hc!VhqO(afV|)8;f#Y%0~99o6R${ga5A49-H!oz5$=abH)uF z=*5;fhV!Eu&pt25*@|8nx9r9i&Y^qeD(BJJxvpbt=eQ1+oa-F>$N~7t-+a#p_=bOM zqs9jMxSqUp&b3SRo$JJ$=AkwKGr5# z>FAjA*odF$$Od@f7`qzV^rLUKNt=rce8*Y#%lVdE))1)j-?OC!{^$jm;Q51(^vM9wkL-+eAXU6@gX~?*R`R2 zHsC+!`^?^Qk$&)vtT;h;KGAR5!g%d`^0T?u?BE36dEpQl=qx|uGk+w9@qir8;cN2| z-qJBpV&s+BMqNpW|NU6m-T3GP<74@Ijm2Yme=% zLDEUPcr0FxefhsT{?`YWt?iJJ-|$oW`nL9LZop=88Q=S#X|*|j_)LFwmRjAGT=Iec zGhi>k4|b6A^@sDuUfj^W_O!1p`69;^^CRuB8M$W$d{?gTg7p6@_@bSo1D=JakKf5- zKl3UzkKh0D|3Pd>UZ3S3-|wR@vE#jU1@Xd0;?7HMaE?CklpOToBQf!lfHv_!PG&#P zh1=)&xH4{@H@v5()`3&c3z z@iku4!~d0NTi?l1HrKcOmFIh}w!nG&@LiqZ^R$4qzvLxb8au25;Fe>)qZVh`C+{!N z%lB~Nmwbi?;t)siM_%y1PSzRN%RLF-3ua9QPke8a?^D7ZHe~K|uk-D9E`R$U95F*S^00|K=NP@|At#7&y5pGdCF4ie z@DG2nziZSOKKFw+{@}W?N8IwG`3f%3!L@kKhT8JK9r!3NfZhCmAD`Q=U-8CI+R_Fd z@H6}Ptv+%b6Y#xj&XM=T2Cjg-$(O!652x^ipV(P{zB^eS!5KMMfB1bzz&XYR@a&KO z#gLzTPpfOh}Lmg(fEXysV{!81DVVjwIg5f7ytRJ4gVu1zhyllj>RMY^NH^YBYWQa zAg9=o7vvRr43B&dB%S=Op8vP>y|Z!>J@Cr8-6w(_>NU_vk^IP2gkHUe!7Z%V<+9{BNuCf{rJZ=<6mqTcjPsGpfmg6GrRJO zn9?R*;vt!E$M+X$%V%*ef5@$B5uf$tJKDXMAH=>s_`q){TZ0sj@`FCbTz$~iI$23kk&pz=emi@0ZU*d}R zGG^J26UIt#(=~Ex#h7b8y9P%w* zv8(*V?ykiTacOK~8-4N>8QIYP9r9E9%2po03wk@3FI_Lr*uqu-_l>+pN<9UkUhrcE8sOetT}-z>EZ>Gpr$*6-Nq&-WXX!}pT0=C}_(Bt*M(&f_S&VgS9 zP78b|uxEgbXBB4^Qv$Q%d!TXK_r3bCOo}82D4*n!v$%F_ZITN+0EI_3iS&0tnRGt9)Ssg14a)Ry(@4@;QGL$-AB6<>xuP| z&5@0~<##ZKi{WCoz`B8X0(|ASP1LhbG*2`a)fd%|RgYC)3(Oyw8u)qO;lRfA#`RLo zQq2Or1^V^U`NjFgCFLdM((R?&9}oPp{AHhGs}!pg^7yV%AAGC%R`d1x>-C$}o7Gu? z(*xt`arF-aeA?=@`f)D5xIgDv72n}cN8fqt_ajekPHsLG_)q)@{%Z5pX8n5o`qJvsV8vq2`BN=! zj8voH(?!ii&G>*={A%F;0;@HvH9rVkANXE?zH0N)9Q33Yh`xgSZen#Mg zz%$h|)k=Zw0*?glt?#YX(g&6YmaBJG@0<`=ZeY2AM+0{c-aUB6@EOA|1oj`=f9R>s zQ=KmrUn+jv{I)r-KCgbGdZW5NaBX1mK;5moS5#M2`0G2-C$}fJXLe?Gb{g1e;PuYy zom1MUw4W-UDnAkUSn;vKIJ{%CV>4I{R@;tlJNk){PmH`f_uaXRjxIX7Uw6MQUp!tv zULV^W+xV^33tJbq{#E>|sLHB5sC`iTzVg2E(BjZSU3h$Rd~)e9XKKI>%f?RG4I>Wx0^lcJ?gir zx2mJ-qicEiXMxKChXstG%l4M-*8=8_eoM*k1*ma89yql*wePRJo4uP|16u}etZ%Hh z3v3(UlgZ8G=7PXq0(S>a2&@@kmtO?rs`mr>{A}Qg`igqTz&-(E!Onqg0viPu3oH~^ zIPkr|oWNUwp=PL=C-7+fXssP}y!!F^;`!qK_WkV(0zdEkytCNAV*QvqVfcjMe*_L2 zI&A141OFH>o|(U>Pu^_aY@P|s8(6tsIkLrKB6U zs(n>^LSVUaxpK>5%i@{VGcC2s0`&s*o!vXThmIaP`h&o}-F>^eRl8O1*YDT(KRaMv zJgJxzqtA=Qz2&{-^6ll@$Ck&I#}~&J>bvus^P6|;cl&mfU#<*X61XQ|{Q7l3jkSES ze4+o}2QCbZ34FKsZt-I4#r{~V7V}#bSp%{CUV+(xJ$ife{5J59iys%S1|AFS5_q!p zWb4L&-zzo;F&~N{x%oz5{=hr+JM~G;N&R}tZ(@jT^`Lbc^`A8=wWr$DZ+?z6Bh60( zD+HDc>=7{bJsuF(;{NM_Z390Fs2QFQ;K#**qXVZ0eiL{hFgJit+Wb;rrNH!n-zp}{ zW39(ppDjOI-VwO1eOvpG&LN!*1~wSjVQ`1RbB50uo-=mN*t5r+J?6VZ-yJ%yb6)3@ z#U~3jxH+P_)0|AMGcL(7pKCtXc;*CGp6oo?*=KN{$lQw#KGb=rb3prm_BrJ_rI=eF zpiYmnryr+FcbD!?8=W?~Tz9$d=GEraBF!R=In7@Ja=04dKY>~0tnyRsPqp7E-zncH z-YEPI&Hc^&jW~F%dab%Euv5KL{olZb&4$fQfljZ}uUQu@7A@8&*C@xg$G1NdIKMo< zRClUV&7sx1wtnwuD4A#g-ME$?@24lfQb9tvy~7zlWtvQO~%Ykkdcm8~04$I(sB z-#YMmz;BoD9oRXrbzmT{`iBq;3kB5S{Ip7-j@NKA9M#{nW|_dp1FgWb^|SSh0b~E` zfnAzi!UFdZ z7Y|%KFm`C{(2;{j4!+QNp>t*X%J#M8wdD_s9~Nqf19}JaR;pL3@9EyteSGBck%@sX zjDBJCmhLTGx>^fZxmdYBCs4z0Ty9*x7BKccS3XzXTHIP#?_!@5suL>p&HDYhj#!qj4k`{ReqR2(G}g;;28TZse<-XI{JHsaBR{IMj2p&E`NMc~LvuqT z|D0Z&UTo3cqCHP%o{l{EQu$JOY|ItZDt`al+{)N1|4j+P6%;xW9Q5M$(E-Ei7`F_>mRflKHGh?2I0x|a&&GP+xLWXy{?{+^3+&X&e=n>Tsl{)s4_9g9+!I44jTt9UE z(CmTP1M_y~?WmJKReY+zA@fwV_5R)cyN}L&bna1s+edC6nbMuo#o^_O<%*TdmCOGG z$n~4R#P-DY+JW23+e)!#je)JqbsidhD5}V-M>ncAs?^E1H@Ej|fAjroTGzD1_rc}C zvo?*?=z+}YqkoU7T{|yRv5p+_#?&~G3K4lI~{UbD~Ty{e+*l*w`Na` z{Yv#pWiI*r=<}mjHdi+LmHUp_LPxy^;4u7V0k4y{EdTQtO}II=!`Hv19Sez}10g0$(Y=QjTkn zYp)yd{*Bfft(%*hn_H?|s=svq(ys~EsMe@{RR5@^%Qdm4cVFwi)`W6Gd06|fwlS+4 zm=V~fy-oY8#aD~zz3II}>qF}`t2O)o@V$DqdNm`U&RVBgr?GbOw^;kVpmjmZ`PLic zJ-@AaMy!ph{dTB#sBfrls16LsS?aXa1K$YX(vbl%zH+m2vs+-3fN_8E-r_wz<`cPp zYBM!viYNDLpS*5vJ-0U2i!=3v?^(N`xS;rVV6Aek^3?XJ?PG?I8NPqs`{zA4u-Lf8 z#+^NM_Rv-3Rpo;*9&FHT(Cks|QLWgl*qC3+X*fB3bo%J;s^3*-wa#kY*}k(qeQ5g7 z<~D0=+vQII=gh#QEDf#^Y8lKk>OXWXLM(D&mTE|H=#BY8iSi6ZmWK*TOpFp3R<(*xDo34dxBZSIt+cJJn3q z35`kWf^*yFw$JLE)meIA>4DV)D|A-qTvlFI%5AUKuhv^vTUTdw&*~l&SfyH}nov)O zy|32G^p@%0+wi-o=DGUi_tOH#vXy!(^OTA0KMx9;Hj!L1a z{~5SHAhy*m^19m17$N@oTz~wcp8sXwfPgukai8st?be})tzh z@962>)4Ll6K3#vhwgx(XIe)oqXW7nrfy3K}w=XX*FV8N{F5IuWJ?0}D1U70m>ht=k z>Z$6a?n&LDYN+}{KwYiAJg_*hxS_nET&lfPTP?56ON&d3j|b#9zYEGQa-n=|y=$3( z^%yqx+dC7BiN*8f^W_Ge4LZLJY#DgJ{eFLKr!MNk9L^f4HI?wS;2>>e*`pa+O-e`VU@D>`m0Qq_z%meR+L(+`w@I&kQ~@_?h9)3_mdRz>syB`-=Pe z*N@ht^`Zgw;Ew{EbT{d45!fxTP2lnB@k*^TrJPdY+dhF9eme`d7jBV&lTv*e5%m>|7amxBYIrzm6aGZ)P-su+!B6`h6#0J;NC2 z{WXDunuD5ty&o}Y?*F@hym5GWc&T1=PtBOKO+eo41TL*F?bp&{>#?!2b#HAf{6+DL z{`$4Gy9omm1|I1=(lM9Bsq^Aq4!g>Grw6_eFs54XA=_HbTFol~_r4|+6Qa`Cv6w$_ zN$Zls2dmB0LgMbEsF(4_L3$$J_PW z{kg|_v8HETN!@PjKPIqtz&f9`fS2Q5D*l~Po>H#UUME&pu4>C;pBwtz&>`av8MjH` zx-r*{d28scq2G3X+u6I^yTmVR+)oF{V2(O1?(dl6-W>PltdC48C-vvYS9h-NyfgUD z;GRQ!4lO^p{NPRPo7(P$+|u0AEE{XLMYrhgIlAZQ9f2QIKj`P?XRBwcnf1*2hs_Tg zYYUgg?`O(GGukuS8+JDA+!pH#YH{oD&o<9C57rO%?_cat?NFKX_^gI<{qF)h#_w;t z5BhlEx#GFvf%1WJzV>|WC(0*E^~|oZelCB>pX~de>OcLQ^^f`=^-=NLqkd=8n*BG* zZjw zEnvQYGfM@mtN!al4AcYtwRr2T)^M%q8;{ISj|>W^z5czDdCGap?*JDS){`LO#V!g$B=QZaw+sFMxISYr53q%N&%XgOVEI7E};MBm(ftdq)boS_ct^8VP zJp^aWwanLlKl=O81G@)y$H)DnE$c1o{hR&!>q+Jra_5_^H(UC?Ca_F}b?8#UYdf$s;-3al5fmSjDLyy{0|`g?(O>vj9N>el+!n4ypK=j(D% z3`O-D0pq$_UHq;T*gas*BF|bA#x=PIAFLyYeYs)lSR?vzz`dfmt+_4p);-ES$~yz* zCWB)J$J{mcuCbE?Ta4La%#@)iLoW@yG_Xs#OKDBe+K?Lj*r*@mnbE-Qt=n7cl2Y=q{eSH|AdRx1$!f zmZFZf_B|``O2GY6bApQl{%_{pcz(pWe{BBP&(jl|iT$-mbJl+b^-eU1U zJ8*UD>i%;N563FrZ2`}ZtX8a6j4j8O>j%v3tjVqykQ3Bha;mwOID0SPzJa<}Jx(6a zWw-}mEy~)Q{Ax^AOTQCqw(4tn;I_bhfqw;<^fw+C-6w~NPo@NdY^O1YyNs;abw}NOK+FnZZYp$FreOZ-{JQG z^@ug&v&yqd_p@#pyk+o};a7%Vf}xj&jvP30V6;8jUaVZK^vs5}WI11-Ck0+^z1&hO zT~S^UmGcd;nsQsYSHN6Z{LAlZ;*r)!%UG~)Yu~=l*vMLv^=SFg+|)R^akFv%e#EN1 zRr}8)490U7o(Xs^;NF`#!zqD%0_N5qi|5rmtFe24Px0%fz`21aKUy0V8};Y!R~1(k zF9+m!^_BZFYTBn;PxqfQcqyLwv4-`tz@Gze2RswC-iObdsKZtac-L||I6m&W zej$Jh#vVBp@2rhp7qIU7e*tqsHOt=u-m9~I5)i-q;U3D9u}1jk08V&`gHHsk_p9fO zNA|PPX@LU+=KRK&p9jR{q-Ii|Z~e9SzGatd+$Xe#{`Y|OUF$dFd*gea`<)Z8ZoX-` zX?b1yy7ozdiv!P=&z5Hd77d6s>ldCky18|8jBY#kW6|>$=N9Ki_4A8mPwT1J+rr zYvGXRt*ofD_W)}sFJwNqoj>c#5C0fB`B?%k-RW)w5}_aq)D9w;6TOpfPZ-VN*=I6v^K zfZE9#{Mv!71M3CeE#56=1uhQ!E^v2XYT#P|_gfYWtQc4}pl|DE?0s^;y=u?I8LP#f z`qA87OkNwfIxs!(<-p2}V!#^5_5pJs_dKkVh^wmt>hFC6YU%|8 zoq+k+3jy2H1Mcze9XKekVZhwuOM%S;TLiWbIKEC`YGBKNXJrluxaORIar~bF_1Y!@ zajKp>Dqucze84)b`rg{hlFgEF2Y$8wy428i@7A z`vdNA_&;?EZDt)nzOzrhfea z3YZ^U7T^bY!1KHA%P$q!E{^X0|?zcY?ErvyABYaDY={;L6Tc51*niG2EcfW7&`9NwDq9)WcN z>j%WzHv;ZKt{d1Uz-QiDXW1^`T(KgSDD_tx;NpQ&HvEBCZ^ z4a^K!uURIrUcmjOjpO;YP^~yT}?*{%7(6Ja(o2(gdzxbHIrGX{mp0?UnKJ)B?=N#oT&mx#} z;h%h_p2pQ51mq-RfLwe>fUS%Xa=kq59``u`Haj|i(|ZPtHFDtE0na<&yS0;f0%Ab! zw1(hbvO3W7meyTBZE{qAT;kOH!2KBG-`w8Z{P64B zd&wbuZ{0xNlA~~<-TL2mfVw}rL}2-V`pq%E@x1t$c#a(BjYXc7HjZiA_%F8A(=P-( zb0lvXufS)|D%~4+D&T)j$`N4crp&Sw1qq zd${#*fB)O9xBE4_m@_7;ujdOm&wNW;iaWKYwvCI%OSPc+q50&5SPSKIJP=#9>K0tM zFd)t@4}3r1J8Hz2{H$*DOuThMcCh}cW>gbT4XD+{m-TvUH1eK&_jat&{3hTz2YK&= z58-~%w18Y>{lq-Y+Lt+)n$jBj8F8=P{A*U=y1*#`wVhh;w7~g+g9En*t`EE#aP6%D zV`eQ#Bp8jiVu`1UN8_%#+=Q`n)mL;qQR^8j-W9KStaZf@-XM?Ax795e>7 zk$5ql@iQOK3d{@~9q`$`QL!$b?31_DjmAI!KjQjh11AQY=N#wah&hGN{PKfYx&0p}94)nP-V7_RbNZ#K+pkDE;rkuo2HwCOO@ZUCpc>?Ax#xwW#&Gq=& zvqNejYYC?X%mc3oc#hL{&w$*2PT-J$b$08V+XSq=TkHFLV9kIv1LHT&SzB_D+Bk!&);;ATc}%U1yVl;+Eb6wy1M-Sm%DSTWcxO&yexv?6GoY?h!~K5~ zcOR>DUB+>obF*<=>N0Z0GDVOIqZO&G$(j$j^{`TFTG`4#YNWPu)$$?N00#s8L)f&3 z`GEAWauqeohN}#6`iHDdiqf70`vax26dJIcoYVVtkKfk${BfUipZoXp{a)AS`drud z`riIt7U(*CP`3niik}9@ut&8y{iFINwX;U!=USEYQN*8 zmN>>dwV?h%+@{~x|HU!K;5Yr7^oM)5F2)b&@ZSX2RL{g;>jM9gr(6=mFghHE;dJ)1 zEj%C8z2q;}3hoOukGM@EKN)D`uZ3>}`Lf*5tIvo@Yl3=#dGNc~rAF!VRa?kkE`&Lx)F{4m0(=WGmUQi)uO}<`L9@XR-gs# zS&&Pu3*QU(2Knr&AivT-ZyoQnVE*YKb8WAV7{&M1j;u|He{6@%(tqX~C$L@pE$r>O zz{brton_ADG&K5Og6CWt)OPrcA2H1{I!+BuJ%>-xCH6juUC)FU1O1{dqQ-Pp7-|J< zLv6@-%W)lNy;)6C-I!)nn|vUAHEa#^<8#6JeRf%}&SL%G%5Y&AY{t9+U8Mh1oWf(E z22V?gS9H|J13U4$IJ_~aYp9XQJI(vWflXRZa$V11Ts#LmVwZb@J}~3PSH!+~_3)|J z$^pbX{-mymlj$m)Ay%;m^{+<*ju`C5IIC~k6Dg<1C-Qv!BA((KJ}hUGlk3S*CsBuB z1CAAQ`3hKjFsFPK&(S6Hs=34!>Zo^)F)xTqe+tem@5eK8L%Fh?+5TjjPaV)0s83uSJcrs2?Y<$X*QwjRGB}rh6dF<7 zS8E5)L0{lgocv%A>s@z!;C~wetVsW^b2?+Uc5n8H@%ifol;7i%Y{C#!&;Fg-Jfzx)MX(d+C-4o#aI zuifn-T^;CqHC%QtKd=rWN81zj20BtMU=5Kb7t>A(e#ATcg&WPG`<5%v0Q^tBy*;S; z@rg@=Irpq=;pFy~${qFi%H!FD-UGhDSFAtsIrm|Gfj@gbnip5IIX+-K@TT9@#pE3F z5IKRmfWBk(>NA5e;-l_^O{&ea8)I`$*xx=|v4B5XhoL{M(~4QRjlRT_YICOtoG4b~ zFo~#j0BbJBi*I-)v5t@M9UAtFK`x3n<3>HKSPp_uv|RLFNgMsv8?e z`Ip{*JmB2M)7)Bj7dOQ(+~b+qq*wE;)-G1LNBP*?YANbSw6C?JCxW#Dyny5Ncd13- z0rTYfo@k8S+uav+0 zytN(kY`poSnv*&s9V@Phfp^cid(1WN%Q)~ic_mwwM{1^`Mcx$L5B)^D$RX%_Txm^# zjpJV9b5pn|h%e?quf?Z>*dz9vSGg@8qtkFNZH6P|P#C!{8%a#iwzY8Uy`>k6@^?(MZ-x=`i&~_lCdeLeFii?Z>tzB+nDa=LY;FN9D(K znc9T0bZxOkecCnHr<#Xr&{5_=>{Qcuy8SwG3F{+j9sdk-rss@5b6fk+_>fw~E84Se zUi781VS3tnws;{9-5GGMW3D^4hupo$v2h2DYTRgNaY^1z8-d!YxT}}WyqRO?r0wVt z=W~8sfE)M?Tj2BJ6m2e!$vwXi_=Y@JZNoU@(_4eF=kGXgec;=B1Ha`v{N}wueCH>4 z6;IO*;=OvrxfAEs{k3phmwI-_vopRQ*t>gwUtk|Ngum z>(uJwt}V~OQ~ZB

WVyo*mRI-J@~f|7vDpko8M3%{lo9UNaYJG_Py@&N=Xkycox* zh1+{Z->I?95BdbyuJ`b)To~8mH1lZR7e4j8xSd~`J9RqTZasoc^C5Go7It=UFKo$i z=GGkJ349|y@2;QiS7FehLobvyS8-Pj=z>6Z$gS9lbzIlhpQAo19`hNs(=FlN@PnW) zP+#%&Lbv@sbacXZtV!uYV6`GeQVCe1Y?0q2c1tZfw>b$#As`} zbhq_DJRx^;ZMho%l^2N#j&ZD91UJe@XpXH})4oA`l-V;|H%h!C)Iq(ku z7E@>u8r2*bL-x+jjl1(0LmJ08$^rO=x#S!E7T4Gw{-W8~vH9ei=9J$!mR|K7!x+m= z=qu01M(7UDub;*_*}mT$%h!yfF~haS*tv{3ZuOkz;F(}voQEyYL9~whH7;y}9peS| zVeZU7|L~(%*n8}ckJ0;bM4Thm^B&t?^BK(8@tz*zB{N1s9O3x0Sz#;BKy!GlFazvU!Y+V)PsW?uYb^r24J!CtA z8aS*C>K^hp`HC8e_tfoZ zJ7aI0_?G#kwdg%sM{Yys$y=OHd=+bePqAON>R7<>?7;it-M50@X&AW?u9DZ`K6O5R z<}=Q{H0U#wvx&Y7ma#^!=ErZq{NqSmimQiLyvIM;He11cYzf2)e&~Py@4N27TpJH|DZa7u zLF;=pCpgf3%bm9e^CKs}FAVXNuktNFo`p||hqwS&(AM%gwu6u4)5gj3;~2bw!_A8| zF80OO`J9-D&-sivB_`3?av=2@d7n6=wxw=9#0>tjAUHQ)=Nrb4Z>fLt4adm!K-}Yx z{Kj}$XEUbaIlHD+-5cOT_iF6iD;{A_G=*aZz7*5(AkG?|AFmh}=ix){S03wc$BJiS zq~pAbb9mQ%h<(OTZYghYthkL^*#I6k?#A30%i-j5xDqF^S@tMqiQ)KGj>wL26yFtN z_yiu7i;4;S(R`bG@A1Wzfo|m+{DzL@Bm7l7^1J;3^q;yp{Y8VYA@*b(h8%Nnimf%jdD33D- z<{x+ZpTF5Fd&WVy6$d$%CSg0c#^3T|^F-6o0rG8}OQV@*IzfzaJ$VR!#SO+&kJGZ? z{&6Lp!C(0(PUic5=YRgk2hFSFjiqDotaH$?{MKiUt1%Ui+039_#8&6=V_bX&cMQ75 z^X?6vl?G)$o)K4rYqC2roz_;9#*1`<*WI8QkL; zoS$BxF~oO#$p+0Wp5hC*f)3`J=ZCrBrKy*usf@&@_ihH7I)R4T7L)fD+aJ(EvtT#9E9=>JV>2~8O2f{h-!DrM3 zj5)qhOB=?L?#6}kHTNnn#2Nh39ODG_A#uyx$a(poxz~RncHts=kPV7CY+ZcjBSW93 znu)RZ9(%xRY#1-m1@3p&#HhfcfH!;uo9Y zLpaR+Hzn=(y>i@RpznQY_-HsTs4a{2t|@NQTy&iCi#uv)v?RU8pVeVJAK#FxvRj;| z$NkiLf4!=isuOr7e9MPvWb=XR#Q`-2@x=Ov+Jp50{b}aMco`RY3of+wy{KMSJzQ@O z9}D&`uLv`PH8L8Tj&lvX#3r48(3WbPY)d@FdE&XbRPWN?s}EUEhMLng;cemCFel(< zwqQ(g9oyVr4QE$qJKOYA_0s<>{5u#c@!OoxWnzH1v!HeT)5BZC)nQfmNHFK-m$t;i z>Y&yx|Izy9@53FzcMz;T*0*DAh+oqJ@+cgFyYx+&*N0|2H16Sie8%JB*x}W>y!*D^ zc~|`%>Q1AusUD&OVN19t+!^+VYp1Slx7zJ}bI!9<^f`MIgVjaYx;dxaU+FSYVYpF;p;&ik5ALF?1{~&`RRR8H&k!e+hx5Q2e^)P z;)m;{+8tgNo@!tD;=XrcUeJ&7=CD2(Kl^;xF}`rm=2_3Cwf2+i4Ld%lCDQ=%Dz?Ty zaT?n^BRoI#{M4i2h2TeSLMw@Nc*lC6^_C^|(w;IpW!yt_cKgN;)qj3|J)ib_>pgPK z6YD{wSHwT|Z%rGQTW3?x^qp+h`ovK2mK~c@_Wr@32hyJD+3i2MJox>=aC5*D?gcN3 z?ew2>?QPxeN5}A=zTbrpumhYpS-n@ErJkc3!s@=GYh!EyRH2YYM|Bt)G%)d*M!4CEU_kUe&rMPPdU%*YQmR>PX)GW+>Fa(GaegjFR>TT zILFSQUrvwkW#RguXK8aV|2Q2V<1TvWy!MFvF1$Y+m^d)rkM(5xXg!DXzr4PRq0a$7 zIPXQ_bK#QUcRjB^3D%hCZF-08oLT?i`k<#{d)N}JW%Fk_BMr!g#V=#LVQRzpJ5lYW z{8_zwyTkGAjek$LKfD;kJb4gb!jI-+b&Zv#EQ@+M$^b_(` zeOdN-^5aJW|DprjhZ>h!sCBHf>P?v+ZVxvF9CT6O!*r(_m~|mMW`EehdZhJrZ9KYh zyr-NHFh;J68?2AZlho$L0y^3EU+oT8gx3T=lcULz*dpGGc}u33jI{zTGTz?~zYUwh z#(?YGKkk;Bh?VlK6Y7V$D&XeNhE3sc&=35EAP%ro`5F#B)ZV#0flb=WY7dO>C|DcJ z0bi#5L(O%Zt9uqaQT56h+Z5V{E7C1`mWCJ zgj)knJrwQ=`c$ni$meJcdC-pV;rg`2F8TpKje-~^f1>AB1aU*`a{l82Te9!;aQikc z@4JHaCRi_2Q(~v`Dfdc0ENq?3_~X!bgdGz*#`{3Qv&6_b4qU*jd5eM>#*;?;M< z!SJtePoP)TJ8=tsRL8(Q`tj%Yot|fe2g25{A-pTt6GY3%wXEBS@p>R}h1h0aJZ=)B z*|WNx+>1{6Vf$!S2E4Oxv~T>KU^k9#9R0lS3*H*oEUjXFng$WqBk1$d<3m^A3VQCH;Z;Gr8G2~sT>Qv5>tXnFeU!_?iQ)6%17Str zFJhZ|w4N4ujrBp=iuTfHaew=>J`>bp_1xkj`8%84UZ071eWAS^_6g{1UfHshTFx!yRR$e>0X0C#z^=YXpt1o0z=odqVpY{?g4>0kr*@ijI{( zXl_>_Qbc}<8bX`oae1Q* z5+daBZiYNsk8?omKm)z+tD$Mbm1H%!pFZmzpwrjt=#x`F?JV9%oaM`DN@6E{jyp^O=|tx?a+!6Agrc61W7}KWdXx);wQq>;-W}@p z_)RyOAobw_{4Eq?1x6#G8D!XS5c%ao`p6?5zLF=gZJJy^etR~=HBffpKoUi2oyjd;uZB;exJ$aV2GfvRZvNIGI zeUXO4hbec_6;e+9N5MlgV3;BZNqHIA9#_V((GO(KCjg5cF>qM%p?^dkvY3SnGX-G( zKo;f#b5MWf6K&sRLjePIbaiPZt=_nS+RiPbudDKCS>-ai?A1oPlanNtAj?!RPiPnsHcrdRjO$At|hc?U={H%uO%vurLf)@`YhB;DH~HrWqA*2-q=ooq5ahE_mo=i|D)AU zUQ&GaeRAIWfWB`Yp|#O}>Gl0lvgG(g*Wcc!vtI9L*3Nr$wCo;z_kKs_$GGv*=_kcp z{z`#srozFB7w^QcQFAmOakoCU{mfTR?lM~_@y#*{eppKj^vY?OW-FbH4I*wI2g@qeuSRs4N!05dHQeZd8!_`O;`Bd(aUW= zXlP`FqT7#?mcv~dzVwASV_uNE=6i}g@RVi>{Uk#r4oKMXp*HXa$qgT*gI2BdSE!C2 z$L7!x{|pkB-bs?DH_%ww5^AgNC8Mh=Y0vjM;)q&8_x&nKML&>i=B_4z8@*Iwu#IB2 zAEmT}GsLm{2+2k5q)4sfG(UBm9{;#U50@RM2IuW`W8-=9$#_E}PD2#>_$^)d`h@Zq zT_8oDPh`4^13yAJa7O<$oiydcp+sJ65dTgejh@r**(ZrlXB!oDZ=lr2y%aKSIqhty zqK{m~wBlg{m2uS5eY5S!d3Ac6vP2OhYCMs6k~9jmuvqzxq=o z^Y1uWWjv+i8}F&~;v;(6e3oMQACkS@BT~x0L|O&csrcbIm9+D)T{cK}AB|I_?l`$A z+@^Vh7ibx)7j@;;wBBV2{R!Gde42d}pSO~h#%-jjJmD0-rI|vl7E#FkOiB)Kr_E~B zbZmVK&5wwr?{8Bm$*Y5gUTz@K`c`_!yN~$ytfBmZjr1+QhvEcTt)D(cR}XHb1q~Z% z`Q$OWKYbk?@;^t*I!@C^&SkW6;|VJHc#S?gpQnKX%ZXov?Xo#b>7V#=swnEC$gB+{ z^=Ch|yRSx!bcc?ynyq9VbCd!!Zcy^8CW@} z&_zbP)nuX>OZ9s!=)m1vvhZ3$n-;VECA5luAKyfCyBAQpZxt0EOsBrKAR78vOI6!; z6A# zcdn%R`wQvPn^kmhXE!~$)^)9;{=%0$ z{FjldYz3vtC(_La%@ilrLY5^~v?r;QwqNU^3y*S%v!#VDjabs1E*E+h-9YON?djIr z`Bb*Ig~UI$&=0XFI({aa$S{cXWVLDRbrvb?ETkZHQ+m)MNJ3u%$hxS9Y*e;UoDS%W zLp&LH)KKzuO;YQ0qq`gJY1=<%a!+lg-OqcdOt*_99{Cbydlp4S=a9TrCdqWG(_zQO z)Og>6xby<)(<3jEb06Gl<)%ow)l0sbO&!RlC$sj&d$(AGM@J%h{y0Dwzgec+<9b z(UhE+NI%<($z`CP_S&Y?gP)mHSW`)RT}w%EV>Fp4>r&0f02)=ZptdMO;(PVLwy1s; z$?RN4+l_XS_sRhhsqUkM_iO0L0&j|n$)dy8mr$zc3Oe>`5w$C_KDG#@$Jggm!>epE zEL}}Ewp3G=vkuiy52oJ}ab(3;L;R~OXw{Nj+UZzD1}iM6`$rW?dSp@icotdRETUhT z-ei&ONDGv`NwL<6j!e{2yhJOBmlOHLFQev_OKH``erhT|OEYD*(&UHpw0{0UvYu8z zv+l-F=L|u*=aNFb<~5`vcffY0nH?S66HiaZ>S)o&HYz$*M>E7N=(1}N<<5~NUweIO z6wagU3rpy|nKP;H45Z`zQFKNtmEq$m>fBvNr@Mk^sh0+EIC)X%E(KcEq)q4SrASJ? zlUBbzOyBc1(3;V1`Y`_-C9SzkrdQ69jN39QSers~#vj-k1w_#)9#!fyk)j1L3u)-q za=PAVL=Da9v~6n@3H`Pwel;2DylFw9_grY)v6d`kgXzPWDvFHGpj)X6$x^_A*s2EQFkVO@bB|5|Wa3RqSgLWF& zxj-7PtQBxx+XPc22`fXj@#>cxEE5$VxX22!rM9@7qmJ<;F8Dm0iOh2n;0Un8>XZ=t z?e~J2SQ`3`vhjGN6rubP=+tqA;TYlaxG84t)WPdsX-wgnjnq4{U{oc6o{8D0zp4OP z3k|%tv4F|#5F9%>4`CalF*ND~IYS!+8aU&CZUnyR$3Vr<6Sc<)t8*O@^)d#P)yXLO z6M%QOv=Ef74^ww@2xhy({9hdCRuF8CX5)!c1umsD;-_{Ny!HK&VHbkd&7Keoaz)O3 zLu5*tK(tUFfysI}x?K-4?+lP?Xo(wq9!M9wbEor7XcZvw_#0o?%Q(VorZavI zJ0iKv1^!z-Fm@ymUK45XkgG@eO7{OPYcMgCfzHAVL?{#^=Sn5~*Cc>vg%5%>{IP8^ z47u+zab`gg?msTa%GY6-?IerZkLqaK5{ms5$#5->#q|T};0bR*PWd9tcWuMq_c|zN zY+^OizDu?LXDtw+9gD5ct41Al5=fdGIe3*#i zov|3$l!-N`8_=rOg2C)X*z4O2DXk2&ZcW3Mz0q(;2!oW32aLO1u%+A`oL*k&kP5Iq?`d z9FA=U{-y~3XTaKu3tJSTQT8_huU97_nr9wbZ`Q$G zYXL4_S&pLqR%pyF!}gqFD8?tinL7%hPlNDAI25NvqG6tt2{WrKxbn4Nk#_@ZJ*put zR)9a-^3nON21^nv!F4$T3%5DrdagAFifobZ?vB^blJIys>$@IToSPSb^}Y6x|0Dx1 zo{O~mY%ETD#i4Ia3PfIK;?A4~Ecn=tQ;y4UA+HXLFBhQpc_FTGrNHk-h!H&Q3SoQV+$;L$E>CGr?pGd@De?DR(n^3E@2>MqRVZgiy z;@b1zotg>FxydM99S@&_3HYsBiYKkLs8XMgkj>$6z3Tykwf2yCYy)#{du;XdMOX>1SFLGABg-0pV6^f4oREp&vnvn9g0X2HkrH0j(8LyxjpN*mNx4SB3kXMd;WbiOn4L zSb5w4CWrL!bA~bFyhb<~=m@bhak!)(iS@09*wH-~d+$o)KVvS$-JA*8=?+j_PY}PS zjDaX)T>7VrnWm!H_Ui%tx)O}y(S}nk3YxM{e>Z-k`3Yb$_bh=F>o>Q#lq?85Ur8N zZ7vyX-13HYJ?BGQjT!9MTVbWE0*0sQ;atyLq`cyRDSrb=Sq30CD*~H-#^HKhIn1S6 zu-Cf|@8{OQ);9;k5lOh*5sitSKwNwl2L9_&_?=LLcgMF)@h<^x+M&snBt$> zEF8*SPPgqM;2af={Yb>i1;to-kyz5Lc9mn|uj~x*Y*aUvH>3go0yB2rBwB zvGrRCw(3=3;qxdslse)?l?~jaEupLc#M}zTCDwOiLZO(k+8AE_b8#R*8~e8iK<=Xm zY$fdwRTuz^ArpM7wZ#iA!W$kV6n7n?^S{I3x;Pf^ekCG7u?VYeT5++f4rlLH;hsn) z?nx(L>PQ$?9`S_SeP3*f^~0H*09s z*k}@ota>Y4o~@0xT0=Y%kVNuDaSSXYyjvXsL4RxXXWOFov?X?I)yDM@njfMDe4m&(Yq)WVcKqJm}`zE6DzpLsNmlrY3!^6cC3v=sh|(; zWwRL{?~CSi6V#Yb#n;?O)cM9hIXoT>&$5s=h3$%(S_I9jM9BFxoL&68`^M4sUB&kLNR-bGkW@* z@#u>&_!ZS5@Y@r&>NBubITE(#gW-L}8-d{#t}1;|rT}k77~AoepWcW^^mp z;c-zF^5146UOpE3=K`?V&=I$qoNz1G27ZoK7<9HqC!Z}iKRUC{W0-2yJZ$_>hp5MG z(0bc~+3VWzV)H_1aaLf_&j>tM4@BNqC)D>?VRC*1f=tU%k(-5~fh6!vi9@q4!y!lK zU_pN7puCEn~eLt(!O z3dPJ|<8FnLn;y7*GXidTWk{IchP;Vp(78tB^f$xpL>+iPXCeK0B=V+t;mliG^yG%2 zcvS@!2+TuAR1C!QA~96%2!}x_%qk6me|0!!+z5l4ZW1_#>QMZg?ViF$T=mYy>#!KK z8V7;rmnUBQal~3LYm9oD;*y#n)}@ZJGf-pHj82nAtl3_UE9>W@ zq^K6{y%pGeJQV|dVJM4mz<&E6jJlOD?<50zTSLMBn_;8n9@sLb1Le_&Z>KFrggnsw zB@q56b8wNT8B;v!&?#7eDVuWPGF%MJ=jE`SmI|H%Z!8z~fJ=4&I)pR8Tb+QXA|Bvf z7Yfmfu2}O+5vqp%NE`~rlQ}_XD$R(!IogcbYD-Tv`7yD$O?BmU_5 z=8l*1oUmTW8n$&dI3DhZ%mO!5p9{r(`66%#HDT-CDriNg;%Qz2l8X{BZ*>k}$}rMn zFLcK{Kj4;{GHoIu?&@NMICIe-iQaRy?F++_2Uy1d_i(FmfUgAJ}Kb zjQXQ+uLDkeal#KLJ?#7Yh0e+|Je=;ta;so@7`VR>9+C4L-}v!^p-M^j;3aO9Y|kzi6b7 z`C{W8!uw@@`0BT{oDg1>#o< z!!5%V*j>|v0?{fcilp{0r(+DO3L}{6IU_^U1LkkN@p{}A$q(jY z=UskGUv2}ZO%8ZrXNPQIZ=Af6g+!GKmF61MtJf3q4LQ*!#{2 z=QZ82wj&T+W{F5YU4qniTW;W5t# z*0t6!w==^prXyrCp8u;y9MU5S_%O{3-ci2TdNvaqViWQF6~ioJ!C21kkGRML$lAx_ znU@c8-pIh9fe)V<9-F<`7ZXQ9@y#h58*0-LV%~tewJk_}T#L-CB0Tvq4>4wusPYO& zd|Dieg_03#UyZkRMfi6n6b{dv*v_)TmT-O49#MzYOeyr}$f15z11>7&NEmg8g(%Y;oLmqM@A7!;A5Ft1)=PhRDzMQu6nl$Z(X-kJ{K+O*4Q;rWspCka z9JY2!;oJ>HP^TddT(F1c;$+m8Bx9PQ6CU)~;Zs#1CU(@L=jnXRkx0d3cVUb*|0Det zH-zf2eHiTzfeVZ~>t^EMg$B3}HnF+X%y?)St_)`4z`0Z;AJ0TuaTPK>E77W%iM#fI zu!}ApFig7Sh7#)gRq*Ss3d~k3qSsFjA0COo{)P<0##-pO{SJC*8&Ldi^mEJKCIvWlj^+PU}NA0zc?RwUk}Bq_t~gjQI8VedSs`uz4)yd3F)zz zjLbxHWhMM3=i~6A97qH>AfN5kXExd}{v!v?ENPUzlg2F7S+H%DLRp6#ZhJAkXuBA? zB~-E5l<^ST0C4TL#EWaDcD)L_G{QkVv%qHJ3ZI**nkcULZ^-j2pdl_OT)RE6GCIi%f|z~VWx z(0+0z!gq?pcwi>_!$i>fW)>_nmGL*o7N6t-5%a+o%QW@i?XHh&A6b7L4#SSdXhi)D zfqf+(xW=zBug(c%Y>%XyF7W7L{QPh><~7$~lws*jItAF$k`1l$IB;KOvuH36?iZtA zGH8XNcM1^SB!R;YqG)RnhShFi9N)~3XlE`Qn8yKur_*u#rVuL9q)=FCikz?jG+nYr z$%qW}YouXQu7}@2E(j0_LKvIHo4Uqm+SAkYkk=6<{nog(*B-X}BQf?Z1AON5@r5H9 z$;;#LCprn1F=065mItTqM4Ym9$J>Q!P&5}to*)ly?wNt@&!*$T5I2sW;YM-JKl-Zo zj>_~n@hW6GE}Mv<_>C?i^L!AUYm5U+XX0br9Hb}dAYhw4ls*QaV!8`-+h385*&*6! z=zuACX85oL_`;nC9-UllK3RsIuxR)W2czPABxc=6gj#PlE_8-tU$Qms3M=8sE+H(I zngUf=TCVfCM=A zX@iSw@L);+oVo15?eLS#lg`ll`8IIvFvnN+&VKo`y_l8_j=u$1&Sq-UT7UTWhGG16 z3WRi1pl0ZWqp!6wtSAc`4q<$>y>*zn@vA#R8mh~PgFJ>=Z*gT#C*^rt9b_ww1;DrgFa=We*OCJa8E zMi74@jAqwS8eeS&Qx{`Y8CWCTCkDEPDX3H^!gkIqw7rdhykio$*5$$HX(q<>gYa~Z zCLG2UaH?|_vU)_YzDSDgfLRdVIUAy$f*1+mL3JU^t#F9JO=%X>9%P|)))G&}!f*`^ zFrT4;V?5I6_-+H0Mpr1z^k%=y3inKeF{1O4KG>L}D%=c0Lsn3^6bw_vXjI0P;SE(X z&Qt=CoNRp0D?nRf8BXXGf!E&?5^Tl_zcIv>9C;MJ)r5VM4y^7eV)N)sq;k$gVUY}O z)SBXDfH5@VwP4WX0dLtP-2UYa(G3=ucyEi&ZCO}%E)C{anU1kE2v(`eSj%>Q;v+L0 z`)&k-PIIX8d*dtP07K@5c)6?=mu@uUUsf5u3YJ59JJVZ7Yk{g7yn2}m*AKwVA{%Vo zVg<8J#&C%<$L%T;^eC9X`T_$BpA0dfZ-gt14{!4c$B#t}SJj1J`wjUp!pcH9?Fl96Rd1JtMjt(wrYD0FDF1Q%~SaC2G z?WgnbTp|+t44v^QD;etTbyz)C37<_Vkd_L?_ea_|c4;ocgN$))g(k+*&2Ze+4#FcI zxc;1B6{{LtiE6@s#};5J+vTB$D^T>R3dM=I0c7Atz7=Sntomdfz;69oL2mfVzzJ#Rel z?oU28A8Z0|O$`d03edhZ0#*04a57W`H#97m2cd`H?dEW?w1&KQp0&`ueAIz0M*_0R3-v1; zu=A!hgbrKaB#e=~&=|)f%)!@Tg7!XbsI75=wO|_jf5gLt?apDRR8*QaK%%`02B)$x zeSt4z)J-w>p)z9QEg|&W3~vN2pg+nm>-G+1!Y-MYZ5@%*20heIU2q4vw=eK@W|g^UMefWDT+ZstKM(=|O*^9JcSWf?I1G zQcs4%j(o6B(iayzicuhz1r1Ff2%pnON{1?h^5ocWw#4ZdmQZ5Y-Ym%i-V+!j~#x;G_o9m`;RIA9!B##{OG&IPoMD-f_X;%VQqVG^wI zxVM>Uu4Sy2Gns~$Vgb8KH>Oo*z&^1M@5UXM-AIJ)NW^Kee3p$By8xi^To}b{?a#2(XQW zd3XedFMA;~J^=oq(by(ijPKb=cq!n5`|&0yzHNX-d-SlsPy=gjt085PHcSp`<3pel zmS0rETlr8lhlS#AvOBWHRIq!IJXS9w1k2fBccczxUKGOROfD?hV*%%>W;lD^0AZR& z2q`f|&1P5do)5+738wdogrZK>53iXf;>7$9wFw*CX>!9eolFcLO~SSQFf98;xNzM7 zn!gRuSIf@jjXF4M^q}5v289$M|$}C^J6yN!kSa ze{#d{@-5=6FvtB$6Fi@00A6te7_wQv(8(Q&+k&7_l?kr%{wSE{gf}ZZVfddBs&%wc zc)N^)4+2?`$wT|q23HB!mDe3M|=?lbpR%RE&SQD0=T{})|U1cCpYK%a(^UF?LCpnL1s_e3aMXw2_ zUNMA?kt(Ko=%UNr5eXfRuwdNnQ8UB297eEMYz#qD1%wVw(4og;^klXmv@h`C?+unA zh9cH(BsjW+qHi=D{u{heR;rFNJt-*tP{4w0GxS{zLf>V72qvjO>4ONO!#P1mMG&+` z2fr36vEI2z$KD>JlMl_%YiEQHCi=K|TNSyP2AIb7#`Yo|1odfQV5uhl#p~h&bYU!^ z0G+4LDCppKdi;h5OD}LS{a66cSQhrl6m4`wFrV*>ImEJ3zuvHeqRidzYHBLvff0O9Q1o2C9;M1L7#4R`tvK-v_nZ~fG zxeUHAPv_~FD#ZVB?35~u3$)RyH%a}<6C}Vn7gFjf;QaQB zOlSO|)9N}%sMbdRm?6%w975{=JC9GA(2$*lQ+s9tJW|-ha_`0kl33-iQu>^C zbmsnjy1(xmiQoH6yIyd@{mMtm)#8NDYaSd;m&Cx{8JL)Mk9J->MBbz8sH9*GHEisr z7+Eej9b|coKV!6ro%QnBv+*%}20AjXlHJ2Dl4M!nv0aMTds`R9`xSA0JIe;InTw^D z#b7Z-0AJ5@LMuW5I~EHgfcq_ZOb$}C^hP>YzMEFgIz}T8H__{bXQ&&GXkX1E+M2hQ zo-H~{5xr+KPW^AR?Yj%?;%T`7V^-;>T<76iLmWD)5(WRJ&N`v=E)Gv zf4qehbVN|a`j79Q3Y^jf;XNP<{v|S)+A>Lx&rZ^YVQ$!o%)np+FVgy_Lsa!RiPAR8 zXc;0+zD+cmdzn&__S5G2Gjt^RKhoH{m|W)dkig>>>Z?3TCV3a=s?au)U$u+gE!;ro z|IxG?ocMExlW~pT)YSHe9{cgKxi1R;QEAl9)Ww@(3PFXupdKn9I+3fSB`2isKV;#j3F)_kx;wV?^aL(CINVi|?!a=6Z~ z3BeEtEZph}b*AmP=-A<}l>>BU*g%299E*7sar=TK1`Q+`&zHw9MHN&i&qi^-5_WF4 zL|Y-l1*h2j`JjflY%Xj_5Cm_nEOz@@<9RFaElUM53Nl!}Q5k8>-+aZRil811#NBm- zy`&q?2AX1HsRo+=&BZM{WsFT~qNCRbjw~nhwkigrCP5H*%i8^w4N64KQRyKI!4xfU zu=AUrB9HDhT1YlyJgLqR{`w4uRQSVN!xG|;HE=^&4r)s59>IMjJRY=Rd($4dx0JDh z>1LuVSM&H6^Te;R`yi*a@QI6Q_`$xoGHL_j*2CUc8hHD3F7}*K!{58!_;oZ0n@_~U zE!Z1-%iSPw)Dn*#Swdi?0ba%Fqj-lZWMtIQIjE20a~XFqb40m8AR2!xE#X06>$6<@aJ(bKCFnsS$#*`W7xdzx+XTSFvRio>NpdxfD(5x+)|&z{BA|K zJF3I7o@w2xt_XC}2fb#s#qN2$tP?@kUr9*s`A&l?6(AO3hF5JmP?eBEH;*+YbnP+z zOc$ez=EC)rH5|VEJY}a%i!mrFe0=S@aLE|0)#~%K3@c3JWMnVX9j(XnP)q$CGi; zl*xo)Qa0R@RUneAg*ahV(55-qFeU`gCx7VAY%y#w702w|(;!$W56&nx^f3*?{z;O<8q2yn2u8X^MpOJd#{b@U6)L_{9j>qG2Jd<+mPtBagi z3m8l%++-fw%S-XNGc^}CUlc*)aW2ABvN3M2jt3rMXjc$tSXC8&%Cz8JD}isra(GuL zfyw|W4Ejkx^O*=@w#p#*ixkFAs$fBg0zQ9{#`!&3Osg@1;_hAiWo}CMc5nZI+wL*~y!_Z#|X-tE8bZ{OHPbtU8b9s2CREDQv@_6B` z3Jy(i9O;tAQhR+Uv}c9~N_}1&=aIQM@GG*|gLJuLathRj=F)~vZ ze1G)7r)>rEEO!0G9Qk(|IGn?Bl%+BZL7HMLhUHquH1YDR0i^u>@s8!P4zQdZ zXL2Uv=T(^7RD~YN`LKLqkN2zX(8jR*n3XOrXB*>gp*)0&nODxdTGdV^ctj~-be0a} z8E-rFS09#JSk{k25vKQLz$K!DehFhFr4hc*2Uh7@;9Z~@4)QBuTAdOa9$I1M5gR;O z&iLy(hF#OlF%jkrqt*TpnG%fM*D~;6Rypi`RHAuX9dC98t+ zL`C=(NkEln1|p9NL z3UdgSxo$+#0=i?V$O<4sM4XafW%9lP&(}c#(vqGb&Ifork;M-;r7O2{M>B zLQ2o?(HxNhs+sYKN`F5m?|D~gcIg@V`1AywNxMkLUtguMLs#g+qO0V5@*#8WO)p zTTZ;ApYMNBR~+R59ejQ0Pxf-0?xDX3^6tzzWm*V$ckeMc|No?K3z zyoYIW^JyCXcajA14$ztEt#p0G4%&P41~rYICoaoC+T`0qrw%M2q3U)zkxH2BSe%FIK^f1ef2 zxlu@(CG`}P+(WLwXFu2w*{juAR98bIW{ zK6WqBK&*=#oOvaXl0A#%qNYMK>Lz7*PS63@8SvXP3mv7CRQcsOZI=~9%^gX&$;n_z zrZnu$l@O7kfbp}kSh#l)d)56nX_ne2;>wN}tEGY3a7^XZ@ZLUD^7wkca;Xv`LN?QVD_VGH%kKA1e1iEM=$ zd{Hb#PjWT3g=Qn_2g@2;`Jmy1C(DUh!-M5ElEobGa)&FPWqV_vQVaxA$|19y<%~P4 zp)6jCv)yH|Ts9BSo#J2{oP#pW6v(tDcg5|RBlw-rJdc@SW!qu{vWp>k{S{{jm+e0ul-wPjKxng^n z7o>*$S>_`e`?L$Nka@EQjT&&Lr3gba3X#FI>PP<-!GvYZzE$PGIwui1K`H2+mInbD z58S&>&^L_410JURS+d-aI4lZ1)LeBYe zmR}0Ny`D7iwMq-ayHXN0j zA*kL2^`U(9tVlx`vZ1zjKB5YWF=QEx_XpxwE;tqX?_&{^l!x!l;W(d?j*fv8Yz(SI zlTr@G*&H1>Acp`0V0n`rrm%d40x!!pY>U9GrZgNA&BKw+Z7loMijOLFxMyDpnQxi6 zZyW-LHkQ?Y83j4n6y&9rqiuZ)5-RF(S0xuJ7W3fdk&keTYD`2I;Y~pRXm=u3FHgk| zw=>F>m-R2mUe@jF- z%XR-($1>~AO<4Z74wuFX(9FEN$A{Qw@kZjNdnCBk60kOg`SE6rSio}J3+3jaZFU-7 zg|T|DF2|3V+1UHm3lm=1NZ6H!sOSW|{gDRo`WRe&UJVge|AEu1k?xWPFFA&p10}G} z256sRjeE~*nJ({(KibjgB$kC{9@vJ+g}8X45r+k8!1cTc7b7Cj=o*HwbHV5}2!hw6 zXymJvfFrjF=R{bZE-4MayOP-5iwwl1{#iK2utr&c74(#iaLq~^zg{yPZki@cx>XQ;-w^fA#!%j& zj~`6$()FB)lvc(Gmx`gbLKg8>v#@QMET;7+LO)v*-vv$Jn5hk`jcRbQRl&-BDTv4k z;zGp_x>N9w<{lZNllM4a*e{FhyGGcs#}toqRB`p~OgzyMgSw0^7RVFaN^Ec<&H&e3 z8WzGr=0P#jH}(bc_P!v{DQ)jE@=03v&@S@2#J5hPuqVe zRu`nB%2O%q0sDRTb0pKCMjt#RNz!ya6;v1#)Q{3c`y({+`v3*KVLG}nC#HpWAdw0a z%3h;KvC$jo)=5)_lN*wy)k=zdyqyj?SkQ5U4b(HXkm`P@&{K0+vJRG_|AKf(-D(^O zD6(0oT9l^C{eX(&Ux>~71XX)J`YX#rhGD$4d9wuN{eNziRHGxSm(h})DkLAjmMq@w zBs~F7@`&>%(Oa(cbnGxGT|YrtOOI0YjGa_qVM}MG?xW+|4^m*M1^u=+A+_V1sDCNb z{2p3OG9Of_Yu-Y-nlzg_nwht1y9mVuNKs+*OfuAE{;ChWWalqLc_}V$giL`K7fEFAaM{gHP)7hDFw3y8sk)Hab{g9~EMw>PWThX_) zW0d_OhzT*yQDLw@-J0M=n;r+y^avkn^zfmT?T&PXea>DXUwX^lABW+6RQFekaa)qK z=K4(P37$x|ukzAx>Uf&&#`yfDe6-Pe8VTFVk)p;JEIr?#C+rCpD6;43IK#6U_Nw{e z7u@vO{J3@{y?w^c%yHZ4V}k~zggTJ@m>20*gpldDV0JH;AOchQ)wULAiADP)0D>xN$-{kO?YQauY?Wh=H*>vui-`Z za|1|I#fv;tJZNlR5GmaZA-T`Q#(3hg#o+9-aFS`EX zC>5DGldGEpjS4wad-7qb{Iii9zFO1Yh>hgjB1J2j*lbrhho);TqJ)*o|n=&|&!{OmC(^>n%6XSegM<)@jmsIfj88V_aGpN57f&F(zG=q8hbn z*VR=tt85t^X4>u?iKP_#oaxu!GjGPVwdB#dkdi7vg#qg+&SfiY4YnldCFZpHt_eBJ zHlWW=nq)b9A-yeBA*HkGOarG*14mX+ncX^C!v0^6&xUl1ojtAWj2Nm?qfqwB&K)tP z*KD@8{iH;ZhHAveu;czjCE9XIn#??<>4&cjE$kXcaa#o`Vj~}gscfZK!JSmeJT)Y_ zf$pblq9V_2G;-(=`G46>BArYpWne||hYacXMvg@KR?wz;b+SLtcp;{Rc&evIdtx?I zw8S>{ewb4Id@WK}QzLEG53e*{Li>GJP^|bO`aX9#S+%aFxa-rHmXn{Rs|Zr_V+ESI zK$ApGXHeA8N7UpuL4f(8Zpv?@S;ur~-Y0E}-@TS;2Q2AxfGzWd9-;S)uYBjYk&ZLG zFOF%c?wBc3%CaT&>7*J3|K^x(*NB{1U!Ht=3n}yHkO0GDygHOgPHquBW<1s*0-fqz zM+(+!X!ACPMeSg-^oSU#{SqdAc_likyMp2wPQJ>VhemF7B9M9A{;XOT1)Tl&mS*xjE!ibs*bm_O9 zI=$;$K-bt=+{|$QA#YWx(b1p=-L+J{%aB}(*H8>psd=6(1t(1=+m)~3(KeZ;#4M({ z4Ga@4;G>NAb{xt#p!t{9GQIv9GG$!gt;6ax{kuNh-J(b4M$2e3-yB-?TapG#6sey5 zEMt8EI>q0B-P8FAwhVLeXIOgZ3>wuIV{?xr_3%p5wnc2n+oejk80TziWI!{fno+Fu z3M%?Cm-I5{(Zm=T+Egn@E7KLp$98a z|IQ_WtQoBSG2YmH8OfBbq)n;oC@pj|S+Q&RtX-OxZ%56H{org`s)uR@s*HL6%s~0~t=%K;_@?=_`Y}JL7wP^*Ni(f~_ zI~Axxj=7V0OzM4!XsnX&v ztR}Q$5qL&dLE_PEhbl{tJ8I!yw{`60&7U_8`HPOte}L!RV0?Rh(5b5qlb)lxuUE}Ykkzn)k2%XW%X%= z68qkErrSLG4Q=vTq$j(K+@Gn_I`&nUX%-Wejj4LUE^_;Qn52d*DDAruO|V)>whT9I z)RLzGrd#P3)}*OR4ar*dFg;UrrpB2YiTAiRiL%;kam0wq`3$MqYb8aoYoC-rRJCn2 zNk7nL@5yS~9ji=F-z;Wz*MREV*V9)&Q?{XS-)TE8x%SoDdHL2UJC7vmJiSHrvM0Yw-vF%Z+i`zo-DrWSM)!~Du zbSREtfNqSl(#&Muo;C-n{j{5e?`))>dF!Z7XD!7KuA>9~#-u2-p4$7(D27{4$5?&y zoUcoY>>ZAb6(_ese@$b)q5e5{Wpu=u2Z0=Ld!{LjSdB+tfOrk z8ICcsi`IB;qp(hW^625{`$TnmV6}i`B$a4wrxq=1)2HEJrp060ug}&@zfdDbTDPP~ z%W(!}o@W}HLuxdkOO4i&68(2lhW?Y1AzsE)eO))5+MclIM|NPAVw3Eg=x-GesXSR*cT^C!?BCVhy4zvxzp&}-%)IwGl6>4 zW|I3Z0h;ro4YM(XHNg_pGCY|Iy2n%H{cgC}4C9$@4-97tFwGnv2?upyRzn@?)!JD0 z#ZxHEYr~uk1F+~ThoAZlEFFzTNyS+>T@T0I@;Z1)Hsbi)4|r2?8N+*{FxTKRMq|Cu z`{Nd-_17XRs|oAIXQQ*D8c!dkB56q}e8yMe*x$QI(l10yLoxWxn<4e898&!GczD4d z|E$`fdH63L`~AfB-db#A8C4sb@1ke89%AlKFeCacs@&=zx-|vfA?M&8=?k%So+!&I zgVD@~nA6k<*YUx4yY(zgSzgR(wG$Be?;<|`zK(=(MM(0?g+bO6*eO<_o8=wZ-Kc=e zhC5J@y$^q}7^LwevW&ZA^dGu_lyxCUzVjN#U%$i+Jjct=AJA~-H?(7zUV!EEE%f?= zzVz29G)={&3uj?*_#7@+o<`ZW$>=?}6Ao81@Km$_ZJ*9#>vZEdiXZ9)yuJ^>MAVOv+FVCJgQAouzDy1_dMe9x-S4t87+wT zuM0P7ULki&F9dZ4&^hoNIo>Z3vUvdi#`nRFWi|DwCc#pDJG>97f<7(7*!%$GZ#<4g zV}Vfo9D%ix{&+X<7}IHz+OR%>!0=iY+29WC&VsK=#aB{(_z27G4cUn8q@g$N@n?g3Cg5>r=kUrhz zqbZp~xUjSfe%E@~_ckDAnG$U=`HzKNDK_&JjI_-bJF^tua(*hKHdH{#jCQw(k z2(5ZIj?OZD|0k8nBoi(|O1ffnIZlq2oK_~870YPwGyI+!6q zy<6VHb*CV0$>X8%cPG#VtLgMhMvg?q#pu?I-w0a#8G6p&VLEvPW2b&#YaTzv?h&Wc z=jG|LC?Bme7bKZ~q7<9Vav@bDDf_TIg?&*Vb4}MEfS~bhf-7-$he`cOyi(C zgM@YEY39Y5^kcIW?RT0%CmiR}(;HLh?MG4SyR1key>n?i=ck`^$g8;e1wt5r#kX#qqU)==q_`E;{pE-4SllPc4JRW4`Tq{n

G=UON)^~d$pKb$;^i@>XFf`{b_O)^cn$gNTu&ZM^ZnoGTB@pFNR4Dg ziX5w{0c=)UHHU=%&7+Nxi>OsXnNB7wrK92;73r^`3Qu#|6~Jcd{oZt8vmaFyxzPSx zbGkW?`QqLfFpq&D^GNEE>6P`QdVeQ<33H>7-QJXuaF|^FS`vTOcJh|nO@9oI(*y0( z^fGx5RnBJ^LG^kzXEL8=kr5@VU|7q@Mly;qr*|6j>C|Z%vNT&jZuyJIp7Hv(*x4=B zP1I4tG=>73>98upuBLcV&#VA)@bDtR$jubBhh+h{7}9|Srj(^`Omi=8p?@!IX`h!n z9ognfV}BWbS!73wCcEjW9Md=$o*?gqK9n4MjIyTfpv6p!kyB#Bo|#Q7V?~E#6L!(B zeHL`HT7v?NrAbd(g;wP#(LK#MlwY%eB<_Rdk1Qukoz2u|b&zB%J!s16K$>83oOZ|U zBGcC_XM^>(#UrK^y~2=k$~IFLF?_DYjqFPU=+*8cv`xj9@|X``f$~lYU_62PIB(LZ zx1(<3t#pua|F*(A$fC)B`Exf>o7W+_<+X=ktV?%T7S9ZEUNU2PngfSs)2Ukv$$i;s zy3X_?$J$M(^W83bl6i_o_=BiA!;d`m_K<XuOFrT^iU*n#H!Xu-TW^ z%nGD!ACFSaRa-JRU`;EvZ76fhm3;U5P?O0aisQDB(CBuWX}Oy$we`sRBEvm@pJYAE z393-ABHM!T^qkciZlNj#S1Hr1l;z~0u$JUg_378Bb|{9prh&jB=MDT=}CL(@31Wi9k*li7W1rsU|zAD zy%g1DMqjd7?nVIfnCGmc6P^3Xr|1|h-C<8pSnh@MdoeoXB1~QC3#fIE5-CV&(UNdo z)@vD%ZTkkwOxjHc!d<96&yQ*^G7QJao|J8lQ^Ff7nl5QgUmh`ExVjz57I`oYCc~$F zyy!&iL3$y-m*yG!Ni&Wh=M8NNOK?+Qo7Z_U%1J8vZA!O2mq0Caj|k4_8xz_)79(n2Nd{<2}xvAc-=T)$+}d zqVBVEj_L9KmWh)nKbv(UR4LhZ39Ic|^qAoU+A7c8jQ=c`e&#d689vBgNjerJuR0XwyOoN(}gk5A51lyi%al(Ph*tzmh&{>e0eX zLu&BaMVV^OG`=aA+;0cbBPDnG*6u{h7?<^k>DTu0?4h|QnAbqbk4)3|Q5eIw|FJ9y zUzXjpT6ZJyCV>@o2jf!Cv=!^I8>L)%}nTo zWU>uSD7L2qVZLib$E+Xf-NJA|O&PjrGl$}(RGHs|=nB)uuT3(c ziqL&5r@@n*AAV%S_^+SVc1(L>LCIz;+kk2NMmFuE-OZ;+=#mTdvfPOz0S#JxWHCK8 zQ>DQ%WvVS&K*t1DFhBhodN^$r6*erUH8Ygx64NE^Sz=8Yk6lT0ks~=@*-dNvR+Ed! zOwvxCPu13wX+WM~gvAU)3RffbhX&+2dlLnHvLT07KT>9%A_v72G=BU+a{sY|0t$?& zWx`h4apC~QxqDFL9p;6)xrW+JnU-*sGWGseppSBld&!wkLqe?g8>dMr!3MN&$6``H zHk(S1NYN>lq4mzsnJ)JnA>l99wD-*l5)7S5JNsD<&MHZI&otXVij?U!$C1eiQ<|E} z@-p&HQSf%=&mHz*84vsDa`FLs?QTsa$Jf)u+->YRV&0UgXGr=#3vwQ>L)QMv6n9sN z{Dx;z>S`JCZjhy=YZ=$@PLJ*yn3J81B7KyZOjc4tv|$0$JF?$vck~uoU9yUt7?^r= zP?-6ir_*SL1TE^7r>8rWDYt~3ryAze^@82=`z|zZ8p{SKV>P&D3)!Y^pcj9choEj9 z`?HPY&b&LWClAvmrU5%Dw2Hc`7`Mcnq$Wk~A`YrjM3^dF zxS&q^x=d(l{1%!V2FhEhz%mj>Pij;j&m|k8e!PjH=A-ygFYDIB~ z6gq{BtRRGc&V)?)H(0Tsu$-W2w+5zbGRU_&9HDrvkeCs3sU@Is^KV%e0ZTVm9jlYkQLsj_gREo#i=kQFd z2rBV4Otbz1`f<#6?05wa#jjwybq>C`MdFpgaqK>sjd0~EY-1VUybAF!cZYtbS2=GLNFZWuqchViDj0)jWPF&O_1qvca*y81Nw zmNboWrc9(2wFSufk_D;s0-TY!g03GoF#ke5-1gN#psNyj_h6)b=_%V_OxK8Gt?z0f+v7R$9AptHFI z|NYB=@cz@-U}6KA%?1d(F&z?ZORz>i2(NA>;E72LvY&^d?s7YlR}Nv%-3KTP5~A9< zQ%Tdm0B?WZftOku%gm0#X|F___)w3(_OGy_s00N`9&qx#3TfkbG@VLA!qcnx`!yUN zCi=pH=Nuwh{So`Z5AMciu|g*rJqdR)7#D&A+YTZ4niT}KbkVwckShtfjAxSRXy*6F z*9Iq;^s!w5i%!G!<}kAE@saja0WuR8qDl)D*<1Qg)Jj)=Rm5RLnLU`@XMj)c#{4@yL#rHvAS_le$RKRamES4@4tr@FYj{{W*q0pDR$El!Z_0e&c&3FY|(RL+n#I%J-&Y$(cmlV!6(_ zuM5HVCkgIT^01&c7k+i8@Ze!ML}n+#b|?ndGLjIr?jCNAyNQ^Mx6t}34{L&Mv#e*9 z{mmDS%enR#eSH~n>>bc^_C&dzHxBBUA}sDV=XCZG7IuU{vcUnpx~A~1<{+C@fQ#H4 zjC4GQSza@0Z{J3vL^giA=HTnXT-3AtX-*>pv4^_xBJ~0G__g5v(tMPx2uH;GOr+#g zVG7H}qohpu|0sn)dIi=zy@^dR=OFvp7b33uh^P<4{kjYA-LehyzZrmkyEX!jDPdKP zE2i+rLC$JDI+8pwzayH}xCbz2b-jlFH)h4OBPNSw!dKme=9^?>_U5x1QUV*v&yW#* zjj+I2=o+S=t|=QTId`yeMgxZLH*4Mli=`ZH8UALE5y8oT%TxYSdQ3g065sP|$2mS@;jdmA!$AA;Yj z46|yQaj&%imX?p;_^=p-B55!zz5`j4JNVh0h7~I#A<>Y6pu{V>VW^?{kVJ8(G-UcJo-o!E=~%}hr+&<;maFZ84x#+A?n zmUn*4&$Y_~$)$~??!%z@m_ zTi9^v8aBzr;&OX5BCaRm=*$qrH>Tp0tuMYr*&#=MF=mygo_nJX5Lk# zc-ElLxE|Zi)WbXb7E+(o;f+N*Zg07Oqv{u-a_}0=CDJf>BouRHV_`a!hMoIEa3d}d zCTXkTDHn>o@q3Zj5`do+kNGCIFz+ABEq3fjkP&-^uctw(zZm_0Tj2Kl0XE3ApqT$5 zz6#XBVsASv50+qA&kYpFG+=}O1Nd1y#0CCpD6um(G@%$1!Lp=(KZUHwV@x=F6BF#u z!RBN#-leA_u=+AgUk4$-_#8rYLolII2hsyE7)w8o-LGpQoKlaZuoxKGw1WS~2b7&F z!Jug?!mRE=}ssMS%dSV z*KuWcDXKJYVv&3i&PexQRn$|Y1YLm5)C}}Z%EUYF8rI8P#M>pASZUzLb}%TQX7)8m zXO-am=`6g}u0(x(4(6&1A~T(jv?SUQQTqfFvb&+{(SVv=c`yo!#r8!%v3Tca=*ql8 zvt3!L5)tuZK?5bKFm2J2upNP`|Gl3-&f4Bd60Ht1Q` z~U3>ymC;l2{R`n>Y>43j!0oGnj#VX5E)LS=TY%m|yBG)nG#d?#r`;a_c z24mM|WY1|vU*#?6D5N8%HVz+L@}Yxt@bABjTXC+an--7Dr<<_($6t)7|ANRdezx~z zJi(U%K{|Z&i)ARSIrR%JEYl~xl#k?heTIba5K8pl!-3_8pSm=F15RJy|L_$ed>>%y zo+`YP$Ok_=)BR1}V0q*Rq(1lxg{EfcG~U9b7maA3W(cR=K`KAnv1HSL3w`}q@|C?K zVyv$>dX9}Br&G@}C7L{y`DI=&pyN)mO!GB`E;}=y(j6&k*v@=R0Sp^HH=o>7gz4VA zZXC%T!>#fO)LJk!{37h)PDDP{){CKtVN6m+o* zsd-;;`0`YW$>gI0tf#-E#m{_U@3E}q85Z7b#$m;GNMHONON|@wKIH@E7LK8JEiaj4 z0{zhvqDh;7LCIneF?qv?Htk1c=yw#T$iChi)rRr_M6Qfl7@hTb;jH&oM9S5gy|29!CcsO`xQ2yfkS41}@s~z(4*2 zR$v4L1HEvS`HV;7*sh!CLA2EKFyHHV3fVh>#sr^2!>$QoF~Srk#!nYJN3lb0053A0 zpsb;iW#_-gg6Ui1iRJ9#LYd0MJoKE{l=Mg*UEgn5ffVSBC(1r?w0dX6Av_A%Y5c^<5H_``1c zHT)=S#9LN#*NFbbPA6fS)Fwn%8wcPyJPMKUsg(3%G1cFnLp!gH!qfB%gv#<%!_Z6%z zi_v6jBKvfX6s?D$=}>|hsej?sHZR=Ak^zCoX!i|why zzQT(2@CNoT5wY+iQs+LvN>)SHBve8CK@kF(cJQ#oD|l6P;zey1TFj1N!V?>0Ovqxp ztA-G5EJ}t-@>CwkLmunmpSayJ!)nhcz{)Tg-BRIY6E2}pz(Yxv^ikEc3>S!~Xls>|8<{jkTY6Ne^ zSA1hTlU7u*`@Q2Drb!=w<%RXQ%67m>F2BWg3B85*L5AJ$WWHqAG|Ultgs~;OwEvhe zIf?R8fR-q2-SwO8EMaqU`C|w#m876;^XS{yGhE|3;9fVL<){c!NY_o6uIFL-j)J82 zya2yeOr}Ym{G{RD2a$_EFyeCyyjz%Nx$`&99_J;`u;*B-bQeF@M?+wIIBG8B;B8G2 zS_QlDY)piPT_@4MBPmEf9tYJ`x3I4}7tLCq;Kn0DI!-L-TQDDylK0?qK$cAH=aY#@ zA!b-#g^Pv+&B~ob8A12hj;!gVl{k$Wx0EC9zC0;PO(AKQDKw%ol`>!TpuLIZS4Fan z;W9~5dpd!(J9gpowL~te*#;p#DH!0pjq!JdDcfl#nIHLzkb)a%cen;+fk)swB0=Xg zKfM)}MZXo4-fk zc6bWQH~I**a(+@8dJA>!4zz2uq0wp*l}hkXdeLV{FS~(xk$b_rEEO9A9${|GYoz+} zQLgVq`pPh_M`>RX&veBj&2wqddsVu*b3Ww@zAS)LGFAC7W^gTyMG7!A366enrpfWKX2l9$wkY5V< znq;`Y3xm#lZS*g;#+tj&;iU8d(&qV)&v^-h*&|r(+=I4gNqVj(O&qhn~~}>^RniO-0>EDGtPjghROSbPMdB-^T#+;sxxBhQ`ry%u%`y z?cpNmnEiw2OFkN!K9#zRSf0U>Yv^9qj7KYK0O2%*KFdMQuUuGI2C;Mb4)%EFL3a2o zijpqCK_>vSE&MSl=o-xW@?m`J2K@IWBZp}(COt|-`OJH0@bALthYt8`?1Fdxd9-_k zU~^>vR`=b6=-DUO&fkt;p$ABJXn;~v7`~llT88FNDBbc1KA~r^LH8)ySU$wX!EV&Q z&cvEuDM*Q{M&VE`h7}62dv*cR=VY-xdF=B%I16iEe}=Q2#a0%?7+g_+lVWV2ll>Kl zoK8pbvq}gy_F%Hc0N#Cgg_;dn=&d}B{Ps|6-NyQ@J-1P5&;Qs#no+;Qf?*R^bJ;TL2MF^Uc!mx-0T&%gx`r#~GI-7x6KVsRrn2CXEwwsJO zCZ4d~JT58^PKVeGHS!!k8y{exJ_+~tXF{d15qgR*(Kr4(=2-KPo=7Ujx7fk>p+AlU z-^ZkaUI-a>K#G}*ck_P0rlbbwUoFKE#aoc8XIO_l+c~3NfN;}t1b$@Np1Id?dF~Bl z36~+Vtq{wcuHopaNZ1Bk#{|~LTb4y2dg}$u-g6!Ax+>s$gy~#7|HG@ZIe1o(ipDc+ zUs-K0I(tXqkS#z5H`7%CJeN z2U#B;B27CQRg0eEsz2L%s2c|qCZl2~5A#y*Luzg|Dq7M}rq3|OhIDMU&xVlb74(aQ zL-5LNY^y6k^50@Kj=PO;cc#brR)A8)kGSjl9yur8Ax4(XRv#x}S^aSw)Vz$oO>w9! zzXy*6Bex`shFC+P9&``7Zdbvt4(wY*!fyAicB{Q@_U{K(iHFZ6FTKd5L(XgTICkRmkeU;TMI1z9z|Zn7Bs(5GAz|p= ze-7q~;W&9G4-r@EfqQrGKJpMwvt6B=g-Z~k+JGRn1PD&P2x|F)g=fFB_x>ri1YB20t0So6==x->-jDvp2>?{KJED=%tY#*p~CHQ8ipshU*9-rBKbs`2b z8E3J*<~-h?D#5tnT+E!CgNy9n2X~#r$t3~!WqBEog4q0%kc##UXYj=ChjDlj(z74K z~TI0^EXh`K}!ip~gcQr1vc-0i_Z#fIz%K@;A zI|oZ`rmt&W2i46JAbHOV%b!HSvM3W*zIj1^_#h5Gy@!1NAMncQMonfBZmUfsA?w*R zJnJ9whl-$m^b*3uFQT=(4$_0wXlHc-C6{3RCl+bj;vf^5iAwP(Sh-w;Pjm$Cc0^)E zUnT;R6EU?q6)V1`<78M6^s3K8Un3meJ)!uL;E$pRRSYdK$A*QzAOUBbe#4Jn1$J22 zn9p{zRpNJvKk}QNfbW6`z3&pF?^nvOYoG!_FAed2_&oMqkA~2MI*2&*!Z`CPS|WUK z!ZZm}c_ScoIRt#)E@NQ%S*Tq0h0cyryorp2TW>h)f6pS3@f7RqF5+-h3}$`2fbr$$ z@To)w`~O=El_JJ*eBO$^|LkD?GYch4ZosbQ3ibu>M(%osDW=z;#kdwWdbeT5YGw7@ zNK|Dc;7+0s=FDbT)i#FzUkm}u8i&hbUmU41#@=J+5&7I2-#_ofo%0+n&c6yXAGW(p zDio*QgkZ%G^P*?7=a=6L^KN@%Qpz5j{W%p;qC3!L;SKMgL@aY<82#ojd~Pa+&AS(P zIiU>0?g@|!VA#kaFJwRS!ITF%IB@SC&hT7=;P*_%4P8U|cb2s!@GGQ_!3bK<<;P|fZoQj|WTwsgKYv*7?R})wJQ5iF2JkVf&nelWk5PK*O z8PioL70|;@_Pjf2t;N1stiB!J1I1ul3_55aae*OXH_9&efxlx_m&rC6l8{2}~16r7+G!K2e;xOswhxMBUxF?zzav%zTB z3`EE z?#(1Qd^j_}B}Yz&&x2X05?05Q7t&aCXAV^PXTWovIJTcp=2RUUxDNw4oMV=-P<7)-zjs-xodk@2T_1J!0 zf>X?Lbob|R(_+4H6H*l*5gDnmBhq3@3<#5)8XPXAN{X_xV@taDB$K{ zc)@#a`tDua?Zl5<@we|B>N9jM^UTKn1x=iLQ^W28H#Dce6uxto-Z_^KM{)9np>H%d=?B+5o zJm1DWRpmi=vLaf~F9Xm1InbVb0<%3Vp)aKh<;j~+XyeOOz3kuy=13y9$pPmk9l`ED z%iu6?7M?DY#N(j3nE9`rOWG>Jl}*0M4Z855c}6$)!RQ57_NSHOVIe!q&wDjy#A zPhs48C3nNei+i2#%2`Fka7(VIan}zm<;0BSV9GZOD_;(AxBpv<6J^RUvOj>aJC>+i zqJ(Z!G2C9v_!hFn^XlK6jl3L!{VgH!*%(&mj>5r25vzELh0Y2~6m`*4xd zmT>vqE4ZGV81A`dEjR!AKQ42>8Sc7oLGIB&?7T-f+Ome#ZwILUT!6S9H8{JOp}pS^ zZud7qblY0Y44w&-8~pGn--hR}G$3`Ll{0I4!UgbXfLA+}yD(*lb37N%dHfF3*%7vp z%Utfu{gO)Ns)hMb_4WeilbFkCJ^Ra5yprYuzs=MMyrqF&vygAqJ{m8ZKxyPk0`^pJuH0Ugl z@#g~FvbY!h>N*jdE+XRFL4qMsQGPz-^TIWfjf`5(~Gp=m?r_7?fu->Aa8DBg$MUhd=g?LZgZt(4%~TN z8_vZymfNCyjQe!@9hY3v!L7Z!np<+Ih|8$U(it^RKC#U*K`X6J+W>fMtC(s&EHUjA!!u7=xE?`H*70zEODrtctUtbD$7U z8fuYzs099-Za`tCKY}A&kJM7C-JnYQJ(X$u&-t`=cp5E|X1aa- zj|lgwMp#=h%x&s0EvFNAvO3WEUm03L@8ZUIhB2(Ehsa09oz;xui7Y=2nDCMJ!EdN3 zYrtw@FNmeuLuTCpyev5e%k?|Zv3(y_usz8=Du+-Iq6fF7Q!(#~1O@WTkwf4V+GRV9 zrd^Y#;pGa{?L3tP3MW(QoR26w@(6CS`4Et}h;w~GSXs(^B~Q~)x0>l|K3;;W&Pn8L z3Pn((7p{M~4^QV3m@=N%G`}7d!zD1f#5^`Br?4r`o@qHwLd8}e%NgIk>X;GUgsjA~ zaCI!#pT)Qr9ux?Ffl5I;yiDt$XVr{`nLoiF&P%RyTTqtni-by7Y$*)EyzUM7vmuo; z8gl2N^}UgQ|2Y21=rB%uD)#q_U|w!NH>>;wcT8(8V(koJ&*Ok1T}Q0e3CFKR{*ZCJ z0K3e1HfP+#@i&op@#QiM--Sao#t-wKv*)Wp3vGRWxQgAH__=o<=Iv60OVS(VVvKg)Vlx}dYdYS9Zni6T|JK`>6`u&{*|7|d zJBi|=EqJoT5ej=OaHe7tM4sv+O3@BmHXlUfY%d5JMPQX(CJdPVpLGn!~Jk~iwsnH&tD*YH){~5N9A93^15Y%i~HdPnX zz_Hv2;Sf<$)RUkCx8^YHb1u0sZIX83Unt&whSz((W7AI_I?(wOClkIR_0vb3t^Nzq z3j%cS(|DRKAVKaOvngr&Y*INejWV4kl2|Y=O`pz7yQcBenVoHjO6$jNw^5Yu`VPmY zR#a41LP8`HGh^%7`%n#|i&roq+6(zdvvBj*SqL+JDm0{l@jpKhE%6WLW(~M@`8f8z zKZKEgv3NQhhW3a(C>imG5}Om|iU#7(Py`-O99qBLL)x--sQR>F;B*5%tY}5NbQ0{( zry->;7kM^5@H-#P{FM2~^SXylqZ$FUGyP+0dTv!g%EngnT%J z+I5MDdy|Pj3sSJzIu(=m*TZIW2IF=aMtwgV=}f1fBE@*w1C?l#>A)F!3c0Fol+NCQ z<+o2T%xNEXS6U(=(Hl*Fyx_!ia?x24C@I{DtwD}4aAJ<`f(I;bfzzpP0*205W zb9|kX46EgdtiG`s?7~ePd|3pZt7oCxP>5msd~Dxb0p7jk*u}hVf{*Gk%=pb$3`@El zc@rZGpW>+K5LBNGKr5~X?|XY8J3{Cvl|ZhYJhq?P2kFHExEA4ujn8i2pH~fhd+wm$ zCmh`e%dlB422*o4!+B^q_(XLu{Ue(*GAnVLag|9tz39_y!{@gh*e6ks59~~=bbg5X z;Y{4$T!)@>yd*4F3uQ@$m6})MTzV}`mR7>G`4z7A@ssHBF}O^tLmS)ME;G#$&fC2( z|6VB6l%t?^#2tEL*TA1yfW{{`@XKHTSsI`5MY9A=OBdn%ij}w|8Hl8)Q;;#p#G#>g zxMTkr|842U&;3LA*ZT;1jH{nq_#AVx9-xHh9!7)TGk&}odHc%nZb=bl9IwLB%}-#d z`w3ga-@(T2Ee_Z`hvx|?BsrO4OJ5Y!9$mr~HiPR}xPmIxLpd3K; zG|HQ`V7_%L@>>1yVd^{xy@4fL@33C9_&CuWKvsm)VAUkf4%}IrJXgE%^58(yDS zh-;QIzfiIQ+Ik^yemxD@H7juL@oMy*vKWsoWgaTE66RYsqw4NvD0H8O6G!u~({lnI zE^8yRZ4JW4(F&8#4n{-1Jv4I?ur47U-U+$*(q|G@8TG^M#u%J%N=ME ze~P6Rk%-*^>k)4?3tB@Si@erD(Gk)3-Q)vv7cUIbZHvFZT#qb*2w3- zW^O;!?}@@k16y==F~`({PS~m%fTVG5=(Rr>%6)xd^HLvarLM>;Hpld}pM<&0nypDc zg~nCe(P{GmIOgnwdUX-f)wjZ`T>%nb7vSrL$>{ujD8BEWjosJnQFwk74!0VBJf{HU zo+ajw=!F~kPB>u{h*nzOP*{_So%^Ta#u!Uf9MM7__huNiq%91M1MuLM4O&{ZM2Afl z*yU)78UH%t{1G*orTrq#&#e}3{@Vz}idDGlUWVGMQ?TYsId1usL+el;hBRcMb5j!R z9v5Qc@e(}gJQ2sPspHbMX;{B81a4NLD7OD04BxcIExlm)wber8t^wG4-wjG?#u%X0 z6Ib*NF{-RaMDOc}GplXTaKce)0@~28crQLEY2om;Ks=Cl1?TKvb=7#deK%Ukd|%enNc;)O!gG1Q8Gd~h9DDY~!in~9jPpl+oF6=Gr{dDN zcqDc)#}P*re4KBJ=Z_;X%RB<@FO9=bzd5Lz7Kv7q$6(%gSIoPii;8hJFvzsQK?_ab zV11qpi~9peIsx*Ef~r-+Vu2ba)Hq|&8yBoR_*UeC@@XP7r!gx2P1SQ)+w^K7M7sVlR))88Sj=_TIT$_#0U%;5Yh z$AwdCFr$7AqAX6Mk9^+Li_6h{QUY2oo{Y~PbJ5pjwe-z>@ha5?zGefl-Om9ABNSlT z*&fduG_Wey0W%KyB2O_Hd#uu79<&6D8s*QVZbpws`*5VwFKm|imN7$Cp=e7_goTVk z7n#|z8}t<0a`xiKwL|DE&w*kwsiA6pxaVwl-Md{#S;^Mj)$fmPc>pw@CJI_Ru`!o3w3 z(6kI67H&kb#zjoeuzPwGi$}{G zw-|`1`8(mFQGgfs3-CV19UeEw%Iv{1)J$8AZc07yXi*#J_iu}1W;%HB!5jVM9dYnf z3nbrh$D*hGQ1IIW$2+88%k$BwlIwBvXiI#*6NW2Sm*8#hCD3t+$C?9YgwxR<;-Z2I zW~C29h3RPA%yWk62R~%EWMOsvIz*VR#+&CdU;TD94oqDH_u8IN-0F?FI!lo|UPZhIJ~7@$PXIKFf~z>SbT>+37xp-je>;^pV&aHv*@3W}ur#IQ%O!(0x-8 zf}cvgsCXE>K8=LN=)PFvw_Q6X`geJQ!Z-#keeev!@m^-*Iv; z`dsUY?(4h|HE1+WI*r4h+yuPZ9s{LunTR*ez^K|tspE~suiJr$o|A%QO4G2=Di@Uo zS-6>zfucgGvzuq5nROTx;|9pHQ5G`J=fHkmFI=;*ftKen6q_x>uF>l-xNAP{_YQ>7 zq+*m^UWGLkd+}W7EY=R(hOTD2P_j$PC{t)T%3%Xio5oi zu#+e;pbG`j9Um_o%!hQ83l*G^PsA@1{b<5!>`TNP|>e|(f*~6g^}<@~{;nOiXV!4|CB8V1SxL51{q zTdv82dwl`+7Q|y%xAjOEwi~)GwP^QwH#|44f@$3>lx1wgHhK0+wXMdEtGn^pXB+nK znTHd~a&Ix)hy!D)(WS#axZOU3SD&__LB9$uBaULH`4Kr+uoX|8t5Eso6;_)*!=V+I zamKY8i3A*$C(L`*B9z(VjlIhzU+x zvFC-H*U&hFki-)hI&2G;ThGIuqtfqA+lJ0M`_VF}RbxU*iCt zZax7O)f1@k+9rLfT9mH4i7UZ3&~?#UR4+P%z|O|lVh}0DXuTGx0ei);@T;O+?lpdf z>(FLvEhcq5fqr?nvDN)NTzBk(Z~i%i_uqoA8jBFou^ii4pTpU&HMlcqCHBZH=xU>C zjC_({awE=RY5HR!te5-e_>!|aVq@axDaq_%&Ej`!}N^_`ap zXnh{d z#OLT)Sg=109+RX`(tI6^k1WBx!}5yl-2LA<~z;R8x*lz4u|U;ZCd{cN_^W zo3KZE7OORy;c>q@F~Y*fi0MrxXs@7y{1=}^aF5p_?3uaDz1m{Ly^Er3eoLs0cfkIK4wy5pJ?ehf z2$lQeQ9arl=RWQb-CX*LqZRu^R&*qO@3n?{(QvV5x{p_s>lfjY+zoSLj*FAIdPlow znqzB-Km6Gj);(OXgbGkkk|h@7^RJxSG`u9Nz8@EL>a8)>_la1&`m^|W+8BOSM)>?qU1m!Z(Jp_T7;x={ zP^n82OD^i+**;&q92JBP3-mDa_7^cO%??U4`e2K4j>yhb!S(kY(D7Lm;zQaas(y?J zO0`GYrM~F;JO~wY72vlvSp0YGKVk8&IbKJ1f$98RLUDs3PL?`hdw&z;O!7jwT^DR{ zeJ4Cde;1_=r^Krc%E%a{jdE=jJjnbm4o%R5ecu=2lS?}&H}t`{&+kR{JX7SGh2ixX zXB<(|mNO(8V!zHFvAst6|+FW853$fUalkaWN|#ny&`nkB`&{*I6NPng#6UNb+4; z1R`h5#4ghr7?xZN@8mMf(3+3Ga_&plU;`G(*{GQx8){nh`z#`-=82ObOGWA{MVV2o z5b3{F5YX(e$hdh^*!|5BkIOaC7-fmFUz*aRw?=_n-f0M3=_3uxK4x|5x zqrWxKF#nv;dn5hBU4KML$40T0s(A9}m`FHMDatRN6|Guiin}`k@%>3K5``5CJ<7y+ z?HxidA_Vd0!!cvYAF;FNrJ649*N9(gFU69_?IFJ8iN0&6AiOdFy;5UgUECcl^;OWq zI7g(dZxqd*>B_xG8zWq_k@t6(_|U}#Nh{UR!pabtH%#z->qnv6x7Tg#Up1e7UOo$_3}AliCw#TV!|3#^w_8abLTJOVpO1o4ZHTlW_1{#-=QH<7bN2JrSL@+w}5K6^fh zyn*M$m%^>$UjA?qmp@&Eec0=DSFTTGhfVOO=O*#u>UMFtwKLw%GlJ~}Rj3u(LUpAH zBG*0?Kes#=O^%<%*cI1B(4u%zm$M!ZC*>f=#0@9LIzi*jCMc*lJ`lyc3?AH zZQ3UG8nr>=o|EFQ=^rt&$9dru@IqV~x6`>CppW+9z-VB<#TSU~RYocJmD&f%KrPxsTNSx`jL@ZhLTKp@i78}aK zg;VnlB71C@C|6%1%qPqhd2_-=mREDc^csa0M+V6`+6yA&>~b+K!3eo3TIkZc)T?mw z9r3U%09oGd*m%ko=W9D4Hu906$~`fpc!L3Rs!9Dh+O=H5}ny=q12=bjYRJMu-}>x;xC12bG}Qisy1cOowNsyO?$ zLg+r&D=xJc;*7x*F=nWy>8-$mv`pPOPvx`r}a-EI!#BW&7&Iu#-E)&L#VVTbiLzOW)+>9=}~UPTniV zet#`~70(mJcie=-_oZICnVPa2E&>&4{a|P5j=Z_OFfB+Ek^fYn{I)^p+`1)VBTGd> z)hh90<$offgCT6XtDsUoM`oK<5x@SYXq_@&pq+)NZ7dTF3wMe8j%MQXkL;SBxw4R< zb0v;xu7SakAdFb=k16u5t`N2gz2&)c!&yB{f9ZtFiQmMmeqlA|wzd-AG#oMKodJ5~ zw!~GX+rsm!HZIJ&Ahxb)BlUiFXxX`-Wz|n{FserA?$yF2|7OT6TPFPXUJ$Q-wZNI} ze?`@36VYkj1d;2sR2=xUQ0%kZEJRqgIPyaq*s>LKMsC2a#6rv{mm0HOB?`;;BJ%4r z^jxF@vvM6AJykBI-nSR?&mZ;*ckP0zsf6a|DC}4Ye715#@h}DS`u$M2U3n@-&iyI8 z*XxTd?ggUBE=#1hz364AzDekM&lf-4Gez{7-Qw-F-v_O2W{Gb3+k~3-J~6JvHqrJ< zoCxn4i`RFT;oq}qEUFjkKW>VM$3{qasDkOAdcmgB3krk(h{3<=#h_FR{Jg0mXW2&~=674@#O5IX z+G@PtT!0(0d*Oq;2TywZ0=8Kyykb&^(Wd42qp=$AeAXgk?+B0ei!7E7<$duh5vi9;_s9T9b}y}nP^L&wva$adZ) z{_EdMsH}MFr84!3IDBn~a5VYqAo#*J;nCeXrzW#T`lpn z1F(OLG4}eJVf>>gl)M-Qw*-51DmgiORB=8!3SX>XQrYecjNle^_cs1HY#4OKsV0|@DKk1 zclrJ7@!xfrj#guv^=+9uz9nBgY0b^Q)OlUYj_b{Bd3T60pH}K}b*&lKc{wnk-iZyr z`fy5g0H3-zaO_n*-dv_l{X4pxC})7KNhV;7zZ$cb_wbS+9b*`@>-VE>EWOC)wM$ zT{6O}{aJM@oFil}a)atshjVwzSO%3%=dpHKd=xN?*Vj#_ZQ&FurKB?P za2nfB9M4YMCs6lp230=JVfCmvT-kOUpYD)6ZI3uQImL7Pf&skS3*5I>c2m!{EKJHS;#2LBdlsRnUHeE6SX7E$wEUw&_&FjiV?3h_1yYUM-p>z&U9+}0o zp4q(eBb)cuq|rHI5EWv>$xGfeUncvC=l0`a$3Xfmvt#HY4+iz_%DEjnu;zVB+B--l zpyW&6_w;9%rOsUY*Mk8Q2C@6-aQ^u-l>2YYVT->7Ov#^1w}JU=*Efe%deb=I@GMpy zoXMnTvfHlf0)D%(kSDL^bBX0_CM=l6h00m{+AE9o&r`T}Whf7imfi8={CQFS`;9yL zuy&Il*T*>VL0fa?ry4W2wmqlyRO6qv?wq(HlIk-8xxilb)~)YBKZl`=J|7|b=Mwpl zS)6Dxm%n?@V~$q=^Qvvpt!B{hj$}9VE8v@kg}hj}fUW-K@sM98b7N-n_Ou*& zEy<@*C`{9dI)mZgUMe@eFv*LI( z+uiI>O&xDW&FstPt%uU?%~0lynMnN$Ic(fe$c-}=aAw=NOcu@R=}!_IW$hs;ggIa&KN$Q+b$HbY=mSOaR$HXPvGY%sch{xf&a>9@$mI* z8uXvUwmK1fv%EiNwT@x4Swr~5pf|hqkL7>^!+HIwKevZS2IlE{B*+AZe3llA^tvdd30Mxu-Ouk(B!Zk5gGq-_3Yn$7Y(b9r2Htu{*z z)~-!)^xYD}1NN~TmJ!2Vc7yo-auR)3Ww54cH2<}hjPwo;41L;@z5N2|vC@IJbLH7& zX>U1GZqGPvL#`ij4cEV&#jLkcvU6=XUs^`8{8}*kNw%$V?MRl-O5>3?>0A~+o}Ev?pT>fZIxgi z`yzX6WyfXWaBpgw%ijC-+T7H}mX1Ab7?9=5lP3qV(=7QOe0F7ch7B7N?K$#87oLzz ziGyP;C40h#6^|YG($AHX7x$&}iC8Y_H<;}V`moy^6W)-0%Z^umLAOw5IlsvcWw|D| zm%Z=1DvbHky#=-2%DKL4gE{@?a4ya9=cb{4)OaA7_J3SuC#UR03^C;im`lElWpovNBfTkyn54~ zKdr2|qOS_0JD$PQRVI&i+xb51<1~ctWf$q$I4>qb zkN1bQWRv1;_bbSA*%z@=k@K1Vg&B{9P-(_`XcW=x0l3{m`ZRKZO z1DAVwn4%I%XVqA$)yi)FO;MaK*?F6)M)Hc}Q1z=zVPr-W{rmLc(t&-b78AvI>k*O* zGny@D#8Ba{9TWOHGS$J0p7x&1>*vXvr(9?)SuSh4^yZGG16brrDpcvP!+_=-|4NBQ z@;g*E&xZBmZ8@#0AzeEfv#F##^W6VnSGzm-ZXM2TM?#t16v&ldLTIlrjCrRgFg7lW zL-ev)?48FuvX}C|KclD~F`ms{P2r%mbJ&=fE%&las#~VfEjgSPW#R0f8^nhFA*>4y z_dI(g?~hDvs;)f zd!dz{gWF|C_cwpp)44i^2@6yBpnL{Xb>?xc<9x};mV4>BvCMfjk@q@HU_-!Uo+*=i zYt?+J?I>Wk$zz$YEkUw(2Qk%oFuxZ^vH7KB4ro7_`{h~b@rXV=X5i1b+aBy9&u~}P z2J_GH0i4paCy(hm^Z3*Dl56lC`OU6Me=|rj$NiWaAHYtv{TO;zau_oub8gUVZeKQ+ zhIU2lJtU7))W@*II+(WU)vMP>)n_{?f(jfj0 zNoD5BS&_vj5b>j!$XAp^2t^bytz+yUM=e z&@c{a)|2ZNhce*#VBTw%%%~;VEPa>Hl<(P0-k!$bzr*-vPB`nXhO$O6f<44wnwKQf zyyF~ZrxY+EW)2tqCpjU_LRcibX%DR%Op8nD?BY6&&^Y*TcS90h10e(!2)S{7OlC_h3@meEKHp<>j{mcRU>mI?h!%4itA^emR%A+qr zd9B!k+JTbklGlk1!_|4_hAzKK=I?{`vK#)V=*;l(zJj8nJw$Gb@uFIl)(pt&NSS?P|yyvzoEF zyX+k~`3qZ4s`J4R2Pz$OpxHd@K-q}ZKARmf-bsDFzQcCRs_ydGUDWcO(2_Uw1PD`(5u)8miY zvuB7Fhns(q-BddU{BP2WEw_AFK8FhLQ&=MVEm9B4ev1?5&^k$t=l`lRqm5(|(wsjAN&ZgG zSA4y90TG4guudklP zEPFZr%#fdZfF^HAoyOvnDSXxqQ`A{@_sjZ4YlL3%RTs4_RpT2Hjw|4Ca`JoL@u>R;aBw(=EVhYwVyXPD0wpO zUr&~%Ne209OL{5S;7OzG4*m5CL9*k^aCs~GC}^_zH(kE!ro(Dq9meK%W_g?yyYI5* z+b~1U)@;jLZ;ZIh%ZMtQbt&haICh;j9WR;ipzOhUqVGZu=*^~8ksPsnFjxOhpzXm7 zW=JOIu-F-#{$nDS$vu3`>Os6NOsJRiMs)Eg3J_Xr>Puam%4KyZ3y9%DsPJ>(Pd39hF%arOmpICM^Ex&cVwi zQ}v@KPbZN3XT~wubsB$qjHi#%BtDbu+8G0r>F6+#dafCgFO|k~3gc-RHJ(eJjwgyH zu~%X;gHNc^eDPgOSo|I8jV<{7tTm%Hb)(%tJ9$r)EUHvfhGt8K@D(?9ll%PV_SXE@ z+nHBV-PuP;^0Zd@ac5y4K9--!`|TrHW0OpK$?6)MIh+gEr_f>gc(yK`OqIX{y0jh1 z9sXl!;GfR;=Bc!ZPv$X)3H&f@982y`l?g_e`?w_u0~AN>@Jb?ZF>w zjH$U$gG+QJ8|SMc-|R4ESawG~I;1Zdh2}KsWW${S-T36CH*>-Vb3~rx@NAD`d(XkV z9V?jzl?fdADxAyK#nVD1ilLwTapTT#{@Nt_=D(!U{AD+pw;KUza+}KGn-2Y|`=Ch$etg{{<=R$lrCax!!iC$cps=%R(1ml)OPxo#10TsQR#Rm|7T?umr=6PYE4zTE z{%XVjcDClHm-02<(xrFfU&J(KaanjC&)TGO)%9fF^Ge{|*8{m_K?JX9gmQ-oX|Cf! zMKyO0Q*vTjh>JY;xzXGKD#=$$H{+}g#&nZ&T&WJ7Iq*Rz z-fv|}2g!CB`B;|&eN_1EqZ-2^)EK3u#sbNNF|JVMv{5bDbJcD18ec?r^*kD;jiAw* z37j-%BtLD9Wo+^=#*U9+{!dq~yw{5*3Bfc7@}`fTE62>SW7QE?-X9~lJhwa7HF~j^ zXHUtvGU21H7R;>d#LlJd__I|fcE1ru*xinr$y$z2~R&vE^J zI&;!nS1ywp+vN>ze6qVMkIL`(p%q5dZP|g1#dDd5i#806vBNQd|2((hsrDD zety)A_G7Gh{DBI671Zgk)t1vvnev{l2WwSAskzLZmUqn9YK=YLUDRdb8Er08YsVyK zE50~n%kWJm48N_!5zi$G)XwS>`Y{ zU5VtO>$2lr*i!4S6_3k1xYtcH{v0WpC%?M#*EMVYes3)GFI}EJpv*3lWv6> zk>m(>ZpK?XKjDK*0|G*oxovP)_If1mVd=>f--gj|u>&(p42Ayd1uas)oDxp6~=SWzRzAxA#!)coB-_x1fIM8ahqW=CMQ*zPQ|sO};k} z|MtD?(w1kQse3S6cOPc%d50cjTJUX^2E(Sx&U=4lHV>=9B|OFYz$-G3eGQdYE0H-| zcAUE2M;E0^)C8S?o}TOw8hZf7<;O8X;WE})9l(g{9oW4^&MDrzhF(W5A+~fA++|<- zftwXbsXmQ@eGjnj>O*Xq@d}E$SFk7G0!&VwM~O};*81#$b=%umJF^bkCf~!`rSI|T zK?6L7en$^`>19}*z&_cRq_Rf#kUhJC$j7Z{X!{WR?o{DV+H&~IyrAEo3S3p(0LRKB zST3`yaX)t9o$OSyPp`&o)d$d@Ux5qX<$OwB7`}{OgC&;x@v!7Nv}ZqobJ$*V)!2tO zV@i>qR3YbhWk>2B`98F`i0b7JVJ82MPk-uh%c~xHHCnKKy9#H?4xjN>-x2Tj1QV__ z;mEg^^oab1DV^@(=sG#yRrwOVo;^jE%r7vJ*-+EZ3-MZiBifzWilW5bX!l`0Qk8b% zw(J_IFp)X`2lEkFb_-de1?>k(o?QGttQVJ%EI+TVJ1XJqcndqc?jol7EzHfhf*JNd zkf9@4byM51G|-f%E-SNkLOaQNSCjpB8a%t815H1+WW%!eFsxIT>#q`RDqC>;cr7kl z^%Q#3s!?`pGj5(Jm5j0*vM=Ne26f*p^T=B;^3VpfSUv_?TC$T+^28=~RN}N`EgJrk zUFN!f(R2SVlJA?=0DWQv#VA_8~SWB;k%qp6hS(ydScAePKGR% zoQE|p%sKpMTfS{CJ(qUY)X_8GHUoKvYh%EdZ~o#;MGdCRIgMRDKM^*y6_3fjEaCMC zlbepB^7cBs8u9|`KEIHC=bBVnC7)p-=Z4!E&~JnZmq;I{;B;pO7Mk$5G}HMi#akA_V4H086p_B^%1hB7Be)wdR$?4`?qgBDEf zCx5T~kFn|1FN`fy|Ka<=|$-jB>xh>b+RAqyPF&7j#@b49O`W|&>;6qym zHIv+cTV1*ToD1)Ix8u#01}v|(=8~2kEL7;tH`T7J+Z@Sg(-?LPv*PB>QakHlPAQa1 z?xGcg6D@h`z6HIdU$oE3oSn*gGUKEh?{v|YJSb(BH0aa9y$x@?`-cAf53ZHXm~f>H zSKMj9R@uMkVbp=g3RD?2yc^TM*z!+VH=dQ87qb9=#=o=X=M4_5`EJKe<<49`*_$Pj z37I5)m~NjXpWHW)L7nBjO+)HrFWu-a^})<4cP3nO=f-K){IuAFNfP6rEcL<%zH){p)naeP?44ux$M<+A+?GRe0_mX<68|$TBHC5`am%o7D zO+kmHw$!|=#V3c%xL}+ocUg9od$bu{r@L@}r7;aZcHo$U@{F9{npP$XjFa>CJLK7} zzoV=45Nv58_ix2lo~*pxhcV}adC@SM4G5<7B*~Stk&N4iK0GmQAXOg5(01n>_G!o> zv*KCh9L;KlKpOPvPyc5=)Li65(*j?1m44>0>h|={H{dDNE|TTvK-K1QANTIdUM&oH zzfhN#E*f%3zK-NTNrtPQF*^@7WmX4ks(5JAW4JvZpB9q&8qLL051iCS`fkR-ER}lo z@Jao-WbH^g=t$1h@mOXgOyscqSv+!l3MV^`;PJ~+i}j6RzsI3;Gn6dUPhQln@SNV-Op% zlX!YwDkBSL@eVWDbYm2)!((U`6vIa2{+#5qvzkC__)RFaj zoEURBoZ%eG3)&X6AFRnr@9w<#tRK%8MlthscRDH!Wb(R!JYqMN6PiZxa=%P&ypY8W zzvi-WRX&$4%Hp`2vzgXs7GDgRL4EJptO?5DxQ7L-cvZ+PjtyMpWaV(^k9lnMxP*g8=JQCWEV@0A|Lt`a&D-a&{zL(1e=p|t z!X^B1uY{xY@~N^Rhbp0Y+@~~?U&F(B&U83)Mh)QeQ;9a^Cm*3+Mw(jf2j%kA= zD>#H#pXu_RJkvbavEjC6p*Xl(zHc@wQPW@9&Vz!c}>kH71kkm61I7FP7&* zBdC9!+@>7Bwp!6#n=**T&3rlA(2r}Md2xrLAyY25=YO(->~}F^lOXxjgQ_mlV(-k;~441Jy0#>hPnbCY*D~9QUgzt z-;oflEUw)&mk+KjX4TEbJnWOl#HcxpikK$76Uow&e%)~GOwP9oXP>-4{uwNFpoM-E zkNZ$(V<-nKif8JHku*yl#m|EVQ>Ts8-y~ym{c2Zk)rn`(lcCg*cjiwCBRLM^7*#!! z8$CaZ?g4Z8r>2-{+Qr=Vq=+dx>CAOc_o$-=OSyfJbZU8FxY!XSpV7{slg$1`7T9Q#}e$2CLWZ0YF|@sdSu3jtDLwr zKA6or596;qkI4;(l!qp803{_sh^_Q1&s^>gr z%t&YC%WMvumB*fng}k&spNH4XqcknRjQ+9m!31G2_m;hIH#?!|msS+3Z&+hgnOFdw3jMs7vodsU-^_b#CP`jG3A& zIp66tT#(7HR>i#MP{c?5^Z3U&M>3KpG1Mc0t|ilX$hUx-8*})ebt+FOMR9!-x%nw+ zSO$igIIv}lu54)2g+|iHpR&_k?kV0pSnb1$d9M5_eW|>!COmc6o;8eOa;E{*cqiAw zdE+?a#W3pMmS@=iTzTGV42S0>@%oe5)GNv6o!nDjR9bY{aHBRUM}#6Lb3JYZwa^BQJ6KT~kJ^e&VC z$nIZ7eU?2lkPJqtkIFl7+JFGst{lvI-D$k0kj(C%U&2d8dZl`!IX!zc6E0=3Qu_UG zlrx!@Fq_w{WH#h`3Qz1!q-A*&$BZA#H=AcsQ8kIZ;m>9rx^u3DJ@@K#e5mRdAwB#F>?pGt zS4BNEWImx(W?3E&8qT`CS!`>N!zQH!F8Y_iHO+@{m{e!zO_@N;uEZ61bIW1_Dr$Pmpop~kSs}8P~^gL_H%uPR0n0Xh+ z=iY+3)fc>&V8e{z&Rn+4gDuSl(Algvmpy-jzLKMv-aD2ZYKAZ`A)E8-=WzGuaQfWt zPsis$yjSSYJ|99^6)o4+ZC)&u>(_MW6t12(oFlh-vErQ_ryjT9boo2G^lVSZMH>9w zT%GMS_1IOh3kTfSp}&0#<|SUksQIP1IC?QA{#%0;t}k(@yd6`=ONRDUTUHxbG1~ni zVs5(esC*_({|)9gi!7cUoWbI+;f%OOhA4S6(hk&|-<@9_9JxPC-qXK3Fznnwx=8=; z;)yVxtm-dWbl@6~?sEOJWcx{$9MojaT*>Y(Zt2Id>)m*A^Lq@4zl4T&I}zWw7r)k3 zA^=ygYq%N<+cjY4T0{1i=l--(>CqhQ!SLxmJa%NHbj7C8yJ#HG$-OV*t`85p$sCb< zhOgcw_q{Xa`NanG4U-z*Lo-I%yL0>lUrvtmV{408PMkiJlivH&OtSmdeUx6ScL>*A z9LWvx9JAkDlf$dOp-9g8j_Cai6IVXM?nljOw7V1YB?HZ>q#bWHZ_nW1H*l3)-6roo zbn7&jK5d3my(WfB*M>0Bi@a&<%CXvAsiPyg=*s5oTcgV-VFom9Enm5*DOGmaaPVGx zmcDY}fVN(IxjU36B=>Vd`Y0M4NZ=o@$y|J3FgvMQalwTStToi+fuWL7^|du09MR$1 zEv7tOpv3*nTzJF6hG*0NVElATnpgSq(1aMe2an*Hl|ej}=EW}QHe8Ed1E%_Sk~*Ft|FbpZ_zTu_d27dY=NvfHK7@tqk{GpcG<%&G zPKTpW+$DLep_Lw-w9}fFIr2_MH=YT1_AbT$v=x&M06H0~eXNbROU)t{eV21vfc zU|yUb#K2L4y|;Ab$nEXvCb^r(23pH*dmYY9mc8$Rn#@UT%}oVu*nY7(dl$5&+DoYc zg>>L{r}n(9YQaf^ocUAwo+te!>2+aGK6%uGX4XAuRp~@WS5K)^I#S6-X7uWVSZwV| zkLd%L+a{D{)vDYW?ak`_{dlBoC{OAnvGe#KCU^E=;CL&kf$C9brvcma>q<%<;OjFj zxz4IJAI?`{+jAP^Tj_U}>+<|Psn^-+^3HNSF7!8H@HsdBX^_m;h5>vW;UGO`YfhZ( zz=URw4BX_!rPgHB_P+Fy*__ar04jYL!MUX}Lls~_gPC4DHfl7(?c#YaBaWJK&rKXI z_)=!cw%u}K#A!R~zO`qMH@dvIw*yyfmiNoV_8h!Vm3uqrv9{WX$9r|+{u)zmo%=sW zXC0O0+H`S3rMtVkyJ0rn-Q9wSq97_tgV>^i-5uE79oUK;h=ARKd5mw~?=ROn>!^4? z_j6q{dwzS5KGYVnUN@69`fK@UYtBTTf-hK#fNDViigyO1=XxHBhZV!5l6j}LY7Dzk zjxpEABg8WgH}nmmHwM_u_pnEMDgN-TZTD5_yoWas*Yy0+Zt8`N&dx}*H^G?!1?($R zK>r`^<=mwaJcRSx_8LO7$ehn;2W;T`xvaqpdA#e^voQ)W?qz83D~CowBJzXc(9@ob zVMZxfv2qNm@6_T#Lmf`EPD9|kDe%;9grjC9j_@4k44*Tl+smQQeWz#MO+69e2t*wZwg7ipH>Jk_rrZl z#-v1uhE0P0m^!ZC;}D}5gI7*T7_&MZGAIU9$HW+LrP6HatjLF4 zG3ExW)<&ULI2ILrmz!Bv0psiOVSNMW@ErIqnt>r(MgClx!rq<-%rYDi+3h!ARR3r^5XB-LgX9IWx3qY9idx6pJlPaKXfi&vfpm)7-Gw zi2K@Bes@Ot;y`o~3JWG6rLYR2+$%g?7KWMpPW6;!;{34jxHP&Pcb-<_mEcsgaerr1 z6NhDYyfNjLIexeJV{pk>tbb67hL$31^c?{`?ng6*uvQO)lT7fY z)SmTt8_ZR3gn5Y#)=zZ9^hsW@3ub0^q89}Fe37J{f-042m_M$=%KN!E^(_$nS7RZ* ztpNVpD{x=16f(RE{fYPtJXzfckK>8hxy}s*HM-Ca_dv{!Qb-;jfvOf{hDQ99cO86-GC=IFf;|`Bhj~k_uWj!lCSajxH=OTPx9RKN->(O!jX73 z5WjY3;MnVW%#ALFaY8T-z#Fp`FjGCr6~AN(u=7+dj@;&+Telw1uVlgSd^(D@`C&$@ zG5jO#5%kRhk;XoFRuYAGz2O*T<%isnu5je57JrJ}v9bfJ?ph%$@;!jdAXJQ2YcDZB3W^ew^WTH_a z4K|B;e>v)~AU+@7ysy3ILMUeNJ>Q|>!+U;t)^f!S_|F4kWxn`&&l?HM!#>UqM0}S& za+mwzMSwp>_vWB$MIDYWos4{*XO?*eql)*~pFUIu{^Fx6B^1s5zR36!&pUeRAoeF4 zt><$fS2zNTG7~WTm_Bsc!|+&;_a-ZGy}^92$=75Uj%Q9x#~078c;nNuKokyoLX&$2 z(KA+16d}mOxgk*72_a|P;hGhMl_%ris=&M94~;@*dp(Q?(((CqBx<*L;!OQ09Q<5^ zV;1S~j`7Cm5j=mPIIj!D?${vY{E2|T2hRQscfpUd z-uQaK1>1F;5dIeM7Y@UH-k1GQs}$`s%djXh4sM>F7&P|4qUX_&yPbz5(`dX<3qVOD zq3wAd)JSPt+B4d%#IT7PNPsZolIyf>RiaC%7)T}DPt?y$ni)*@w=v1^Fbi_)l zFxERG`SbC_csC!orU&5P8*dy9b3o{3dsO@JJC)2@lYJywk%ZoPTpPxeq1Tc*+Ft?a z;ks6AeLP0aF2*UjR7ijI!>H-*SQeQ8L0RSkMr2{FR36H@>Y+ca9tRTi@JA&97XRbZ z)5c=$xJrDQ$t<*bJgQQH@cV){h7LHRVy+vq-gE6R(gSui9@r{J%$<1RYp)xcO9Jp_ zOAvNFPev|lSb?%*(ada{#@TSBZ(v*Ru5i4x&OvNX8s5nU_&hurn~qfScd-(!ivC#5@A#tgLHHHJoQ9YShHP;{=nE5k z5pc%>3FhQxxWZn=1~z53K)NTcH2I^)BnIc*ix3uCjg22F&~hZ3xzJd=TAK?qvvMeu zu*UK=4xzR2h?~VfZ*M)^M6+@2dp_dkj>nJ-g}AlW1Mw2WVV9bXv@PTLyqbVjo~by( z@7wMF93Wjlc)H#nS}r#D+w6#6&m7Rt+TTU)lO!)VKq|-%>m9gG>R=7DH5#kL(_v#= zi-8T*_}QO{A*=JDL&aEgISqDvwup8VK&yK!OgD~%3$uXkk4IozMi$by^7~#M zhHSzTf=cYm^Bm^!RuGnSnj%R1Qp%(9sk@{xH(bd9oD_aQgq_X>r$d9)P!ozpNXjQ_3K!=a^6 zhcnHSpnNMC;X%20dp-#}ocuBVdmKv6l)*+J4~Nw!VC2G5ltd&zDAgOA);VJ&?}ip^ zv%{h;S4^$Y$LV@~lr~sE><6>VG6#S<$LA=ZQ!#&wwH zREmWw%5nYsMCQ*jF)K6^7V}19`}sz=aGi5BfzOtGS(tH!pG$`@-ee}BO>GoTzt4j2 zvvD}(nvZ>a|CbH8;)8%aT-KVRAlN*U7WwBk1FQ2LTin2MV@OA-k;qz z#1-F02jJ43cvjcN*utqj&+hXu~ zpDzqPu%{w68Lvi8ggt8~Cl_U7RsC?Jzskxc-BzM_0w`aW+A;W#ls7$JW?>4xv*yD zvXV}ZhKF(mhRO_w;g=Y^8+1c?sx=<$vBT86LDE1R`G0#KY#n~5wJND%U%u#-W_OwgC&}fl{CN-Cr=0( z7DFyB7rAo$-RFA!z=1^M-VuYYVIpc+pUzqn&-0;V++}@0AlL^b7S3?}%rmg}>gWnH z!c+FRQK$x%a=kkIgBpT`4d6J{5DAh_n0Cws4^M>Rvu6Y{*1KX6^X0$WgV6CR0}=f1 z3Y()0^GFe9P=xSLR}y-A&2XE0=oi=H@UbHZg?Ic>J~|L3sXxgeBAz`{tUI&kYB}pY zzUx8|w#*A%n;o&rUlHD2vfT5ipf*VeW{Cz+-J^;6wJMmqK$|rup8JJ*V=?=JN_}~5 zv)cr639Q!{>%wD>GuFIHg|?zQ1ajqYdBk7N!sFeSFaM+Ob9oME8_wT(o+*a;LNv=8 zNq^nZzwRS7*+*e;M>K4Ag<$Kg5IEln#Fo2mkXUYyd7R&Sp6AySa#VRIydXj~b+Axa z8JTl5Ah}l`gB@n@_lw4{8(!FR!yY;+YS^cziq!i`xP6-EH*=%lsm-5fiWtrX{-cpS zFX`ZkA0%~78WKwbU>Y8Zj0S&9GGz95H}m&b2gvI}1X8jiaqVa*Zdpa3sx=U6b~~ev z=R=2VRZ%d$}_qb{4=eoH(?#X9EG9Lh~WF}_iH0~SE`~}PzhT9 zDd5FoEA)u?pntkCgr19FcC!F#w>~F}1OI5Os{-=R@$9rM3Z|n%fj1to&o#$Kw;@g)MArMN&q)Bz>difG)Y!S}5$;>Z6Wp*}T)HmV|^UJbvtoABt^ z3qn)`?(*}7&ofUyYNe{{P3&1B@9isQ6 zFzsC;E<`8b=7w;1zt+ab>EEdn5y*0mM9-vHEV!M7=N4g*V1LEe$1dD!s-j9w2ix2A z@Jf0ZqJm}N#Qqyi4P}_jH-VLyAujs_;Js-iYCOR;Bzqk=cl_0LBgF6Wf>&fTTHm{1 z9`ir8?-em1`HIxm|Kq)|8u$?qflIk@_&J$<3aj{z<$vRt*dJt}5y`wT|9Jw*`0bI3 zYe`{<;o9Oodmg(S)$o0?4klmIhT#l3j7SoL;RYp?O_D)ovmxFeG{ntwE>LWWM(B?S zbRG^u3pw+VtSPxj`-+7#83d$r-q{Tu@)}Ggkj^Z2<-h83xi_T z3vLdBir^nwa4ihf8o|$$eL|k;Xc--bOYGx-Z3r$=Vqdl}VrI%= z{sj@NV+Q-jN*#zxTVn!`_goZHFfBF}=6`(f`?fn;;=-{^A|2bO2jh{QE+qcwVr&+3 z*<1h6qU(xy(dr1Vdrpwi3524z7xu@BV*D6E?1<-|Qz#O3CK;Hc7!QvNfq237*8gf% zp9V>!uhc}Mo*Ja~$Rf}43ypX$fua-v1l?1B$9y%s6);EmI~Vw0;Qmu7A9~@zupaG! z0{KLINEwC50G`W^*TyCRZ3yd1W9w-VJa&?U^#N~mI&!_48;*k3V0dm(!~P0Md>;sb zw{axgc}A<$5suzde%N-!9T!L1z%N1^K~@@AGgbw+ousjHu>kAlykoHV583ofAW~8e zQctzaI-VYVu`^V|YzlZo|=V3{o7g!O@!z&=!b->PjCd z9FT#)HF2IH1!7#K3$7ms#Oz@HT5KmwIAelVQ*k`Cddv8W6mH!T#fPn8xc5^WW7MCJ zywDpm>F%YuO5)h`RsxToY2fz~OL$Z|VPK;%yt<7MZQ_kzJ5r!I$hGVRRU8peg76~& z@X5~dk1aO82*t9O%$}a}Lh61;1i#injsV{?)~>J!iD!;86`M|kL$o!LeS(H?eIN_H z7HQz8HdgejKt!1D_Xt6hEcig`8N(pT{9tdC0=lwok#U4@Ey5b-cN*cBnGB|OY2)#2 zPiz<#2W_5t)$UcmBMlLJT{Z+-cEh06Vu6YGf+0H39B*E_B4L{y^foHvr@AV>Tu#Q% z$S{-y#xPGDimYrgqANgL)Kb>IC$X^0(Gn7%`?}DU7@i@MdYo~EPXjNc0-Ae4E)kVK)Uat`v-0aa6 z%?z@z6WrAuFrrrt@1?a+ZdibqQ?ihu;DLi`UT}(IAB}JTTv>;?%C*W5<^}e$S8(}5 z{*KO9#XoUA8y^^B*I7$Qu-=g%V~wV}8fe}r58p;Hw9foTVlPF}tD%jKIbJZ-Gs86J zJJjBDk4i5+qih#(?7n4+!YEfvbk)V;GFNO82X=l^hu=pn_GL$5{B=G9r)475DGO&E z^Rdb_3IBbIWiH&2y;0t%m+<6!li89kJFHE$Lti{FVQw5UUOA$(*8+x{)N!Ry7K4j~ z(b^?|E?ZG}DCxr0-5M89YcPL&pO);|Mc-~*r*oyh>BVN#M$9P@Klp)5#~rnZj;5GBvt%f6N9+cG>G;lBZhet$BqPieOU%or-}G; zI|_coQV{Yi1-ISfaPn0MLZrCIjEsVKQXo!gaKFg!!lcPYn9p;JtqUZPB`=4VP#KKR zH-clmANB@0<3)%Z6pLTdgj*sI^whv>eST(bpJ{x`NiuL2!?pzq?3uG-f4DV{+Q(v) zC$s*W<8etZ7MEs4qj}o|Y`fWj{X7G_mrwxHorOs8$wk!9biCR(5rYk!OQ7$AwzUor z7%+t)d+MXw74Z9)9Q#kiaA%G{HvHVT=jW*du&8780GDGw?SOvxfTPcK<}||J=a74z9UhFn5zX z8a=m*@m;A5hDwuRXd8jle|DH|!`l2iecV}QgoTF{AXuh|Z1&ig`jEvhLNwHRG1)0(dSZfi1PNusI

k9Dq&Nm3M=cP8%e@i7+JV>aJbcJ6 zfx`ZJyk-sSQO^YQ|5t`EpC%M1u&?EC1R|P!;kv>WHZkV7t*ndp4;AqCtTcAcl*N`U zlCacQf~BuA#s_F2zgHbKYt8W>Ivi%K8N7dPj@^^KP{TG6>=svpmY66?MFip3_M1Fr z__6QM51ze&n7H2?>&O*d%FLrl6k$hX19n(8Abd(4R>zj%L`@Z*=C?paW-=VK({Sc& z5R{&K;m0>yELg6NHJ{}1K~o0qzf^JRCvylcR;b>tj~Ztq#ANy)aC!`kHG*+n(GVVb zl33ZLfDcjz$YhV$oE<};tvX0AH?h9+!~>~ZU*>V2sT;<%hHyNz_T^yu#cKA(H{-QI z6TF4S;;nTlW-gq96N9xpOB)5{+7ukiCqzB-Ku?YVuJM^O%uog$F3Ql&)rKYWt0#0- z;aX#WwTezyVa{{oQU}ZzkVe8LDMUxgqcy`2i}or)=znZ&Q#V<0jTWKG9*UKKji@`u zc32_OC<<4u@|^iiISy=?f_%$*SgtF=U`Y|;_LgJNaXgOsH(`cODYj?x{MVMyXm8DD zz9DO5?03Gd21OHNs7Y{k#T*BuvFB*>!dPbf!eO+>1|v5O#adxG*l5XPMUx)B|24(G z4eVF>`G91{dg73=3ucx3VrYaT7Ok^k7AX>*4^r{Csu(ABHlWdX9A@$S`9MTA-nHgK za$-Jmyz6jp&Lj+HwqefOK>VBQiHLFLXw)>q^Uo%Da+}Y{8D{8VzC-Vy7vyHeVZ$na z{OL19a@c=VCm@UsUV>QeAPX~Q^52|!Lq~fz@?LZo?7qnC=mkH{JaL4en*+-4hM_Mf z4-T@G$cU`Qmi!{tVpWC(z(S@z8`_91zx!R*8$=!HkdBU zXWIoOh&rj`Y_$PQO}vosC=8k@P7uANhj5a@;YmVhTO@`93)utpP9A}ox2aR4gX()+ zG3kdBdsZB<)<_$@V)}R;>4ck#ra0$l1)n&mk2d{x9|OBfxjDhKB%UP z6&sA8C!&MU=aQH?Ta5D?H1SW3y|NCf7}unLrXOOsa7+c`_5Ts+JfnMR|Hv;_9A~2q zVI^$OY>zc+c}AZ!gZJ<}83Oyr2PDFUM%i2itQ8f*?~41>-@lT61rtJEyYf7UHRc`W zh(G86^=?1(GhZdxXvsCD10KCG#EM=6Je_NdPdg>C_mLu69&01|oH0~Oba2&99cP4j z_Rimvvg2|%drBI24@l#CpdM}xxidK{@zZKz3YXzMP7W45!U(pplPKCHjYfh z4&xjg=XZIMQ3Vd3$;Yd?(P&s3i=VH9@UkEnUv-nP#dH)dxzs^#6YJlrMnG~^A|CzY zyr5NukQyvNl9)dnm~AsvjY6PiEKCJB596&es`5E6!qFa~cUW&OVQ)O2F=cnfAQH8a z1bsbFZRL*QNdfqy=!%`@p6FYd#F~345`Rv_`G?Ke)iDNPo0HJbwUE_=XehV^q3=Qz zYUae^FVAGIbWB7@^GFm6Fc)pdzJJ|Nyybdobyp|^A3LKcF9J(1#=(DuI~H^PgUfj@ z*oGM6nWQsx?c8wD%>vG*g4p?LA^j8fK~TRNGUI|!;O>krNpF~Rv8VC;C}ibM#(}rZ zc==@{-fvHZ(Uy4pOo@PBwI3XQgyWoWD3axK;NLI~5uO}q*O3H;kHOeFB@CPPhM}Fa zN@j?L@c9;ki{HcWoab5|@^1L{+YWPXa~9EVOOy{aN40=5=Iwk)>TdNkdcYSl{PTYA z3;|r-5Vgf07Y8#iYv)7^2-IQxl^R5{#xD0F2#H?;@kEpmd4&7*D?V6^K&)VT`FLeM z9?Tt%M^+waaB@Tm^B>DI+|Ux_fEBj`5%t&`8OuFUqZN++P#@gZ(Z&-`bUS|zie({H-xj)wOd$&)PSpQ_5NU0D*y(>_YTLNXCrGCB^4d)*LFeVo? z4!6YS2R2Zc;)>TAK^PyO3GbF9Z2A-k1B@2W1= zz2);H!3c);cz4qAArNiThTIV?E~fsGVcvE+<+YX~`$KS!IoIyLgb|T0$l)1;{t8n_ ze6fXXwh?ET7{igXGwL&WryP6n{@UN9Ew&%Y)>HxKp4p&n&;s_F`e>CGM5ovMI%;}-j&}k` zHFSQ^!%tGMtxF5?v+P$wk26%}tURI7iF( zg`oep7yi{d!f7$rq1&0oXtlyNOHHoJv{Cqr8L>^0*cxgH-Ey829PK3)w_D_LO&G(& ztYP=X0Iic*|5+&wmoga?mdc}MxdOa?>S6sm2OR8_L;jf$l+nR^4X&;yr)tjGiI79i zhM$z${)sYUjnQaz^ao0{tdAEu#yzQfHH)L?=)?bQ_l18G5 z8ji{j!_8N`Lu~(h%AXJcl^caFAQaWn&($VUg0H16-gw^mYle0S}Scl@8l_jdV zmYG+t3F)m`_!#aCTm2whJK+W+<~_q~bTBZ6^AVh6(39tfK&}ywXa(ZXF;7@10yo?9 zFlv4|%H&%gLHL{`IAs^% zZ$U21S*KXS+^N*PY$${!!vBpuD$Y8h;k6TPO$vwkz7qDyr{Km~AoL3RwsH-ySjPy* z|8k7mD%Kx^Lt*`tSZDNw^21!LJ5_J|w>P}&wee&bw)qFC%N zWS)Ia8O$vcaPo~iM#*a6Qiw9o_W<|ZK;!%{_9FN}zAqT2eT7)WGwVC-UFh645@Lg? zh+V|9y#gmR&31soMRR17+2H3K*2EroV%Zi~^xg4+v9d2VJWD{^m}7C2npd)@DS4GYzY;-&*aZ1#vgx~Umva) zfKTR8NE$N|`}G=7_q85B{ubl1P6lL#^E_q^hxr3<<@ANuq{FJ8_vPmT!M2Y<8Wq55n490m*+@4Tn-fA@`8H2x0r&33bhCu zF&r!3S;L}xke**+KYy_weiww{<|%)?*u(RUrZKRqtH(Z{I=ncZi)G&vaktkCT0El@ z?R3IVGQu4T)&v6CpOxYW0ck5dnBjo8k8E*bxEBf-$I(fexi=RJ4pm%vb*X)=3Z!4n{fib-&jbVc8zmEUqgc%~21R zcur`cW`JP<8t|QDj7%+E^sBQcep~?VEX_s8>JjKtWc_OB2!v>kg{Jy&49)$Yj#P|8 zYpW5$z7k8%iIAULg3jUyycwqg#}h$V^EL=y8^Vwo83BWsOvFgDm*MenMD%j~n@tF1 zPvyL=-1n~3!r%)D3m_p| z968Biz!RRip5wmsRXqPJ1!%gT3^~rxteTOApEdEASrviT-JDs$^?6VNvvc}|n3>G1 zP%?XET{Y2dtBHA&m2g&O7-mYb_Q;Ze6MJ5 zFFkgd7PektP3)LGl;1?+F4t{}6I38EMiw%UhT_w!KXl`OC@K|{@VWCF-O=i&c|tp> z;zK{3H~viF&v%k=Z8zCp`amD@FHuBq9(By0LDOdJrrLtNbh-Ty8E0>&j#aB@vC_JeWh`g&&ZlH zP^;I=xC?#d&9 zycPjiTzN;r`ah}9`UHiWwDS(nR$6N`oGiTJDStyY{hqU$0t;4Xl5>8K7kr}EQ$LYY`A-s*KS@)f7SY)b7n-?i z8u@Ux@zrZ{Xr0C?TDf!+`C6`~tM_M+;<#2y!z`){Tuu9(R+8?~W%SE`9m(9xrEQ|^ z6g;q)roU^ZZ?oso6tdUTbx^1FV^

e@&;3u&XR6QsL1moZwAA+{Wz^rKv=3Lw^3pl# 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

Wos~$*)#RjJPFqqXW-Mq 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

Jhx0Ak%4)HBhL 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 Ng5$2ADC6-T`hO&N1?m6* literal 0 HcmV?d00001 diff --git a/test/regression/chan3.raw b/test/regression/chan3.raw new file mode 100644 index 0000000000000000000000000000000000000000..8c1d012693870e705290b1c4fc237fc5ce354013 GIT binary patch literal 460216 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 z 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
bZ{1%_*p0^xO3FevOD3!-1?c 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�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

1~6`%6p=?5YA`f*OnsPJ5ahWVRw91q3(&U>1o zha@*I-NprnA(7nlSY%RFCRioGyS(7JzI8ymi{6mRI_cXYSxu??EzcdL6QES3*qo=# z!;t7_$1zcfgO{c`$Moix+A+1hg_UWv}OQ0>7ix#5xw9km~ivtl~1OUyI%z zht%m04-VuxrobDg*b|xkCADgTDbL9Yq#LeuT$JvAmAQ8-tSvcTu^>b${lK|NUHl8I z|0B@K6k?M-kTE5QW0XKM)c{d20u6SIwM(r_Ms~XrR4sGEMBo0#GYZ~DCaB4j%^Xmp zbPtx8cv|#S4t6zDie7jIjqQNergEO$i9&Qr@#Wj#rOIrADV+6otc+x$AA^vYex(4@ z0tTx~>Ce7G9Z$dTBI-w?4+GKqK5Ug1c(U*Ds%O}J=~n-%-HES1h#u{sYFa^0wB>Zp zV`UU&y>qzUN8(it>E^yjJ*=Kpuc(*kOTUh(CEb`jU4+=rD{8fup*p&oBMxPNsN4(h)_bAc=qZmh+ch zsjs0R>4GD8LBNTf+-im%>hZZvSiljhIOn_B(+Ot}fC3;jmckORs+$@;ouXG9SBYz}R9Lf2-2(tm+R zHT4s8vH|TE!Nh{i>_$fCERmd(=<*<}jJ`;!H)zg|=+pl2ZV7g$HTq#CJGLBM+@7n| zgL2!j63N+?BL0?4y?tACEqc|!3cHAmIK=*MC8k*iD(}kcG_h~Vs&B*oFo-xhNHsw- z4Z#1DzWyV5%IfT17p#L(oO%WRwjZnRlTuhc$pp(Fbt9ZpNm&Y?btT?-+}2rNHf+MH z$j>Mu*t@YH4q|ycbY&%BcZ@P*nM}g{E9GzVl$TMPbCzM%Jb?GoVauL?iz_0<8%hvGM~GJ8RN!p*dVT6zMXBNWOv} z`hl3R#Lq(6kN3`CqVa{v5foPEt4D~}okUN4!rmWAWOJ$A1ZnZb_Oc6u(DGxkWm}}o z@2stkp?kw5PGKwY$*gpU_`vCguwOZtm~h-#uT)bjs4+?nq)33cV19Lk@*eJZz*(I@ z5{+h3Y$+a6{2wi=SW%dF~>IKobQ`ml6i2wb;v~P>2ttMJhsi58_hpC8knHDXG80t{ldOZ6CWfSXJqwc~Uo1@lH_aj|fah5Se^fw>} z$1z3an%$omW^ed#t#LNy6k6d_`o0! za0{z*G_RkX>sY}$&wS3V;fPHh>okM6(lZZrFz@cpsrH9&ek10sI8W_RDElau#sOz| zisj!?ZB5QaW9`9eGo>FMQ4w~jFLHVX6D#i6Pq7YfQeXc!zQS{*6w>%FH1JqBX9JdU z5$7s-5SddF?&OAJen2-~CI9igdXx-GLG=iHEVFC+(Jdo_xWkXEW+gx8K*O!Z&b*@B zz)l;AmTiJI+KFG)glK1a=*k0kH|Naqa?ah5``6*>QTXDOkcr~qb|#X$3~Nqibv(rb z2uELwY-z?0`~@A=fd6Ge+H3UOdEVU+9VrN?Ev)=BJXH}{R|NZ5D!*?a!?P>9vA6Cy zWsnDVupV9_Uq2yfufo6MSlM%==~Yk(Kf%|M6%`#M$dl7>jL5^w*l-u%$`9C~RY4!E z=3Gyaw|Ib5AHq`=V;_!U)0Kf@vmu9m<#|4$t*fHXW+As`V6(M_rd}dvx8N~Wz%S~K z$8(7ZId$5OihO2IW!Q(p0&Zo zc!8emMuc5r8zbP+=XAd8h$XfO`MUsrc@efjMP%SV_-xsc6WNJ1zeHL#;jEtGXOx3V z$Fri=P*N!(Di_&{Ysg@k^);K73tB^Ji)*1R+M~;=qcKu(y-Vzg#3+|@*MUghSx9c_ z+$)`y^0R{BoK;~oQi|}Nh~*sne)Zj|0ei1 z+py+l^E~bGa?0|zCvbMV6e`R@d|(xFwIdqk629eIu%m0C|0X=i75Ke1xwrH732d4h z^n&r(CD3!XiAD(0cr<%F9nYdCo{3JBNk&X>N9N;{W-q=aJd-px&l%zeFDH zU^(`OM!K+LE7-%=>~MALsu}FZWZu^ai(0ba)A1au;d5(F64|US?C}IN-g7L=>a10? z+XSd@8UJ=*56ZIF(&IdqGrhvz+~+xElDpKn3&Qmv7K7Au2{$BiqPgKAsbZ2@>D}3v zrkq$`uG)*e5VUAVtkqEJWB!8!WVUQubVbpW-Z!bx9_iqAK|%fxYL+STk@y>e_$bdw zwgP=HhaKOIK0D2-hOqN3_-z$@0PzB{Vwnh1AE`vin&Qn!3}5O%rGv?P)+rSm(giIe_H_xUq8(KB z3wLNhOr{MMiPWRXl$&ootEER%dahH8bCp@Gb@?ie@A01N?1IJzBdZ!?5By9%r!9Q8 zkl!9>y#?95-;i(fd95W1wTig^G-Tuec2BUp65Gy;JubE7f@_g}CK8o@%L$29dK-I4 zeBQmB_BCXSo1JONxemqO8_KH%s|vu4e?kd0uyi!2F)MPp9o)GY4oSq)5#)6jo}w+g zR}A|};@W~-ktqBVo-r${Zp)qyhr-72lne1GWs=aZcn~d9Xj1TcLRq6y(E9B;ihSs-Kl4?1QiH zXGUTlG5D3o_{(HCY#J2%Z94I9?3?(r`H-CPJpBfwYiB6*XS{^;?3?QN>Yfrc_zOw;8*-sPyH+G6yCBshGLdXA z_mcYGuf$X9^49@8*HWH(W6IZbICKnFTWhXV3Tl&DFX@PIofR)fBaOtvSq2pxV0TX9 zSxU5hH+KGB-t&+hm8^yID=g1hHRdW(*D#3FYYw%_wAjylLUL{!ktKhnM9mka_y{ru zdK)(HYW}vH^V`f%`*`PRuKKOQBL{n28SC@_9kgnwi?M$vG9RwLT1vICi0?uz?}*`) zb?#s%G-mSVzgBna7ptUo+uUmYWzI4;GlRZ_Rma+3sdg(oflqcFr0Qe*y-_JqriWOb z6Vy`LMs0&ugbZmwJ;ijiq4eo0jomVx$@1Hf`g^=bR6dxj!&HzNg=&-rN53u#DlO^-@!>AurMT|ULT(9i(Fd- zRW3(gPUPoq&|Eb%P6G5j0qt7}zc&}umWlXidG@Y6vCni!%OpFBXy$7ysU$mq9i0cu zb{JaVDyLh4>$GIIr}EVX4o=IeK5GMjx#=*X4BM>Au{(SzmHXHQFX z;2SnE82Kp`y3$QK79A%!UlZF*y4{4bBB^Sx!p_PBDyehN%5Nptbq-5qD_=`F)q{L@ zg5Sw}Ye6PS%}ph={RB9@7N3*J#40bXM#+~R2@Ls^xT zN!CR4lg#d$2tG`5$cs6{$>`G#>~I^jqVyxq$PTg;Vy0iXg7l#DBax+UKybMqk-KN% zgl#-)cdW8@&}Dlp^gcYj$cS~&-CTHKH9BNLil!7iv~-&lOs>p+O~uLN;rXTRNBa4R zuI!9#?ZWfPw1Qet)o)O1!<65&$5!eL7xd)+y?9o!@ya2eO7Y&joQve9+*n8P$h=6N z>mWOQ5UWBk0$^}-Icx1dO64!p$A*Fzn%k&^xK;OmjKD2)VDLB(9g{=JMR9tp0dpZ(UFW7k5~ zp6BO@PFp53>ISv4)pqOZK24 zPw~txSiwXhP@6&Q3CjEqKAO}HOJr^x`&}NZ=?W)b4t*q;&K{g!6u;kzMO*{vb(i_V z9qn$+jqYhbvR+tmR&M*bwbuGz&9esZb(|@c1+AubywgQ(pk>waYU8zQdN$WIUDuCk zaoR!cvlgj^>Mylh+FY7i%BG<)hu4NasE7{fUc6JF{w}b3F zc5bF&)&fy<#LkB;{2zF>@kDY$nQ&T!$<0}bBY5dV8HGOGhQ$6I?zzSOR>%LnVgG5j zCudX8&Tfa=ADDIhpS8_8VePXHSSzhDtYEvf$@<-@kIpS;HL!|W>8*?AUUR4U-u%IG z+Z&yZYMjwKD)A(b$Ic< ze}%KoL$#C8kY49M{QK7S&vstsde*jkfnkiZf56ghh3`2BEp!>W`~^=k692S6b5Gl9 zN42xsbnO>(dW3d^E}Z9(cvXq-?Ldb-uov0QZQGh{m9Y#n+BD6trfTJ|s#vY9&Q?>a zHoq@m1zS(dedZK%t~t@{YW6qBns>~tR)1%U8m&##2k3w6iLPv(xt`OksH3}zr?R(} zccZ7Kr5k&Q^Hdr z|E`j8EQ%!FgH_z4fqq{M|m}C^>|09hXMi#TXInZoi z)-b*165~^#M_{Y}g70H;Y*M|Xw}}~(RwZXLYN>02Iz?1S=SsgXUCwk3)7?+oEOlh) zFW!f`OAA&vI=|YRtg<$BylBJp&Qq(a6~ff^OXRfEIHQ!xT7SKnzE_>#thYWH6$34O zza`B~G!ic-{}^aw##>dK=}LmCFfsm})>-SKrPZJ5eO>ijA9USy$aTs++SA%I$DQoj z;~MX}uV>dzIn%6qX27^(Og8cu?*cy>s@c)ZW_CAr2WABB1im-287BjS0=)ub0&N2= z{J$gzCC0>erMzZf^n=KVFKs?|jVu+P!>kdsH(i_T|I5=W--x_za|UH<7j{KE>rbB$ z6n`_`mAEK*PGFS%NW0}J8yp{8HKc5)8I~&T`V1Q~EzUGKL;18_!_Ink+OHEkM^FCL z>SOHZhcQQ{F|?76PG2vNo=2#CApJtx<5^zQJ_-b zhCkdtH`z?s8MirlYUIc->A!6H{PI(iPpdz*_{@0XNPqOZq+IR>nL-NPDto2U;|haH zO)Xe1d$#bBc81siAGCMBd@36^z!z;rsAcrhp1i?nQY{EipZZhU(;2H}os>Oy)^%xj zdG`d8qsPAQ@GAL*^{UwiBW6}0ySr7`*fbZ@Y>(KPs&hz=;6g!JyzAYY^fGE~yKvxb zLhYE*pC^25`1w@KU0)m5^wbNp&B(XvyJz`oWxthruO5}WDf<1#ULRba_C%hK+my5@ zP{7J=XR$|H$>vn^KjT2a^i4{7_O(dd_~`YKo4<7Vvi(cm$TpFUBL_uZj4T*6B&uxm z+PLk3??Vpf*j{4cPrp{b{p0VYuIC?|F)Zke|4r1t?{mM)@;NrXw=qaPulLrc>f_uG zgZI$}vsRWX*+yn>o^3vI2`rEWwW zSEj)6xPf0HKTP=$_vu}9hQwWg6?Stp_B{KV85cZrld?P6cYb&R*;R>ZAOC}+P4%ag}n>gS(oS9x51RgtARHm1IytG)^` zV?Gu6^d#CyO0)~PUb!0Sb+sgYL~!;rlQK`tu{-Cr>_sx`X;KH-W>Re2`_C_@zU=q@ zWXyQ~1$BjIY0w|RQNiOw8igJYJsf&4bYEz-&>_Li-P3I=@qN^Sk3Bxz|2!kEzrV0L z+k`&xhQFvPGqd^i(!;B@BxW|5E+)i!WwOgQRR$MXjAHSpV4xH@v>_ zN$HagBo0p)7~eJaX!PEwNm28ownlAJzJ*6m=l_e9W;JcT9y?J^7IPcGjyU za#inDdwsQXrOW4io%Wn(jX5T9aqNz$?J->ws`yu1S?%pc?Z9ZGj200-GHbK^@4hdP ze{i;;5vBCTzP-^`KNNqP_w9j?d17}aFSU+3v+T3TtD?>??$)VprYV)aPujX+s^>4u zo!B&L%7=uvzq}vuCD+$IfnSwmP`mflUHYux*tCCS|0mCXxsGN$AGFusJIeij?VI!O zLch4;_xMXFTlC-cLr&wsgTzb;MH2r?*8RTZ771fwa(p@XG4f-+FJ+^nV++Oii~C>9 z$H>p0r+=>c<Lmhwp@2b};9+T~6*x#PUdM$OGv@e_i@>?yBZo-?8NL$s>}MeXSh#F(y9dhqw;$ z-4b5=W+|gWKV&?gvrXY*K}U+VNxKLgN#@j!Y^Y*y@b+ zUP$B3K0M#)0{QcN$T%frwEZCQa9r-#nX$X$F2p}i7?a#9P{n#}FT}<^!4z-PaQjCk z){mW-bmb=T+q1{wjqyQDrcphW$%A~KJ$gt6VjZ?I4bL(8H|kRLql2AEA`P&hG0pvyS)<#XpL=8d*86Mc}Z@O4Ts+ zv9M3xPTD!AlbY7u$D7l$MoIQHifCufpWf1iFf0TxDsCvCtmh-G9ry1 z0{*0wgUtF=TH4?@p?hLeZuSnM?_rwBA^0duTD&6e# zuW~&2{=33Xp6E0_Wp?sZ-zaCD`>@-FW~#*o$Ms2m?2L0a_ICI7@a_uw7~)M;CG=(R z>fjk6*F)=suJ(8wU-Ha^;H0sE3)USokX$l;QOpHg^)U6Y>#a_gY;&5GU;V@V(5rdh z>;1@rjn#L%x4NHdU7a9nk~z>?XB{%4eA$w%q(;6N|1JM_zSBvwk}~-E1}+#`jk^9* z$wQL=^eyq<@ptrx`5*a)`nw0N2Q~(}2jT)ljbi5aW=*3)V32>k|B!#Ge}T{Pm9XCG zMMEb<_`=o)<#y-sR7_PleU(fR>3W9r)aW~*KM0h9ReG%ZmZugtE}o)eOsa znvzFLuXoaqXt&hK+6>nPPqm;;-WG1JenGqG+V8Cze9GIzl}Amd3_<2~ak;fWZQXon zWV3(A^O|JOH);e587Hje#5No&r+L>{Xx(r^$pcSz{v|VcN6D=<)@G1Rr-|5= zRY&4Wc2(l>;Yui7iG^ptlk=+ily>9>m?1^3wZ9T;ceNAj5TbxSXN$ea+H5TZi+0AI zV?8uu%#l_Be6sM?DJq}sy&|gQ$r$9L+$(4S?j6w8n37V zK3rG3v+_nQsI^qLC=uF0SF-1bH-l%J{#Kjf%Iqx@blcNS?}(@KUOlc4(Pt{lZ)lGD-cpX}eU z#OZPDln0M@$L>uOdWjun#arv`!eq%;5>5Txb`kq7>72y-`oQ}S5}kQSHPvpr0GYn0 z_V@Nv&U-XinqJN<{O2h|Nna_Mv=^==9@`V*N$WbNKXK0s>J*&QdqK~SXVw_1+oc_` zeF3*I*eIdzV-bgQ{?Nmq5=DE46g7z=# zeQW=#HgyJ?C(ZuWUg9h#&6$!+l?t`A+($vkA zI&~Ju|Mkk(DrPIsCiURg%aI$Si~0Mya=CX{MSLBN?5>NU6~j9Q7t@F9gFS76ss@L; z%Q`d7d`5)P*!bBv;Xj_VK50c#Tc6h|K}LU*HQs8kT-85%eC`k0E`6G(Pspm!pS_v1 z!poC&lkFTLw4b4!azdwzyldo{{fTUtc zs}d(9jZ3!#G0`5 z!9Hz-ox^-;yf;Ug_580Brp0$jnCrLf(P|H+5Alc!S`F`u;K4z&Tt}1!tU=Z}vzJ-Ntjbq9Q#T(Pp=PLg)6kKC`;6ztMdN{S-^gGtH;Y+Ytr^xK>w)z@ zd!6!B^XrTCIPIOD$x|ih_uyT@n}fD^`ntEffAwY!I_SCQ>ZH#{KHSnK=<%A!mU?99 z8X|E7YdhCjMLePeXoD=yY`d^M*?LW+V4YRQPO?_;Oq+>Zt+W?AZO9eZ1mlp7Ovyzx zr`A-9AtSSh7-w2_tNKiROgyO=UVk~N;{`}A^O9AQT-!ivBcAt}z$RmwmDWkNW36AU7^|ssN$H}M(|c)+)w4FTcL`d+V~cW@=TJ`<2VLG1K6+BQm^rtMQ}D(lJDooBAc z45GFp><4C9v$omPykJV4?jrH5%+?LGNPRM?!-;`6re6AAHH%hWtE2hJbh)WnD5zc| ziu;;uHuGhbooLnp#Ag1Wrs1hlnq1gN^v5moAAb8IHNv&1F?LaPw9=|>6|-7FkvY(w zC9OP`W?eRQ>lP8T<>n#I@j6fO)SPBE=e5*)V6I{94a`;MG5dyE()G->+x^~C)qB*l zz;o5xCupu(#HLF69ahLl@I`m6OvIvw znMp==^MHBZ+-=@6+gj(WH0bNnSQHCF14hiF?u) zN`0j!bKVoQDOv_?D{H+$W=$rHj(5_4c$;juv9l2kD9VaYTMMi?)&%P}tDDu%s%53M zUcfP{%s)tN6)@9so)3*z zMs4#Ka}e>&uhwj82U?Pm?V+3pEtaT;XtTkxP5`^}0iJzKPDHwjJ|hym7G2m&jZ|wB zzZ#^4=%clk+_Nzi?K&L=rjuEUp>8}0?LUiL;2E-Qhgow^E34JYd~aMaP8ctt*C6wh z(bgz!6c4=i-$jzu4IB^rWlZ91uffaBP5QICMh0yPIUC{)nH6-=Gt@oJ?RPt_!`Og5 zwW(TVZJIV;%db}C>E^2cXifD0^zM3sdW9@)4P~Iy*zRH-H_Msn+0QVumth9F7)S|g zslDDA!ui)Dre9F|q|P9Ec#8Vh!+duS+fQbMN*z&ZVvu90(JiSJcRhAb_f+vTclUH< z)>Z8uIiEC6b^E3D)~Z6J{4{a+aI(i6%uSr&d!wmwAy6(b+P}+J$(Mt#F23Quk-pu& z!v6FAw1J>Nq`z#Sg0a9{VPzvOz1+#6ZwtB~7LodK#J%u{@SCZwha?1PUeh&_3cd2K zGp;PGxvy)Id%8Q1+j6aQ^>y`jJ#f`_ozgm}N6G2*wsTn>%>-ka@yr-*X0nD`1*tJ< zOO9iMeF*Ga09)-L_`TjB9xsCS^V%z|CGgt+tZ~*rYnHXfx@1KXZN6`H!2&O4AG9ly zox1PT1W&dSlujP!88LLfbr_rVt5u5cJK#k$LNd-F{+-ndwH_di&Jz!hBZfcS+)w=b zU$}Ow>4KNjS}rTZI&T)W>RLY$C7)xqwrZ<`Je`92dVllo4sI2CAb5_qpf}9h!QD=; zq#OEneZQ7Vui?t!nIz{s*lhw>V@

KssHR07zgq2YaKx$n$uR$b;-O>icI z94$p|A{snJ17#|?r^jS{hCqSiz-}BT`_`YF?nmWku$U#mTJ#3b@SJQwT_@gNg-=kD zT+a%%n%W2S<6bqpI*d#pwG;L-I~b%z4^SQT$(vrqK2B?YL3=huVs&A!`&i4YHdaL> z*AsI)-0MZ}4mJm*#B2j-s8(=TTk|=T-O1Ucza&O_&b`7D8}uOPjc2TThAY2bTkU`> z=>+~^iLy&g)XM0sbw@8vhU1ogOy8)jQeyCpI$OV(j|0Jhu7T1->FZmQ?7Pl+WhiLb z6Uf)X>PC8VY=zI>Snr53&9}>t3tWYi8>+^W2S}qugH`=bT}94#HHglCIlpvR;}h-n z&U=MgZ+(KkTwjlFD4=O7vl+Nf5njWH^tZILqlG0~+7SJGf~-MpV)w7i5=fBK##$om z%MGvDk0`$1EMwI~S3E=ul`>;-asM)iqGoH!?Y! zZ;yYyvBMhZJX17n3Hist>L~hVyd@LW-TK*@iN9PIWO7Ng*gmqpC6Hg0q1!cJ8a{wz z2vy&Zx7L;a(QTrm?Xh258ac6O{O@|;hqtS1wVv6U|0s z_0E|Y&EbY=+_Dq(T|p~CehkSFawVim$j{yvS`TM{H5T6eY+kolsRvxmyw8Ig2Hy|r z=WXD=rkzrnI3?}c)>~}5r`A}|#KXwqea{MhNAj$+IMP>sl-2R))@iaT5z0iuV zCc_UU$;~V_&zZ%oGgczDTP?G-aV5~vXl-xMmj>+!nI94zQaIJK&?!Mn^go@8O+Ti~ME%(%LT~aSQ>p`c-Sf8w)?Po}*RrV6=tU1qoWsbM{+FP9h z>Ugb!?$RT)e-zE>Z51#F8H8I_s%aRAaXg_vxsQLB9?oQrg-VdH7?g_4?`rq0awF)Sl_IRbs z?BiCFSdm>wO@nnG+jq zB#4ckDbx7v;q-e{e)2HD4)JF3@J%>B1Z(|2*kTb%n=7V}S|f_cuW?F>}f zs|o5?q~_nw6KjNd1&`ySG1hEs<>Tbn5(C+2#USVA8?B6W*cO^KiX8V=^0Py%=2&!H z%*{qeBg`0K91W}pL@LLNn;$GSpzHm2^RTa z^G~z0*#=LcuhSPRd4_&gZ|SP+I;q1x*5mr4kZ4NxjBdjYQcKA~x1iAL3ncd6; zMc2j7slf?{gO%tA4cx}gEeT5e6sVUdFh8B}h__JhB8ZUA;Qeai>n>1ltC!V1ye_D@ zK^P=x1N4b{U+@5v$e*9qm+3S0edzk@`W|AQ<#a<^uQk+SK`pwm@4DhoeFVKS9h~1v zr2Kg-@EcfX4^r@v%dxS?fzN14AD*0`-dYgx+zuM4Feswwp!o$&Ds_Ji!B#!Q7T*cZ za0GTtCt`P%`N~T)GPQHjehLcaA=cq(;+ax+)*KIi5XhCQAeE$ppUmI>Lf@oMj^N?4 zfND#kchvWI|1*i9-omnKNYzXe@RlKJA-udB;Mm5eAg81w=x`8JfAZA;+?32Ol)fOn zu)V5-MJoUztsj_;1t6%NvV%2296zB-xwI?UI1HdhjPo?&0K{si|~ij4k5@Cu38!k@u4?sR&n1F<6J6TePRm34KlksAEPBr;8c zRm;l$W(Pf6gXl#!cD^xtG7b#WD54uHL0hhp%W7)})L}5>Z6Yd3d-R2(WptQ@_V|_qE{mv^J zII*mJsxw&0+EiV5x$`{EsWIO8Ua3x^AJ$-IZQll8RhT-f14#F=&H`mNmh;cpgu|5? z)U5pN{7*Rx9u4h}e6I`Et{pWmW1XsKjk?Ma(A3hKJQ0j(Eu}6vuWq0ie`K!(`&^yh zrdH-bm(TeNRp3R_KYg5KUj zll7H*_GeCQHlAj0<-Xk*giB_p2FRGE>Q6i;{pmURfKy!kp6aHw(Dgbha27jf__ru1 zy}e|fMk+Tzx4G12toaQcOQ`fAa(vm=wT8}*RK>YLHr`>aqwt9f6CLjh9k-)0EQ|Wa znNB1mjnaTTNP0b$HC{h&=T?4EYucZ*s&=y4$=*-=uB`JPcdtUN${KL4)wzn)NTyXf zJDJsv)DJvVD#9%Xh@p?*T&g(-Rku@LT>^6UtLm|asu`VowqJ>~N8_I)*;m-PQ}#*4 zCJI}?KI61d)>>V{trJGYkooJQN-1dAm3`x2GJAXO9Nmc{a zP&jjq-AKKSN037~Z+B6KgZ=Bkx>6CtpAOcgt}?_vqr_Tk)lxk7YBkCVC>MwxM!=N^ z&>5-KU*N-T$}u~&T9+Kl7zW231(*1rG6EV{1;SBkZt8GKy}@if0z3EwP405;D(N_( z`pPC}jJn)zp!)3uIwPpg8UscrAE!T!D#CnRe=b?5)L;$g(oby;k*~Gz#T;h} z>&y#A^Rm+s3Tq9wyrZ|@NT&gK#g)!Xc3-B4cVP#{fOm`ob2<=9IXC;c7i5y4OAmp< z8VbD+ruMA|z{&!k>}Wr=b1W(8zAyuPF<_H(lkl{|2ACloR;?3Qg+PQxS{$ zg;-o|p5zl9?PgHFc@4Q+o*Jm&|3gm3fgIe=PanBzD)JWTsm#*&>=UYXqS5*icgqi_ z|HN-HBA>tVTu;G<9^f-F{rno$OK+f`aQ^l^*Ud|9h)h9^L%%n*9lJUH2d_P^-Eu6`I5>C!IMf2avV}ZCcg|yWkOA6A~LzbM@uhb>G&dD zeDd;BUa+{*v861i(Hh9$x=6C-AVnMSo3i{(CejHuS|%<@-v_BtlwMys_^eEDkWRaT zmXozapht`w*zoTkOR1l&Xej?3MH`ma1l% zIxDzWH}XlkOXUW$S_Wxc3Cfk(l=Z+9N(D}1o=_$RNR@Rup1&%8ubA?@MftZlXDSmy z3-I}z{G1Qev2;)tzLpNQ(tS4vPoEAcB~xAi)q=APO+h3}J)!Km?3L_MYE~|@Rs@AB z)z?z(Exnz;&9sw#y;1yZvj;Ne{vNx3mD9ZdVpb|ScJP~1{4IgAkXcbOdq?`K%H+fl zt}WABgfnG=y_@qb!OwX)odo)gN-txXoFTo01RB8Pu~ zer0;{QK)_%yy{gJB3l=6*J9K$rXx;Ml(nx#dz|N4@+jL_M+6?3^a9!er@msx>vQcA zJk5RNuJof#axL)NtFYfoq50kL*k|~;0@`B{Pc|C-?N_8h6)>zloFCPP;d1MU#U(__GUC&E42`x{eT|dZR_M; zD?;xP*fImCiTxApF`YP^4}U$*xsT>w;H1(%I?K`jB^9YmDysZSwjwR@y1~k4bleu| zrnb=kF#`zWl4`8oSCKwPL!je(wqQgb+l!S2b|vM#-BWQRA0~<&rrfr}&`}N4o=5`e zE_#PkAIvExDJ`Jwf1#+sSaTJ*u8FtVQ2ATEZ}(EVsP#F6%vu5!)&`zqfPultQCZB=)o>w{~Q zE5xjIat>AIK8;ja|fe(;3|Y+x#c}$Nh)>`~Ca; zasF0;%7Hgvb2jzem+9hx6plhCB&pFQ<@9Ln)pex>quFlF^>oj=o z1=en}vU$MhVuYDb$>_IK(`ZAqi}(nyv}o-sxb24OVkg9o!@qKfrsOm$k@vV}ezYbz z5$aFc5BgVqxNEa(o9iU_=nU?ouEwr)`hD#^_VaVB#}06+@Op9LKws#B+k%+MS#aqY z;FF0|%-&&ttANtZ0aCgbD;-S5)33xdmfMGklpW;jI6ZhS)0MWmz0dlQ7(`VwH(p;7 ze&Ty|gXdb%5$`2;D|e7*q^GMVi|0r8JpHcv9a{4wNPrsD-8`fRQ5okI2-%)!w+nbA z!;t`|u?5mOi-{$tw)c~L*=V*mTjE9jYK|d(oB{BWKFKyUz5WBa*CWJLCb?91f@_AW z1(enuY{5n9z%uFwwDW2wI>VaOEu4bd55dLd+2dnKn}TTJRy_Yfr0EIxtv0Wp@vnUN zB!8e^WH!krBv?UwpH_Gb&*`s_5g+Ok_0Sfb27V%g))U12Q)-pQaQ$+`uGZlVwsmZ9 z6#Jmg|Jily`s`(H5F63fb)rwNtb5iYzMfm>iPBHArV<}mO*VF^wTP_mGwU zIwCkf+Rf}Tc5xy?t+>*Ad!P~oI_5e#kzwR}E4zle^0-dvPxOa+5}o}vs5kIvr@`6R z*|QL*GjXcwP|Qg_@3HIgBnC0TAIL0>A$nYdIK7t~Kvv=*wz<%XBGYikN@owCw&5_f z+8MC-m*d;^rxJ7<(YfhxU<}<2TB9Rms`5u9QX+cx6xw(RdsY|}NnP@W1@U(C!Kp5C z6Yufs%HxHU;qNW@>rd29RA6`h;A*4U-93Ez1bc6zaisr$W~8r7+av(wcWklZ(W)T#Et$hcx{iij;er<`1sNpr6T^hYg@`m4pQfmZE|T@v{#_7{!<_EwHOThOzH-= zs{7Pg^o*%QHHMn(79Ft`#rf%=JXH`%@n>i0Jkt zx@64a{}cFk34NXq@{R}W@&>v#+$HM!8ETmbXYZg##B@%qyt7LANS<#Rl>r^Jzx0Z( z`mRL%ntn%L1M=uQP1o{K2a$}ml1QJDaAyMX-j*PFE|N*gOC)wWbt9$e%QcDE!5w=f zvOEJ+*v2joC9HzqxAVKv+&>R=vYZTz1^-vXDv&O2t&rdi*sE~P;0{rVo1DZ?=>2b< z)SqFEuc0<-F;b#8HHS%Li{I0iWeRt04V_0&2Xo8n$GT?{{T^l4us@N-nh34mAeVIt zT$KXO=s8s0o*2y@q{t|)P=$K8;`r=i)Yk6NL2rWIdnUVf>N8yT-FZE~xX0_Q)fl@P zIrm$3GvbBgoN#-uHN#G$Y*jTVV3M{CFRumtJO<#c=W`yJKNzct@lQ94!h_Gq(MOv} zHaTKFRu5=z)aq1!me+#xrP>lDuYCfUHp~784Ll5acbQn%S*0)aCg;gR#o&Ps(`UK= z=kBIGLn{u#w@Ot1bDo%Uj6co)?A-L`ZLF9`M0(hewWPPQblc4MPDv9&VRYIH~ld9yK2L#+`R z&AwU)Xpb!*6h|s!?N(&Me|F;4^J-aVszqNEwYh#nZ9=a4tvwP~Lb>xy-u6U|*YSjQqwEBa8I}9A*aV5!S^lGGbL7 z>0vs=-8a?AFfC-K`v>p7RHMTuheYc|oR)SCrs{yhJGesltFTqU2VB=u@C~EY zHg;NnE#DL4N9P}9k^TQzIt%b9(xz*-jm6R6?(Ps4cXxM(CAhoGqA%{gxVt;SeQ|dW z#4|Ik|K0iiYp#%xjC4OzPt~bYr#2a1gpbM`*92ESM=B*+j#Z92!lZk~VQrZN5 z|43g8e@Xqk*%d$YpfyC?r(|$uarBcLN`^E-{z;baCceu=GW%up^4dkUkiN}KMj0pw zn>bh6N2abOY{MiWS&Tzd=Onh~5Bt6|S&A5}h|a!UhIJ3Yo|eU4wBh%IVH$NJ|K11Q zNRY7#zoDJJMNdT@wiRrd!rbpYa@&(Q0Sl8i*#%o>mXX=KZw%n{%f)$@3CykzsB$jz zi@3;j(Otq(!kORGJMezsHcz0twlj@mjiaNITHI#-)Uuk7tm?2@|JHvPo$(-o(8k#; zW>9phc0S0T;RlS98-jOyqy}si%$&6PIPIGnp!YQnkU8CK4!1Umjiqc-5zf>X?07$( zSq8lGLvUXb;eI?Lle7lU>aKCo989FqM2eR($$6AmPThyna#oZ|gkI9LYyNJNf2*PQ zBtN-`4Dc*+(5A5;OWqsJp^lsey;yC7$l>p0912n^_EIls+~B;wWn={puSK=&O^}%E zAdXIQgVo4%w?k#b>wgq zQ^Lv4oEMve=yZnnl-;~$ROXY1;3I10JR-q{AeIS2Fi3D12=;N}@@mAY%Q&5jkcZ3z z_Iwu0eb{UZGp3;B00D~uUvz-Jyyp~13(7c=Q@#xTUS*<|v(#n2fQR!R9>yQDEQoFz zJhK8;wD2E{+)tqVGpTQW&6!sb+|R@Nog^Ax%6r@Z`L{bBz2NaL@w%;=e4cYCEhm0X zB1MyEvk;MBBB+S1$8m|6*RFv5fzOd1@2w@L_82^_=~Sa{qwahR_3Wcz4cKbey*w|JV5<0zal2Bi4>RHIp5&0KfMjS7`Tf*^N)Lp8wgJ75niV?H-de zi2&DteQyV)xkQ|)6K7`!bLfn>Vs~Wg0y1J(qT8KF?OrBn`JN3l!Bz#ab!;1RJ&jUM zkmP_;YD+dY+R<$Sy2_-{PpF!sI((xel^+1-cj&N_dHQtYm^3h0zYglBiPOa@)E z74^L!O<#BqyKB3xd2ILlQSq(pKE<}Kgg&z ztKkLShTTKRR(-w-7IziY!&anwz|VGV^P?0D$gV!O`|{eI+G4?Zo`Z+jwa}~aySH$* zUL^8<1#;wKMcEyoD>FL9!2fN<F%0KR$@CI=o7SDyzg zIFvc5&)xqe{B4~V=130Cxw@txWECU8OzhdVH7WX|rX}$HYl*t*fMFfrGlrAtc*W|j z2s+aU{P7+Y&HK=FjS!nDCFN+L69_~FGGJ$kgWjRGRh}!#$oCCI4+B9!;z06cF%_J; zF5*h5zqA(X@sYcszaidkW$O^Nx6SbZBiJFs$uOK`#0IlFZ;|P(49YN#7%xg3K*Vn2 zjV4w`Vc*TbH*E`kS|3byFkW9%RMzG)bE7yx7l37#5KeLS-Ud}339j;*d`bg6`bEsB z-OD?fb#a1Kp>RT%=BM54#X%`bMICvkK13jv+0aVD^R0m{2GvGn99K~@z5-i3oH(kk zIl^oYlFr)yu;GFk!sjh-L>=YM9LRg1Irq~w$HD|M9>%4}t_(uO#_3D&unH5Jc5A;W$N zF4YAX!R5`m>{7d@UMQ9$pOC|vY{sF7avtO(QoF16Rr9Oy{uBOe{w=q+aFD}Nb;^9p?-6Pg2{G4XGj*hUM7T>2|ks zpK}E|t5cPE-ikL2E!i*mCV5Nw(!%(zuXWdtgVnW^{mMe>ebU2$4|isER#P^KyYcZ# z!WD4p_tnGdVC|`1iWn(?)wDvWz{&gr7ED$$47-@mx<;5@NVCX@r`E=CzuVOTuq8)n zm(*qII<=m9kGh>MdTwd4t772pfYC5)mjw+Etrl9v6DTbpV=|BRkxd<%lp}FS@(ry& zYv_oXLHH!+^5h9x9Qf7!%aPB~!kOflFAXR<~UoN$Zdej%_ORN4eOtG)>NLj2D za;$fzbLVrFPkrUyvHl_!zU9!fbDKiHhR+$uVy?x&sk30FL-Mk$O75DKx=X;R_8Qn zN;dW^wfxbXHcw$z2a37i^E3b#=?*`$J{U^{>EnQuGtqA zk2>N9`0vAo3u3G^O!!B?q4hDQa+US1M#fitt5FxelSs}W0Q5F55lR|i1?;gr=p*LD zmkuK*xIkRTo!h+V+)`uN3nS7kOsD>7o^*#*-WJAW2RQA^dHz|}fZcab6o0^>+HG|- zGlRN51dANRT&)z!NKfTNIYc>2z3W)HkUUMYh}mXRopBe8JPK8hqbNlbF@EVU^hn~Z zajc1&=)BH_rLr3gVjgJV2iD4A>M|Vg|4vdT7i2a!*AYKNbH;Swv>F0F{T;S#4eJM$ z3A@0?iotHRb!5khlJs3ll$Xf4r2ohq4>AvuD>Y!T{9|lkjJ6y3!G;d%1=JT< zGjf>onzK0dM5<%IE3K!Zr?$I{tGY{dJ@DiV+#2xCGunO6mEFC{z0|YPliJhQ-O>Hj z-OLj~{p)b|eYngETzNeOJx)(Q&oOs7cdW~BHFQUKbWfDKw!4ihjq95`%5#+Zlk%Re z&YrNjOr@GLz_rM^$8le&MUBQYX`XytY9eH`?!hp26TSQq?{Ia?jQsvQYO=qh8t$*_ z+pd+=+QB*u(Aug6{hfS?NnL#>ed&FQHbec_yD6!e_nFt}E8`QrjgnJSh5Ch4a-O$U za{1)w`ycu`c@HPAO#aIo;jiz@>@Ve??mOsHeUo5jy;l=eS$prV?AzfT z?rrAFsQm}pab7dk>*{Fryz2AsQqO4l^_|T2F4&0=sLFY)7KicY)+fNB90Qm3l^$;P zfngJBq&0I>3Az--c_xgkqr?;q@oNu?*QNB*d(kZqQW702U`O|-8mF?eCMqv8P!l;w z1yZu}w{w(hnd`f2vopIh-kH-i#c6T67j(68k8<~M&vh+v9d|xg>dQZ*o$`H0dRLUQ zuCs)5h;zFmJJn^?#XiyuxsVb?mgJLi3zTz;{8EZ$*R_B#-bM3B-kR2ASpVr)TZW^Ta zM?Yo1zp4M8uaZj$^vN-aj>IhqpAw2DT}ir==ubSCpd^GR zPDz-N5ScV3+3ocw=ScpTBqo(h8iyuJE#D1)0rk1MQmdmC*NW-$?K&(oKT&lHxO0MV zNvtH5l}{*xlmkj1$1k#Dn;m~S6lbLC9Ts$=^Nk~~^R{!Vl`hjc!8OEn z(D~hY-`UCe$aTma=I-K7aUew)URqcZHxYiDnGn_Y7V|?E7bJ&>Wc@(*XFWmKQ~yZalG<$dJcn_M&bPI7neYwv#FIR8ANq8z@-Ud{W*r}{N@gLYm| zF!PG(n{|g=;T`HjbgLg|0V_Zt_r&^+m!C@i+LmTN+|L z(>nPwCD%`?n4IKmrLVJ!Q}5qW8Z3Csvsx+j1U7WPx|lk#ZCWa=nfek{px0_a{elt7 zNq7oWu(5GS>#y#^(vDZBXt(uR=nae(&%=pdEyW09%`4O|M|lf*Z+iRr4`~7BHMo9x zVB?iCnrnysyL|I}4TxGF(3f+uGwv!212d#Ln8rv|DfpA?UpbeUpUn7X zcr7uYv>V8P9<&aK%N_4MrGxi}Bn7Vuv|LT(f6PGbir=B-GN-~`U+5_3Z0OAA-0N^U zzAH~0QLZtbo}PEkWv~_NYk#RX)c@(VtoD-AQO!BrA<2aV*-QmW(2eT&5IX8SB*R|9 zTuTjRY0!+XoNCefF-_zg&!FAYWccEJ$=_8s>+AE>(VT7r)H(3AV^KJ(u1)qo@J-cL zNN!WfTS-s>j{z41tmYbV-R)x&#hpyy}n7^ z;eYLKt(`L9xe)WbAXGlpYVNf;ns!@Z??_bk_oDi;8#$aW z<~lIRc+j#L(3#SMHQTwD^Hf#`>a~rvW+!r#8e=-l=qBWH4Na9X^TO<#viwPPSFZ1y z7@YeTRq>Io>qoU^YM>Tsd0lza7S9%#b4RAjK@W`I2}!Y!5`OriSY6R- zOLeqX&O9x2mrJ{r1_p$UNZm8Ei>tWtBjIVx-ne?nl{ANWo-A7%BLRJ!C}ogyp{uUj z?VjnpEbZ41Cnv?9h;NfTLEC1XCjOla&b~pMD%Yf%`=XLf4i=A?rSv}j;?!Er_hr`` z2*qSmE-7CDZQLfhw!t!&6L_h6q>4U$=stmR`tU z?Kj5jZmRim81>Ax)&pS{-3Q)V?~L?%3pCl*8il~QSCFqOYSuD+<}u>PY^a~y)%%iz z3oz5d{LO6k)Su8*@sn0rnCyBNmY5+lOZyDjLduC1yaf_+C*4*v!O1tZG2S95Gj%hj zDSE(ykP@L{$k%{sPE#1KMSA-sU-d3lJw_U%k~Z95-#=AfE^Tse3Ca@u(NoHCMd)u_ z)4XbF^}Rm`O}Jy4Kpt$edC}U3?n58fBKKxjZzVGd8tYI&IH2vL%59t8Sl^6~4x?IJ zB==Qhm=BpjA`d!0C@4H?L%bW3GJ4Z!%dFN^-R2g@!i*_|CGRG!75i9;dUxvU6}=Bx z;Z8*IVMOq2t>ff`it{*xI^`PJ2CLvwEyU+fB&P3S{lTj4HI9+(60LT||Fp^K7Bx!i zXhd5%l>Y*9rkR|veWvDVSGmjT|KTmW{VlC=B2|dqZE;p?4R5@VGax23ci66=`|hR= zL)t*jxU1eujrM)>o%7E@N$0xnh5x=`$pbtagYpDDb={RpTgQyU<{z>vrHqe$0dIW2 zPu8zmL#0#lDkY<%yj*ihdFTgQ@S9%On8uzeEey3@QiGROyP+oOm81>g z)k4fgU!}0)h1ARv$?P_ReKA|8VYM}WYG1XIFeK-KTOLI(V31jqJcP}MZ)|Yr4E9e=FiP@&W^3y0HtWx+KX0pVH_s^#gL9@IpJ8k2-mZ@NzuunODfyu1lk2$= z6xZ`dlV6VHlk(}HQo#YPh1LQ+uQ1HDK6q)!NKZjAOud-g)f?lF(q3qv)f%c(t7x3G z4vB?{LT)(iU)$HXVS;{8~D!p=NX##RLSRlRlT7XcPtG)A2up@hU0=0~-vuetZK@0qsOd?+lG z9?3tI^^QQtzaZK3#6w~h=`Zn&IaWL4E9lFnW--Q+6@O{2!*l2%tV3g^s57I|R%~kh zFyBy_;SnmCG1@fsqS}d7@KiV;E6!rBBF;?mRjUlFl{1WfZE?5$*&CRA$ro-$O2y>{ zLK|IETNt~<*UDgJlyF}=={MERrkj3Kcg%EpMtrnVqb@6VhH+LeYqW$J_Rernzgu5$xzC5irp=S8wOh5KbcguF-709C>yF+s?(gWv zam%!Sl%>we;%@b*H%1F`LcE5m@iy@S41vSKN~xASQ9N#pQnRbu^+RMr_E?}$D(V?lB}tTT z3A2r-+IxMdHH&UR@6EO-VwE$_Th&B*ESfQ3Qisj^f-KDvRcnh`kX}>~u#Nf&#i#<$ z2YR^`en~@pspd6yDD#4%QY}pNDd2z76-$t7cs>O;3HW6`Nhlc8E`FBQTh1xp(+4H5 zODw8RR!RiP!4utsrNWj&{GUT}RdzNOM``c8C43{*YI+*hWNlXR58W`kitFS@)G@AA zX3N#2+hRH?KP*Gj%4wYBo+@b7@OymZZoY$nZxjIi|sr!daZ)65xmR67^Si@nnyI3n$_?r zuY%U3Iu;t@N<%H$E$7SNv0=B}9kd7Wz2f)y9$*hznCp_3#&u47WPEfj3~1$CBCI#a zdpLds6bi`ZXlA9>o~VzEWpH6u=^Om(y~ljhVchf)X0ulRz(MaPW|uoVt~+iM8zq{@ zjX`Er_W2<*y`F{fX{^VawL$OCngfh5W-?qpDVLX*P{TDq_$ZAdTUcM&Y;B>&Gsd_n zzLYjwlhmc&U4EZ=2wVTra%qA(&KMxwSNcjljU@lS>QZ#>T1eTggW56miQZHAo7(3Q z=D$SEORU{uL211(k~laTkM%nli6PcPBe&7j^npU>GV|IvleNUPEqHiHZI3DbXN95L z`8YInPy=y;w^s5&EuS<-$zhpEwc^Glj?_EIn;mDw*7|U5thLEeg!=eVjwMvFwiK>O zQ2>ozaSd4KQ_HCh^)*&w%;)4%%WIc? zb=6?YE4`6|tfAT*EztTVZIKrV@38ir&8=dTv`Hvye85*rhVM5=C~L0JM;M2xn!7~x zmJDnDt+kB2#%Jo2htCuI%)MRl3=31;R5DIeEgOQg`*72-_cAG4W0 z1$4zvg&Z|>#tPo=y%~-=`!%5m%BfAPa^ekXp!AbkDmQ$I=Hh26E^1g2)PHN%H?f0M zSp00x#`+BuN=m22-d1x?rxI2@s&*?`FHt}&MCGAQ|FL?;em#tz%Zv4d6{wy>nXqDD zFP^mG%?eb0R02aD33GKDoSQY&bku~=`IUTLYaYcwxN}ek(T$(&Zrnxqxh=Ix@8LNQ z1j!gnN0R3-7&4FtybEgMmZIQh&7fmbQ|cBD@+o$0Oh$5nH_2idWahG=)OZd)^Hf+I zJ>XH_F)P7aS7Eqzrhc_Fc;F&(Co0|FW)rdIgoU#XcKcDXT(%m06<8@>xV9P8YHTDY zX7_w73>#?(dD1jo!$-26nczkgBNKWPcF}!ui-q85OrbYoH8{B@%z&Y=zJ8i5sPojx zan_)ZS4S8!8My2HWI9)q%?u#dmP0%(Y^P4XigjG*Dz2gzTW%^xx{+rbMlOo#JE~%j zQiqUab*ENuDNGJO(PU59M0_;BOoTH;nuz4jysU4^P5FrkmM#l{|ra@E4g2v8AN{G&PbYMBc{Tb zI>^^X?uIH)STiNTG*gj>wL2|WXG|Q-V0AvB6fC@(u)_*+a^``NWOpD+O-AuGRbhX_ zgo|X1#xoK&Grbi5??v7W6=ACi%#mI2Pxj-pwS=j49RAZr>fA<=`HWyaOoMS!gL}1m z|3*@qP=&QJ3WbV3lldbO0-|e0e_3(8nFy{0H*s`8aoz2?r%~-Vt zUrEQRar18u>QBgQGCIo`srhj9>|A^qDk3^CGG+KVGo48K5f4pcbw|Sdyi6o5F$;0z zO;fQ~+H%b;xldbhtS|T6JEhN6U9#|Y$F@q0OA%%y1NWbudn!pLHVvPDffZDWobo+t zL~;^^)dL&YN4DSY<$IKh@;;37bmlk$#59Z*nZ$G7z(>o>b0Zkz3gqB7p`3M{D(s!? zmSbc_H;_Xe#3z=8>s0~1TUJ(RYn~TF^sv)htY0x^o0&zY5N&LxpTS9^BRTJaa1LPf zGN<|I4&fFjVYNf)C{aUP!>2xD9+!X^Yyy$pPDHc^%Ml6_dbfNU{)CQVOO%}-HT>`# zZ(9A(P}^hmphBcN>wg|R#r>?qNn#Q49_z--ds(QP9fkp7S?N;v)$RE0MYvuE*!>qo z-5So>--*6Rp;WEh5dYAV@i{zzZz=u3sjkI-DU9(Qsi8EHDqGzwFVNB5%*H)5r(S6l zJTNErqbR)X)WrYy#aWC+YLQxhYdl_NH1}TxzSAdAhagzuIbm+ThPB^`^|J_O#2i-B zJZ#8%Dt25j>@UIBn9jU#MzbA_ZeNm{+_~z=w}SKzJg74gBw4FDv%AVw?@JaVlo9ifne6g zMp&2~*%P5sKC<42Q`RwklF|S8&g!~JrC!h_dyHr zFFB24rgI`y1G-$q5#u_G=G;eRyR0d>T;<&}z?8DW0^jXy2A`{rqrN;|s->V%>{uZm zMVn}n^1;#0F--oCyn2ANS=oqx(^otx43ds1Hq&e6Sn6)NC7xNxUT6xTDSjX#z zTU(&sC6el?OX?h7Ha~JndIqhSe~3@^7gaTMEGF>t58r&%r(Pi{+w7CnrRsNoPTx)M zJ71VOQal2B~4j1LLmN(|^l%N}Xin zu*Mpxv^alieJ|K(3u2%S>IS_66)4+{^)QFNa{6Dj9vKQs8OzOYSigK|YwR`dSh>YJ zRyNpg9bjd~;1{@w&f=+Xj-lqKt?*X-TZ)vcCH zqbgLj5A$RrY@bBfrb}4IyU@bDfYQ(&^ChR9(<*8fH2Q-|RD^MQ(A=Rf z(GQqYsN{WPwuR~UOsGxm%wnsdQNo-ntdYKp^R1RJW%gRV#ecvR=NYriU1*Yw5=WT> zP!k$%`l(oP>pRqUc%*JiH&$tD{S}B7Zo*$*q8jk0V$?NM$4$q}?5O6WUT~})O;#$s zb`_>yPGcY*P$50HQ5*j;Ep_=FjPH6jaJC5WravIIndsX(9jo}tx&RtiO!z5Yl#Wx) zT8`R){Ai|C6Dp&bSJ-MMex+l`6rm6-$>-d~9Q>qjoR33=ui`8?ax<92xD$i%0Ml4sJhAxe@q~V?gvH zsHEZf?c1)}th`Hn;l8t@F5h{Teqs{gkY%wF%tM$0k0|wa&R9pnA)IOWp zs7<~F()gd*lPvmQ_-WnQ%L7o1c*$9`lQU~St93cCc7Hq^TMyje{5XPNG8~oKSDd*j zUc**=3+LXB-JbLQNifV%6ZAkHOwT-ONCSvp5kY7 zjr9)i!e-WQf$4V@j#E={5If|#)dkg}P^q#wkI$jMofsiimV%+Ljld%wK^4hLyqx7i zZ8|mgrtY*mticDuRSV~P6h9@Dzz$k_&!QMr`u?4LE_-$WJvRw zGPwF-X5u{v!X7-P?RZIag+x1RgVYKeGZ$1Nm%L7XDaW7`x>3rHmZM3PVGDE}m&wW0 zVvkicbjc^nt@uj@<*R%I1;l#tE_n~NLA6lv+esyK2@sYrIT9^%mvoSd?kduLm|;??^+6Cti;S7_+YKBiva7u6p+m53`~Ngkv+uR4{nr;S+nA6@Xr(t~4+p|Xi76C-D{S?sk3@dkolwHCR7i@UN1wd&6Pby#w>lfZo~$BA?Cl z0o{a0nH~klZ^RU~zS9z-tY&!MG)_TF^*whn0Uf-%U@s4d^DNMg0@$W*to}5n2lROu ze_aM+a~AXIBD2sc#e467O(@El6oGe~4G;7RpZ^ekVj1FyXvQov{O^_Q!Gl6JDyJW^ z7fVvjdWpv~{P__?LtE%Ux0Tq$_R|`(y5|zFtWEL3H=*(5hiiM1J6p~7%G3brTsCWBAKkM?Bv?ifzIIG7nqajXC6n^ zX&EE3kcy~XRFEyCE_N>*#9v@nPZ+UHFj6ZKkAzzL;L(mGB5Vae`yu1n*Bpr7IS?Pk zU@YhHu1m~}#J3;G_dcQ1rHh?Bnl;vu3M8*75)q%E=B6FvU62UR?$ddV_;&$5?nM~D zX^5%Q5*1&8Yg`liFoOH3#TfR(ueiki+|2*&pYO6u=Mu~0XUC2wa;t!%(J0kG z$f+5zSbN_616GCe2L68}s&p@<(I|*jVb{b*xRV}3FdnS~&#y)xoeqNbF>wJwfkK~CcO z^vs?UTqlT`$WIhmjYnNn&^i)f*j*u8@N-kE5wWaYv)hVK?8{Z!TCg)%L#wE|KR`Tk zfyX&e7<=d5#`Iz%O@Q_OqQ&wbD>k{X7 zV|R_kZ&=Q`d4YWx!`W%F(|*D&zQT+wWF56)PnX~mLWm%34V7nHzujH;5T4Ome6?+4 zME0;x_HmaBxZ@G18g#H)vr>EFp)BNCH^}F^xrSU^k=@g?GT2A`l&@OsxLQ=4SK?p# zL0|($^O!_c+dnB^bHQKjFB@U7E8_Zt9ofCLyYkHTtdEvlT~q#T!S@dQrXy!TOCHVn zZ6j<*la#OKd~eA9sKlcT*hYCq!PfH0#dz52JYmF{wmOfGFI$i3E354#cJU5XQdfx^ z&$5DdPzAS+Rke||wS^hop7OOHgyjtD?F5g*DRX<7ySm=M(lpdYPrNaT;NJBvD?q{(`DY( z?il@)$4mCt16I;+;@O}4`-8jq10Lt6s?6>Y>t<~P^RKze*g85vd;gOehn}#|dTURK6E1-29 z*K6w**_vGT?~#y9c?d+Pe(u1&hXk(M?n&z4wf41S;L1`lr}n*CDRUafJ=vXIKQdCU z7%N+Q$*%FUXZaCl_)8vdQhsl1E4|@)KN*Qc#>MWnYhQz{H)M~AU5|*+7{9fzBP8XT zQuDc)xo^87F(3Of3-?!yyDZ8*+B+~GyVm})N1-TR#dwrp9Tw%U#d)4xNmq=!x1VdT z$O3$~^_X(&{w{{m> z`|*d@*yCi^CC0Eie(<~htAey&{gsEUg7u2mJ!3SUVU_-471~-{H+e*{+H8HQTdd^A zJjd4C`_1d)c*kU}!b(xrGO$%*%1B9!kjBXQv1+znVLWqSe|7>t*~(A$`uxlle`3Xb zi4{qtGg;h&&mDqaYU`qS z(do1GTF#2wl#9-l%6TFqFC6%3uxzqh6^&O~U+tWJ$xILq3jcV-3=D6iNrqq<2VhhldD7l++ zlp@Pd#j#R0d8Ber8cD@V2q^tvd7s0O`^p<(D&(Z*vYVi&H+(OXd#PizY+4|7Z_&O- zzOUXc-pT4ezQ6p>y#3TcS~ZlRUlXP>@srsi(+?ZHjY^CUHzX!+n^c^C@ctv|C%$DbJm65_>S#)-X zU7bm3N)M9f?nuv?fMW2XdIY@oEDpXHGCQtV4(nqB3 z7uGFkNl=Y|MeZN&Px3MGmRVF^rKR&1^LF>X_@lrvGm7Yw1tt&tu;% zf1UMZ;OC(q^!Ksv!ryOrKkw~?cm3XFeLv|#?N3)e#eEF;Q0QZe&mF%!{@&}`@t-4p zjsF$>=fR&{u~%Y0$1aN7n&?Zeo!lq+T4G>wY43=nQr^FP_kA;brM-3hbVq}`>F}3R zo2tXr&;Gyt`TXg9dHoaog{kl8>G%62Us>NNUo~HP?O)>R?B*;K>${?+l3--Q);tgz zp#0NS{3(r8^1>fHAO|R29i<#mj?0cRjt0sad5|N-8S4skg*h)fdOEVX3egMpoa?S9 z*7G3XHkwz_?(LqFfy;xA2Bis}9@-(SXK0>~iy;vqgM;S>Zws9t)-tS1Xur@yVN-)2 z2J{V#4n7z1E~HQJj-U}iRRcDAvb!g^_PZv!CwOAqlwtgQZKa1WPO8P7j4MpVpq%3%NR4YJ6cba8oq0}v{?TU ze-pKWe~<5^za{+e2$&e<)jVo*Un>7`P?9{_9rc&*mcOzVpiR>H&_!n}Ug=e|Z$_K9 z;X8IR!|6&}+PtmBY1ga(si*u(m}O4YZ>!~v5yA{f0t5RWzUn>wyDFIH1-E=k{tJb; zn`SKiV#iY*cE{=?b&`I83#P@NDN6l8D>xFTLEOr-LWjs6YI}o-@1sDD!eJ_80$Kbb zq(y^&fpt+#=NPAS7f2w%!5W*Eca$2lV4T|DT8uL zqIV}+DL3Iv|A*dQT5y*BAm?+4HvU+1$c%@HnT-%w7sWXJY^?2t_DSn&48S+=fWl2S z*AYPsGT&p7wwb?S`^Bd)#)rV4eS{{60XAu@sJBCB7Q@s|1`=fd&Ee&wG;t&B>|?+T-0(Ff$%qipE|@kB?@$_ zp@WJ%PW%O$l-HERz0xMpYh<9RDagttUxzsmiXRs#u0d1oEpglyA&5@HZ_TdyYNMX` zQvRPbT3m`6+je0eH6gX+tm195){W&4;#qMt^_llARStISWPYm|9x1!xbk1_rl@4(> ztP#sP9x9EcuVBfwgqmVDIUOob1?W%PQL2nq{bE#qmWlV2zDj**gqhRuS>2@%D2${R z#}d~L5dTxAI?hYOhzlHyS#fa-DrZ&E0GJC)&m#;q&wxw+hQs!^{8)IRN9o(G|3FFx zThGnnXo3_6spw(NGP_uD<}<4;T@uDx)y(F^0|%{QX0RTrmDM+z)$oLGpaq_QR(Kqz z)&ImMmXqwy8@&g%y9MXaL-Q8#=r@p&RMZ;27YC9#Uu&%~3_7hfl*WlWP}_e*g~4L; z0@>kdc#>_v`ijByTn=Mk2mal3u;~#-Ul=_FSZ`-hZy#oU(90VaU~E+vUGU!pb}HF>2Fq>y3zN1h9u8;i`?E#eUR)a%)7Y4AV2H-`JA+?5@8}+}zZFbW=<}H0a&ZwXD=|(t82m3jX zLybwy-!BvcKA`iHq)npYv!C{io+=j^i-C9|F`#bcL7b<9i{1vANHmi48+v1NBEFhM zZ@bHoZ# zfHWJ$!B==BH>8{LSJ|Un1!X%U9;fQ^sT?al1RuyD9Hb^x1iQ&C86ZSigvMwImzOGF zd-IA0k$kX)qBv@iov~cgOnbd}%_PAg*+|c8(2_b>kE&!UzK{!fV*b&W8wbp@bVwY_ zyl;dvc7r-%5MS#pc#P9R%?uy&9D4H|s3+Ay!6L{=4mW4wS57nMS^oopk2KDcDRt8$ zVmH`9O)~;aa}UVD1@j1egd*H^X{wnUl9lc(v_|>j3LaT7E3k-kL@Xt3MH|%C5UnX^ zmi|X3WRJB&{F}^VLAsW0#qWHg)RLaSbw44D0FhK!6Wj4)^5V6^h@l?qr?gDYEY=~z z{E(5#N6)EW*tL@4W%@dLm)Ir4 zP;V|TE~9@#Z4@xhNNMDFl=%l>5nIy3WflnCRWR|4AcN1byB_e4t7NAyQun*xxMFt2 zFYf@~vA^-o7{GYkNBN<&X%c%hvg)#K?t!nT$NxG38=1a;#t`t#qxh~9SfN)?mfC1` zAa-Tmb6tJS-NHn&(f44gbOIf!4U&~;e!**P1CH_0S|zN2XEw{4O~v#e zp|4n)Jp3_`n%U-T^erEW<=9=J*#7p6@dz?ZONoG5b87a0WuA-p^)U)3zl0281u-8v zZl6#^iWJj|0ccjV6XysK(o&G=;^00F@d*w|3BqHzG~2D)tnmS8x_&jTW8;^K`N2Ad z!`awH<@79K`B>g*7kbZI!4GS)r>YU#E(Hmk3ghMh*zY2;0y{ylhJ&iK1-tr)io^@6 z4VJPW@jzX)N-9}hL2C!WPt7UDQc<4=q$&&Cr9jkR7m8J>tFC99HAkbO{x9>JAAESN zSOKKX3r1O9h@|RyJJw*J0h2{g8O;{#q+f88T8iOVv4!+z@e9MyBAm(^tpFmJghd-H z+z{ST+c-k%E(XA#`$t+z&%XR3N`#z_Nj&cpifg*qOX@-#6$QG}Q>rC}NQXdiDiO=- zXw!y+qd%h(8vSdc?JDAPR@heZ6L-Xc!XI)kFU)ix4YBn4Y(j=^4jLtsK$kLufu94F zn`A9S%ljoeGdGn*e_*x`1TFo?Sc9z}XZEFL{Sarl2Oai_;M5@6AT|bA{X%y8Sz`|> zx6e_1Sx9u1lV~;)Hj_y%?j1b&s-U~8g^H}q+|1AxSQkeb|5l*ad#G^_xB8h|@uy~y z8EL@lw=gT2v9mVAqZ8QY58kags}?Ot#`zLsmm9lz)jY!37NCx!Ayxjd_$!S;V`GV^ zi;C0H!THFUl?Mde&3>#Z^d%ot3=POPTt#O%JZ@NSPq1K}P$=HV6|Mzo??v`y4?Lb1 z^k-R&7JL!n^S7u2d}E)dGUuYbwNkWkk$xx+KPF4!Kn?B)NPIU&f3Vrwx&s2?7ILw} z3xo5W!^({#hg60tzUTDY*k)7{pG!$}p$#-np)mX&{rq9@pRWoZSPLIfa2>;m+dQ*iZc$A-nkv!-a9hvG z{l)22H;seKvWV4s#evZ3dl}eqq(;SiR~0$9|^YPi;7(tE5T7 zR`a*9&^n4gdy)#603p3}7j8vQ^Cr2s>B3?ulbFvMM1JmvwV(dI+weg4TCX{uB|3e$ zjI>q^8p>0)sa3i5#mQNOe%m**j}*w8gO|3CfgnYzH%MjOCx-N z46Mk4Qc0a&=9xc;~I0c+lmDX!8k!#7AI}_sE4E zW&Je=;m8NO96Y%`wMJYfPEk6pZPHtu!|8PIE3JuU zd@?Iz2z7rE@LN8@C+JU4vnqIKS+LZXxYqmlJa4EYNsZ;0C-w#FOM}j40($oe@N!<^ z*=;s$>@X1_rpryJn3xZlMYH5QRVMs z_7whyACVO$pV#yQn$F1-Dk*qiug!W^Ci0fk(VMCW=3fmoh%SHd8;=s7sNh;ZVDoMQ zF-mLgWPLm_--tW#Ngi84DSLH~cuP2gPQ)tHXT1f3%ZjxwLR7E_6m%*(CJBseE8|Ii z1HWevY$J5l@m&fFFYs)0TP+xaZS1YG;6u&8_m+Wzjlv3+M@e|87|y=CPYg6v@W3@} zVJl|CiYksSHVQAyaA!^giO)F&Z@}&}_kkU?8GP>sh}jVQ+c9K+SHcBrj31GMGyM^m z(H{2SEilJdC>Ndre<=l?)CX;gFP0ztob_YcIp=T`MK6;H{00fR(f#?Qa*m$FhErb92(cK&3L^mbr_b3^CZOtJv3PWX8~L zwkmRV4COr9h=rMyk`qb*pPP>FJrT9=YnB1usx1ibRk%}`$+?Vxqwo@R@;1JGd1m@L zoH85B^bzrN;9 z>dh*dLL4%ZzXmeyH<_sf{yLNsi;S}Vvwd=5fO~_`o63?(Ia=|sZMMfxq ztko6P*G;k$8}I`Q;}_aWawhxr8=k;pVJ7N0GsPMxEZf(bo$TE@PWkERBL?9?ZefHy zL=c_mUh)aQrynPF2aw}P*3WbCDP1Gt%*)ikWneu0CVm(1QkFe3lP+Yh>C4cMh~P3d zWCUlxew2_NkqJ7?UQ^))G@>HmIIQIncti`Br%;};6V-`#oLW<1n%tvjOMdzUH(_Pg z;co}PXseTb%fML}CX6!|ljWX4T$vyL`=faP?Dj5r^?m$~taMZf6n%{JPV+ce&QR(^ zBRDf>q6)hkw#;ZEgQ;+L+^pybUiS&h!S$u+o?jyBvTGUtfv4FRUAGCmV{UftLongp z?1Mu1t0H)8VNS{6Fj9(GJBdl6sVi`jPj1a_n2S|)X#tl~@53SY2# zZjkGZ#;0wMC;o^}X$K25C%fb+8Rgu}_uoVpuZb^8qR6&|^}HYZm=6!65T|ZK=CmEC zd=XZ1U8)O9z{4)huDXLg8Gyf2MR<;%v6?*|&pzJD-Nu;hVSq*okFb)nnU4o#;@zz5 zzU+bnLMrYCrX=%Shl&E#%*&_`WZgYyr8i;)KET5aM3JQkHlrzcdMK8|&evUpecJ^q zR);*J6aRV~SggV6@ej&(4l;1-U?{{fqPOvpet~;effX`en9IHHhpVb0^p;v*-ZSJ zpPlpsOOwccXvYb+5^Q`qvylbeZ<|r*WbVtc+a>Pf51G=gFxc-fr`I`2XTi!|$Q>>w zcRiQ$t0bA`hV1hfcy))(q2SQVI0dFLKP9mU7P-jVoJVz7?N^9>vw+;ko7Z5vRfJzP zf{gMe{F0~SViQ2oH*kt)Vh>*8^Zq3hWAj~dfX0+$MlvxT?Z{exHV<5t>_f@DHEiAr=NV@5tDG z;EYLPhuve}T}jDi=`e3Q@jlf!E9l_|wb^PPO{Pv#t2rqYUiZ@(^ znVU+EdI&zjVNS>UY&e>K)>PR4YG^%ImUKc3lHUYDJ54S^jaq~!PL>BG9)MBdjhpAnNT0c#k6 zHjZ(A$x1rME_Y*%qV3&|C2Wm?);dOi9oMys9)*ec8m)=K@{?N?S#>4IK;CEfO<=Ab zvm-MQ4c@2o&JnC&52C`STv0CU!U2@##tP%n8uByCFX*v$m!0+qE1HJP@f$4ozt|{~ zOvfD7Q99W9CEx&U$EK~tgNerTXilUsozHy8xqg`UeL%e3nJBpvpZA?vt;+1q<%+74 zVXe&?OXPZYVxu$RN!G-w&m;HWgN%7gY-xY^><;{(Pgpd+Z5w&6lRJBa2eOBqdWqe( zoRzUW#SRT;312<{<`cLS@G& zBIlLXzgXP5pb%FY@uQ?M0Tz{`JQg^w}{ z=h(6LnUh8AwygLppJ7t;L(_CAv)!AW*M@bL8V{}qG2?rz(RgO&0C&BVbF~kiKz~;6 z24=<2Zv#?Li*lUXBk`+hq<8>bxZh{Q3mZ96_cNy_S&MI2n`L3p*u5tsSoIB=ms5P= zK-S>}PM9Ek*Q;DzK`eD4c2W$U<9FuvA6{3P)wq+W<}tQ)DmLvMh-(Ap`8V&8mZ)|$ z^FEVRn1N624o^!U4sdYCc{!g(jB4P2n46HA2lyDmYTd6bpUY+Q^*n+&V1|E`G%!!tlA*O|k-2=_Kt3oYtF`TGe ztWhUk_X{GP)A-#vu=KVnV_x>seMbBPd+sTFB8d3xJgdA8V_S!Nt;Og!XP5m!V>XnY zXOW;gGuUxgSrq~Z%~7o0cgFrAJ8dE-WFo6QH|N%9cD2gbon);PWH0n!b*R|428=)! z;>7@F`X~Rt$^LB4h>wCV7%uoY$iQ?@DU=>lrXR1Ydz+JMd3ePf!t?^FUbIR|) zTC~7dy37@*SibkHgT8n@T{w+T^1A1Y*+9;vN!ZTxcrCTrx%Kf^$Iy)=l55M$Z2b>5 z)(eoC)kL{nn4_9Jhd2mp-A$0Q)_S zO2)?Q(IZ&ZE1V2l!6y>UOLz#Sc|{IB)ro!j4^OB!=h}T%-VJJQ@-Yh0_%?l*fhypJ zy}5=+)^SNzyM>?sjdd}Cy?mKW%n729N{pp_me?xaw~1=bvpO2#LoLH*%pn$7$!w<= zPB5NpS*tI(|M$d}TRGE~alIXg8Eq}fzKrxJZ1HeV6t6iC@2V(KViM0u#%4caPG@s3 zHrHhtBS|GA=fX2aJ~f{`kWVnN_qEw0WrtqDGB{QF6@T_rI=@Oh$ zM;Pb%tk2@uHk9RwZzqCVo*?@e$E+;jlhWZGxyd2C1NWVS-}8bmJ0{BlUb>n2S;Ra% z!!BOu8Uh)UOCVi;@Lzwk*9>;bB1YfGNwJ-~S-{oq;**Xt&MWc3GScfOSe%RX8OR)l zvs3Eg8UE(vTgVuF!)8B*oB13oe4jP_A68ai6+ffSp)BV@eMV*hpD_`<=_A)Vj+OWu zeBu)v*nMUsE50FD_M08FS!jm-A@#DHY_G`Gt>dK3Ppp`ZPutI!gko10a2^ZbcyI8P zE8}I=WCpL1Ng9La`5AtzgZ+?1oRU>s&K_6rLvC?LPOhXfUe-|jtzN9~%kTz!z@b{i z>9LDd@rvCU$U2+I9Aw9y?niU!CZE)mwVQ|q9fQ|43|t`|d`w_nI>_fW!(xqu1D_pT zY&-U|_4(VeV;?iqfiPLtgZiXlHPi+%*@F)2CcfuozpCU63#RP!Vt9e`7{7;>-J5kg z(OD1v>a!NJt_tA2Ze(3mCxRQoRo`F*P5_Gu29 z-T1hduu6YpSB7vV7H1zfAr5H3_sMu7aoCmNoO&181GZkigZ;FI5q?H3QE^^D_c}&( zICii&d7>p`?B22dYO^BlGOKfm=`%3zJs6K(tmMkn4mN^SeFZC?nrQBXIULM=7nY$7 zUk)(8izv&Ehw)z-Yg~#epNMC55(arsys$FtrD}L*w@}n=OFyYp;t}?Elx@O#3~kHm+2#u?L)Yc7ZX;wKin zg2$1I{df;tt}>bKoZ?1tq_j&KE@@~ybz^tvLP4(oC?1$eq)~}An4QY4b*%S2yvGs7 z!NZ;3PGNnA{Xd%S0?x{6`x`hjv~)|C5-KQ&ov4UnA=bsXc6)8FUhAq?%&THuy8|0+ z0UH$wK>-mEknV1Vnc@BZ&ir4_XP7hRJkPWDUcJ^{Yi(6?^8S0X zX~vt{2>wpWF^^wi{XF`62v2-HN!yinY$rGJSrl89O?@A_9O}Nk@#S{<=O7;57x?sS z7}%ZMY@*WoUf#mlc(wz6+nrPxW#opio|8VGBKh`a6W7%>*hz;p#DDFz{BHf9xppo4 zu)WpoV>Lx0CaYP-ABpgsichYjqs}sq+gSr2g31~c@-v&hroFWR5-vfti~)jJY*-)DCJ z!+WRWx*ymf4;uM=uq!3WW|5qS$>Q%qNBu@CrIw@(d6F|0R+`tBWZ89|yC15qZ?q4< zbr~z-TT-(Rinx*n+=|{WBmw8Z@fqxxOX=4$N%2awD7((DFJJcM`_ii1n_5l6xBzk<2 zC-Wpvy%V@SQ|W6G;~BI1jGQ`=OgRH&>!7$9bX51Et66H3VCE#$G8|oQ^z7qF!FcQE zil!d|@<*_dmhf1vr_rA!>z`q1*vH`eCyTi~3SH#$>r_M>4H`w}_#Lgk96i)${q}{S zJ3#FhqweoX3&rYY)9pLZN7HyPgV>LE!^ar+t{{c$q1q>X@~Hox=ePW2PN}507TVd&~>JoYOo^|9xFZXT_9-h*-T2XyR4lDjgyGiTin$_@#do$s1qpl}yWu^2Cu zu%OShrWfSOf99(D?Lb`M{r)I^Ho2w89qRbhljev}yaqN)(fv7ec#PqD&&ysZ0h4k{fVb(Wh*R zv8;j)@Lipr$>}gTCr%e?7&rj!H(iUkJ5**H*Q5)4}tKl?DUUmpj&Y5P`lE*`}RRLz#uxRp1r8n+rO|&{k;?Xs;iHB zSFO__Wg|+vI`4j1Y0okzamgf@RNjsbK13b)GA9CEq*ifd@k^C^RynRp*DANEy?vv~ zkSaG;`KZduDzmCQSEam4+p51*x!(z2E1hWneC5Aa-o5f%Sux)_-|h^VBS-5&@L3@; zu$<*wqW9O$Iw`MFb3ETkMgMX>#y?f_bt!AF+kDlsx@F(%>UeeOUV3|UD!a67S!tPb zp8hO7)I9f<|GJOr@cHu8_Ac8~)mC#Ae#ey!DVyY6r)_18=@CL z&+(|Ar2%##L0=_1t|wKhq0Iy6kBw}qx&BjP#lAfL1}Y~H;rYB{FQ>dq@V6#LrjI7K1B2QS`c}E*JT@gluR|jt=E- zALYuqq~!Br76bjBpmWNFq~#-Qu4N?UWY+s{zPS)w4q(d-*DIoD`DwC9_ABqKFaA>b zAS=sNxq-)G{-x?=`u|z_;$P-?A00N1wjRSGv2P>Fyu{CIc0Kx*Z!G@`%#I~3=9=*h zVh4>;*CQ<7rL<$W?Muo}gOTUy+%@)uDi_^r?RV;c@K~iI?N2;}t}aAh6O8jBS;$Wo zNj{9s*uhLkk~0 zTC{>zdrwBqFjV1eT2Y}h+5Y#y)+_X06Y=K@==Yi|kTv2&UCExS=&qxSeun`y(P;1Z zO513+64vE~{FMcT6NO$E4|o$MZUg=ASP?J5RSQz!W*Yt&ae#x_q`!FX*LJGT!Xx|8 zTfeif2BNv9=D&yh(m`^82H0obUOtF)&z{>nQIS(=)0Q~3F^b&}6oy%u>>GCQRFM1< zjOC`;r*t|7X@3$)G0wi|J@_*gVtmBVz?CBKE9vZ8$kzodr;hx(YwgLrgu=R#r{}># zm7>j{RTtc=id8=Z$0yiBx{F0Oi1fY@SHAAKFOzt6NR8(}Y!fR+UIvLe)=XtB`uhR7 zNXPOW_ZPh#;@+NiUfuw;(YSN4y@#h*3CD@u?~ATJgVB#zR^M39{xsD;$k&uKuBSqVii5V3k90%^0Jt=NI)gyY`hnV-J2tx74cSR0BHrNi;TEv~quv;ze5c zV{)K|e4U$EfF4ylFW&AXw)YGOT)>9tM7CW{YoEpD?25lz z$z1A%cDsqM9!)wvh+cc6!&#{50ebu)E3fXp8*#z|q~PiBm3`Rb(c+D;_cwm+Z1S%y zOZrv&Dt+PMG*S1?!vyEl3`7JZxnhJDTVN*MbR zHUEb<-3{*~vS zB9rwwwErF|*wY;Poi|QaF?(CGL60(zx6TC^`u!Msp~$&dDIk=dlu$*AKo_`Hc{KN4gQfzO6UDra-Oiy!Yp`G?TD*O~JtGzkn!04(!=?`3F~shWBCB z=iK#fVDJsP@6TRO_RBTaIR?B-+*b<(C!*n=tbq6v?NI6YXk!lTn>y=eASo*pF6ZF6 z`*Gj_?2>(=`B|qYk#k3oA-DVNC6>Yr-uu}_RoKgyh(vU>OEDM*uJC%=C+lTTRC12P zWo*jBjq?b7IEU7{T@1%*7&!Vbxc-V9d!y8U0&?WeA*Ifv)@FWPNhW&n8n|CD{(fC$G!1 zd5;FHjPf6LO}Zrfh(GUU%XJ{9zhY&~v64O6J41YXBpPTyhCS<^4&pOvv#qU!#FO!k zX4bR6-(qLR_xO@mb|M;DPUa~np01EJqzvor*^$RD(g<8 z4P+;j`?RH%{=o_##IySi-CRL?TmxG}*n5xD5qsE;=x4m>-BeLeBgOy4N-qPS0j#&3 zXx$t9Ka#K9QoQ2@Qsi%>$OKUPxxi~5Th)oI_3wF``;Z+A*$P9^#OGGp1r^>;hd#{q z{|DLrU!KlAuDKAu-VF2oL?Ny)*B+v8hq(F*_=q2QEM0pS%AaPHtx;(SD(X&)q^m_I zyKiU1drfmc*$SRQH68t&L^tk^wi~f0?#CyoZr?-1cO%}fO3p5}T8w>Js303VXLQDCbn-JyFuRH0rVD`2>t#00-ICOFh5^Al(xd2cxBRe1H>- zFwoj>gTt5DLpz|fa$0CGJY9|Nda|=8fXG#(*8wC=P77`h&J$Ui_wtl->T_Kdbp!TM zdV4;CCQfDb%oo`kVa>0RtY4tjHY8vpa6X%?+SM}-$6GhT(|?R|jOg~?dGC9`<^&PW zQqX?Ko%zm5Hf(^WeE$#D&@dRd89p|+rX4?OnNb$8*axslej;)I>t__Kje^^sNa6JJ zxSe&r##85@`j_zWJw`nTUgWF7#MAWKKhf^B)|S`FX0{$pCad@yu=_WU>`Kph(E6?h zwU#Q*hZl8l+QgLN--^qNpDF&E^R7;3;XKY#8gJk9!1C?9m4nLWJGbQ>$DqBj?d@%! zZX4}{qldSZl$=x2p=8X}|r&YO{AJ+F@XgKdUdQ`AO}fTFrN;QoT>{FdfY% zRi5UYz3DnqeP2{kxpw9M(2l#RAX{9%sC0n((=A(uZQXI}SDWA3{Lf8oHZ|LP_2%og zzUkcC2HURMcEz@HO7AYczI3Aw=6e?ZRc&33>O0(9^QIl9*E*|K=UPK+jH)`Q%JJf! z^NSva>tr9TR2}zl<$qNkqHop3MRUOH01nJb3fi zErYjCFB#>;u(P-QRQg!?dHO01Du1*5uk!E7;(K+zY30(X+h%RMux#)0 z+GJ$IqP3O3t=ghmhiZRR`NRnkOR6k(qVN^PN9zyxQPIi8>-DbtfIT`^~zpUwbr1#x%#}#{LV@udr!;I9j*Ug&Q{n^ zp7>949Fik3lJq)59I+L+PR7&8cl(&VGoa|1q61W@47Crqn$}pwPJf!W-jHwkSkd63 zf9S5T$sWdA=X8a(@osKqhaZAghvTF#&GSoAvpPw11)KI2 zQvGID!hL>*lNJlf(8XX5wHZ0lQbS#KWJY8i1iu?;UL>5lVvwBjZ!xS5RZf$xXg z{khIeZjimSSRUeLI_?hFy+~TTNwU08-nJ(NAE$r*MH^jdE(`fSpNfyJAaPsMJ4-~P zuAmhMuwTyev=?Z~UZm7UQg;tJ`+GX!QnI6&C*Ml?rY}qK=k^yFdegpJZCNru@KYY+ z5fqWK4}033blx{`{)TS`vqUa6lkbiA3JYd}SaGsg(%}mW} zel?8#NFr?qsbuiK4$nE$cNplt%rbhNjr65;l#{O8L0~)mUu3RZc{+)jw&c++GMfo( z{AMi0d*yFTK|jG?Pxirn{(nzQ`!Kq0n)R=BM~ zThl93je0++-jj6gkX=7lj+S`=NmM*s%xb9!>>Q0(@$hWKY?bKtGBq(9@sAUH9d6BN6|U^w+S8H33Pu& z^%sNE^Dy#}*MVYVKdTLmCDxE_k-gS)coT!+?JqR2H?3Ni^*&v6WxD6oVY#+NO?%MV zW6}2GX!l4@9^jfINQH|;&F^F{{7$2O!Q#3E4ZVw_Dv9b{O;0UFzcoSUFc#m3pw`mU zJJI_uy7mHg$V_m22whCXOX(lIhg`i2dCS=qnF8K3WvRX{_VtL7wu4==oJ-6#Ue77u zmTa&gXs^2+)CTOgSILm|a&=C^4^<0MwLz|)Yvt#Iz+t3F;)69r%f9sNFU31$Q*n~|{{ZsVz*@ZQ{i?Ubv z{$tRr&-T6uEe?R+SJ{l~a7`)=rW)x$kUh%iZ<61yz}0B8c$POYK+N_vuuM;_&p|CV z$JZ!aWS@K-A>LHo++M~L6Ul&~uzCy3_wlTM!RjH_UYEokZG?B&y6Irw0Yv|fU$$Gv zcjVSK(secd>_PfnN;0JmsVv#Z#}E6 zZ?xx4BJX0ME<&|>P2i05v6=$M<2~^iaQF>{w4ejxyYLR(GZf{|CIc6V$LvAo4JK#z zW&2MDi3uoR3M@=F<`HIbBd+LgzvX?9*vL~zOnjbfk@%C>gV8TW7;2=Nc<`D+yrnUD z9-jOdO<#)JW|+@Be6SwuPXwjASln-;^;c1P3)H^^y>1clKZz{p0z;qRr}<#l6#W;e zyV}LNPJ!Kx{<;wK*3xw^;gfVP>uJ50!^T)R_|wz&2eGXC5Hxs=`Sr2lyYbHZo>qc} zhtX+0;NlgOza0N29^Dqi-{BK&C6mt~x!aRk$)rqH`xZ9n-LCp#yNYH~bc=UinEe{h z*`bgRvy!ek0f#0obT5DTDc}FZ9w{fsW|Q9gv9O=P%RRtjPC?gnr+Gf5-wt5kr%V0` z)>%&m(9a+|5xxK6y6t$q1?s+?ei(xC9|q^mMx4(7Zce6NBBmFMwFQ5!P9ghj2Ap;U zzk^U^XZm};B^!JS!cv`<{5qDJT4k{ z18I8=KKah?ca8TQulLl#c>DA2f3iMDqruz+w$84ii+jOaKN6^enWl@>`=ryiFf|c< z^)i#g@L(q+zAeVPjhrdvm8ANwiFJ1{--A5$b^Ph1aWwv&m8=5cIwa9ysP8}S%&u6v zqs?(oso(89^&;zxb>QR|E1l$;U(Ge1RrFYIGj3&$MREn}iT6BXm6J))ZtiM>F1Ew= z&mb^`1v9b`-L7mc1IUVgu-w)>en98x*jJle`^|iFia;th+K4Z|35&CE_lusoiVbnS zx$f!S&G@j?lN*sL^Sn=1_K|2iIBsRGub}$aIV(YKIVkOo^Dd{wde|fS(ma;aC0kKc z3BGm`i}|1KrkUUOk%Yp=Z|0k_w?ONV{A2Aaizi55E^Lj+dXhhU7B+nh|ji?@2#?w zcHKbQu9H>M9Obn|Ti@|08SJFpJRDxbT#g|#9`M}dDDq=4uZ@;!fx%?=my_{V!D)Kj zjfbxd#+Zo?=D4mgemw^a(!b(U-!8R+oIyF$%o>VQT!C_nSTeu5?@d$_`7+*XM;uZP zZ*x7NmKlG~16~aBIoDyMtgj8C2F*aYp%~Is^uCn5S%@Ddx}pkRuj0DH%`w??k9c-D z2zG;wC571D-T0^vxV?vq$FYc4p_TDgQic8b5Q%lGS!V}t3B6iI)=jaJ`eu6x=-!SR zx|wn0O=zSF-Lb^;oBR9%n5k*bpX0ySUZv*!1CH7%B6J`r(i9(jXLVCZrAZ+05$aDz z!Ap&Dx_HDU((EIWdNFUPrgiGb5BiB~UX5eMkhp4nN#{+jcpN2-rET^`*{9>v+Hh6o z^ZDrOFHf22)d`<;H|{&0dn*_(qm6o^fxxUL+wU5ZbQzrz`~MGk+m5D3(M+wt?p7;3 zoNY4CO4G@4xRKvA;+sY|m`u9}Ma>bjjIGnol{<>ZW%r}Cxt;*y_2}L|Tz?cz*wI=> ziEHfWx(iU!E_{V=JarbjOaI6fsBsfaABjT$=DCgN$Z2qz{IqfAJQBz51fyqz;AW$I zVvQR_-m03xDC1W`BR%m?BeWa)Vg|e{_Gx+^HgR8`T-m5qXxLRGU`==^hX1Xu`O&(1 z(3aPlr>bC2YD)U-i!-OA#Xnp-kiNx>o5`A1_@fj=)|zECSnlF^MQA?!Jl~9p(0N0zU#xs3-r60- zb#c#JP%C3KR!7C_JbMu;TS`uDGm|1xJ9(j7Kz%w2OtAMw zSJ`^9hP77Hp)lTZP%1Z{b!MFXsJfy->BqT)PZt<9knZzNRa;jNH;+Bc zZ%@yk;feG8)dF2rB{@>hlAf(OF=s83x`Iz5GJ2EscLDc?zRflDt+}$Rq=2kER=K zJ%5#=&h)VfE{lD$ndRHUeNAw9Wm=-#SWCfW8mKfv7Xw(kU0m0mBszvJ?c_PrKxmUI zi%Hl&@pTdWMi*`YtyP|11`o<7$hX<7s;Ok@+o<$G?+9xpVAEg6S`tYNP7bzsS9-jaX)O>5!Y)$PeZ?-#0%QCH_XnT0}#QhQU8vxy(8n zf^o4Y{S00k;j1<-JrL&hptqW%t*Cu(OW#n$MaU#_Rl)gnJf_AIJZ{ zTiJYk+?XVq2CIw6kZ727-p3;T0R2~Vy`2bRf5QCFblI1_Q|*jrwz+;fh;&Dl^YCXo zusj5R96=HvK}NMB$-0h7poLgGWVFfs+>vKz- z*b`n+gU-+0^YO!?yl+uR(92B-AhUR z?(Bikwv$Dzw!6DZJvlwx)4zO2V^#EbUSf7j(O-L4?OWiavF7>*4K>%wez$@NaG4B; zU%_h>XvHT@WNxap$2ZD)YP++(_a(GLd(tCuup*XBp6h3hnbqISs;^n@ zVO|IDCl9xx&YrZpzxIN;yL z_bwnwYNDo4T(V#Lo8?vb=pxq6b)>_ih5e~}#24NsF@}rceeB(Pa$>$!Su%_qd4}(P zKM(#s-r;Q`OgFjr9M3tz`uFy;hn1!8cqfgfY=Wy{A%)VRr z(M5|N^%8k846Z*B`Ft5)-UHkJf!FiJ>CW?WBfmK34%{e)emh!t*}V_@>qarEL16J5 zjKAc*7k%>*IrSYYe7OHdS@|#Yd3tv*gXe9u&ki6Q`CJoryQ03HAkh&e_kgPdtl=Q9 zBMaQr7aqIA+R;3>(_!&MxIEN%eG9L{+_{H)_Vn6=blM5UBrblT>yBY(9fhth@H*Ek z_nyc;N+0)LMvAAH7jT_>AiS-{tAF9k zx%hR0RsKx2P9lkhvPB;f-MIyI{p zb)HTdT!Ajn^3-GD;9$_&72P($Ev@N`ba1PMgLcA6J#cDQ-{qW##&{~HGjs&y=I~sN zc1&0LKS|edWGI=ap%d3k`S5+lf%T7iod9@wo5w?}WbGnDbfU--j2nxckHYUiKDuvjf{nu2?UW zv9o=qE>@b(k}a(^RdsvGIoYf5yRUWYc52=Ckg?Cf-Y58J9G$R$)XXWN(LraiE*`V) z$#S5Ysu9^)m1j-a!LU<$P#Gv9{th#k)TWL@r^w+>F|WfZNCRBR=!)8T9u*7Xp+hW`gKSc42&yYOLBK^56jUf4vnw%WC@v8gGE!qhmMY(De8D2saHi{zqhba!=}j za8D~Z97c|}%0zv-SV^72N@8J_vgoVeo?3Xjoo{+t>He-gjO0GDpyzfg@K*z)Y%_<- zuI+@*Q~h`#iFP>+mNP<*BG+=l$lu-7+dOwAw|2*E$suX)Cwn;if@Uh=dwN243gg@4 zWQI2^Sm1?i)`OGf)u1x;}ws=WY@|D&KAuS3B%6=?V|df`1(H3F4=32LLkKC!~N zcxEAfTFXk`!5o^A934RLK&w2C1kV{LiN^c`My?kzxX$ZxuZuzDVzTi}R}3szFsVN| z17yx+2b@v3FDI!S=XJ6xPA$An^jGY(9vBa07b3N_Qbxs>euI)}%8LDdMuXr+9Win4o-H}sDLgm%}PlCrn z-4A4Xp_R@kEc~3i>Urgylvb!Fu*!2g7x;Y_SB18^7VgNYAEC+C;F>+lcE;TmoVyo3 zZR_ux_Lbd(c%P-#kb2~eysmh`>#Z_pa;&q4MAhbj_AGoq3oorGKz?2U7FlEVs8W-$ z08SFuiZ>oeM1HI)Tovf8^H&M`D^%$4oN%Jsokx{Nio z{uUsU9vqFl8XBiX;nlc6ak<0ckN)Lp>9iL(<++J+Cf_Qjoh-yZvvJWP_|8s2Z0Vd$ z5|{*j75^{6YcmV{w%q)J@hV14K3ZMtOq`{@@z)lhmh((nc3k!Jq6V~RN z$2OlV0;^E;Hokk}f}z|N{;vu~b&Z;HRC2ad=(H_b+LOGCW=h1bGkLcsm?lcz#Z|>< zD<=e1b!RKTYr|wR`WpJAqo?L%p8D{RI7EpjmyqHayM-%C%|6&^Eoq znCH4&5pOFoh8o^iFU&Y{B0Rs&yc%0`ksSWsX2WHPDv727)d8^h6fqT-7RS|XfL4qx>_tCEoubz1>yk=BU=wK0>% zu-^t%wDmqxs+(CRnvt$iRpG3&yCdu3KesUd*sU!J_wDSO$g1St>}#Dpt-dEnH1vdK zUUl3X%80DX30$#>v+J63$|7Uqc~$Ym$d66C#xItAAO-yhL9IfY(uk^fSw9W?4*oONm8#AX%MXDrjSlig4&l(`n z(%qGC+ZuP*KxZpJW+zz7-cQA;MZdsKvVjx9o#x#f^y;)t_Ih%VSEHlUqDG#?CRlBL zE69r`p1TyCFEHSgR1b-%~MM~b(z-|k&{aJt&tI90X0QEV+-q>Bo;W!Rcp*Ydy*xd6Nw(l zwn{WGl)e?m)-}&YxZosKN-9~~p_jd2Iv!9Wr@Mg1;Z_uxzr~&5+nnXR#@{)`EAUx~ zXD8A4iIf?&!ZEcaabB;Mj7u5FjoQXEO5FH4o%`VWxa!<>C z<3@9j4$Zk%Ih!l{sXK#tWJtI_GPyFSRP#x?vRz3|B!(8LTOWNcKw;zIDH6I7$h2gk z9*om+CVEEL3bV=hn=67ikVJ3hiHUQ!g104bJ_4;A$=f-MmKtkz(Sy~@Hs|(@LyfVj zelE~adrxg@ozd~r3bC`Ce3w0l9`r>blBFVLyTN=a9I|hH0&k>0IIRVdQnI*%Z@y%S z&4IDGM*9IQHjAQX=O`zoH4s7m0&TA|-YPJy0Z%QgsEuzn`y_iZNKh7J~IJo^vo9WQX{Bt1p7M*h8K$5 zKFT*fTkoguNXj{+{cw0Y7EERpA`;_ZrAYx>W$xXUg&o9(jdtvwZtEJn2DTHd!R+KDk$Ku`j04UborJ{aOCh;i$J1AFKw4 zJ}7l(GHps>WkqB`Uo^iA{=P8(bnmNgFZDHgcdQzSd(q!-s$j11lo$CaP3*+o!dn_< zfBeJ(T_#s$v7O#i3sP*3=*(;AV1OC4#PJ`S&wJL=nDo^-T?W8Z9{81D_6Yy?137}1 zm`zQ)tLKVMjcMfubI~XnzOQfhe15iuZ+6CyG{jz4c7ky zUf2y(YuJgu!j41tLfmzCu<9$`G7>gtdBTIDtY4bx;davgBZAWoL)2u=Cqi_E5yy}w1H^(~7x%go z{|!O!6Yx}jvaOBWt!^TZ>3Py$Tb2;G(An_#=G)!`=Y9;q*NJ6-QB7_M^Sov$zDi5 zuvDkiW!a75)pqj9lV@SvRI=B2F z%5XKD^b>)(9&dam7I+q|pB_R(RHxi-?f<}s)A3#hBOGr|ZB*y%ZQki|c#f>iGim0A zvIQ5BT8WqaiApcGj-AEC&akfOs-=!+TfXlZFR6As8!w$;KYJL8Oyx=XW>;4w-4=DN z#X%iK-us}@MrJyT=2%0DPs91og1}}Rm8!2*Ak_m$y+-4FBr10teYLNAvB%hK$&N`B zv7T!39-<-fJsPV{JC4oJ97Q((qY~7gctRyG+RbR$uc@vc{YLQq0@W7j5s>_+j%NQR z9TNIZK2@;_>*Gn+dNkrj)!h5ytuosEPcw<%H`JQasl7dl*xSm+qOHVZCW8JH*|Ph> zc@=x;XthMu)}oC+Kzu%)n(B9|&i}% zRv9_mfu`yKuXmEACwiBi_A2n3+^sU2INiSDQ^p@%M_VKso!!6q1XVn1NT)3{xln1}SufdFGVm=CGX;cITN{#Tlrxz59#&kIy;R&tl(w?kUN#T4S`iu=Z_X z$0$8D|6mK

7Bm1N%qu2Y0X!pZuKRxI7(LW6k|Re^+Kz)v=0}DC!58nr7{5Nr5IH zU71wN4na;~Zf?CVlak4+x}S79iM_BVZu+Re&pDMf_WFER7NLw}Zfpgy=j|xu1e9Um zGT*p0KxsPMOozQw;kT7hTH~Q`_CR!>Jd4F_t5{OW&n>mSL|RkV8~-8E<*~+y{~Acd zFK$9F#+QjlSCRjc_)Zu4BYhB0H%bHELt+^EH>0?l!62UbG`Jn^HNw5I3~PIOG9zkw z-geKeYCW-QfAal0Gv5=o&jQuk(A(u`DLr4mB(JX(sFhr)bZe&Y?Ij8ZM~|o z24)qk%O3tpoFe%NvID#){yk0%b)a`kjP^MRn5g%7dLh}pKhYlPJHH)wBm=O- zTIS-aBCv`@mX3FAL2`G`%5HcOsk>DUK`ZbIH~#5qlS%v6&F;Ts;b-O--?5sz5``66PAEIF zY;UIlH7Tp_RZ{wU>1(C8ls;H`N9m2Fca}a@I=A$&vU{ACS5qgkd&;LeDJS(Po5kPu zHs@ig!RqS(aGa|7JBz+5np;%2c)#Lficc%PRE6P3#gmJt7yniKt4hP!#q*1&7LP1` zxA^7a7mFV#zNz?v;**Md6*n)gT)akCoNtR>*0<;)`*FwU^0jACI~Dn>bUB&GivN<` z@jQ+GP+=G8f2tGC1Gj_0a!0T)$4#?A+?hgb(1%zBC)hz-t2^wU`fLr+`TjcnqtDd! z$?0L`{d6wtUEaqTZr7@jzql16NX1A?Gh5hLAnJV%+>S(#H ze6pu4FW*vLtYc+uJ9BMx^z6x&+EqnVc5JV;r*Scz`6G%-hDJq2+Oep(4VZVONgiNT z>L#U99s2fgUV`@Gvml6_@mQ^^1S*mL_gpX_n+FgaFV1fq zYa&6}k(di}lWD~&;CMYqw7tB6BOSoAK~?e&Z&3k<+{B5M7C)xIKE^sMAA# zzD?>cCV^ac_Rz%zIQ1aukA$L+MR4 zILPzQ))VtSlw2yyIhDw>dEmFPa*Dw&xmj~ro%`X84fJxfbTa5~v&x;U<_R=%4qhuK zciv+M)>jR27(a7Hp)&Ou{Y;nY$$q2##S)Nu5f9gQUwyrI4(B=khkbfAje8gW<6O0b zoqb-Hm$VVsHt$Y_=|A)J-U}5|W1DDV! zlj-eGLGB&)#R*y_;vn}H zxaL;(4M*R#tfjA+T#PSn0O4yvstZp3T4e4S9G2X$t4Qu2&_rrUuCxA!$hZ5<{kQ^; z#V&ahHDrf=gm=lA8c(AZTS*o7L@qu{E1ZPe&t-2Gsc3q}Jl|t=Bpd5C{JW4vo}8J) zU31;3uIotZ#y-i8N$QA)fWx~yz8}e@?`ZvouFn}5XS)6ZusMf~G~W!IVCwZSncoLI z?ziqgQ0^ACbngNTPe;#^tgZ-;${GVR`@^gk2tRvNOB3V3}2YLSQ8zXgp+11P$J4f1?zY3lz z_J|H4m6y5lZg9ENx-Y=r7ompF-9Ofob|QzIylAW*R(^$5{DlfqB{IU3pGIvDu>{AE zBooQ=_SRxKT+fK%{p$a_ ztZOrFnh5q&!0IY%pGp5E|Fn&nU2aBy>0>iXH04S-A7V}C@Pa;JEvB-5ur*(Z{$971 z8E7xPgHHgNK3>_W+nrAM!m6(z@p=`a6t(oRP1J523$`)2cLIKYnRG9cKQ#ib)5*9O z?2Ul2&ZOkuQR|f=a;F#ag{JYGl5Li(>tk_UOP*dM|8K($!$Ii^lIIDM_$cq*0P86< z=K*GXA_zQb?#ZmV)EGP9h;&&QFJ?J_|M0b|lUaF(_gQ~-pr-L}s*&Og@$w|RP(n7m zN0Z(FkDs~zLOCco>vtp{^*i5}f?+KB_?b2EQFjoW0!yjZi{G*%m|TSq4k~cXDR@6o zsh!YYx&s{|E^#HQdX4P8&x{Wu&rk79Td}0^td`gi+574WVyD3RxirN)AT~kf*$?F3 z-K6#;E8GnaAMZ&=7I?Te>>p5wI-KdAQ$XPs_dV{qoKutf!Xh5wLim47mfY<)>oG96 z5#_X`O)BE!9n58CQlXt#`a?M513YpSn_*`h^@^*H*X7|>9QmIDUp_*+J_i>+(QF@* zsAJ9kBTr3dw`WM7Q{*S^j{;7F*T+ys;{5aQL`P#JbHho%FxyHj?i&)P0nhp!&!|sJ zFK|`%RpTW$B`4a#d`EEG!y0>n)J4|QoSj%CVl>G;Io0RWg6&-Xe^l@{YrYB9CvWU_ zQe_|;F8!U;jr|%=IM^pwx#B`P<==kJ1?%$)zSGgZO|uA#v z?5t18r)21*?xzS{W~X~288y>vl7%yljdc^g&F<%Gbnl!(oT|1NPY3T$SzmMT?e|`v zyCXRXt4RNvq(^FK=HmOYB+^Hq`)I*)`zH(JWwbXO-#!OgUwLk*HaYK&P|GKtGnXCs zC#qRRGLP`xMxQJKAt74zH| zrJjM-Qm6J9og4XiBhA+eKBBw(!@{Yqx!9-9!$aQ(!Ra1G2?Z75gi}y|V^BSdebLbO z)ye7XOZ{ct6Txo2v2GgUpc|1K6}vmh1^>e<>-yGp+eBI086nv}vASo1)U&8FeNwZV z&=BtLu%?TwdOr~QyQ??D#y2QD@y8+HKh&tx+`T(mjK6fGwMO^V#YL;&=p9$QTfoU5 z_&DdgEG94J7-ItrjfSbl?usvwUE`D7c_18)CO=Y9b|Z<_UyS`OJa!*Wn~BDju=2X$ z_vGL81LL(mO-AMW_$;T$K4Nxb!829%^<0(Qs>98HXMeZz^z%{k{$2;5^Hbq}AJoto zw7c*jQ{9pJl2zuI+WGV?IKQAp`nxu#?eqcthBQHa)>3ktQX7?8faI?vYi38k8-jXj zq-v6dok_dn%^)XF611Fg;GTGmO#J!brJynQJn)YJ1fIi@Zx_ zRz;3sGQ^TMkld4GOT=DJmPn$~zk4Mbn`mRQDe_7cTXuN5oBbXn(%#;smt!(4lZTKj zn2lzdthr>C#EXw7z0G~88_3RcQ!r{+m`MY7Rr6_Tm{W!OC!8i$`VFa*n&#QoS;c)# zL3baxN_^yS_E{|LEIK=Dh+(R=lHr*=#!cXs ze4$qGnHq-9ekVUNkgkk+lN+}N94COrOut9DGgO;A)Z~J9Fuz?2w4Q9GgS@ZEDr^Wk zk$K6H4Cf?6J=KyG`EJQTO72i8ki|Y-Ejo}alf<~&fMf1xX?_)1&{NUHFf#lJvOdwQH&|I8lXA&-NS07C z`O*)fVqJ;UCh{NK^G`EP)#6mwC3`P+a(&P4SdeYWfP15wPv;$6kfjHa;QOJGa*zmrr>b?P|5G1Y6>eHt(N3P2Y_#x9 z#oy^2olce~pve6Tu*%6^waA}jOD2Oa5$DLiwnl90yWMe4bX6~NJ{oQ9<Fmeok~W3 zh96%NJ9vscdxL1=wc9w4k+8pY{~}^EEj9fd52fn!#q(Z-GioqV?Bs;2XQvcIdNu9mb= zs)Zt>1DWLAM`o9aw$w)5vAxq}CXw>gU>=1MPo`~81(VajGqLQ-o*DU&)B18k+j_8R z<;rvT4_Es+-L)tCIokE@joSo`S9Mo9WkjZBPcoIl6?GuNLvj{37hsh=)(yC~5owl) zcvU`66?ZKJiP<2#)*7Sh-v;6NBtv3&iSb9u)-%!u_hd&ZJ7#t4$EVi+ClYK73SI&? zf$cmioaegalSU(EuWe7VxeNZwzH~i0wZtsa`669+tID663%AQiigNRgBu`y=J5Sif zo#}&f8k_4}8t6p74@a%ZHdybDImV22`lES9KBtFQcW_PBU~5;^1o=i_6wR^#M$>=d zH>-OOr;T;jCvcv=rH_(|L(y#VZR-}S>~1WsYm9j%eZnLK81{yiw?3ISNR2 zOS(_>XS-hDjsdWAvQG{pm5wm?bb3gYZDWwDV_vb_Lz4>&QnZG7?(Qdc-7YX6d6j+D zWS-3j%lAo*7f6c1Jd`KN?2o+?+sS_Rf`Yt{eYD-Yi||ri_bvs=XzvMDmnhh$R-7{f z-p3KC6VE<*q*U^!Ya6v&0h^6LDmlno{*NDic6F@fPy9}0OZGsMHJU2my4KSUE(7Is z4T@)+x{E3W>R#i@)Qv^MZ*WH$YdbZtsja97BfEe|4|vU9STSs+0wIyDF-A%)Nvdko z{bDxiP2PH}h~(v@es))Pb~9q)eyQ7t4VPNi?5f1BZDwAn>1gVe3WVssR4lgu*_=HZ zzHC;o%i=>Xv98fxWg>p2|LURZz<_W1*zCKtr&Pt&xg=PN0yS{p{9EM=O(z_!7E_982!d zM%uWBIi|Bqs$No~5g#T}YP*p#UNF84uD2R@vDL;WNp?f5t?d4!s;oEIv;ooPe)lBn zYRWZASMi)cGu8he`D+Q-B!@c?*%7tvWUN#qhay6+*$v%PcxFX6ljQ!S+CIHz=i%p8 z?%j-HQ!`T;MTzBxN$(x4JQnF>)Sa#i$;M63ir)5@uC~4=V3YZFG_zOn;Tw2k5(QxRCp04`(_c5|&n?&S<0dO@ zMT&<;vNKjm9$fk$&f*iNuVk`E;>GtRciQ`F6FHg~VJx`pOQz>SEYtPoF^e{P$(TP` ze==p_LFbITT|lTMe9i#7IWjoUKy%gXv!r)*4X|A#uJ9_2IJuyg(^YD{wIoiHE)Su$ z@NV+kBeP?(cPvQlMYt)ocIoY~K^L}E-5zVC^n=-ty_fSfr=rG{+fysPuV;)kx4*<( z4rV`n2(roWYDDuVU#XHicVn>~0CT12F*++0Qz3`aJ0Ovc>^6;OCw)fpRRfcpG}(c~ zpA8;6qL|n}<9wf!0?xJ0Qj{59=z%)M!^rbSU5pBPz;n2%H5%v#_c=c?ujK7k*oevg zN!I;5P)&u~M@C+O;(B{(Iz^50N}s26+*#$jZ;X+Bp#x;Kq=IgmUB%X@_I**y$5|o` z@X>ZS-{`fYtGc4@mFAL8ZmAS#0@f`HHc~90`LH>Go%5}$yMpBr@U#+l=LCb@$*Pug z%nx98n<(tncyfmChO_&Q0Oj9lxBsHN74kZA>T>pAmgCLcVI&dYcvIW#S?-K>QVEy( zrf~lPR2VyHnVFx4{|B-qd;RARBPHe9hb8IXdzuYg;N;wVBa>Kta!dbOZd+ z1pP08*?A%j2fWLE+LqNAZQoL~`>O&ab}-xasCKo! zMz@fbovmyXD|rHos=g@lRC9aIPZ_u;FJ(LGNJq$S?u!jJ1AZ2>&-NjOva6h4t&!=! zpq)>RkpA=i;j)g{_{aW^HIVpT{DMAUdZ_osR`x#bPwiEz8E3F2KJz&YEb=aPUH}cG! z_1xC%YP#ZA6t@$s&Gn2#MAF|Swak&WsoqI8;fJXFJCOOC=zBWU&q6o9qQ9LBYs?-; zf3E|rFg*`ud44CfSjm3j{DMzc2M4C_Sh`##!r9t0wtDV(cF7-Nwi&UB5tApDJgo1@ z);En<8=anK{UxN{SNJNn{VsT*HQ9H(=v_TNTKb{nq@H+`D^Tiue3KK)cSW0x;c=B! z?_fR+amo}c`~q$cB!>?2?JUswxuD_G8!>&STjIsDjj{wJaw=wHT#_DH$wlkwU9Jn1 zQp-_}U(zKq)xBFtryYHtPDzOq$8$-Y^k(q*9St3UGCJX<73l0Q5@8;gCI>D(l=`6Q z_5K>}%FX0cJe%ZVo@Uh5wD7xjUB=pJO;kMnauS! za{9s|pZ(7YQ=^t0lQHHv2A`|}!*te)FR}^5ma!l^d&+Xy{mozPNw=ItwhYY1TUDYP z=_9=r-?fFQoj^MIsY}d%mgiii3g8u(Et1RsB22gPv{XQi@mhkC<6$;8|J9z9SZL}@ z!b`J^mu_60;NxhLA?x}E#Z4)|X?6kY+0Sl(&Q@4iPUanNb~nq;xC>M^qTA>IVg<;fIG547&!c^VyE&pNV4Fw%Ixu{Dx`x*a|fZHOf{3ffk#9 zaC$r>|F}|t;^Pw~LK=Ue-28ViuhVFc_?M~Ntn0bkVCXmB1>T9VS3x`NP)c%F(gQxa zV2P(JvbwD(Id$T_P(?CD=b?btVI=lmvQ)F9ww6tiddMX#mV;4R8=U&H*Z6`Bke#RJ z3)Wt`1Ep_V>c{?n^X0x~O(FlMa4%Bb}3b{)4+xsks`(q+@6=wA9|{ z>2Y`pZB&Nel6la!fT30HNCi+l-q;`M2NRpEigo3ED$}!zID_nI0%jEze(gOmwHnEs z-3BAsof~1+^Q?a#6qEYm6M4aZGmm6_J#Q^73(ra&+7$4LKb9KYcp&Mq9(>mWu~?1E z$)+`UD^~d)Bu^^jlP&raD6KM!w&-gS3Wx^F4ofWmm8v(Ao3V?Te1-Qvhxf?GMEw(w zjRwkjdWq>rhgbA%uVJ($sCGOWZDzFNMNIlw+eSDaNs9gIDQ&H#wa?PYB9+C-cc}zx z;h>FV@&4$xHE2ZJ{0dt+k8mzN`qER^7kFbm*kunjQU6BpKE~|6FpIWEJi>^(Sbu5^ zQyn;()E;G=Lvi(4tlw&Er7>{c9oMH`ZYo+#AIHd$9dY&{?oNI8Mo>*xkZ;MD$!56; zl_j@0J@txNe5oZ%?R`1^%t?ehq0o*fE77R6=(bUTLlbG<2%qgyKuh<zY;M>P38>iPsL$sE>n{kTevFxq?Xx(5vko`?0lHIgL-t2fe;bcGy9e<~6T{2uvcBw;R`iajfN={jNQP%}RWnB77QdNm zBEP{~v=LBpK`L%_pk}w!Xu2)65{fA`-*SHw}!Mj<$(#rOQI{kJFK|4egvx zJo}qlyr=XIjPD%_G;x#oZlSNLXg5)*ianwEq(bO8yHTlGk4G68B@(jDUHLxG$!=Zh z*;8@f)dr)Uz}7p4I-Dv@-R;!^P8FTOZId& z=;NJpA`hi0TgXHG38uSv_EU0dZ)3BRvE^5h#DW34UT;U6N zTy4R3F%EiA9`T;CqIwr%Dj(ZzdPj!Ym2y7*0IN?xYzvt`h&?~vzSPOCPmh_`hA9cJo_dZs?-y+ z2e*Xvmz|SY@)Nf>3Hd6qm0v`W_G2wRM-6 zPv#TmEbce>PB|lHlleBKh1Sr%7Z&`I5h5qQ*_}&OdsWf@k#gF$vHJ$eg}n;z^upZ} ztTE@}Ef$ea=kp(Bt6j?vyirEs<0#>BFph-%R^H!zR=J<7n(Qk5M-=~Y|BoqTc~3y| zf6@rw&=>4*x$&co+F2gk`(#h@PtK7)c%#~o6JdETaxZ7F9_7jva_b)v^B4<**|EwA zUg@6m1IzbP7D(!1KZCD_tl(7H{8P}+mniC3)cTH7Lf><$&xK%KNhCA-jp@;zebq$p zC!>&y(Zd4PdU}Xtw;@$vZ?T3FMNd9RvSq(P-*r4MwsNx3Z}gl_G|2Zbe<&(G9Q8JE zO4l^_x{&Xm`1JiM(LXkBs(qVPx{IZH3g31YwdAK34d<_4h7!^NGv{>wCQJ7|7)ej= z)BHXdfBa#s7oy(LG|@R`($zDQeVy9pe~2&~icXIraT6Cw&w$^pEEdg+PQiOyB=Uc7 z`8jB;lL>p1Q#9KZ?c^+~tBO7~qeoH09A`0P_a^m!pQD=rtg3WJo-Q{kU0ogqi|0wp zoEDmnV(Du2Eg0Xn{kQUIDc_(%{ya1IFUY2n`zoCP zw>jCWzMTI3wzrVs_z@m^K@Rm}@V<ISk;^M;K77eS?iF75ryD!G<(R7}4Qwli^dIu$o5x`n)HTvWn;F5P}RY$q4< z5>h2r+k0w*c0rkEpqNz74^^A~wKE<6uBLwzzOB!GJ&43ghqC=)>LC3Hs}_xQqSnc@ z&@W(Gzi5P-jLy3CO{-K4wjYYmrK00}Qf;7|(EciqA7Pi*aI(rl`0_40%86jE6+fA_ zJz4N)@H6L;NC)8H-Tn0-O*z^s?^28WiJao=!DX=Qt9!`8WS+Md`8!h2#kS_&m881> zwEm|4{coso6iIcQdWmCUqp{WWbLHOK$E&7#)|u8@o$OZ4-*=+n%T$JxsACu+JN98C zCRb}2FYib2{LP)akzrj#u5#Kyc9O<{?)7R5wwEt0U+7g{UIX8c$BzS@R`z50E#*I# z?~jA3R{9)f-z7)V58xcJjNMW2zwlDB(e6hjLVEQB;{}_+ojK)vmwSZDhV_e4aIiq1(y$?h2-<^Zq4;z z@G1QkKP3rXCGiKNh9`}^+^JeMi+-aa$Cyv0qDDpOA^Q-V|3|j?gEGbMg7tK2O8?_s z$eSPW*z2%89DgNZIf{fm-weu~MtKPSxJ<3vX(*%@S$d^8rT5a)FmM$r*&oLqhUyP3 zbXYu5^}=(o75hAvQ99nID_2E#kmQ;4E$lttK-xT}+Gv59mZJL__+XneU1wIRRkX(G zyx%(2bpf3HM6=yQD%~k7c$ia~z604`(Q!_dPtDCd6!sg=eo$`o#dP_j^!EL7o}a_v zZx<>|4%KCKXMF-rLEG2rReKV>kzIoaLHBmQUn31}BU{d;7p|l$2diTlM!y`PYwr>A z`Ey=tdwRUIysEPv57wQb3qGminO*S4@xJd*zh7kZW56kW4W9(d$KgGl4erKysbKlp zGk>CetFR^0r}k8obqR~+cARq?EWV5`N8p{A_-GlteXmdF>oE8!I(!c$enys#@cLNI z%X41;W9vLYHeBWYWJC{w{Re$|um9gwMew=T$DaD2r{Ch|I=cNj*X9I;WRE1bx-S`& zULdi<+oGoUi;3+gV_327?zh7Kg8wt9;)MdA z4oCAjT_LB%pk-i@b`J@1MxoQc^aw0iOxY^GI;FV~@btLtfBJleN9cjXgyf(os6Si1+qa zMK9dFj1rF`mcY)mb7~tKvTS3ICo3_zM6tlCkRhp6PVQSgm+X8eD{8G(%(a%}!Xz`{ zcQKNjEn3l0Hc^mxbYJ7qU;Ioc{LU#GBSgsZ-4FgB1O8uv-AJ5~(~y##kv`L3x$|4s zCEh#Qm8qGW=n2VoPY2nY^%B@7Hzzwl$%IOtWzJGeY__6rR`NhAB5v6|FJk>v0pp4; zlIhmmoz=NF=%!d6!T{2se;Sf$q zf4ca4@si@%B+%%YyAR0Ig=t?_Trr; zbDK|w*L1n71;Uwk`u}I=F!At2K$82A?1#x-p_Sxv#iq}>18?KZx5V-vCIjvwGY65X zx041Bk`51(3CS4$A9?%`{!PwJ&h2~Iec|ckhW&uvk`b01v|qvcPxPKsLAJ3Nvab;8 zs)#T(u=eavZQ@@f%F_x2LM7=LmTrHEoh9EnG2vulw6d=D?Du5)r#t*UxI90-y!HXF zUOr0|e|9u-a>~9ac6T(GT;61YC4SkpK*_lyeNhsvN|sqCSEb`=_8i*y9lRxLIQych z45$Z3@&2=$m|U{Z?`G7Iz34@x)MWHD4h7}ZpX5L#(<1q+i5?|aIZ=ajV+&U$He1sZ zlY^6;rnXj@OzcF5vY(J|0)^~uH!A!jVw87@0YWi3)Ufhh`y@MmMsE6yj^C&sd_-3~0owm&>U-VJ8av;>>lg)s>>6z@j_@ zIai%dA)`gN^!_EoowS&kxR>RCjd8~*h zQz`gttcy!yN&X_1*c#bWNFn)?n_{W#9~*!9SUcZzp6FcNIW@f!w(E@U4DU>t`NH#c z=Fjtu(pBM?og+FIq-(+pnIFDzEZd`_`QOMn&zwElKAzDZQXPCnY_-Q@&wLsCdvJQJ zkBC>ZVE$hseIAx=jcTnEn|Vw+KWy7NsI^^d-_`-G-CH}gHg1h>E!3JV*7T>b-yg|} zuZabyr`5jE#`-2L*PMLS1BfKCMem9S2CxELZi3`^4w{RqpPv z$fr}{*PWE_CpR+dm`JVP#ZvrD?t2bt z8Z~$3$w(CQ1@y8uRTq+nU2$J_^165#*ChgQejaB=L!6v5GJU{I5Y=%ev^|vX*GIQp zl2@D`OY^c^e(($7H3)5e_Qln8wHEtTJu+>xSF>dYhJ`Ow&5Vrvn>O+fYEYGr zN(`N3)CP$Ut2>d;n<0E+?{u3t7iG;zfpxM6qw`#K(w^~L_ly=jC|039_rJ+AvwHRq zMgBaN_pci({>VH#IR51x;WXInEgC(ue6GA?Rs`qkRDaBx*;bF|e*cwwS37W7tlLZT zzgX3E*|$3)2}}>5AxR58iBuWAkngGo;>#L9V5nEHjdu&)z3qg$PS{ksq>uuqU-f{*)P<|2Gj#qeF;4V%|ue6>ie_mtFwCN zc3Pfaljm#%XL?6|3p;gZc#}UcHg^MK%#yt+XMBBl6wm!4TzXLW^T2TF&haU?iMO^( zDvI|Ahn|vMG7)gm(BvQEB|VaQ+WxNjB1cwgtsVKXMr+m9>aArWU6yFg8_D4@V{6vd z-0^#-Y)y>+|86AFwTXA^8?VO%D;bq1vQA#hv5^RS$AeoVGZ=;^jx=MsOZ0apB_7e8 zt`Q3*y0mO!zstvmTrscNDBstJr#m`c-yVry{54m&I%hSuu>|=ZG9K@R+Fs3 zdwZfQ=O&(aXzpX@yb{V?pWoiZvEPqYejxjNOZX0o|CZ3#Re5$pzTcd`JdiuCnls!Z zLMFE*FQWogz6&R@rTJ;RD_^R#?#p}c&y{&&H|D4N^TqDfXLnGf(!7xduxDh%mW?e1 zdv7L)8B5UE;?g6-QRYXD30G~CeONEwA-l<#O&aWj*$Tgo<}mG01@yUzQ=FT4#wpo{ zBf?`Uv-b~wLHMuV*tzoV3xsA#Nl{nbH+9B_?qyrO9_oBMcWveyxpP4*)L(|y_D_`X z*vOvq22Myk`>E)a-y|CIX!?l!xARTs(!?Eq*Ez3qLplUq()n}ezRuf;bWIVum@m{| zcEk~}c25nhn_z@H-^t$fg_m%kT#s(}l_P-wlsl?ipMF_oGpgy)r`+T@z7N}kzqEB^ z$JYPbA=9Z;|FA^hnoOo*bG(yJWHaMEbr-6XVUEoR)cIUAYq#v}K6&hwo%?xq^pwO} z{+vBMCv>53Eg~G|dA4#+y1UY~ zTZGDY4=3-QIH0(?85O_Gz8{?^+%Iy<>Q$fs<&-Cde)MI2BdfS0t2bSX1w$h~mXqd# zzLR^GS(B;9btJs*z$@j`R!Jmt#Zb`FIV}~8zC*+5SEMrC#5w)Y<+x1?md_S@QByZ< zPK2E)qMwK{s)an++z-BI+$EeVp=}SC)(;}yDY*9IH z{)E-Pl`ps>vW0Zi@8`Ar9fs!B{QqKjbZquhUyhri6EBX(cv9@Jvtj|96Tk7|=#;DS zD2q&F%880{sF`^-SCJpnQ;XLGHB(iScn{a{2UW%{m$jl_=<7AIb0f1y>P*EObn+%a zbhUyaqhD3I!dKfov)I*B%)JzC9Wnvqm0u?3VIf`&V;`u#GzNh(}=`Xajyf@kE4xyS!81^QF1xjKY z^3Pt6Y8YAR)&Wt`P3+EGYCoytTm^vp2- zKz4qP(C+-XL)8JpLWxzQ{D0o33ed7f+=U37sUCdu1@b;MT>53RYE^Zrm8`xtq`9oN z=#o4=G>Sg-EEm6&6^YM`tV3aqM?^-XVOH|l#QzEn?sf)rsttFlo`QPa@u zoZ1VL54DIUR4oi^ZE}_Ad!bsjWaeW(A9`cYKNQ+i3!>Whok-#TG(0*!YlO}~h12C~ z)8`Ybt_BhT`o!EAzsJE92~=g>&ZnU{b016*5sgvdId!fwV_qxT0jFQM5EwggL{x&3 zXgpr9dZAAmK2Q^*x&Uee*Nf}8o-3)N;`i!Hs4{r*{I6;pr$C*GDmViX1c((j>Kz4+32&P8XmQX28@xZrg&Ct4}t=6hs+SacJ)s7m_3ev;UZAEb24$H zXwSZ?uC87O6LaPhvOZL-=6~Akt8V!!ZHv!L0I@b4uLA)7*U3|jqUtEKV#EVij8tAT zdSI>QROim8ps8>FcPiF6zM%p4FDh=T3)6}9yo)p`#Z zNq<>4xyOpI_8IdV5p>g+%s$e?55+?RISUctk{FPL?`Gwu1pPOk1l2{-tAT;SA>%rE zk5BYI+@#mMi~_WzsFoSAV&9_Dc#||FJ5czXIWJOV_Rtg^yliyL=xD=LaxN=J)0--= zXr!dq=!#IWY6u&YQWbpN@z5aJL|)5Ndp9ezcOPUG;!5_Z<`>xw?=zPPJ)2`gW}<9V zg4WPDi6LUlv(xh*ri%QXC$FMc%%8E>Yy#Tu`{o|u3Q;Y|g<4BqkpR=>zRBB)vfDpv z_D%>c85dS?Cwn?ss*^rsxOz8{c$~-ra2l`W!N$`+gT8ttw$xM6=lopU3p@RKb80Gi zoN*!kdCQ{diWFEJ)P_!b2>8S+Xko&AWwZQhNpC)Rn90P(fM^ z&Hu1X_u1w)cp@b;O)P_xMX~hEbh*;xi5d9I z^eHl*)y(36MTc(|N0RGMN62cEPw2}%(SbORl&koKn7A2LWGTe?$XFgv+X@;b3<^SpFbHRtx#+=~kJLP(NV zg}bH8$up7~6^{?c>g*@tq*w4`p)Q($tw}`Y8&9UDuomZ4-i5qF zadrAotPqh4H9R|C&S1fuj@e+QrlIKJdGOI>99e-gh4-O#%f3+~I$J|^?u$iGcv6vS zSsk6ZO;F*-i2m!2s@E6!3=>X1*$W6k7KY5M`IhWTk(?KsSAUW-hN0z^n0I0#J54%& zY->?-nJStV|A}GR^_rIVaaKVBKnI#>tOA{uVQtYZmHpKJfo@kT>@S5TW$VD*nKdp_ zUiKxvWiRPnq=HzyUId*V%~rJ@Ie=9olUItA);Ca(1{L-4VX`@Dvian*=Q{Af(`Qe0 zOi>>V?e3K2Xs!LFtdad;7K|S5JV{-o?u>UL?)gIQL&S|GT~xVewxQ6qa==qI@y;~XUAp3i5I8r)*q{R*7#x%Ji3F!JY_fBq;wJIMcX6^Lts%l<& zGr5bRTD9esxJ`6O)ENF1mv(Z;gYvm702Ll3P5cit%=+aYvoP$9z4wmx|7=LPwN_Td zVzY-+hf=CT4ckCQ*}OKKC$eU4DLu%#VL4Xb+A3L1FcBnT`CQIT7M3PufsrTZ#C#b@ zXqvQQAoMER8Mk^~_h|kfTfrXbU*VlrLH_fQXaU)1cf$t2L)FJg)_^8;F6c@9K-saC zk9XemT=AW|XAQ`?ReeLDg>i|zA3a=}9}Sm{#?G}X?vJ$wc}(_|4W`P#dP~3Z;z(i9 zX_TrXkL*hM^lTZjP;`u!WzSJ%A+Kpq+Qn+E+WxQ~I?*|7@;Y1Zs)zym$zS|UZF`|I z&%V**>`2>8#hVYMUg&RN-w1&EKad|sd z{;SuN_omZ8*%i3aL@n~R?w8)eDQH8LHMxyu_$Z};;nWMEAWn&=O2epx5K9o5V@a8= zXn*>Q(Osev^1)SbY;}d<6OBvy zY~b>ui%ZHUz=h>sTVL^{XDAdsu$oCCxc%}aoTUlzKA*Q;6oqO%*jl_ybGJxuC_*{@ z!UC}v@D-jy1GpLjgT6x_eq;T713&ZV^sg&l;ln&9v-w#b_SK0M^;)kSe0i~jE@0b` z=em1T{|X&N7ml3ftFSB)^78!U>Iy=Gpd5F=Yb3*Q53i*B5nXQJG4%Mt zXKY`6FG>$uTjd?-IQJl?#wuc`xo7zY-6%v0$u$u)R=vA(jf&4ruBBjclEC)Vx+;#u zf-gFtHPM?D*b`SEl~FS~o*b(p&uW4zDTWH2F70A{R_Gc3(fUin_-)zk<*QcYh2}!_ zWFw!RS7v{lHs7jN#G9o3oO=0~&WgOjt0>)>vr~)T=xdZ^$4L}2#R-Ti(a>tG#Mqo8 ztAHej??I7dqVp+Fu};nZG@m$t*P;pb0hvpy@pmTcD{*jsx~aOlu#l%;C$}YwDpyFJ z;Z>aCIZbP?>kjNbJxUi<+|K_c^UCkF+pdiY*r4^jJavdISt^)PmPtuX9SvV^yaOFN zSdQ!g5hV6L>VdL1XGgw^jl+l2`AVh!j_u0sZeJa?~bLD#X5 zs8$ClR@rP>uZV-FsvJDM4TtB{OQJhP{6L30dGRaO8J-n$Aa5YOtPx$YaZxF1;(-+I zNW{goK(SGDi|Sm@YrRrD%1@#V>VaU8=4m_?x>@F1Oo^^y`IoLl%f6grbuEKA)UQqy zi5)~D`&(Iaay%$Pc1dr*w{xoc$LZLnicgKGYT?K8{mEF}P@>RGk2OERpT3ocPk1K} zx~#BCrMuZA#Z%;zdm^37ie{Jan(UJkkPo0=aeD2TILmyEKUO#L!7LZqETS8M6PoXdzRMs2qL{pIn)?d7A^`fk> zXyOpgy81i0zLP5Hp_2g4rU9Kx`Kl&e^LWcYa7C|YbF*Np&J0h}+RjGK1oyg1Q4y(}Mu*lG&)%qZMM>o!*wvbQ4jo<5GWY<&-fX7VQS;W5;sw!Ah4hrc&?63Sx)RC5f}^j|M_rw^V|%ctSOH~Ol`lhX$PHINUcH>4?JHWN zb1EB!bW;ltp&>rCXr8gzhvt6|IJ`n^m?pefD1@y-stw7f6_%P+>eFc+Rw7R1>6N|5 z9w<#xQBgi3+f~mHy*?gHWJ^DnTN2xPC|Xrl8WYplSo&`0X7FL|*vVEOVfus|5vxZv z^3}SLluW9Okh3X-zSyvAOT~rxchh8b)iV}HuqtR&e#s*L+Y$I&(RKGq2GxUSB5o=( zCR44`E!&uFVo%U18_*rw5jEAQ+=KtsY1Ukw6{_07t9a|Y4}bMV99)0?@T zP6Cs=MTqcClRIaNxntdy@Qa^NB1D1{Dm_Qj%an?EkT7(ImTdBn|bShEiA-=mlTs z!@O)X>uRCKb%N(vq0zJOJUHLvdh*32$J#d;pTe=AuZpedv7>InUa{50b4BySwD7yr zrq?T`>_r&Sm>Csq+HdK-EK zT7rG3KQOdE+U&~}KhFL0bL|JsBacd}tE+P@{gg?KiuH(wihYV8m&TnbcZ*}x%#b1I zP*0(Cf*pWP-L^p>sva60i)GP#HvOP}scNIx{Ngq;ag`US_`Uoa+W~F-C+mU1FfTOy;2r%1k~ue-NH{!ocgy5H7tU*HkDdva zJ(B(76|3rlS(`3*Zz=%IIodcKO-HlQz@rtA-kJJuA%wWYNIUp^oiyXPbml zHp#uIh+H*mHWl*g>;-iCi}^g$Gvpsy`P+!R3VL){R$o$4_UyG#huwq;e=Dyw$5phR zzavI5ZT5skXQH)UF-}YemhlZ;!FgUENn&D$&dMn5o#q;lO`;(%mGbNGn&?RV<9*qA z{lPlPl#78t&s0ZbHJuygYt6`!&2wk4|I0@@!qa~kZpL3QM@|CvPcL2_qsSY*kVQ6O zp>(@4Lk?}gCcPf%$O7Z(O&iKr=eJ_8l-q>YHpthe;j(2Lx|}iHIapcuHh5Gu6Y#2! z=W}@`Q)VqAv(xG%+5SVqi(lkCU&!lj&8OX$lcUSb;1Ii0nQq4JIt^lTqeeQe+vGfH z>{;?zko+pZSSRSGtbGt3?SHbmCt}#{U7Uo^;A)8F^tN%6<cZcSUNbQ5=>3iwksF)Gg7Zdvgm#w8$#B*Xgp)P~T?G ztlCIZQ3utrALkRD?mgjvm-0%si?VLt4n)HW@d-58xUE*&YLK3GkY4BaRB zyXq5t_CL#=iEezK`!dabncUYN!CW7auibKHV?vSZ<{B#9zROPN8mnsM(o`9p9<1?c z&7F=7ReslSEYFeu@?+=*`sRz!(Ab=^`@1<*OcJPsVbRT*Q(HZ9alg>Xk?FAT=X|N% zI6S}EA(XO2R!f$@)o{Us4aV85is$k>=oeLx=KScx&0b?uOrF!|@2sn;>D-fxMSpQ4fB7xaZuUr~j7!FASpk?(Eg`;aMmH7O$wnn>U8(3WQP|V~mH`y_#yJnw0*gda=x@$VmQ-90N_J-_=R6gf7s>+n<QPP! zEnX1ne>nFkn}Mb$dqw6xRmBef(c{I?PoZ5|EM4J=d9sIVgv)kHx0zj2d9Xty!kUq- zY&cZKhb{CapZ)3VBHQVKd_9q$;Otbzm2C-&r?Oo%UcY>HfXKJVOgnv!L>yNSZL2id zKa~FGuD_&~>D18u5vgw2FO;%zWY-jMI4$JRGCnbCD9l;xbhTDo~b+!Yo|ONHdgTp z9G*xk&+UWI(VN-F^3&O>Cim2Qd)-qZ_;lP;U!-F?J>+!dC`E_VN0EK@%HBaN)B4}% zN<5YK@)`05^51+*d3C+{Dqatf3DKpFqpHt!=EIr10P!!L5PU7f9PVU8iZ-$-c&K7# zGe&;s_gN@f$f?)!F1`KU%_oa%e%EwvHtAL0QxoV-6H&h@T0lCLrzOwKo2A*mOouWv zWgv`(<`f6#yx5zIgqomA#glcAG|TAStm~D~^c&6D_&uN5G&21J)m}qhEuZ&`4bX+- zo1N32THi{M4{-^ZV|Y!IO%{&KUnzV&I262c-lxZ?u9>QV#^=;fzb<~}unfzcvHTW@ zyjrn2E7yOyIZcrUzA}W(goc9IrD`R<%e~Ez@8hy^^(PmH3r~-HKPmNL`$j`wn!3c_ zhZ^sXX1^k@aLpIO!?J@jWlaafBG@O@d&j1>>WtL#otx^azop;GMftfaQ?>sbSj?dA zH(MXIUTj_0+9S1zV`CxRnm#&Lc2>yj`LjC5r+?Bnoi7s}7?JK|qf&J}c;KVXIhj;H za~>bGPi*hi-mSfSd%AXad-e7~?LV|1ZqM4;yK`ac)P5SC`FvoJ)O3B_wLqqGU)uVh z)ziIr_n7Vzx-aa$w)=tZce~r&{oS+nEYLH1&wM>g^eoylSI-ySPjz3_{ip6Dx|i*q z*!r^de(T=WX6c%=UTP*E$(ZGBeB$@X!QtP%|sxVg{m?^!sMx_4jrBuSb(Yd>G zdaA!q>>ShCw6jcS?aqkK^qqFQw=<;kP5XoP7wtJZBRi{g)=!oAuQS2?o>bL+(P?Kw z_pnr0EUhm^XycC9-fu{A@x+hi2OM`5@<{`)Q*w*Is~j48MtSDdvNse8IedwHm^S*$k=@| z8F-U$jVX&u<=n5$sXiE~yK!nd_st#7o9;`a(sgOARD_NgxH%_rTj$yIry7(lK$nMl zhNt%T-L555seWqf@z#*;R`;~sL%XNwey#Oj>#Ei(-40xIpMu z6`6?p?UC)KSYMlJ^CLrF$41YL%s%`*y{vwc&#%hqN3sLc>SnZYG2*Ie*d_> zllp$sw?*HQeXI9v*0)^WoP9g@{iW}hef#%4(zj&)YWG2Nq!j8#t#?~*x4vyH)V*2vw%r?aZ<){Czx&|seY$t- z-YU<2(!EOen%Rfp-F>aM^4fp5PH1h_TCFuh>)rGjxFofQyGA$e9)4apmV>_G8;7$G z55F8Ad+_Ac^WM{RSeuZ}gYTtZ*BsHTb7Uu1Xsw@B%-ov2HGjIKects&S1Up^x0fDi z)1+6_#I8@X*Z)r6t1H5HzX+X}a z{sN)GiJezF6FYO{`zN8!(doK1q?vp?a$uH$*;5ZX^FVk0_HF+9X881j(EfXQKC#o+ z`7AWi?#z_eO*b${x?+vYV?_F3ZJGXbbB0^G2HK5P(bt)7U{F49RJdq^@X=v8d)-m~ z9*gd!(A`O~L2t?FZ=LGrL&I$&QdxXJo*z8$hw#ERO>OaYse->Eue&xBsIQhv>pNo0 zv7q#5moHQQZ^oU;+AKo8+tA3wEpncF$KpOFy`rwkE+1OY#&!zX)cj?IWbvi|ii}iC`_W0^_RBaZCLJd0 z&pwzUe7{N7t(thJTz~1tdg+f&(+~Wi?7&5_XRplenCJUkxJ!=a$7q7V;TrwYXNqLk zQGM!kSbQP19xU-kicosUQAbDC^Kjus=mZIG2Ybt<-2t%BSnsqpIEnN!>o~&Ds4q+$%LGAfOiPy~?59I!L${zAG^rC_HfWkDrz(kmu7;3V{>CsWu)#CV2 z#c7ctmxRt)!qen^i$|BOojo-RV$IycvW;CZA$KmWa82HOU$onq@u}G*ucQy>AYEqIm}& z{GhI*B6+tChwqTzER~%#Y2(eT{HR#ee+gZ0lPdpR`Lu(w6Z2%p z56-IJ%9(5tdsEjxxRih7KHtcBS^d*l!|S2{*Bak)LNvJw^OZw)C~wbv{=t!z`^6gH zJJe{J%!;unrpgJ6fSE~a_JH0L_eMsDi|V|;TJH1Lsf*qvRDEJ-eY;p7yJt^UOV`FP z)3x!ftp1qL%3V3fzve{mjx1Mm`cAB+IYV(`nyX~*m(4w}Zgu$9MUsUjifDqXOd~(} zf$YZP(RvR>8{FU6PEh5G=j2z5^x7`#&}ZV5tix>3-J|0c%5;=@qtixq-IbGECs)2X z`}aA5+Be}!wz=%sOQ ziPdvsp3ClCpSu(H`!G8@Z)154YOM4hvc@+P5&3VZeQY$u{9Vsx|K`hn&)#)?UOOr_ z;8l@m>|7Jl%o@>cO`kufvR&41is?eR!exFVr&i1&=4gjMp|%|maChHBObcZ|=Si4*@fC;D8j-J8zB&t)gqh(tAKaO|#=+9va?6lwZR&TdjB*Sr@>I4!$4K79=S8cvuiJN;qy zd7YevnQ3acb)A1X)bUb2{nC+rKUa!A(N}M+NQF(a9(5dZ zryK2~k=@V=H->smR*@Z?5a}=9qncxrylaWbBC)p-c}$TLlBfMR*1O*GBA@SNe{`wW z!Q|`a3f9z{Q|(e_5*4hYT->eNC0?$l9ngAD-_b33KG+WY4F{o==;7fKL1@GQ=de zFLDi0cJWLIKJ&*+w-HlbC_8F)SEV2zB<*xX{{J0szuX1}|XWt%=e7mEGvYs9(pu^7nu>)XxP@vg{vt=b_ zm-AyMPjl4|eEF>@crC}pHa;xA%b)V> zx6uQ?$t!n{Oxi9oZ2hcN?p?J34}{UTQEFXJ`sl%75NraSL1qU(R1?=_|OsA$h$r32S5V+9=@d+3ZHlsxs&wu<+#PQ77GVo{j7@8~CEU^3>SC;w0x~ZD-|C z(d8>c7gyv%t$wrMn{p=BK<~(19SpiG2AsGGJSM(=@!|oEn|W1*jPD7OU@f{g*sHFXwbYIvPKa&Tt>c51cDKpH^(G+1jMFO*+YK zoe1rU=>xS;Yp&LG>HG9$eDzn-o%vrmSDf^-eCE)c#K*a_JG1iNX9w19`Y?Cm&%Kq% z#`B%KIyWaWb4BNx&gF@+T-7-v9q^7%q~ny%(TRGTo0!c-oy*c0=*G@NiEF&k85du$ z-I*%B;*#kpKPEf-o1Dy_vp?r1a(P`&?8WfV_mRgnIlHh+ay#pV=Xqzl=j-tB`w_YS zlS7|>Nd)PFbn3e~J@fAi-96Rya_I1-u4lR)%j2!k;vMd~{C=1%m6TRV1@d?=)&9x!q~!}3}v6DTaT1!kCwUYbT@!YZ7J z3B(m!h28%=GUwq?o5-qZ-?R!p{`Zj}Yo`;}dZFd@(s6LZNS9;s+rNZvp-RNCMPdIF z{Y;DLr6c0^OlbG@=6_SBZi{{OSnQYgLjk;+fxPaOXoXMnzL)a9oT_SneT+VcJgUkO zn5L<-(#0dm^$1xy^t@QstgF)$nXd3w^v*Z=oTtOnrjzmt(7>wXbS=?S zMOO8rtN?04q-VyQ#5_5jMRI0~M=QfT4~iXoRaSaeY{!#BuMcJYx5Wm3E)rAaD@>}h zFquyO2lkrTNhX8Np7Y|(ewP)%qspPolfS?XE}ZqRmuGMoL!;w9&w5B#)fNyv?X20mSD zec#8YSTI)TTA^Sy*u!HZJsJsjXQcDVk($@Yp;xxb7qv?A4|)Pm4DIP- z^-->RXFRV5L)ZE;KNNa9P)|$ZD1dz4V42)(I`iPpIH}BUj~v ze;Nr}T)kj+a70!(drlShz3OiDzFi~xqdU|>*)f=pQ918*a_4%TE|NQ%Hvj8?59?w# zrw(7v)o^Pe>R4W-r%bwP=acCyxeR#A`LnXk!@Uy|gK`>j9*|VC@|^VJ*%@69t4rpmc^^dLb9t5iT94)3WAiQ@ z==2o-Z}w0w3eHfyB!m*wM?0$+6#ByxtA?tM3f;~VdY27@saAOh**7$M+m7F@^BSz< zGTEnLd8b^R3cjgxE!`Jp&dIBzfu)`z+%2ELUV#;bSYyezLL2Yo+|`8Y3k?mbgT)7V z_Dp^+Gi@#yx?lx-m;KaJfP7pat2B9FRKv$6=9*fs$IWNW=X{p^cqQ+dKA)lUl!{Ik zw>lu0eAjE`4%pH-VUFD2#Q2F*EQG%z3{cPtRbob@2L0{4)U+08qS@Iw5vpTiP zr@WVU6^ib&e0M)nW#g4MvO8U@QQLM)W;J_!?G~tquF?-LxRwhioXE80sPg zCuK!)wfabOCl>i&?9dw{(QnOXESy!$oLvyJotU5hm7MLdu@P^Lq&Ig}^h|8pG_*o^ z&5}KNA@}x7Xjm3>hVa|;;n0<`a`Vf`YT3`Pa@P~`3iX?+kG{-jK!6R-=jhf#=fTR+ zFEIZQFOcj@ga+tomdSSU1@?-KxmIJVY>>#>Q(a?PJ9auP4eE*34bNZI;`(V1MmZt%nD zKYZ}RZa>a2>D5UG_kGrPaR0Q)_!M6^+dhj0xuR3_p;0c4C9CXH@F@t6u^m^~jy=UjnHtLyY)~Cb$JYN_PH|kc`nHh_XQngtXPGpzNNdA*4jZQL^szb7<6D1g-O#!x8La#B zb$+s6hbD{rtJZGGk1mydvJ0lu?BdBmz1j6z-v3yTAD1L2xkLQU?IUG|Wy5SXkdMWRDyK6}9s6U?6J6-SRz27G%^kMvt+w$%weUce{D4!YyODtr7q2;H+bhwl&#S^&_EZ~14YuJTy2FD~OaajD_YqQI`N!}ev2PZK$ zI?S}|r}Ew#-jkzfMMUh4^{CF%Fv?pic{{YjDP(DcOLyLDztn!9eSQ1l_Oo~Sx)15TrTeAsDSFoEIk4yQo)>$j>K)a4Snqkg z_x1Mo&Od0>pp6G@G-$g)+Yj1h(C&kF8?@e_RR)b1H2HWC(+1@*QAL#vQ z@7mEAkM+FLb9B$|dw$w8WzW0amv{fMd$sN#TFxLAnxjXpQ&k!#_wJ$ z@g#Hl4vs|KKK-yaO2lccOl(^u=!sS0p)U}G$BYACWir6MiJI&ZM8Z@-vOM3uKUjk^ z+J9{Su6;;QE!(u$Y%h`33~qnd|5pDa{WtgjJD+@acKzl45Bj^?>$VSX|0DYBv-Xmi zHSn)QXQq$;|NHRlmjf#%zHwvn*y}`MKhv7AdzbEuyWi>_-m^{5F+KP7{I{pKcmCe> zdk^S6viGRocw2KS;#q!qCyyomDz>b-oK7-PgW3lyqtP)b_FM z|JUB9y>)x7+|!iNYpr%~zE9I0-d-=d?)3Ik?M{2)&Y0j~e%Cp!bAGx?U)Q;%^LVfY z3uLm|&m&u|2p9AD=LxrM9!ul+b1e390_vrk7$?o~OXYC%`{YmSaATeGHwLILqt94WB#@4k#s9ciA z#i7$nT9>s>3x?(I(QSK0GpyE{FIsJU&;j=+zIjqS;%yVrf!a6oo(23;WRsYrsNV(o zUmo@B=(oQ`Djt)L*!w1~__IVKHw(^To$T0{L>o5?MQ)oY&{Pib^Pi~nw=0@3%?eeZ2^P7!wg)Q=Zn_Oq}{J(u3>klj)N?SZg ziIJhU4f0qsUz<0dvt#t?{)s&6BEMfAyXHzeWL3NWFHWkj{7$*vj`@Gr;4BVqqDp5( z|6UWxuTnxh{HDlOQE?sX?~D!mL>{__LngxvUmSUMb2QFd*%uR7=gBUaY!0QSADnov zDGb|07XC6(=c6L)j?DMH6S+5G3UXq{;3drD`Au}G=>JaH?{y=SAtw5w37(3!x;)y3 zM@8zNn1^oVal9CL>{ah3BE)gD~BGo%&zYfPC7BCe`B;`&F2*v zP>cLbcGyne9Lm!7`MA8!bg>gd9~VaVLDoMN8Z^_ZC-e#C5!}M8K zRqOY}n}qq-OF};ocm$PSB8Or7-2H^Cg}#PLGLJ~V(^g&yx66k#V?ZB>>Wo(X-&Dn^ z%N02o9{N);V&<2+mbIIQIW1z$3uT>Rzuu<{4s5GRCabO5%DKWbddBIE0hR7=a*Z`V zOFc~VHHjX6PEFO#5ud1g-p=&CQ_>{U`-9)Cy z-)0GquNRtMIj1XcswicM9gYI+ySGw2p)j_*;Y{0aoVh@z;U+E}!1rk9+%Dp=iRbVpD% zP`&$5u$~qA96c84qPFJt$QC^&Z_nep$kRI-YSG8tM6str)4ILO(f%Vk`pU>OlXKq7 zC)i;z6ZK@Iq8^y5=b?&?SD-Rd9|qV#GIh<|{{o@?&+_>u`1s_TvxQ76Zu!jtLD&8@pL$t7_tvcWqnxulUpbU7E9rFQkhhJ+CwIJG^0>z*+jvyg zv}^Wd&L)m64oE_qR`E!7;jU&U{+XYiZ}f~X@YxLq5nvh=uZc{IFEM%Xhjb6&KbtOYTQcJXH|TBDxOE znJbulDf_u}C~J*IDzHvm%MR$|Y}e=`I28GV(#SGzRYRwqTlcf-`2A6Sk`a9?d!*Kn z&7}Uov`-bbb`AYiFHjUSF%(CaRArCI!=rh1bwPe8RQq7)R(INxA@}8{XR_xWtVK0G z^`OUQ%U!8JSM{!*pG<%XbGOrH_rkuB#_DTd%c;qnLh4nuEneuSP2NK$8x{45R8htDID{0 zWH@V}`WWbgG$b^Kn&oBTFG_b;6_Gk3m4o6`(`UWIbAl_x2AMK?PG>BZn7$xA`Hk!7 z5P&LaEcYnqspBB6ueX=(Mry&;9W4`DFqsqOFP?pneIFi*P(!(VK4+DNR>&a}RhEz3 zT`b=h&u+8trigUVaf^2LT_*%R?0OrUq`K|EZ^>)1(DWnIXN4tP^8<>qWyIuLTtnTI z9*b&xWUuVB>+8y)k0DxQed?nJv8E?5EBN__uI_4fUCy^=GJKN1PRN?POGd72dKva{ zd6z1-cXKMVwTU|LujpqWOfo$>)SU>ASD{@m# z1!_q40k%T52t=2;Z>Aub@VRkflsm=l_g%$0L@iwO@Ng;2gKPmzXw}Y|az}=kw77K6 zV5yv!iJrRW)NCWzJe?P;htyP$D>n&EH8!&U*-#+_&4alk@i=qR=w$wgSz4r=eKF-v zH%`@~toT{-IrHW&W^6bRWw8}-n0Q{{hIA~_?L(J`>bs%OntbQCq0AriTRjTYp`nuM z${~wW9TR0q2a*@i*`;QbvYE+sT|4*}GllYLr;)j9GD{3nN0;hDq?fUtJk_(ZrXzgV z$m?(NiSOhSbrHlb5PG}~95xy2f$yrK@YjL7F z6tP5gp27`ka#{b*AC>Alr%#|yVz0tx@(5WndX&vRVmjEbPRb;W~Z-kIVj+4!1|ucg{I~miNd@tH@R@ z&*Lf`Yi3Z%6kdj^<@s}6+J$Xq4@Tr1X34wtZj`Z`JZZErzp|&~VNFp`HT6&^k7cX3 zL{%v3tX|d#>p;yizXF2R&v*}g>PO*Ky79=nR!_U?3#p@9b+)t)G(&Rh!AF+rcIIx- zYV{a$Iu)_ES9%B09ds<3a>_c_>&3256)yC%UPSH{+O)a}(YCp4J{$fI_EH}9<^Qdc zZq&gMh3jpi+X)-qP8Z+k4yQwxPNK92X;WV|kD{9|5<&NuX=ZYjE{(k18xMq9TO78>p_KchRZVudar+mqxUmAx>v zi@tFGdPAak-C|e`Jj}_HnXCUd`OWGSJBB;2k}i^=jtb(OT+Y^&%nx#KL4BbTVT<4bM+iM~c7oxiVF#x)g~L=rZc` z#Rq)xq1Y5MACr<%fl0R#eXsTEGlfokgf2w&b_^x)?n}Q^#eU(z(2d@dx>Vss6vi5< zuEi*eEUcMk5Zu+3-gkX2^@z4t=nSrcQ_Z7hU!0CMqVe>6 zTp-sL)sk(3!r@KOi!4yDVc)PB)kas>V_KuQPVX%Cmzh9wg<43^vU=DAd~B0QNNzZm z@~`o|oi4c`0#lv+oET4>)>H`%muvmi3#$6@vOCB+-QZa9BneF{+sK9@Pv6R3kXN7n zk8a@5;4jr|!xE{5hvk6aq7Ueovdw5tI?cJVmh1HC9Q6sbvHrre6wJL{E~;fM^8oY_ zB=KOXbq=d8A(N$plX7l4>FUIQ!g!Brcle!TC+i=MPrTFg3_bQ)xA@gr)O0L$Ze|5Q zYTI2}!pd=oK2gwk&{6izKKfF%pf=O1*d49h%jAxkx)fG?(KLqtyGs@xeL}0~H(L|V zssm%ibd9R%S#7*5JjGJrNw^MshNWa*L>}3E zc+W|G5J^BbR7Wv#mNr45&}SqP3^{ED0ZDtZm+GF;mROJ43bH`Ohboe?1bJ)pADIn1 zC-%i>Fu8Qf=2bi!h)!`^{r_tIv~}TPnjh7&V9}}m`ei3OSu%vbkFt2eRdb?FDL&X*9FEnAr9h{DLvH6K+*q7mx0 z+av}2oG3M`g7(qBSZ7@)RuayNA+)OJ?PTd|uicrrr{`VGDX>VySZb0EZ&tTJf3Mz^ zHS55q<4Jx-NeZz40Y(~D27w=&z?bu;=<}P@494wY9iXr)B;p)bz}!_ffM7cRQw;$xGs%g zf9))pQQYK}D06T=g)O1$@X-9PQm-b=h{cQXl2a99sQV#NebLl7vglYW7++L3M1DO^ zP@BR&lRLrDG-gF@X^f)oviih&%JSq>KzUTJQLzoah1ctyqX&lX)!mW&gu!-Y+ytvv z-IwJK>O7qW{5b2Iyl~!jxhz+?89iU@zcUoSGEpAgO^#xeUGKf3d+bu!5q~FB+$YNx zK9JAmSFkzEnJeZEE1jLXRdz; z@fLW1lO;AEx_Wh2M_+wC>vQCB_F+mlk6tMF65B%A;}Q z=V*s|b=d^$Usg2_M8s#ZhpHbeNzd1)Je^hkU#D(XKy{+ly$T}VjEmvhQg+Zk<)>7~Cp9Tb4B~CelFuK}A>G7gl$k{C2_kY>OqX zq`TvWP5x|&?Djz3Jw8{3`Bn!gRweo)XU!I7rNiRRncb0zUNs({E_rJv^0aPn7V8C7 zwO!&=KTjRd9{G8z;QZE!B`o7RIGDoM67g00WiIsPiQk%WeRGrb(cAE`{8i1Co?rJQ z2B3?`1NnS4`jFi6q`U#~7yKovLxzZp$XfP?JNcPpCN9+()hsO2K*<9(fgJh5k=k=L z9>k*g4eHR7s$wzv*YRvhzE#`+H>j{t7b3?<(pMZqCp`4WN-F>S)tvbI*+DT!HUMb` zjpquF=U(qmT;;ebtWULYPc6q<=|3pcu&^)Heo*06MTlQri% z>eTP-hn&nSO%B8y@`rPJCW)9buJ`2+sfb=O`#)W-vTUw^D~C6-%EW<%nloE1XQiHV z-=OFA$eC@Ib2K$hB)B^mel>FsH(8teb57-x)7I#>I{vC_pFVO;wDt4IOkK!Z`K!z+ zzNFz6W84nEY+P>gKatV;GlWq4O`)9y=rM_#n-B>Jr)B{U;?|FEI= z_j31-BwF-P_~M1^@;~!QUuLgw59Pj`y}mBbAkW_qEkBX;d7eef4Q4d>|JZsz!U**n#ezYMzckIBOAA2jLS z;jJaI1Jj0kUr!$KoMiCMOy7tt^H?r*b_=9COMmC1RNc*%$2>up?2>A*Q}fFEa_6i< zcF=5z>~5XY`D53mK{Y*|%DEp>F*qSTW4_GuXVaPHw)8}~FuhU!kc{7Ng34JdoVjXq z*5xzO18-;FpUys<8`RQ8!3!M`ywb0OFghsDWE}Ts@Jl;p1v>|ObXc&TmuC0W(X5)R z;$i7;b3{Jj#MCri+;x3ZwRc87@3+A)?h*{|IX60AJVabX z-8QOJPtHGhJ>Q=R_rZQ$kbB-KdEE~p&o;`A9h{2IpXXG^uxB@cZ@R;)+M4f*};q3mZHxxs2P zErRVtVzD$o4$ZLi#aUUP{M0W)P2&cZh*Um3IOwN?mi{8A^+ga-Pi0NJWOaJYe3~_! z7+e|*+CjmxZ5yQ1p~*{Mn!Dqrsi3|u_xX?Dzc&gNbMDTq!JR(Uo~N@#YD`zm{eLuY zbUN}J*P1SUxu);gGpNxgdnWXJ)bm1~?b|bV&lBCh=$_QNA~?OTk|*CQbUJ@D>N~mX z8*-gi=<{?en$YQq0r7D-WzlfX8bQkawCQcOXV7^Y z=I5Ex6KNnA#1(?48y3vop}}eGp7T1c$*doly}UAeD0}>u;OX`V-T$mX^)2628n2b- zTj!pS&b>Yy3H5PyRM*I5L;GuFm7|;gmyJ~*^0aJz-XePKr{T3zQiXk7c>Y)6kHbPm zdqyJ;i3|~WSS@?1m*I-Z^~&Dt5v<&yLAst14!STjescKcuw3K7$PQIZx;uOtdiWxC zl4y#mMZM`)jWpRNvg9Yh7^uGAF%-L9XlU6;Z$1I7CLUB?`iGHL4>vMa-`J}{GrFR@ zoij8^7E0vRSWR!|lXQ~!DyRBoC`NQhG)2~0=3ckPZ^Mr&>_$doEF6l37TYYJ4S}|4 zgF#y@f00vH!SqpR^2udun8H%SKu_RCN>YejYMM~Nt#G_-cUhUU}f&1yEv z`j^dXVbN804Gt<$UhL!SVLPjykh-RYaw2NAhGy?rE)a^JM3}+Bv^(qLtm7uGHe$x*Z;uJ!}X2qFc61&tti&t}QHG zGnds&jg0KyAl$V@kS@FBT(=1q>Xxu~P?CEGgTF)g6Gru*@X>Br!xs6xPjU`71eLi< z_0owk@U6G!aYbrX&Iy|5m%;SxA4#%S&WhCvd&yeYZ$TyHo1wx-@_lgE zo_RJO5%xS1^5vBMlJi^|%H~-(3|DVWp)D5B%vO(|V zFY+5+2dvHY(QWrfPTmlzJ2m#qpQ95`iM{Zb{QTGaMnC8qV~yR@Xs^>!E%Li?_#r_v z{~_o2tGw=%1`B+7+C7#PWrqT{ASXO?F8465VF^ zXmp|;d^&*Z=`?@#yeHDAa(R4BQ4Mh_@f`j=yF;~gC-RfUtFm3~A2bjT@$KwsWfDY7 zOuo~hMl40dj%BM4(wE_ZAM(sq=gOTA$~m(id2c+O!fw{I5LUGaJY=w`=4G+ZmsiVY z>StZkAKKwbpD!lEU#WN_Pf>pDm7IXe9Uj=L(GgGQ@9*R^pjBjlc&_e1_QyNv2$M*3 zhZCh@=vUw6}ngJ>J!;W=BKFyelB;(Z|@0@e-@d{Qjvi+7hINXrN{!P z%Efagy3C9SmCg`Er=Czxg=24w6um6g+j*h7Bl9>UwD;@i?ce5cOstY~LVp)U=Uo{- zy*KpxbUs(MTMwbda{cuqb#}-J9}vq`AI`I4^_?CKer?x3qm$2wR=y~_c3Qqph_u)> z6v3h&9r?LbXhkMxrbvA;g+i1;knucK^~#Udvt7mO^hN9e?phUVVWCCR2C}DOoVr}V&wU+w zVDIY%G-oK5SE6_ON)3IF2~Gbje6n}$Of~5?kyRT-mTZv6hT$obr{sj8dGsyP^@;r= z?kGD64QgJMoEu~jEEH^y8R_b^2S=KSN|A5Y1o2xLH5qwXSO{M;#{I0@Fg?Y$SNBzY z1E3dF&9MZaL*SYGF9utgs=jcsSdn=hVsF!hJK)z~-yq+h$>F#c3}38~I~f)lS~_=U zW;#7IBGwD7tCz>na0>LYtQES2KQULuXX$W(2j$vyV>mLhM+7V$H5k}o(PS$k7O__JT0)+sL0imB2CW-HR+{Ooz!2=HN^u(yr#}wt6DQPV`x_UNI2wYsbCs1@JZ+W&dccz z`gv!HffWaKjeY+>c6W}P`yTNI{vL1O!qh=r5e~RMKIGM@nY=z-X6_9>_0f1>5692D zKN{%f{O!E-Xwj{9zfjM%p{NzJ(z$X1qP7q{c-$%LwtrLf!#Uy6KSnS7GW>Z^z8~6D z{#_K@=1rl4he89d=j=%gksYyYHWSZH#7*Q>R#mh|US{ghmj3kOr=q%bI^uhxTcjP^ z4X#s`NZf1oyjQ$WF1~P%Y6a%aqY%|Hv+`!B+27UuLE9{u9bBNHE3rTQFUe;Tny#EY z*I7PLW>qgO)-=wA%GPh_g;2J;^FP#VWhe_hA=9bv7tf7`qeDb+WOYqe6w8;*5+|oy zpblovy@_|owXrq5SM9j$kFJ`PQHSubZz5Bo7ZqonA@76{6rn}gYA9KN-!(t!W=MaS zE9M=t5ArWxgi6Jj#XRIuA!cQ)^;-~oD|rA1Gk1PRE{dd(1s*KEdGdSn!Eu)r$%^RF zK$AJmiq1PV8c^np#KZOagU~4^0>R+Dmi@G+YL^~~T@MxfV)oi>)WY3Ci^EHbfzzpS z;rObu$gg0CC^}fz-RDRDsI#&@+nIoraJ@OsUIyAlLqWwpkG6I!_P?>P16f3#Ro#eZkPl{C z!3N0NRjy4H0~ywnopmar+j4qUZ9p=xd*Ih_D66XSxb6{Z8O~8epCq%Nr1F#TnkvF< zCLSsMOm-YjkO%p6wARDnUUeqAAL#2qzQN9j%{k4=-jSU0G|)#ZBKcXEI#L$LLt_-q z%nGX)g>0M2+Lh^pL}O1?o&=w`Qe|UE0W?Y9iSdayOEYUN}aZsDbpxN>Ibn?~~8zCnG-eiv%pUCA62 z27;xlGJ==6QezwIu?#H$sRA1SiBwY=3ta%MBRUAc66R~{C6q4JtIrT7YEkz3*j zGV)L7&SJ*O7S5^C8DrOopc*OBE@FGW|%6O%(eUwn&aX_d5lX(<^$kHR+5K~R16pRW3ECBW3@6oM&1^#iS$M%#gnQ5b%!#W zn8o9h3-`y~ASGyCR42wqa@0CylP0ea-U0%Kr(0G7OAo)<#bhY|IJ<6=fb+VuMSmX`NPepvm z;<9UsGg+A)ddJ0mfiOvN7XU7aHA1g*;E}PZ2UF52+v$tZM?>pg?%aX%Vf(Q-Lw7*ZGz5dRnp7JK~#|_ za232e=r#FEXyQV5v3gWx+Fu!9yjJtb=|lG@my9<29>0;fCF|@-Ast1ORp65+g}b+l zWndic`J|`@Hx1;a0Whw?x7{hf2o=ZJmX(+lesuf zeC9|fD0T>O)4ZHHEEp7xIw8A4GSO*pXMBsoq2XKh+GL5qUU2@h3!lU;qaVn6dr%Uy z&@_0IeZynGu_(PXylc}@&?ivMALUARnuo1|g?~`>?eAyraiJUtYqvB3YaZXqJinXs zA(LoLx|3AGn`nohg(fD`KAKkND#l%CIp`i0Cq4O#d0wg|R4I9oe6%3`ZfBp_+)l?; ziz9S65J#_R6 z$a!2&rr7zSGj;@NWg0hxr=NT>8ng<02!Bd`%P_EgP!)b4uM2HhQWOFVt)LS#xXK44 zq4e>?J%z+aIcUA`RrXfbMly$7gy2_y39-R$(4`W#$FACEUNfA543o(1JlUh6p$+`Y z8d7b5B1&7@+49_+y-Ej&`nO_9oB#QK>_m1W>VQPT0d(jz;kAq_*?%7E zT)EF_vlE5DVrl7Hu6CBKL;|RyE&b7ItT;1ITv??^2rNvFy59SJkmy2wC-6?RgltU3Jyo^5+-MKDuvczix|I<)08QE zrtyes&aE!KujcRS4`~#=3<_~5D~BV|j)>-bd4|T!l`Xs-Tq;VWt3@QLBLz>~eyA=g zE$OxhEEvt8-T}t1&Yu+gXmFH7fF2G z19;iATlw)&*SrDR9zxP9%M&TwJ4;OT$$MZ{;dfP^<0f61%S+|4iju%cxAIH{6klGn zW{PlvJc(S2iVeRnt;xn?Z_*m7erahIEXl)~gEAx!RK4(;*aS`j1*jLY1D`}nki%q& zUF%9_QO6OKpk5wAj8(uApce`W#pY%uvMWTm)I{@B+>>=DFff9{!{6&K>4 zKhww^H5h8^%Hk0jW3j2b^kA#77|@<`QjN~@5rOxtzE=gBC>Wnx6}*maa@4$U)eNwZ z{H2Q2S8M`0uKaqnpE%ndnDWOCWATz-^dlU%egiPFm30%pEqlwJ7G{}_rMXaDSz~k= zZ=}$Gw1&7A%qcwpktKr$nPzr{_$@8K;HqmV{AaPLs zD9u*3h=>Axt!D;}&sLv|5H6Vub>}KoKg9BLHF}j6RO?-M+4AUhtQDIydlr&prNlW@ zl`fReCfQgRyn1zbqE>2cWHBm!{X!G(dng%iT_YY34d^@K>{Uw3!kAggvt1$)6nPc> zo6Ih8hN7IZFS@7<&4Wx8uPcPFe2P63`~9}rUsbH|{B*XsIGMv@tvZv+$dD4`$W*x_ z8ILi^X#X@{TP0t(W@TmNS@-N|Yl6$OcicPtZX}BzJHA>sC$eJ=E+*%->iGOnVn5)@^wh^s_Ws^+N*DJ zF7TmqWM|h39&Yz!-p4dpN%79=P)+lQwYgqt-Qw1dvcvXQXOR1|mIsvlf3b95+ zkA~-7Hf(5bgPhxD!9eU6bk?E4`0bZGsBV#Kdz!qKD-BqRH&-n#bnJx^A2^ zWZOKMd-z9kdq=1L;6Y6;d&?jW%|bJqTtCbya_uoq&$Z)11$%`K4hah6C&}UNo_ks= z`DwF3PDmc_(qysaudmC*g=2y&J0h<#)nL|qPIu0H{)R%Ka^4Ju+#Sl$TS@m77^%CH ztG*$3d_~jY=FF_%%-|i(hdU@ZI$h7U2u^0F0e$H9PR{*+U`0>M+RZaNC78#5h7wH3 z(FsV_L!Nw6_-|s)ncOtv=B50Mx9L0m6kcuU)jVk31;*xnMbTlosv>E=oZ$+|h_0K{ zlDFPAclyh4`ft*OPUilCWb7|bH`jj$FLQF!SM%uLWA@0aH;s(bN7=-Psk0h6DVCCa zpFUA+b2g~HPCS#IoRY5kHEDtULSn;7vjp`S*L#0bI*~7tb(ob3v$tU~piAXs3-Qb% zH>Lf~$d?NvOCAZ9=EBCFyP%OeFryb_zb=dPIX|3vPab#W{P}ZYaI*Wd_vnZmclXQZ z`uuNsCAoK9X=pvZkD6Y6l=M&0aqa$`=WW3k=-vwTOy=k#dv8AFo_w~he>Y`ay3Rk) z$RZgEbN)m=Ndx>Y=C@)f?T}=8|Cv2CbM(Ma?dthEYtv-=(l0oi9R$6tPQlr#$*74!k+tQ2s&8}9uOV6BMQOmdHNoUw4 zG8Od8uIH0|e2$eq{@3|(Oc0v8 z<@rz2#dgg|0sSk-1RJ+W?#(2g1Dfpqskz4A8%_GJP~2^yf4d}~!JgIk3kCubi*6^; z#XV5a`0TK_B(1A^gUJB2h^b)Tgl_njJWG)W-YTC<{A;>K*5VTA>YXFm4~aB1HF52n z;|}4V=^{NhiQE_yxqnTA^|>wmpa~u)%BsB zGeSFOhjO;dmH!sKaaw5X-wl62O1=?VI6qqTvT(|I`P{?u%Kd}7JUp*GIcrnh!@`Bi zou%1lzW6M;dT%gf_huyzhx7gssj7GA{o%0(LectA-jFZ;mTHz!+40fMS zuY#nVHfJS&2tT%Y(4=e#wF2wMTG=4aSB`x)Dmr(a@Z$dqpN>sm(sP2L85i7)iCkwy zM;(~Y8J+iR5a}Y{*caJ9G(SV@_l6dy$jp`{qpzQdoSr2%(%sqN2V$e17YZ>sOXumQ za^H7`&-AQ4EBkO)etsfS<)N&5jhy-_q2|4!FV_n{tenp~A?ukw)OtW@bDDha`nl@^ z@;D@a|4CLeG)P)8e3Ns=XSYm4cp^OeX!iP={L~%I_jzdk+nmRTq2d1UDI_cZNT2U- z@}4uovlGL$xmYEyS2`p{cmEN54mx)U0fb)G$)r!oX;S1~8Dl4l?yy=h2 zL?-C>wOFu+@cyGC+jM$bD$kb8ZY~xbHZFIg6Urx%8S~{;axG?3tIk_4T-radZtUDo zv!6Yof}XBdbB2?$Zd1{o&kh|KF13je}e+r#Z67r)M{=FjS0ip*O#`(&E( z@v&j|2<81eHq`DpM|gx0*$Y1CGod{>wtvM!{3IvvetruBVV>0JMplmw->K!CHSc{b zlH{V?#Tn5*7li`kKgB_LQQzmg=}C{}rwO^A-{336uReGAH&`CetsNSM-K^R?DZW0sH?{{Rf<_WqIiR@7YL4nu3T3N)^F^)KFAx z7=tawMr_1Fj5(H6P4OiE=xCR z=Y9A3%v^90zV546ufyA!sn5Ii=@*4(=XZV&@7Z7K33s%fulF=qdsU||OP+^~ z^?P||CXVsn{jUd*9DEj|95CJnQ$v0j-+4qe4IgUd>#X`*obT);p$OqRt?$9= z)6=@X9<|ETm4jxoiTSRo1NCUsUGVny4##xK;a|UOK?m+IJ&pL)w&+v4C1K4|*{~C2 zznDTQ3LtYorEm9}8^f`GYF8I^jv{J5?ks4l zrw03*+TRxKjpz1`)^bB9ePe4swe#RNxuNIt*{zqXy)x+R+^TdfIyg+(Ki+9(*+a6t zWlSB=PmhYH9nkk*?=)VRlsqhX{NjGMPd`1jJ8d849n$>l`@%xG1Y#s6%Bl*Jxp#dK z(Z5j_Z1%?`?a6enr6~8K$w6KL((oHm{weVyb1`L}-PB!FSFNrVHIp%cnW^J{Y<$Y6E-W0~)+Wt1_oeYOfy4M4P@rHf&alzZwGNQ%w z9@UlVokb9@2xIPuCtsgMA~MRW_0VvFwK+aFS**VkeSWDkczRDfF8Ja`{AK*}sA^Rh z&NK7aaF+G4Q~#Tprw7{|;nwk;#KXebZTqX$>fj>h;I7uH5=?FBMakI9;&fXsY@~Ig zDo~J>wq@__PnN}Z`m`x*Gn~t*C|Nq^!cPv(WVY@i5D@>sKd7s-Xs9n(g z`M@6#z24e+@{I6RZ`&HoHCxlk>c_?gS>1Z&K$^$8rfI`F^c)#cGTix|S-Pax743Vo ze#`#gVdq&@n<84aYglLMo;)NIh#uN+`B&Led=>QD?V~cDJo5%`X{G9Sreo%nt&F5R zrB!VgMu>86)N|G1tXiCxnQS~i*EfHPRV1&7Rl0GIxu(yv1k`)+aEgAB9M?vVm-p_* zF#4|G!UMH#``}6C_f@ZJ;_j-jo4>cg<6ES5VSR70;LFC8DUO zo#=(wo~XP$3BF4!673Q35@lf5f-4WQT=sjTe9+{d-MpP{9~S7Mj|=VGPT}h{@pF0O zy8Y2pcIz+tG3y#FuFAvA#(+cmRL@zD_e_qF3>;YxH@D}h$dGw08(o%ynR?@YmMbEw zm@n9SkyKt}`{I|IoF6{m@zRMF+7YhCY8E4utK-z!Z=zfD;mLr+0p;4tf{+0rPBO6` z(Ff5E{AT(v$r7HN0-1Pn5#?I%7`$bD%cz2}KS?+GVf3m$rl^-lxJ(XJlwt?+X~lWy zR+AwB@|Sf5zbj89ZB_N6Y##YEb}zp}1au%VxmDwH0Yh=+i7-!gA=rxK@o%gXtanex zc}4p2o6}hSFwNRb+(TOXI??)RX)OPll=w)t@872teL7hzW_nZi+%ml0E$*tG@8O-} zhVe+T!Ldocla%xl_rqNu-1$Ey8TYiTir-3NJUx6lGz!_N-L4y#x+wZTIa&1ezP=w{ zy`a5{D9Qg94G=Y^gTiL#AyyD-Kv4FZ@$v6RZo3N z-ouYqrF>-AdT)B*UuUPiK27l*X@>vSECrmRyIuXbHGVeveQI!>M6h}hxy4=@OzniYFLgTIJY2!mTx$CE` zWZTa5mBHfRcJtEUp>}Q}L9%Pp_{c=F2@{&ouBCgj@SYqt+(&b!B%vCR{SRipNeTQI^~4c+HctiQbS+ zd}LUNn*XBL@3zZ*I&nQsb%sB^wS6jY#c`dUQ-h0Qq<1ZFP?T@oPLM>K`2phC;vR#U z_Qcbrm(*0g{aT)hmY$OM6~^wx{P$d;P-4 zaZ`Gb{vKj5TlamZ_V=JT@(r!XluEwdv!gh(!7giO+qbiq#Fyaj8}eEGNxS>wEV1YJ z95Xa;i>|)Yj{Y?s^}%-M4i~jbdZVZ%K7MU@Cevne0>wwwqw8sYX6JKiPrM{tWSx;5 zvZoFX_r92iHB0Xf3*Q`_ss4F)v~Y6wBqv33)9DP`#42%o7@*i*MXIv+{`j|BR{b(l~lC!ZF}Z#7jbxJ{?^as zEBxzr_r|d2>Cw_-qH+|=yZY@Q%J=#1tmt?4?z63(&2VKfV&ki?5e45eOhI`QjRtkR zTIHZ#XtITN>Aw4<0jeJ+4Ia^zx_i<`br?E5s?`f$Euorn7^)M~^m-!Q$vgEEc*=cI zoz4LA`(*#z6AWlecgK_EbL#ZQ^Yh@IhNmB~pp2I#eSV|YGu!uj&j z{1!dY)Kv5{*|z#|iR6mB-`MUZ8(5rNPUCbeJuja0qXjf*?zDDub@p5EK0V9Ts_FA1 zn}{@#9Zd^V@4t1QeN_DJsh#bUlTD9oMVqw>-WBtUj*eIA7{dF(f1)yhz9APw^p8yoZG(DXSz3kgxNNvou|vrn%V<-VpE~%+42sa*y|}_lx!GCWrkk;B zAU({;9GET>PK4|J!B!m>=*un@>Y?RF%=8r* zigE;}ih>m}8LiG?GCjyXbtvj(Wn1jI!1^6~DqF{Mo!G2W{?TL+(*Wf8sCJp|c(irA zc%H=HIr)lff)Bc$EO!~5lSx9e$65VemXq9%$#kDu9u}+WVEh0lLRr>69o$9f=c@JM z$D&83`LL&Sg;&9I)dDiIeZX`i(;mSS{_3dfd2+^BOLWu8W5si10)VMLTku47)D?@n z(?|J+FIv!)^VN-44uMXtu5h)yB)OloG8yP9ljIPJ-)<9J$q~5=PFS6jY=+0D$C_3k z;w$^)0j-aP%j+YLdpetuZmN$?OJCJ3N(C=V#?yIoR`R7-3G_4H#h*wMIg02-PR~>} zf-Jb|z&G=JR;GbWKWkH)@D9G5sTL#k@N3qF9{RYY-N=NR+U3Xg8=bFZy=)U5i~s8z z^M`3KB34i9cYAdLbSzZ?a!bx_KhsU^%!Ld;Yq39c#$%`6>h$)j$J$wOO%g=b+GNPd z?Y9E{P*E+@;P~10j(6^0s6^TY=`f7oumoQCuM z;+SHY@9CX+bN?Ri6eT9*;ne6IQ>iHfMjsdvK>bLbo!#~PKOIBmpZsGGUG5xY-g?T)953}l{3mk3_(oN#=?BegghR@Ro88Ua zFqxy|*4U)HxEBTYQ=){ui&CpHe{Z_fGkZ44r}yC2o%i@B$Q)6B)q>N(U(EVHIz?Tt z{&TU{qw~RjvK@b~{omB-^PkC=*de@xm1ZFA+rGTpFU%FmG2;rqm!UPDjj0P&!@vuG z7fm*ie4=yOA)N#7;Z>NbC6Q@o$kW7YCzno)V5Y&C>U(E6KA8agrLSDz?R(nu%NMpG zF0@~?DcfBxkaN`0`n+B|7P#Jd=~N~f9n=24w21V5B0W|N^ZcH@CQE9#+)j&gGm#AM zGha;K44D%q;evwfzTJa~N)Wl5c0!W!sj@bmr4CPW##P7h=y=iY)U=EbMQ12-M3(+U zTXa^K4&O3gM^341zcu~#*V^gp;zYj}?HnA$r*9B$C8ncNO6}Q1_`z1j?A7h;xsUq_5x+`JE}^VdJay?n;H!5*V5HJP! z$?2!h=y@nvN0ONWMQ=p$Qys?Z&gX+tRg9kA4$q87{-EX zwPTvzWTwL|)Pc4~a}sypr||Eto<4n`)gI9YbU@Zy+DdTs$#V3bu1V)r4J2}muT5Q% z_=i54As%eaRT|l*Tf((J=XEz0BC++nxCy zQx%|Ul}$n8-M#m!xM+U*3DEe}Mvz2Pt$Edg$4|DjYASc;-=BWk@^ERIa+Sp?)G>+1 zvDoM*B1m4lwiCUn<>#w2aVDTKR?5^!O`V&(=9w-a+vmJ?c78jfAJF{Ak^*B~Xetb* zmQ9xV)CZt$yh)ALNEk>#;44}+&D{y}pwo1xnurdEGNufJkT3XS_I5n@h)?nkp0o zf87D+^i*)R3j5e;&R1v>p3Gw5AOc<}6pxw8UEFVKYFKQfGfbcR>R~Z@pE#*ghZ*d!(OdXtMH}HA>~eB!GuTP$ zIkPzvoLPPw`Gb;&vpTWy4i5DUkH$;E-|tqw)0;pZmlaDMz7A{IN>ht4)rM2C!w)rZ z9*&{=xD&D>I~e@KOX=Wqs{CftWy&)=!SC&4>?jyCuoEpGYhiXwV%-=SSqi`I{S zTO*k1Ed+z@*?NZJdfUH&I?C0DW$I#aMUrm#kxC=H4?Yfsz-KjmP7@!}ck?Ux@s3Hu zm52A#=74Xw_R{4`m%p`qbo11|ynO8PCCle8pWdYUb=Pj&U!PZo`1=;V+bhz19~!rP zNmk%*FQQU^l&AdTO}zeI9f8*=Ca@|W`V*V9{)MIAUwYlrKPyt|#Y`L8ucuQ{gQAHU|iYtC46R#WOPS#!mj>(<=1=I%ACmN#17vit13 z{Mh9Km!Gu!^yTN)U-%V0<#o${*wfy={I|>RYsUR2m%k7!zq5RH9k4E6zP>5->#W_p zm2Kbp4hrtiEyDGh@`(PdF2(vCADd40qa-eUUoWYh(z~9LHTv5{uKqm#_J{HXf4*7c zKP-#%idA>k?|7@FhXt3%E*)A=+m{5X*Dt+!>93aFvGjLK{~SC&-n9E;mcAVHzp?b4 zVEu!p*q`4l`*W5q4(^vMT^PJCT>8nETP;lxw_B@s?XwUD=LKuh-Wxnzzj65u%dcI2WoPu_<=2M`&sly}CwK7jzRP-DwH^6KSv`@X8*Y`VO8f7y0vEdPBN@WJJOTmJO&7nhG)K0Yisb@|Nj;AhL%)D7*9-V%l`bAaObnVzFd#bb5>m#yf0dHX_?4N1_PR?;(b=k{wf%N&l)Y|0-P60fn`?h-ubX?_(d)WZ zm#?~b)dhW>Q-tZ9?t4;M zsdD}QwH1D-*Za$geOo!t?N2NV zf}c@7ohfu`l~T{(F7Bs)*T3JD0!j`^&49d0l69WU-|;^w&3qi%0Z&P0_)(FFx~6Vd;PL zPW<|hqw)V=d5?e5J>S;#?<@cK!&%uM>p7q5b#$-K#FdZB>Q+B>LN7B2#pzXWsoc_I zUIio`p)&5QbY-^uRCu!a%n+rE@WPO%q=kvO@?lv3>PhJ2dR(fJepLMB32~X1Wj)`u z_TgERva5H=PxF+%_|BgYw4Yq$i#Nga&%cQ(AKf{;B!AVuao^uvoXT(Zw`VTASI_Lq zmn9n>(=$w;(?eP>vICM(IyjC!!WX(}6si<)y>c`2S7FxGx@P7phKF@v~%E zUUW>l2U*F}Ju|lGE;IdvMgto>fnEy(}1x-}@ynefDa8fVw;IMnw&PNxit%ByE zy`Gh~@Ok+N%~+L1erQ*#Mdpv81Bm$Pj4XpdUsjWF-9@eo+nR?!ehnEjHiZ7|tk?Cr zN~bM8bT$DGh|Kf*%Ik6lreV=cRZXa@lHsO~<-%~0cLVL5)je7M_Q-=z598aADFZ-~Fl)Cr!AUD~CbXe&4+ zkLpJjeBf=J@f+jIs%c&j^&b(hetwkxPP=?v`P;AR-3t~qde107;((;tK7BpD+=3^TRq&)={k&g)Ikdk&p}+px+WpI? z*lq12`~JvsMjqE+4oee#R{Zs4LHUjK(|vpK^bba7UyI7V)=Q1qY2n&*0u&FrC|o!# zh?;zJ$%1M{{?zT<8WzG|`m%n9CP9nf%b9+DP=9%uGp{ZW3MRs|4cxZT8#7g;D_n zU)5(lYo#`jpNaQQ7Wh_O&2u|ZFn(fwES5jt6h6auz-H$UG4E;W<9R9d0#WxlGs&F2 z%oCF_c}Zmi%#3Y5Qe7%k!pbxjLzxZ>e14mD_l;WzKdt#@e1d8corT`w>zD7$!#}%I zYbwI;Jb7Nmvoc;+CoGQP-n?StZ;-wD%l4~U_4fP^`pD6M#4UKOc!0oIbzic}ovR4G7y~aE8sVQ?@i2olkCn_5-g`B~@SBAp_f>8*ZmIvaHS3xvt3*!^ zofCc(4bY2_5Ua@L|y!)$8J|rze~5>CQjvJ6{#8SUhEI)c~qF~f)vEzrP#Nw2={&?fihfE}0gS@P3^m;ifJb?U>x);Ga zTu?3*AL~SCa6}yk@A*o7Vb~_d2;#dZw-^7qto=>@C902N#tV1}_ALhqUmx9e0T_JbniI_bZ+UCG@2*Sr;94l*jHZ)lHVZ5w7sUJ>uv zI!^JO?zCyo_-bc#NBAvw_k;!X%zgW}te@|9F5+w(#2fZ$ce@2evmA6}5tTQI?BrH; zX6u#1Z4WXj)YyZ;Q{owq==*Q9&-)d5e_{V`8V2qc(+!9r*t1Wfc|}Jt4-TI zh^tsPz3OqnRv(7z!=cl|j&Jrfo#uWX_fs>W5<(`&qx#%~!^#JS-&^Dq{XT(8~T)ZTu$@a)i@LHzo7j@%_Nd;RKZ zYO;#xg|w1;9+31hSI*QAab;SqTx9ynM7rqZqH348?&hNvcbMPA)4kwe=R+&N8da;=+@4 zqEeC0e`ylj^fc4OWo$mNNLktL!Gd6Ch`Y&-9azebBoSo+u@S`hO!#33uq9ZbWF{y~ zw&UcC>0>x&IDM$5!|&uyjxIQPA)=Htfw7oqUo>8EJlKUEP$Rr^Dl98=Mn&N0h^hs} zET`kDSlr~akgX!-lX**rmnTevlsAN{ti;UycJy=lnmj7nsTlO^)c46la1BV~Hu5dz zwL|ce6>a_^szP~kJSRs?wu9WknOvc3Ev*hk45gz2^@IN%>}XdqU@lp_Q(woHC$sO@ zGs$rA9!)o@?JqwSn9g767XrE|LU)t$0?0MG6a;05PH3)w;i(F4i9*WC4 zR}pBHlI(UIPo+A^D<02(OeZ4Q@yVg%H47d9qVln6|7;OH2mOuYG?_V~r;!XDwilj0 z(+=pcy8X!;7h%{hdXtTMNHix;Uw!`c)m0mU7veQEZ8q69i|_hI>x*VW8d-aBcu!Z9 z`DJ>Ass&T8ewOTz^(UGvrmVY{tWA>&cy{Kms_9hE(#P$cE-#B4ma<^F9`0QPIFXJdAH={;cwa=N!He_!9b2W;)7tg^Jx3M(d9CWTMH$s_{YTHja~{xVMM9pv@D|$5VV(43-=A7s z;H!B?|60R>$L|2arcK=e8^XW<54eJH)?y%#BJ>~u3mP)wwI_uYU zCzSWtsCI3A8O|*>cwRfdGni~0uN_>T^Ziz7z%N7KwuIi#op+yie&<{}Sv!9Zupk&+E#=S_2*J_F(-F zMJk@Vm@53)PU)6RwZo=W~L~o8l?YPFAc` z!-21E&c72B{y9qeaCm-XpWLT7=4Zm4KWVKmD(>?iLHF*p2L<&%DQfT!?d)0cO&Q@A z#rHnin%>cA>a}=fr^x@u5?p`PPZySnS@k~(ZhAz&qA1SGiV6LB&wN2Uzoq^DTXC3Y zmrL^G>Nk%HLZ`N-?K;`tZ1?*FpPjnX4MF3QAoJGf`D4N7v&o=4qrRoE@&U;N*{Kih z-2?ixTyGxsm-dX;N8zt&)o%@sPf0$U7gzsCFVm|(6Aqd}`mmn#>Q?pAAZdE#6WiG> z;Xf)nHvHD>h0kJ5-l)ynoBpUOOH_)eDAYenk3JorZY|2VbE{x;u}$Q~{URLvY3uz` zpJFkgIkCA1g;99wX3^{MQPNpao*9wyr|<1qk8LG;2hH8XP;razwc?LDuP}nT^1k zL7U-8yP>Cu70}_Y>t|D^whVt*Jxi^d|Jpp+lRC9y+u;}D8Ak`Vv*TZ9^%p%M9v&^K z9;BJ5aFRpIzGDgLkwLR(_e|z4Z==pWbTIaW--@cM*|@ZK`p~P;;ALS?-VlDD*=e2L z)22F8&XK268Hi(FsdKmsiov-M!x)|tftAD5-I($1Dh7Y=1 zn9U3GV9f17Nj(uMq34+n4!eg#Q(tB-16)u&&cCN#5Y{|0?S$V-UkG^>DsM!BP7CY5 z6uy17?_cfY#J+x+#lCs_d~{ITy%j#9HLFSEp#T*z3e+t&Nq3_q^0M&L&>cM;uCoky z8(A0nF)z0d6>w@&Wav*_pm+vpuuHpHsn${dHZ^eK^zr~$u`@A%oy3!`W{{pdU6a*! zPp*(jln-d7G)dOUnodaM-fSQGw?52Zq$bVm&y}pz@q)8nmKUGCI6P93s~$*g!CCQ~ zn>uGZ6MK|VX;&<#v8wrIW@;GEg89LoCDug)k@szeqIsEzv{o~z_3TjbMgLwEkKo-j z0ekXXX!%o#zzSg1vo$6+WY_5Ev0bn7QmvrsT6Gy0g-7ZVRDFr#%*miK6;P@~`AXGz zk?J~7PbJq4i~X?DHcV2BYTBLsh=b|eEYno}344lfd9s^X%d%Z3D#yPwb;#@uc*obZ zNALM^#Hm*0Ddp+bg&Tg)gcLpo*8a`m|kdnH)HA?btF~eB4Yf5&XctP zx_5*{)3MvcDgAeNsb>=3)E47Tmo7M$c^7(Gqu{H09^Nxq>C?k#rlfBh4S<`tgML~% zwyW0_=g>)$hZXI?Jl&p6+1;u0;fs>P!OF(Jai>k=K5CcM6p9~$AupcTz;>M>o;(v2 ztezi2C6!4A6ZyV6SZwqwUZ&scfl-UvZWU)Tk7T~UbG>6HyLu{SMU8cTo*8q$=p_HA zHd(|FUWv-ijEd=O`^mV$=aVmANmtfMSbsv9EEDrwmHgE&`i!{6ap}o=c*tS-(SmoN zt?Bi2O_(f)WrOzh_+-+d>A+7)Ta-D#1AKT^hnc6iAp8{7(s6aqK7Dxd_jPF)zh4Hz z@0ZE-+9a_a;pzxg^NFX(&Xy6!N>}}=Q!cCM`^oArre&NOmi!=o`n7grcIt=HOh1x- zAw%swi`P5T)85rPJvPnG{&v^$;D})1GW;!kO*jNuAu@vpiOlew>#1X|=a2eXBvIFy zZGJ`7Vn=2Js%o1WPn7WR){H{v1pKI~twkGtGd=tTX&pzTu^y3bCa2|9!QffR@x8l? za~6*>KWN9U68~cditVjU%h+cj@Ar$hu={m{h1Zw18(o7x*UsNj?w0J6PbHa8i4$Ji z$@9@n6l3gaRO6nih=0(Paxi2N>Wz4Ln5?$h4Edi0=L@46^hT3l_sUPyaQ~wwo2M=Nq=q`F> z81by|XZzOti%#apo%lDyTh_tfrWJi4P4#n~s=0`GH;=@0x6#2A=MZ@jlRB@z>+*GK z@X|R&{jz+;6Z@_o!;gd3FSC^Q4u_x93CUG^VymM&PqxE&azIoSH_80?u=O=*`)^B| z{>S1af02Ft%Fg-lXy7T?1EwUB{fXA4tS`0u};+E=L182tNX&7@r|h( z)x}}zqj)35X2slf);%PM?_2!n1>O6*;m?28`55xi-2BqjYt zf1OoXaI`41)zvbd77wNaiYn=EqJsqf`1SsNRr@tB-aKL2%}>Jn3zMqf>J#!`KO6U< zIjGydE^fFsiD!-`K1UDNdy9W~e5o_Jaq8UVe@(6MH9=?NaBA;39|~8u{>ufAWj)hx z`LDNbC)c)8y|VCP-0P?9OQr(9FgoA9lZ3-hPg<#Nr9te|*RDZ+^G<@q5{p-lea3vUgzUi6})&zqf~uRRa+bhYQ-#MOS( z3CJVZI=cErYY~ONzVj9B6bDt2quzA(yKz{iN_nP`iW|uQLJj)SnVz&;&(rlt_eE#5 zURX#be=WWI*tpQi;o>Rn_xP~xt|E7j?(@G4v;O5*^6TrZVX3F>5{?|6m*ADr1nd2P z_Ae7y9sw#-qjXK{xHhh`eHf)1=EnIvM1ge#eR>eQJ;+hzy}?2@xqjnlhXC>D<&VHw&hFc8wg+TidUS z>6^kQaZ$6b@66uT)k0?MM53nN*90sb<$l&xDl>lEDp9{I-&69pd@?S3d{`-Buwkn{ zC|nY|TR%@AO#N2e@Ra_(ZqHXc{_s{X+Lubfi;{@6gnP@{Co#oFMZ@%Oq~X)x*CuE5 z$k!?Oj9>9`YrLVg%K^BgUCtc6r`A{QPm?Ahu9u|opxe*%^k1Y8JT33e|IWXnv++Ic z=A!Osp4ly(hggT$#y$N;w?0@Q?+wmx+ZEgP7t=dV?en4|*9AA-u1*XRI^?a}6CV_p z{fAypX%9M-p3t4|4J*DIUOhM}{jE6hbAk^TKOnxO@7l@jo;^>WB~S0kcku8|n0~xj zIDju4&`HYQxU#+8T;Hf2;>M^(1pVgL?RqioBlD!axATXQ_qD1!!Yos0u3EcaTIGv+ zJ-0RJKCw@6?i1qG-)u+fZ`l#sraSZ0-PrHWjWT4!(N=#WypzvGzrDGA-ko;)>2@s( zk8glRaL3vw=SBLvq>g%~1B34+$%D7#FZ{c9wmLkxGk?`V!Dr`oc19B5xYmA3cRD)E zxi~1(TtQ7t^yaAOyPeJz^+7$Vz2CnbZxwCplFS=+OPgl$i%x-m)VaPg$jZ%m zZ2gCi@8rMPJ$~3p;T@0buSW%Sme}3xSkH)KTA|4l`U}a^J~+O}7jjuoAm6U)&UXfj z_51DA3F_$T{4Wioz8K7Jj~ec+JO2xk$@)zEdhg_voRiM1d-d1a*%f(HpB~@cCyJ%h z?%C-~R?bafwR*s9!`A1u?t^;m8YS~#>ru={y__GFJ|&j6&Z1}h&7Jy(Th;3P>t}|k z2gTVzj-TqLFzVX&{Ec*xw*=WU!mRs+Y4lhUZrAt$4Z&;_(UHsh>sDc-j=*%SUv{Rq zv_Bs89|m2qEg5=j!7IX39Z=x%QY-mEYiGB}#`(>Bl{@sD1B1c_tG*J(UDOqPP;x5| z2d_4#gjJcTK3_losC}FPK+1r%D$^SkcVaphIO%yMJ(~t zU0eIMLHr3})ShX*2gNH+jp|mF+as&_=Rrqi=Jr8d&-Ev!D?Yw=;=O9AwvO7@CaZLL z_+{7W_ThOv4eKVorZ4B!(XUhfd3(o4X9k@}%yym1Wnt{2!_2G0Hd6kpX`G*Fonj?-WD)3{|JmubGYrXAvivhn0E${CV< zuw_u#z5U#q&X*@!1XH zShu!EnzWjJ`s`+5Igbln0!&E>^}noU9hKPgJW6+k^Rgf1Yw*B`u8Wh?P;|I&Bi#dR zSzw|Dw zJbg_6k3+*yb3M`H^bc6o*_w?868yljQ1xKrIi}sKzMAT1JEUEUM8G^+zAg>)3SO*r z!+klDs7{u&4ofCxiL!6l{rGu!zotGxhc?pxgedr1oyFDh@iXG1I`f?pzUcdMVQbQ- zQ)Vi=Lo$A5laH(dajljG+<9d8Ua;a1&;d}BAN#gTPKrTK|xzA@?lf_^r^a)U*0^edy+4Ue`BHQ!rap@1mkB-kCy{aqzGI;~u`T*S>eSW1YPl&G_8_w*q>Qf7?=G$@P%hMEI z-JW*t%pRA#)Hh0BELPF)6!m^VcHegWe`uQg8`3o1R7cG3RS)!!iu}%BS>>pmj{} z`L`hZwjz3Ou4?XYgUjcNA|6q!@)gAqUsx-K%G2&2{^p z_LA=Roc>p3#5eN%yefKzy{y%|qxj{a-RrJ)s~+?xN#c{!;7$r-WG3GhKRqapN6)@A zY4qW6?u4-Fl-{4*K1~_<=X^i!%46}8vI@ZOQ~mUgFz^%o{O-=^lfC;=zg2^LdVC&L zPIj6+^~r;q8Qt<@V8&D1%kvjl`5Q_37xue{g|#T}v90Eau<~U=;)QuFUzfM?_xjmv zy5CA>AKDjrESva=3rgmpcxF(SY5cVA`uJ#BeiQ3YE}=YoJ)!jdysp#ZI~kunJ=)Yj zwS&jD@6Wf3|H`YWE89o%dHrP-xw^!DAP>#I1ep)#>-5Ded@o0)QM61u~G0DLGY{Ta$ilaIxdKdd7h94{I$59IMJ!eC4Nqsm-MRZI-LtU zmFpH-%8s2ez3-WQe{_4I2dYKbs}sMlt3RBcc3<;BWaAwf4eO`-FGYY&nEJ=AlF_tx zJX)RsUG?TP!r$!LOOk)PEjZjCWpNx9CGQg~4@=Lzt5xjQ{bVgYE3N#Gi(CJ=y6N2O@5!p#BncqX@fQn? z;>NHU%uekTO?(R#E{86}gQv3gDzyI&P*!p)Z-ic_A&;8`M_}lX2s?&X6 z-1pV-4U+}`CJcXTzUo^#a&c8zA^IyM3X*e5&u?2q(V3pv0AquOuHWNPI^Py7(TC zm%0_%YwY7~;|F^MuO~$Xhb4WUO9foz9tVdjCGLY55F4Y1byKiEY!o zOdjAfee}XwmkoGpe^GTO2mEtU>oIn zr^Q*G)M*~mCqC0}&JX(k5Vd}_)BiwcaZD6-bd<@vZ9?u=Vc;3vZ?ohB|IB%Dhp$Dy zu;ruWQv7Gn`+ldxmv5GOE#)7C^}?;q`=UlAuBbTJyyOx<|r`ZSr0K7MWYrd_J^Vu8uWzJJ;yy;DCPU9Na1`HW0JF}q}X#p+QvdEl}* zLG@PW6D)in~o0ej_=)MAi{Fe7?S7pB3fLk(dT=!K^!VrDLG)?i z$BUz-!;|2Lv?miN_e^)yffBcqJAYX)+oN@=g4`hbm!b0dWaF-VR&@9gorze$y+Qbb zr^{ zH-dx7j52W9HL`5kC7ZPOy?XAB?Pb3>!IQhsulHr@;NHnB9{vlWs!M|$-`7mh6!(3= z!X|%c5S#kgJ^K7%L1K$A^kMP(JJQo`?V7W@>ddI_#2~K|?u|i~M}YmHU;I6--!vEA z?d`(R$8^5~;);hxSx@ecj}I<%CwZmpgL{JjzrmXBW)jqmVXJCNllIK?+NO0pxsy~K z{kHs6s4%tX& zbM>=6b#MDp=cqHM2#*PT&uoYCP}W&^tK~zA>wYh4`S>a5N}rps|r&SyKH z;}?=$UhcORm?)~Ej!;II*9M)pU8^@!Rl&wL@l5Anxsd9sWZJNp@lt$7_chhkJ4MB! zj8BaIe=pj9RGi?qgX%-Vo&ACx57_4MI{B%rmvgfjaTX_ZY4|{~H~3X$0i6 z*tf{S-f77wbnEz>xh1!@0^T#Z6C$U&>6-^6nzU;YN#`88;xqbxquy=bv-z=Z2-D;$ z@ECqFY}EnxV@cXi_xgH&`O4x`vPe`5S-onJecFN9-Z&G!bVoZlJ$|Um03U!E;JVK0 z5kH-p<*o3=$l&0C**clHPdK<`R4k*8A8XGbXI7i~BDoZIlnc2ss z`My4$PWPHleXHQ|t)!M{%E$YDYG30K-6!n&^Yr^~)OG2kIxT%A{r>gobY|DVTC!HR z&#U8&>xUm?>+{nEk4zVQYr5r;LC`F5zPU|19~D(_ODs%ZnZ2U(r}mj$`^-KISku*y zTi9B9FUt;)b8kZWG4Vf`b8PR=4@PK$Z|VVQhB{=Q7jL>S4xsykDt0~~HCkfix*yyY z6|lMFmVUc0`3OI0-8^#EFYYV5L*^ANMpnQreX(@U=*hhLU+UQ>_AK3ZXNL37(g0ML z;SkdqSoIf8N&g9TG$K#@Vk*Z}g{{obz^CLfSf$_Vcr7lyS&&sxXV!xngNOC=LxRy> zQHQ*Hvm751b($?kOQN0Vejp-%@@T~PsXWAeqVydXYfx39X6(kG@Y8tId2xix7Z^qV zq?z(snqfw|(N6hhXGZloy_0KtRk*Z8I>~Nnl>9|FhZ^Or7aV1FOlVWbL-}RMVYJ`75&q{LJwC{*jC5aHi?oR63-N=ls~KAjI3;R zM)$-;XnSgD#9U-h9?+MJchOkgDz1xGPHR1=O7xnHddyCT4P|wiU+`g(ih@FFs>FS2<^Da`l+HH<;R!Ig+P$UVNTv zt8_Y2BZFVd?4TFxW_?vqJU1xH^bmbl6RS5qFZpG`OinKEwr&;b>cyOSfq8OOimdHQ z9%UKHYOl9wMK|~JI&r~YL?_GrUTx^@J#D(!%AA0evJq+Xa`s4a(|tv<#p>l*da4;? zVg|C3^_G`YEM9m;5@S^{G}`t3gQKiQGJ}_#S6`Rc_?Shc(i+TIm(YUi)@>)M+d9* zdxsY}GZ``bpw2DA(3qvFstI-Kws&^67+bn@zM$A;3Ef=(fiTWn(bu&jwLRKZSG z227$QO*W(M5uU6siZh&QKCw9Qm@aJnvRHNCf?pLyxXE5ZpP^IWUIWyn7?0Y=tL zipamm@nr3bXX)n$%bc!UQy9bc6S8EulA~ate>SPDYu;3yPJh_7txlHk#Ix*3 zOj17xr;VR`O*OUe`o)Oc$uoho?mGSMRmS2bcra{HjXM!9wE+VOxuBlq?|N9UDM3S? zqBG}xmx1p8mA<<@ygOUZOmcCq_BFYA(`VZi?qqdy`tmUNZ0v}(X&Sc{nI%^tHA>u%~|v+-E)ZHc*)-pgUaDPC!(ZqgWRFk)395diTI}C&3;-WrLOI zc23LBw8Od6bgiC_=j5&EA8e3M3?BwJrd#!#Kbi(-QAyr;n)%#$I{aCm*fkhg6Nn8x z&{WW?7_izD5k244H9Lo?_;=OP;{EU$n!;ep|4he0WmDJd^aiu0A2Pi3aw2McNjSJn zHh_~_^vNf}+2AKXsP(UOEmrl90^Gqn7=R9Bj>`*~p6&RWOky+3NWP-^+4OdXqiZ&9gwuKdr0i19~W&({KKJ5w{|T*Q7ZdnaBC4yw-PTN1l{5aBjLF`deM( z@aA%4_HO3~1b2B;y03k&h{osJi_U&*lD)H5%%a;PI6OKzyxFSn_Y7L_nPI{GSD8X6 z-ov*1LFXnHLCjn{e>%!MCrjqV?RDE#pYGK44YW4(Z}$6`JZkdHm--EV3qSA)#e}}u z9WUulvd;Go3J>k{X%3=Hmv_B<6x|9$ZuBf(H;qlN&zEM0 zJ*)d%m1p_5R?E`j9g;u3?!q@hS7UdRC3^dbRjGuzwK%N03e(#TT-f-Bb{hMaIrYs2 zc7C%@Ja7R$S%_!#bxhyc67s~*|sZ|d-^5q!V1KDAwA*C!NT`HyJyLC5tXkhQwyLIn&2^U}3iEJB$@9IP^3wO@z&VP`vU(Vu9>9LQ?xB6@C?tm!vs%Y(q zun5QcW~U&-O>WaoYxjz(RH*Kl5BjqUY~tVhYR~_CJ9$W!((Yl$t?g+ki;S<4o_R!G zgtvy>djuP~!}3vOIK8j9(pUPKrY?I*AJRR8Apg;x;h{L+mH7belkZDS!G3vzO@G?G z-o)RD2Z${EBtO*u&F^w?w!nVjC)nH>JoXKmeE(Z?uYW9#!)v53qzR)xE#C3&_8{`8 zqnK>H-LmD)XI;~szMpUJZE?lh`}C(fU->h#VZKpr!7IX!r**gEqQ9HN&-K!sKT<5@ zKjJNq>u;C$d|hrH9=CdEJm`wx`A22;9o6~qc8vb|%_60L6?DI~kVF^u{GH;#@5$%# zglO){1$51fdQ=ek`P%1ovNx?2+dZmh%UimvlmB$BMq{bk9AwGdQQ}?X9EUv%2oSaQ66c>rMHo^bOvs)A?n26wmJo&rS-Q*13Pb&z;l% z=dOKZn74mVmr3`ks?=W+4xHP`e=aY<^nH@o@R+WAb&!#%&tCm}*n9GVL+;V_zh2br zUB%$v-VQF#Q)Zg)zxVaY=CtpUB=Na3y7(G9Xcw3ZxPba=7RzJ^lH6_4r-12wa3%rF(4P2T73KTuv`~p zo`h|~JNXeug#$Zx3i{^!chVbvnLjKy?b<~)qp0KV?T-e%ww0Q#ctQ6NVUnq?|HmG! zR3Ex4IuTVpJnL)QgIu;phQGR%EyuU?dKOjue0Xs|(AzQm-Z3hiS(`g{w))26%xZP7 zEq{i^eNdm_E4#f_ofz(XHvVdkIDKfFPW+`&(-V>eB+mMIC*hDtK5Lm}w{!b^c|7k$ z?L@b1dA~AWuI=yiA62gA-t%|JUF0EPX`0Q$u2T6#^S`O5s#6gaVppiKyty;u9U$o^ z=lF&s+ljyO8GfUcPRGIZI{yRP3-8&Z!iT$hruy`+MrkU7b@sa_j;R`FI>4Hcwqr6_ z?xadw)m^NkwedTCHB(}DYlZ4fS>C!bUDF9(-aGqJn>IcGeD=1Y0BT_l2wtX3KBB$S z!^FzJ97j;Y_3dy39&8a-nX}4AvMOm$uTZTbA3^8eJCkl|=yz$Yxc@W4?CI;H@}8f9 zZGA^8xHPEg%d~BG1Rs+1X|03)CT~&(>rXqWJNrDHnYaJiG>ld01)`--=+3e}wu{Et z(zo?@Q7!S_U$j|-YFG72hYk6mPlFi66d2q1De`L$5KH)>9xA8{c4O>LH z>Ph$}#~Qk#C!7=fMAT_{@c&Xbq*B^$8B|4xw!My%lg##&-dEHy~*5d zdQHWah`TbPZvc&21(}h{L1HM7L z0Vk5bvNC6y{>q=^spFrM>4-~=22+sVV^W$(Nl{BdZ9e;u?6_8Ipvjyb|J1@}DUxIfCU6}ODUN*~erfTlgI;YlF)v$QZ^kxwC;IWeGo9ml=U@0_u9t8nH=6BE0+r^0D|o$00s`%HR&NRXX5hPjQf?8gfL{|n@u~22&y+dTz$0V#Xh%*z2{SeDLp3IC zjb9Un^IwkFb7qRE0mE(hm-xG!of?Mm&hjYP4X+umACKX1%()9+p%Wd=#j0UDkCwln zLG*?L476rOn+nOf<8-f_`Ja5I{0K0AW@LcHeptAABk^$4FkZn#PZrJ@)km4kK ze5wfWP3JVeWR(s+r=D%vgXd1ex@WeT z9AO^EnE(e{@#XPd^CWujPB^1F34d{#1M|TVT+C}~5T*w=-{E*$^?uPgce>r<6?~@r z!Z5%;m~>w!2*3Dqoy2%1d81{*k&!TZCTYSeUQj%~%Yx@fRHulR#aQ6u%!Qn@MQIbs za4kP744dm5Q)l2w{$c_8X z`SK;tly-MheKY5=5&;5nTxz=1(AS+ePdyodf=H{G&k7!MhNwyJUy&I!!1lwnb*!hQ zu_jht^ILx2m9v9FX9{^F(&wzWhYk4hyZ74nTr|gcXy3Ltik+ zIn#Z-NJKeb<3EQJ&J)ie>tuWQD=hNm`^0`!y7O71uHiZ$2c!Ad;R&C+*o*HX-zz5z zzh*uWIG`f(dtw_a(PsG#6D@IK%g`(AaONv9Fc=~0LN9sR3e2*m6}~7c;(TNbyUxCx zwRe6Vyn{0nHR93t7x$eEiHW7mc~2GyNyA!XrO*WV!9*d&PUuzq`KTRKWIZ@jtC~LW zgT*9>n8Ngcwfl*+&D2-;Y^M_o0Rhj41I`Vm3 zA^G7B!!OX;Ktr5iVlZGq5;}RS_tW(92b;lAr{^`eK9L(w!i{k2iGw+jiLTkx#I#7C z75uYHQfWR1`s9WP39KAmHXITr!zFSQ-Rb&^BH;J*@B#JVOe3FGBs?ByFJ4n~h9*G) zwv99$%$cZ<9owUbq&3sn(9%RxX&R*cbQ{G7J>L^?_|^(ejYN0)D;y9Xo4t+ph=0=s_)GQJl1a8gnfS@b z?v?NK#?e_wbkL+x4DO*4Sho@p94%|;5}ySsg;`>}%-O9#|Ug=L|-Zb2kv^v8{+chzraF0$P}OC>cF`Y1U1Wvvvlz{67}7 z&yHRUZ|r<@mzj1t6KY9~l^M@w2#_*38+@}8tHSBQ2mf;qk_3hhZ=NpJgR}GqJex0Y za07neaO4Tie0Z?4CkN5@@M2tLu!}C>#Az-oQjBaJehPwQ>V5nfEC{2B0z_`dnhC!Ys z;=IU@vAXcmiM^spFBd%@^1@ zquKXl3Jmv#IX*qQi~44Imf!L|p<1@y^hbtOG){CoTG5JbN9P&ca;RZ=?QlUmpq&qO zI9c=u{)06*Hax;<*c`YpoW`g9TRCfYn17>6qgc3PuVx^Ae|+D5-;f#8U623NqV zWx}%^<@10t{R{^1M-8S~{bY$ad7l|w6vhqBjFg{j0z0w?>mTi8Wck=`w5s{-^okqn z2flR*xr|iak49 zky=hzZ3+H6IqM#dw*tM%BI1XIm-v!1c6Sne{0M%= z1&5CgZ4bX1s|j}km(g`cLjYS=4IO+=Wb_hy8vf{cWEI?=GoX=zDQm|%L3V|AuSoXs zT@0TaKgnc`$zjAFhjW3h>wSlTaCAkI`IKGaRio3vz1iL95Tos|eR-&O*Z8P(`yz?x z?=&lGcS^G6$STxJuOX3qVk9&#$jBYoF|+z$*-!v20zC{Kjdfu)qbpcFzDVozNtgs{ zhYtO1EH0GpX|QA7<0fzje;$o^MIyO+<+R3&zy^jV14mjB8y6Oh6^sV`28PLS96t+Q zLCOzjoGe4Stl#2t7N#z<2o#SxxxuZR!s}-E!w?fH0Nc@BDG2Vuuzu~(hKb#l7IQI6~45NV!4)XZm zOrzi6q@=;hxr4*#6IMQYwfi|yd}}gd(dEdqfztnAC@dL?;~67wh6@i4`953}=8v63 zPoi6a{@6nNz2kKpeTdx0k;n5v8}TBc(4)T%zro$d-XKL_39VuLmZKlyQ!7*ex+_=+ z;_!dC%5WuKJ9+@Puf%l5*EyEYNTU_KW<2C9y_J(0J*HcxDU4M%Yjf(XPF9R;CR!B^ zDSk3M(kfBO$XL+jVPiE|4`|U?@O6?=J|GQiUK7KyHY+EQz#G3AsvK<#pT!4x4&)ht z*L-J}f}1taGe*LrRL~#Dn@Tm_k>OIbjul=9O9EvpzPJ03MY!3>TU>0;9S+YLtOvG^ z#e>#qaqjOO-52bJepYk~(i7#4R2o?XUx$AW=NQ-xhxUATaGhOw%JA*6NPV|&yC&&J zHz4)lBfS<+)BRG#f__#yBaQVtcs|||Cje7?j;9BF2d_OJpTo(fL${~lEWSVpgz?-J z{Q@mGc^t*+@IBs@;ol%^oiLSVzw&}9xXx%;C~PF&XtBPJ?T8b?4;Zx)twhtL?eK5> za&QM#_?i_BLW&2m&OT52Pi$+n{Qr3tzooNB$EXfR7(0IauHN%Ek4HkL>x#WJo=E2ogJ*?!1+U9s z{P1e>#%lPh=JaXZum!F-m-+NymM7q1crfh6^{i}GJhX*Fjg~kv5AK7vPdPWIHP@(e zKw;L3qrp>DBkC?EVk~HWW|3OYgV*}eO$NkD99$%tbu%v>go*#cIWPNxd-MNj$xhC? z#_Kow0!oAz^YVTqs+q8&v@|9-Jv!ECz&?X2=A7&eS6$KKC+;vb&yxk;=lLsqV)#8v z(>wBCXT9ORIOk}#!%<-X4QIIdSb(%F|6u2E0Db?R3=7^ljQ5$80AGG>yw7(MfK}=o zd}=&xo^Ds8HM7&ncDSSRi#0q}jx&Q-@O)_6-El~K5k}M1MM+1?v#R;>T)0BR^Gqj> z2ZG$lnHBAEq^A|w`CtubqJEG8m!WCbqDyN$ha=2rOZQ2cOsYX-mJ-83lc8=Xsx1m~V?3y`!ME45$m?ZbB(6zIFwz3gm!wE5Ed9+p% z+sqES>u6H42vn%xxv(OZNnRjzYHX%eizi}s(6)*5S}RhCt8x6J~`|1Du>q8x=v02T$TM`Ki0V7IU{X` zFXNnaJ7rW@ z_hT^(AE6C^sFmVTI2K8UMn|5pj#2#hLGc}X^b?LVoE&x!zBrkc^ARPVRnUMYZ-#a; zvS>xu9=PNA<42*pkg|iZV1sk`KAt6?hcjgR(BO(?HZ~+H(u882ELLcAJmX_&Osy>* z@;{M2*`0iYD>@Y1Brk^-&Z&S4tx#lp{18qVynG5Rjdefv18GcJz$0HPe0aEx>IHhA zTw5nJn*U^J(#zrWz;|@^6*jC68|;^cLN}a99$sR-BsN`ovS45{{GFQH z=_7>ufvr#Blq?#UJv~?8jUEVc3gO<0Ry}qiD3TSV&}g<3lOG=n9QSup8-IX5qt(jR zB|&+d^)m)*8I|xz$FUV0TJc7WP6>m zy)~gCJYcL3dX+O8zZCf4jO+(^U?p;u?aV1y9}dAjo4g;m2LfZCh$F#Xek57opoWrg zNYY+q$x5C&jf(uavAvEAke`Z%&@Frz>s5^ef7i;BXruTP?*iUHi;|(Cvkz`ES`Uef zGsvajBSPo24HlYu5c%Vi|Dd0YSO$z84Q1p7>T=?vpP3>Fx8yB_A4DJT1zP4}QagBS5n z%)Ga$JzB4|4aVR}a;E7qG?%Md!R^6b2Y0fC@58<(_e&QsJ;CX+erw)^4&?R+hezr- z4f-)SnN|kcvP4Gq!VkMK4_B`g@lE}Vosg^)x`wW~@Ei4`J@YN>*o;4t++ATJoAUOa zrX#p@%K|cQMi=^_e=DK4tGKaRx$Poa=t0MDC$1mU^?gD|%S~FP`ANFJ(-YV0d3SZ9 ztTdjT2lfdXqDde+vftU?Kz&V5)ti5HIOl&BGP*D)kcO;7lIaLA1Mh^|ErPEG}rEzGUR{d+`jNaSbE!(H?mTJv_m39g z(|vUtfH!&sP3NLJswy;zNbac~PUZ&Sr4Q{>n{`k5v}n(4B2(bZmiS3ex~bLP(tA?! z+$v1&N$)jN@%;9NlGQ=z(K>l3BcIj_E;<-(++1ICLrg(Xdp~kY<=omV7$*UeDje2r zpZe0PY$JiT>$7)6eVbMF2Ie;|RsnW=ZfbLA7v_Q4k=*zyrb+Y&x zuBcz;t(^`H3g@8rs8};aOhpzw1YPMLu+`$JpylVQnx1@5b%v{hj1G+W+H#-TIGEk9 zO6)sYxBa`*1FAm!X@9$;Q>V?zL|T>h^}PfS+|W!L99$jFI>C(gF!AD%YbK7O zQc@IeA{#I7H1vC1jsx7U``_4Z%%MabcXn^}`Lq!|V|99Sre+LIpFQ&n?&ze=axyVj zXT%%27LME;JlQwse&ganKxo3#Qpi0(&ARLiSFo$ehfIC8P{Ww!KqN zKb}i-Y5BDErols11<^3CYae*RoVc^l(O7mq?7CucLL@l~v*V4!9J&|}jJiqGYdSB9 zPtJ*Fm@SN-pqs&PdZv!ocXd{@JanqMk0r%Fz&`T{{-o7m0BofXkOTB7_7fih4>O6X zR~%{JWayP^IxiSxt~ER%3vTZnI%UVH+J+6c2TOB%S(S$t7E2F=zw|BL zugNJI@2&0L#2LKW6X;mCE~?R&!vs41)~#wOnEU%L7cji7)v0MD*;rXR7;e&<$wu7^ zK^a7RMs<$**VVz}_MpesL;rWzm%-Uj)I=9`HO}N59`fMUy4))64koa0%lHcmz@+y_ z^i({Go^Zp0_t9|N>(=%u0)0oPNNQ{tw%^>7w+enLR7qj@!t&C264pMT-I?=7rqEdR zvoVFt8O=F6FV>!J;=C=cr0d{K=G<-GZ*>xq;W++hus4Z@Ux%#6FX+AEWc(faA*^mq zeD-n?!HA#Ep4Gg$*aZ>U-L$yNcml)l=8>UR(}N<1Qq$ ziUmBHq;WD6Z_<(2shiU|QAsgM)__cK6h%+mxGQ8x=^IMA^RwZJcZL09i^E$yW%2|r zZ51kS%twI3uzc(t(MCFtew7akW~wVUO8z(nwy$Us{zbk!^YPql6jq@bI`CwWsmB&0 zqMurk^Q1@eF@Zijppk%s%4VErJ~ws?>B|CzC!R|;h5__7T#42-_OR}i@B(FxH`z*V z@AH$<#_Iq>K;4tsD-$g+{gbY&9l5^wp2WgZ&nJOxOSuzuK zAL^P2Fxd!}b1GHM8H zp6?uRNGlkB8Csj#C4PJqE5~v28dVQr5KkKD8xfjkpQEKr75?xjRpSKvptdi|GdE3LwCb}_| zI5@3}d0svGr1{Y{<@U(jM9Jf!np_7w z#p(lkJ6Va^+ckZN^(zmDKgW)y+C_!7Su3RDay>cjOXIq?_oCH%)MNX8tG-ZQhO=7T zG4-YRZr5E|KNCHy@2ykHCDE2y2luPX5ni!Hyw+)%5d5$@P&~YTC?=QhRTq&x>t{4` ztAC@;ABWbd_4dy_@^xH7T{@HaAn2xSzEv|R9zCUO7_fzVp;&pu8V7}WG-wi6?S-ig6_mld| z3H@*C(s%kgv7e6b-HHAF#D3NV+m!Xwd-C_Y-?_ccYn6Jz@(IzG@ZYI4)rn73Y^w78 zj{{C;0+YUW=)IZdy9J*|_hm+*Zbv)xJ6+gmGx}V(@+L5#ICdibJUrU9XqScS4kHic(32=5)p(VMZ-WO;P7)4BmkEZGvjTXb zy(aE5{;cUxO0R%d;Eumfy%CL&c1niPbSC-wtU^1hc92g=8WaNmhWBj;3-tYtFy#<;(B8?+5p7vgQ+OKC|YBYcE*m=%u5V{^EYm zTyLHA*KY8-^&h|C%^RGz{{9>P@kU#%f5iIVUhj9;-DtfX)_LjbM=$NL{G9)XsILH% z;^?An?;csf-Q6`1AOwdXA-KCc0fI{i?rsV0uEAY`yL+(UzPmHi-6j1_G4Frxn{NeX zr@Ol9)~#Eo?l~9U{3Ojo=aJgvJq?qeXc4xJFxt>-3)MTJ!I@jRu9&K!Jy7~7zpM9@ z#Y!dl5%!T)yb}B-`-yEJJxF?bm-HdY$ZfX}c|$_9F6~Q-5#oFzZK&yHCD)wU&H(3m zB$Kl})HP|pT~&6J6r?gcWZckCTIu5UTVs7)0%e2aQ@FvKTDd?cbBPw`4=8*25O&xe zFNOJ|r0Mp<$mwu;w$#n!b|N)wm#5YK@&-tILBXB9^Qi>t5Z!&I9xkA1XTRD(N-5q?yJ2}~DmBfR5 z9}j-2l(Z?_F?63-Cd`gyr%6b4{eEq}TEeVvYQfFHgXUy?uX;kW0>7Hmy(N5r*GBq5 zZo-Z`Tb$L-0zQ>LcIrA`2xm2=!n^@#OsbGIY#G~P*9zSaXA2h&ze_QEkh%1_u~$dm+gJm z|MM?NzlAdM+;qERu@$_#u_U&IbzU9dOC5-bNgcPryrGU(-z!smtM!y_6>@<+qvO0i z?$hvjdzZ6_&-DsAQ=MkKx7R}c%pbTtNm+V}UZa16nypmrubpaWi8EW^EK-G46VrzQNcWEQ3Ssz#U&ezT|)B6iiweI{#styN)b>_uq$m z2{%HeSsB*FIY?0H!k8Yn)VE4`?i&+m9MocKQ_lknhXQm~j^U zn8SRPVsfB#=D5^m%+0h7V&p8owR@YYJ5G+nkLkI_vFil#FY_0 zed6?W`rZx?A4j^`R%JOgFKX{10bW_@D5o@U?LNB>&e-UwVD%|7F(K4{}Cd@^EpUJ^s4C zUy9Wlo!Qzdl%oRn}ak=gUyJ9a(y zp!*lkVx={o$(fAY<~(1Yn6K6YbFbb-o$WhjERe=31-+hppPbx_XVjhJwB;AsLuWd< z>sBD&^I7Zx-ADSnbJ@Z=^OZHqPGyQxPD!R5ljq2dWC9J>@3CGk zgL-W_?Sy(#dQqLB_EmpSZz`*lmdZJKh@4N}i>i+w zprYBx+szm7#{4SV!@99NtQeD-%F5yn!`UJBnpMNQ|L`KHczMh#`K^kmCpl8ATw5+E z*Obf2Z&3w!2KHc8aI&-9YwuP!A7t-XB1>Ye_-H+QX-}qE{izir%bvm!|O5P{8lQW^8OCYw{f_lV? zHxqr4gI{3F*%(%fea}jxmm9O@tS@XOk!9lja5oLrp-y9O-3={FkiM5I%fHHhA%}>=c~)3?FFuL?$#)|%i$Q(m9?+b=2voBk^o%!4S76au&7 zfQa-Vbd=j-R9~Sdrt>bmHLt-7@{;@qUK78!<)h#o_VQ0Wy;sE>4!!Efz$NlQpL-JK z;U(#*L?t4{$l2tKa&}pfzhX>I!hWV9X3UJU%Y9IsF5_9=Bfb>9@jZ{{uh~7una&kn z3jgyr_rY>b;B>4b>SnjzM%t~0kCvTDaVMY~^IV$Nc zg*tW>*zI$u*p5aO>*U^7egU&;4o37BUIw$O8)n!NSm+&|8vVEoyVUQXZF^1%%B>K4 z?vtO&s**wRDO=^o==UMe-|q!P@i$maSr_TC)CUO0eZI%LjonE*U_{$_H|aFu`?T_GK1{lZXDuS{mlU4c z`&Dl3Es#3VRA+5*ndM;{?&%?RxF)6op zUu&j)P;RRQ^iswGW0<~EJE4};%IPPxG|F}8a&N-CH@y2S70VC*(AL|@{WLf02@kP_ z_vPt$0$Tw~J0y+cJ$aZHN6oVl@OPcPPjU{t&u^4Ts8iN~tA! z<(WK4{Rb<~J+F!MQjS+T%af&+US1r?E|F)V$FE8av9BpFr}bPG=Bbq;l8bes2W#QY z=6~>3bh?v3-n!M?qVDs^5c^A{xc$;T9WIbmIdnYSkZsk=v*IMJR?%!2oF6D-tqF7s zc)=7YVq@CqGpx;4Dc@q_Jj)@$z`_U(~iv5S%neL=Jl-kM?ZsEnpS7K8W#g#UQMrN9zozX|m+-Y%x$8Q8WkAPc`BCqko09frkJ%Nz zoE~+Dx@F04WHu$?KH*-GK9OnRpA*i0Z51A&oRsT3!}$lTlyx~~W^j@JoxevgRZ5nk zpKqPH$p73r;>)LH_13bcZhq8Z?iVQ)Y8jd5jHB1xh<(+~PBeM1_5m1JLFK8Q&KEH6 zXcM$NT1{iT`C4fJtZ{_gSKBXj#9Dg_d%UGyM|RzPPHMB?yz=~u`-t48{a`7(+=9*< zXS@5O+uXjE6ihl2YMeAH@xhnMiQS}E@+BviS6N?T#>F&_Sr9xId=Yq&d}7KU{AH~i z{+iY;vzq#gw~W3$L5|s!>t#7;v47B8mtj)kgR61rdB3%mj8QSZ8Izv@gDFkBn=S1G_8EdsP z|FjPHo&-O|D!%f14(qX1)BLCoL-s^^>`3oDCP}%c)HX@tR zd=Xa3dOSamAlhleU-FfR5N9Gj5oh7gkZlz~y@&bIDXdq=5zkhTTg!tGAs&=Z$tUCo z^1t$3`J#Lc|C)nHs1;(1Wb#8)rJRkmH5X3rj-eI5c-cIH=xrmP%zuY(Z^`Rpl&kSN zd@x^#NaZ^J3iM_XQ2S4)r_lxR$WtjEQCeDj{eXD%N33cg>0eZ~7x7_MJozfbHATH= zzy|7J-A%`K zRen{vAeLo#mRV?fZuyop6<#JMV&<`EbFB9ovCn$MB3;qup=kLKJ{D2zROlqaMr*RPx*-odw2q1Chl#MAU!d`*hT0{~0So9z@Ew5o66jwA=wP zekHGnSInz}vB>4+#h#)nqLOCb5X4}kFjhx#{vi<5!Z=kKfJk{UR@E1hE~iGngw#w@MRmK9d)C-aXX&sE3}4MgM%_wX#4vCfV_g^la5j{-RBX^5Re53FmyNrQm;jY3>C7grpP8WQcG(Vq>cM53C^ zBJU5>#H)lY_@GV5{aiDXOp(B3i_$&zwoAb&M5o=$05)gexJEOr;g5SO+>EtJLRoBP10 zHJp%?!x>W(#5KR8=QqIW{(+6`$6dFh&0{ei>LY3lVtzcwIno7ql~ZV)sPHK2O^Uom zkpU{sKgIczz-tBmFEC<}@hbSAq9)O0JnI3pZzWco>EEj6Zb$rg4)2MYl>yj`s54a@ zJyQb_YB%)UaP(VW#Kym%FDqfDiaM`RWiWwqi>wB5MlH}?QG-Ub?lF2)RHc4{?=OM* ziae3zz;*NCv$-*+MTUpSMhxL^ZsOGGDq3&~Em{Lqbvi18jDXb)fL%@W=3orOdmr#@ z`JpB+YUD0OtaThw=o9HBqUUFr$v3gzItE*vk8$mf){3^LMk__0z;#&Oc3fo-{KQ1m z-Wi4cV-I+r7G59N`$SZ*84s)4361;9IPrRi{g=pz$b#19#rO2U-IZ_EDsCeVKZL!? z8tmehAYPt|?@Msy)#%e3_?sB?S}pjh5wPubnAxYL!)W70wC)zFo@~Yrd>&@bVEB;+ zi0cdE`l9lKs5&q7a~`6VM=+NrV1K&^^;BkmyUQBP`WhG~Q zrxV#WA&jA@qI?@qaSoMRF2J%5;h9ABjm@a{umwLi0HI%o{#uOh)4VCz$&JJFPD6{P z;hCr7|0ko~%rbmt11$6`t|x3()PBu{Cl)oz`e6?DL7Ns~pM46x=nVSyJUr2KEE5x6Osb^xe2V%@8VEl%9!_dzgFpDnX>_D6wWkjur zI_QJW@C;M&#Pe{M{TRFJu&%@S*$}?m#k1uDs!@>#(B?9HxVH@Zj(D#vui_PCChG_s zW(sy^uUL2NGH>x7n280X!g6|flKi`TK+dGh!cM!Q(hsZ661lki9+CfM>7cv=wQ)|# z^`$uMD??r>xee^6GBAUSm@#uOfvpb;xNL+rIQ%nK^WH(*rAB=UWW5s z5BqwNi}s37mI~kr*C8$q!?)jqhujT(WE=if54&9p>sb$ADs|vgey_Y-_`mL_lja9}@{SD&#uWY9m&xiAU-T|Hy`@^Hs zF<9FroI{?%+OYwCdoa(19pPBCp{f_)W3Xoaz%I!T$XuSrtB0NV6iU3?tUA`_a#EOn zW}{hox|-J}E$C`mjO1sEJV{E9=)DMzLK|uY)G69Fb&jT+UCi?O8g+;^QMdFuYB$A_ z-+F&YJ!GG^lP;lU`72-)>wsyGLhGs{YM8`-=Fhk+|BVXN&EYpwO10#2N{mt(J?>Yt zY1iZ==`~ik%<@8DC>5}d&*f>o18gBL=RT#ayq6>c&q-FXMDl_jVVB(`l9p6r{oKs% zM|*E%0Bt1IQ~zTW2FYH zi9OTlK`NoO_uSg4f-{71;pO2Dta`Zr*EivMk#Zy}eQKBFxp0~` z*Ic2`R;KF@jlX==d_A;>`ciG1+)s}v`(U#J=x1P61Kin&wcj|DJS216zsO-yhHvt6 z0xk1cA@-I1OjD9#Ze2UQ^TMtf(ZUBp9}_nxv`u)0Vkr~N|D0Od$+%JR)l;@lekqQ| z{}K03s<&x!8P}AFzHM4+?IW!ld20_yycS+VM<#CkyeZV#{)hcVS33t$4T~tmU(W2P zCF&)tQNf@;nRZAkqCS(~YGb9oJT2?%e$NZC)6RKktmC?a**^M)e4!dkFO`+wvaUFn z4C5T~8u{7H<_xg!*mmS%s6*&N(u2f`i8H>WO)6z}3BI5w z{X50w^pE{Br8&lNwVGO<*9yIg@UM}tJ!rr1&Cg>Ki-fjia5D6)!m*6S3(rp4si>q_fXCt=KE<0MF6a?qWVo_V_(^g8V|~ z@iH{CJJFdNZelld%0<2=)%*H);)ukDpX-J`n76I&WV@Oz-c7zMWxtf|Q!GkeA#Qf6 zIq5R{TFP~ded;=SubU^dGTiR-;jh`5-&k{v zSuHkiAeUZPZzs?7iYeQr$NV3sP`Df2LKiz{oK$v6cPpLA{_(o7izLarFOQXUZ!q4K zSUEDD?6Q9hH4Jx&%!rH&ef?THK}xulu!oNE-O$_8%0{F311XlLx|i&HeE0Y&acfdd zPPN0hBv;Zpssq(zBpm)R68zdYyq6RX&q*won9(jFo#O$1S>ET}Q(O8Q`+N9D>%Z#P z0;T;g%tA(e<%?n~yXE6@nB1`$xk#=M!yOvY+(+&NihT<`j^J%E{|#rvztbdgmZYQ& zSS7cD9SU!^=9MQfg zIrZ}TIIMeboM}ltNE?3yPy$RgH&Up{OUirL6%p6D$uziz#_sqkAtTFd|`K*Z;vy4Vo?RWKe zq9Ne8@wa&5J)+DR*>-By;VS=2R3 zHD$e*f;R;^_7B}cD$-muh5MYP=Q$YT!)ZmD0Vn2!RbngQ8%wg??4Wm*UZf-0J|f}C z{&YDDA`;E%t(H2e|7c~6X69KV-Z-JBFshi#jdFTr{k8T`yQ5{+nrKPNEntb6v&?y}oJkgl*Jv?hH?H{<-`Jk~@V`@Q2pkvC)SUs&#pxFlA7BMrhS*Y7+JBV;2Y zwRmc?raXz=3A-pYHK~i{a zU%dRusel-dOKgIq(p!Y8v9bR0cIe`f!=ZQNbl zbsy5A(qC>VE@{^N3t`+ zLu`6kI;EV^n(01crJh^cuI1KeXfKfjHH0^Wk7>aespXC$i`|iO$+yWr*x%0T9Pq{E3|_Dl zvz^h{te{s={pxc5h74zQ_`htYo7yh!y6!QzDosJhldhx*&4X-_oxl(F$h*`HdW;y0vo{d(esh9kyT^^DNZ&b4p8WCG@BPxzsT#n8M30~H}aa>4bPaUS5coJR+_5F zUU_zloo5;yMv{|($kmwSzM?lt3TKW}m4;b7dF3`^9Y`H}KB9+ekt#_Gl1hhIi2i)4#)=8psd4dMw`ENH1d~&N_X=#X-8L zNVn2f^f7tBhIqdzXVtgTM~SPSj4f7Pv$9db_(LPw6T}jKd0E&Hme2c<4JT)SG)-`a zlbb|gz1=hRQmWG4bR~IZ4{~$3FC!1_yy4h{_X$~(G^zqm1+xbJYroe)XSD$pjh7%N3P@=tPGJr&a8 z9>}@PR{rn&d(Cxv0pqhiQ!k)bmh-dJv=eL0JCg@?GN%{D(jg1Tk2vAp=D>vDd8IFsoYu zbrT=K+uHZTz1c?A-JYI!H>nt{f#tx0HUS{{qFi>ZWyiIIY~AScgB5{Z1_>Bk98K)Ahh&2iQiWc({GiyRUr{#<{c9 z%wA_FgQOXXZ*Xv9Aah`||E4b#H$VAbe$~iqJTWqw@#^o=dv@Kn+@)+TeQwtdWr%Dd zgcPPZm`!fb!`>jZm)>5kc|AH7F+y+m zH#(U%ARC=OoS)oA?pU(ltrbZMjSN>0cTI8=pE#f7<@}?q$?FZK&+ygrSNDJQbL+d9 z6v^88%NhBs3ns3weU<-_=F{4w8Bo2AZs*8adk5BulB7CKNmEgseegCaFQi7^k8%#| z5I*R`jnR5r?X7mwm}5q?hw>_5Gn1sCmmN7Vz%hZ7#IaxRe4+CZ8Ju<=PiL4Ux>;VpKQO=Z=PFOY_n zV0G9JtTJoI<}(%Nx)*T*-yM7Qa=`gaxiiiR4dk!2Q^qS3l!?j$Wd^Xubjn?MC-B8) zSPehow7d;a7Lg;I6Z_^~K!|?8-uSQ-0IK?z{6Vg)^uf+@q4Kv9RJ*CO)!)^cYJN47 z>Qg^9ab4J@M{ zaDziYxdiSY>W%jX-qQw1NKIfE`GI$R2L3P-2wpaf%4eX1EAix$fT6C%sqb}QZ~48J zKpT#H!=_SVhy5!snW?D#J64(u>|i$Vna0?!3tV#t(1QBN=(&g!(4N>6<-)n(RkodN zV7u6AHk-}DYdy}u8DfqS$P}1{{r+d1#HR5|06iQG^lB;)mqBRpNT3ZpfcB;H82;i6 z+A;;b-4?iUcg)~X_~Z_LgMY#Kb}1ktII8M8a-J44d?W| z<&MBdf0Wb74EX6epfh8D7*+-vn;%~(fvbrMxaDwe-w1fc0AM&9fRtY#8Bc-C4MJ8WL)OV0Jb6QmgC8T2gq~-3zU)BmI{^3D z4b;y;E@mCzIkSP>eUL2JQySzPWB?i*12pv_(AK|z_4NcYB^c|1;q(}`xfLj(z>S7} z>)F0QC58dd5lG=I;77}W9qmCK-D7wi2eNYob3{~Uya8-a)T2Fv`ML}i^gGbSX2?3o zhfI=WNM=n$Cda=(4m@DTWr5l@05&+~8!r0=>^V_;yb)}yF|fOyu(w}$I!+F`WkqD2SL zuG`;QD)@VXfBqD6`aG=k5Kyyuc+#FYKbn9RjRAT&9hl=qAclgABmr-!i*_{yX4Mmj z-8hW)OyC-8ak{((DA`oJMqsSFV0JcyhiHP{%#TcQp|c>Wp#Fn#Ujh_t8t}0>z(J>> z7ykrSx&nyO8hnYCUH!%b_zY}GFzvGgxh#uutB;qsUTfUB53uo}@IJ%8q3Z+Sg+x8? zxSfHQk={>U3V0yGgI-4XvkAaG|3Nzi&qZXR z3toW*?6n$j+?K#wdrG4*D}TlBRpEb9zz>T2ZJ~kk>f7_(2C6D*9bZN}U&2OW(MzSj zeY!D_(GI8$-W4O!5@S*yJ>MMt-|XA(l`sOL0{Y$$qR7`~>!y4HL{@vmT%1V>iz&a&Z(Wnm)~@KqU>QvRF0hziW*@Y@f-qXn}@ zRF2JndkR*KU{MO4HBoK#5ytxbHyaWRmrLju!I8NQYkGtc5P$I){UkIj1h>KY#sd&) zHX?_fqXi;^U2r}Gmq2ix1jkhH|3r4V;N`wSuRnk#h;xkVxb`)S?SpTYDj4d5J)ZfS z6=gyD^1@>lK}++Yhw^^2uAKP2=r?wd;JoC+m$15w-x!fX9VE(15Go#GwhO+a;MfR$ ztFT=pM7xAukeH={)gnG0)jx?= zh=^8f5!?pB$Po+~!FCaC5jq#5kA#Ym;O9r{?~31qc1KikTlAY?ZU{E3=usC>9aWo% z>L&@7rr;0@8y3$X_|AgS^#9q|qK5F^O#N5y7(VHC;CIoYQa$#t&VDJ z2`;73ArsFe{$KR8ct@~uly9~n7^#AZBUnA+WKh_H;M59ErC{iZeu^>?g?>TQ@sR%2DlN(brL~s`zVhpD5=`Sdvi46Sf`YOh?B=aLa|46KpBLd=y`T-701iE`&8s z%plQk!cqiBO^l4_gCy9Q(4-JL6ED%f58*?_Dk^x1H{kO`W%66_s`uf!MeX`m_&dRk z6@4XG;6i0dcqef+aTme46TL3DV!|GxdK!Y=BUDWVQ%zLQ7OD}VFT_jC5HUhg9-SB& z@g%}Oh??J`9=*_X6gCp&?nLe6D0fY$e2A8b zb_qVYm|cP;C)8bpm5E*x97yqR(SPE}qD*9A`@$0ncAVfm3(qE)ctU?fSd>uJ6893L z7oAmt|0h<2D3>~_Y$nzeVR!#qBLrVs*h|!J3pE@OrAF5i;YUT4ATc)t!%Fmxs0uFH z6Xk10m4KpJo`Q2PSc%c~BdR|tp5TA279K6SDu~%BX1(AXM|H%6ClS0tp?ndYf#Orb z<40FO!FLxNx2SfT@DHLso4AHxV2U_EaL@i%n@0E`;W@<>#h2ju30|JCB4NcMmqOf8 zun5IHq81~3W0biqdRolVXuk-Ji>T)iYSzNHiK~li3VV!l9>vv#x}@-PVg?D{998TT zzCHTf;x}QPg4ZVej+hf-)WoVC?Q!wGXj9Zu#5jm}P53%7k3_!<&YBKdQqR zeLm5D!qP;~MOA#oEEfGPyo0bFp_Cz*iP1VKVl>3_i~kWy27-SWUE73pi=Gy1udoym zTL`|e@OV+LDpWkrh_CSpFJrXXfRG&U07#Y@bFC^t09OO3Wl^oj5~!as;! z7JV%G?|+slEJE0}=ugovQDp)#I?;I$jcdg?ifcz}SP0&+xQ9>z5?)R`qv&_hm%>Mi zPm4JmwIMO)V(dlyAm*R2|EM<*Z5Ezg%vn)e{s~@UMH2q|!?#`+JuL1d?h^Hk!j8mD zjrwuXZ|Tv8*|1m0iT!usZ+j`ha?ORkK`yK{LVHbc;)QZZ)T*LhP55lFvWk^0>KCJt zvhWO1Zy23X!aGFgldudi&e2wjccaz9#kw4|CK0!a&x>aj^GQTB!tO+$ij_djT@fRS zU4igJ(Vaz9(^&kisIMSC5mh`C*-@XpzEVfIK9~zTkpV>!FPy{9Y%OpU)%zPL_j3N8 z|KKghDj`%~gib;uU=uf_G;&e-2r!h_KuKzYU(y*FB;~xf{19^a&hVz#Z{^0WR%A@I z0FE^kjF=P1Li$O%0!-yQ?|Yys9lS2caB7bHrui7z&cHlEz>-cOb8aax%%wnm8>3Hm zVfQ`3TL{#|hh1}dUSN`P$C$sxUUDn2n~&!Y{yX9$@#q9`6pv@2h}ZJcR8D?W%a-vM%oP1UT3Z?7lZ*r@jM` z$a~m|P#hHM3PO=bXp%jIpST6<7V}oPWS9wgfhmZ;C=LWfXhR6C zFA=ec6-g+Gq(sXE=UZqY3J)W6V#FRq_<^(-t32PXDn6AT*GUO%@CGo&)A0N6q52_m z_k?1WP%g}jcT=Ii@8Z3G(K-`tE`V1STwPQ+&5tW3gFViKg|)-KpJ3+b_{@8Z@&uq^ z+h8;G@ZK_@XjySRp-d+<_?~0*Ct+M>;*Oc{Btv1NigXipxEO5ZGxE>M5c#ZE8RwPb zc?Dz?J_h#6flH^t7_5Pn){vKih0{PP>(v4d?C|zz{TH;o8jzO!xY|14jG9!^yTap< z=jC_{B^R%q=&6IS&&`O)h00hF%!UH^UJnRgBRus|u#hHTM*fPNS--pob}7b2AfhFJ z5yeYukd-^1FXol-jHjh($R92YZcrv=s(coA>)<^^&QvRWed4>kfe0CM%Im?4F9Y7! zO0a+k?~PtQik|6+IoI6tdHwlfoZly7xxo}Hg52lr{4q;I$GA(JiDa}oJ9r@Z@RZAA zx~q%Gqa-uQjT9&Oq-M$l>7=}0ooCbzWC$!V=P12he<)>A@o+QB4dJu)8n#*~X7=(Ivo0zZ**rHdX-rL<1$KxB9*O{4+g-d6DRiYr0IQ7ULVwAt!HX$)=cY_qq!gSevHR}zb$oFdMG8)UJB-Y2euN~3x~lv+{{P7hFf{X_<4GiY$V-j z2@W+l`HR$9ek1?K&$xBTPrNce#%ACXgCtjp3CvFWAl83;`*CTfbU!Z)@E@;n`!E!En3%p`c?+cqsO|aH) zd!yB7T6(R%GEZ6$iyg(Q@SW^ucACxP{b9=)yaC{kwgvli2d}`pvPQ^!IY+jWN#qdn z>q4{~7&wQ$8CZR4dcPv??yA#@)FtIeHFCqRY*J);+!vtN?O4{^QJ!54Q|2 z51qC%C~1SgCz}#GTE8ThQ8%ljqSBQ1ipPD0LCtU6YmCu?3QHjl2OY1n=68R~(P_q(@BS}FbLnd}a-*xry{WWC$R zO;7Ss3rr%)OGtIS>1-g~jXZ?(vGCZ`ymJ60G-HZV8q|T1~c)(h$hB(uUJFYi(Q08UZ*=qGxxr8(wTr$ z^m}BBd(y4KS|j)IGVe_fldfzWI6P%|7JXXs8|jWF)BQjD^uV-WLt_iS?*u~m!^z#- zU?LTUV!{J2q}x_btE!Pjf2PmVb7&7_i%D*4=aTafoR#ZtS5lTgfl@?!Ev=S8^K0wX zUdq4HL_P}r+ypurRcIfwnq=ayUVRd2(rlDJL%kx)Fdn$wK#6dd+*J)KQx%`P8&pPA#+E z!R%u;Q~&XD;kUZi;WreqsWycBXPM(f! zCD+JNvV)dpJLy2QFDEOBlh_741Dik%mXcKkSF$VVKsvhTob=APNV-U3DUE-?P^GY~(`tasIGSA@V8~f#;)cD)%axhHT6Q=;6WgX|<}F zTy<5ZRX`S7f8&z66R2iusi~KZUUTj`K6kU5oMa;jZgck&IfCqt?eqmXOq;Qjv@9)$ zY={hY0=$47@`w96*QCp8XZgJ}PJbD!5?4L=UGPM3MPMlMYYqqc7%I+o9xBV_Bzni` z?{;oE8($Kcvv ze6XqiXKR7d+be~0-U%$bJtA@(;7D4xm%HDsONSG!GfIjl%j_ zWvM*bOCVz~zpEj?s9yM&$Pqi%Nox;^tg|oKFFs6x5HXeERm;+CF!zk z!l8u3@E-M=uc?w*s$=y?F*tRa*qi>pV-Ci4jC&DyVl0+NvGL%(z9MCl`X$`9GtfD9 z(eU)h75bZ8Qai2_ZI(GZ*e-ThAdC6R$Y!N9N+~YeL=xQw?h7YFk)EO<@-MX7}|+)i?L zGB1fIY>Mn4TO->N7ls$m{K(l4Dr?n3rWw2$JnTDQ_^e|7-^|TQh&y15{Z4JCWu#+x zX@o>lMVf^=By|t3i?k1~NNoSrNmvo8LeuLr)oNZTy+Pc>l)?CZ{xdPVk}XcQBc_Bo zO}nj@LjG6=Iw3qQG}Yee{uUmXxH4Rnq~*PN39p>eNhjtGtEyShSY@QLrWl#S9&WS^!8Ray{^(nKBs+E z)AJ(q9JxmG(qVRw$jz{1f3m-Z&xMbMAB9gwoY2t3kG4-8p!8$|lqcDxZuVYHnmAgp?;< zqMHX9F9Cj7s$pWk## zAvZO*JH*y8hK220b~n3xBpZ4*b>wrnSZH$O7q6H+lU4V2>D~Ob{jug;v$g+Ue`@~_ zgQ<75QCdN8Vy_@appSGGkzpmM91N0gEAx~*%08vPI$W!&`_&ED9bd#wB7xL#eMBX# zkZ1Rs-PBp;oOP-@-R&KA2m1ZnzT`|sT8T3SL zqGoBemHyyRey?0q%FDT>7V-+Exw;8@Cil^w6V&ElF0@3PHJP8F1}Q>rkw1t@w!1O# z%PLvm-f{{#i@~Hg3QJucx3WdrjQujfUSv5NM^Df$G!rdA>yy%CG8pn7orCth z$d_>caR10td$AL8uDX@z1y%vO_~}wr<+7Se@2~%^KQ-={ZLPc3ax205U~%)jX_%#r z5qfuRpq8XQfj-M_XhWQqN_h+UHI|x%MmVv=l$&U6-#YMsOF;dVXyQ)GVRX}Do{Q@Er((wX6Q z!G7inA1Fj&Ry-$NhwmGu|#HMaJeuF=G}sU@Jd3#;vwwzA-< z)$mI3#;h-ONkOv2UFBNt8Q8^S=Y!M2d1ha>+uPOcNs;&AtKm11Db68xG8s!d@vhQ* zdAgEKo2;KUGMGcnV^&??P9O2T@-^^}^Zj5gH2=YD|5vM}_Euxn)Jk8uCo&$ccw_l( z_MWz*XUG-zxx3QMi~P?E&Rgf4^WKiw{p|GiwaDS{^6<29QTsJinNE;H^f50eYf44+ zs%9Bo%Gm^x~SPwpUjvX_QKGejqvHy%C5^*V1{& zdsRtU@XlwtYuv2vEUc_koCOfAI%zky>qVAE62f_~X6$wI(}}bU*Rj94tkgnIa$~a& z)Rp#IN!D)PDICOH@u|N4re*He2kA|oFWb!!%Pphh=>=X|&Y|R2zsFvhIMuN=4rkke3*Yz~P`?pSO$uPIoQF%i99vJ{BGpKQgh8cA-CaTT(Y6r>V=BfXW2D~?)C{||s`SL3BQ)VgXpRz~Zj zwbuGzv@=TUSGB89xtk#ml+OV(Y5;_(u9OYgWWR&C+>pDp1fz5ooq-JF?sOA9L1O6? zGMY3enOx0vop|S_eJoF+H=G)y@hd zNBzEjQNIk_VJ%RR)ACZOAR^}~@_b|lwvzK=*Ex)5;eA*w=w`K~oxuaEh1_ID_LAG= zIx^4iB5Qf7`;*(%DQq9GTe=R-LHCnw(tq$xmz0A5R5zH@^y)@(qnOdbY^=A_k~CSb zq^s&q`2ZMcmE<1MpFjcQkfVo;8*iDEK^X%zkosN?xvunu-2@WwfZe1w$SP>tjip)H zUh;Z=^GR zuwG~v)RD$fy^5Asy{s%zGbvxBFOuLhuL9HK2KL)$f&a||VrN5pq#5$$s(3|sHE%k! z5UcSZ-_HJndej~0G3}*uk?RZ}4?UE2BqIs9hn+?67&l21R@f=QLds+?%u8rzv>L{9 zJpXB9wqC|Gt&eIhJ<)iowbAOU50qxGv0`#(sj$}#c;yss0rSfu4Mz529_a{B z6`|Ayb<5t;~kf%4SxXPhrc!RiMynIK}><2Ndq_xspntpw>rfN%-g6b1_D^T~I z$gVo;wcsQ9G2|>>`cgBal}8(=uQ2Lr`Lyvs@lvUON~?fxZ$~Eb_g+sh1+#gLke56aY|%Jy zl+NY&ewQxp5d+Kf3RX;Dcu7HWIE+Xus&?jO}_;^(>I$J5UGO#P=gJdKA>7szP@xGf=hi=&xCv;B-OMKiY+yyh6aH ziolje0Q2q)AKr>*f?gIlPVlU?pg=bT9NF8zipB!fEklnWQoMwy&9#p~SMhgX4!PKV zzE*bBs`^Z5=~On?TIsANW=^BHS>H;)im_R1pjFh;sIl^DAPNnTSD&44g@WrD7NNA%fOsG4x1pDB$x=8<7@2Uq)$1IIKc`;x` z^I)6TL`JC(+0^1BYa_gY1TObNF2fW15vwUQJ6VQyU2;Y`&+W?2Odw?s!AU>q5vi=& zS>I_qHtL%dtrk{$>k8OJL(CJ#EPbrT)oIwDOpwRpRB|6?`b^#tBQOaHZ+|mCxY_Bw z|B#>V^2M;H%TP`zhn(iJ$Z&6p^STbOvaa9qTIaw=_r*EaDdb`2^qxRV(9h??#vUQk zI!Q8<2X0@toO{FRh<*Qid$Ti-q~MRedQgCCucXoQnwpiuDrL>GMq4GUC+2apl9|Fd zq@HQ?>?JiPjnGwbd1oLJez{S=5MtjrdIMr6$Pzps_L@_s#7M zkFb8KxMR0zV988XEI0bDErH?wWRLmZnWEDVu z^AVgn2j=|@?Theau>AVo z5q^(X^+G%W8Oyn#C6^8QWGb-P%22C02bG0M@^0`nWayn#g)YD}JV9NY+}g0+KHxKU z0c)u?9f8PbAZbEkNnXUd%Me}v0wkm;PCd5ReeC4+RHr*jhLhh%QcmnApZM}XMaz#v zy)J=+{w7u*^NryHSN^K{FV00)N?Fin6epYW_fB)$K8V6 zQV@v#YIdJ*@g_s_>`(PS?W|tKEMRrBxTX36{*nH3zQ?}(*aM!o@|lZ_m)QADQmZRv z&)r0>Z<@({h=)2$AbwifP4_aUOd z>u$(R4V6B}rEX!83rgA3$W>C6j)sCPY6w8{V~A2h8?BE9*09$~<7?$x=Wo@RV`ulbM=R0#2*`4j_uCA_n@4kEQ^XKqQ&>v_|)mg-+&*aZCzs${Qf7}{s zb+g`^d8`_&3I)jUURkB=y!Hl={YB1~>~a@nTKM;=x%2aRcE87u^OKrN+kplx8?&pA z{-gev)?7P)if4`p2p=={G_|Dx&NvW;dR97X6*bWSnQ>Wjia7ub;4GL!K{B4o)V?ZN z7p!+y*ov~tgZ2+bt$4~A;#OA%lS5u%XO2WcT`#a9a3$~|FgaL0;z@8Sn8VCqWUyJF zk-w4el736Ohr38!MJLYP&#qbk{d*>Bzq!pk$7?m&+Gy)%=8*%-~DsqV5#YLQR2lJHo(gtd$w8`3XZ3y_@Xf=rbdN@8P8Qi(DAJI)Ku#D}T z`LEmc z+jU1jWL)-1Uw!`~|9+60R)GLtrvHk+i+_&qj4?ysr@dAeiMgx;>&S}BIy1-*oAXS* zVouC9S8#Qytl3t))d|&eKIeo}85glNvG*Np?mT?}tw0p3p+hhajUL9& zAa7NSSmPdOpQ*J#d;eBs6V=F&4&%{!#u<-_&~PrGSlq_CRG!^RwWD~ptJ~x3yLJ;4 zhb?gF%EhYkkoxjWTw7!D`F{}E5&A^6k}_?hh$o5fo3gNVR$Z8H0!*8y-n zaYhsN{_L<2_QFHBj!tp8Jcg6md7g)Yyt;Dq&0OIdxDq&zvhUv_?m5VBt|TrPhx%>+ zQNaOn7EcTIFI7peE2P4H+Y!c4oKjc}5r;)Ut*#D2-!_wR9-wx_iP@*#5y!b9RUyJUn0WuXorpx zy(}ZX8jQzJQ*?Cc-7t&{2gO$W`@P{4{4|)C5Jl0bav|6oL zp?ku9YK)qy8tj__WcwZq$m=4K8_c0BD2vyDr3C*f%%8=072tcG=BqmA)CgTs2hML8 zY^bq}#spB)$^1QpE9=iERN%dyx+)dCoe&Y%UCzLBgj&pbkLPOy&v0)dkOAz}<4_DO zXLp~>Pdpd2`9y8oP`q8@H$D(~d3_+f{)5CI9OoLd)l)#7=3mci@ggc$`sBIpeWy zJ=Wm=`s{hv;&J6YR_*_oxBp{bdK}{a@v=N_wb$3fW1D(?R;>T7{eOH(k3sssJ|O>N zcYB@vymRnW3m(JJRD)yTJ00e^*sJ7MTe>IgNQD{U zv;iY|na?I<7T8d+zBdcqt40hMCs^wC) z@q{-)UG_b*bs_iiH@GK>?kM<#_d&G^h>6Uq!Qv<7w48^s_L?lMtQ27wU**B2eL5SZfA%>XXt( zyp$QOIb7{=SSrob-^G{V`FKb4x3?=HSzcUqZ<*ivj@tR%gK9k|mHM|c8#g;LVKp}h z*DT|2M}wC#Rm&(M?ej_*y}xtGzU7~6pOmwx6|W#K-J+t~R=bGSPH(M(s3`ZTdBKcR zI)&6o?R#fE%&jSEEAy`2fQ)T{*k!*^zoW{vSoTzoI8{W*8KiEPY3!Za1bBU~tom9T zr?8&QN-6V3l$r3?sEQRV^k~DgDeEf%ER%P!nHoEhwj(_xuC& z#|aDJ4SWLi-QHA67h$LE2!>S42qzm{`6aaT-RE&azwzE|2ECu8zXW0nNZ@;K5>s?TtoO*r1Xn^BY^h_s(h8w8Xe30WI)8;T!#l za?e?=H&MD;?UcNMK=Ni~p0-zhZPjpR`F-J9&Ux)9tNku&<)>3TNaz(x9eG_V7LG7; zN365!+2fUk__66cBRQSo)U;Q+M?>BH(a;7b&VOFro#cd@#c0argr#D5K*u>|kU>^S1X0dfB&O?zvN2RKqN=}6;#OaS z;2UDC=%}aeetT#{PRCL6z>cY-l+kMY9$1$C%6HXTsXp?*H|zRM`O@C0t`>Jho8;-n zAsqdW!)(m$sAR4c2wTY}GqcRgTa+|dQ?e=A*hWI0?n7YPzlXyWkbF+%4X4B9L zbq;RaJ}b$cYja zBv^k@d(B{#c8goP z{T$sjvaH@dI4=5czpB=V-JqTh6i9JGd*sfF@keixy8>zaF%kHu`j-2{Y6D*?XN*6E zZ@TiG8Ltcpp0gh$HCOWJli+noV^TPjoKm&TTgq5xdZ@F#T+P9(Xdz02t3Gfp zhpveoP9b}kdYBdZGj2hZefQiiLq}ydy|OZfPDS^We~lKQIJcv5+0N)X)=;&gQBPzt zUyGc9ua$E4WwF{wCtH}`sT=sb%}yaXRmo)R3N=k`2R(m(C^lRIueVry=kgP2_Hx>o zO=Ur2g!)_ZMX^C2W9CA{7^BWM^V(af$~BdD&GO1?wWG7r>FS);c8T%fobJ!Q2kL>) zEV&jBxNQ)9Sqw?0iv(03bUj0ajr>f0f$ zsD8j`hqeDct+(NM%1xqI&oaFy74;0%yGyCBm5rjRnn3J&9iM^)#5iZj(96qP&UELz zv(#Q{g{;F)d3&0f9*@CG)bW!>6|gXJr-h7n}Vv*0dGC-W)~qE{SbWv@FDpOKMN{%R^c@P()>R*G_J0ri0z z(7wi{(AMz4)@R~!UQsV={AldbUulcTpl4}))mU|yu#_n9qw~Z*f4R+J)ORGh?M5#0 z2uAT7FsSF?j1T25{3Nf^ZQ~uCU)ICOOYdB?hrn&gOugY(`v|DwC@Pj4je9A+Nbxf2 zW6aFd8`5n_oiAlD>W)!aub~!F;;gTeUnZ^%O|m|LtsgOC+zx6k`B7vaLPM%4;6R`=^PSgs0+( za6i+w(u0=QHHU}40O5KDQ(|RO{iMN(CF7gK@A%m7&Hi^WVspl?GOvl88Jz#cFS%s4 z9Vu%EBSe1dH>Hl-HR;UzLT?tw7gAblZRnCR&c8L~&GenpmrG?t)T9#9$#~#=mC)yX z%!gN>$0h8FuaQtM)XFXD&mVO&sz7AJsDGkwMV*VV#qZXRP@m*&p|%NwJ~vIQ911#( z!Q*0KbbqZ?(X*+o<$S9tZigAnPsv@A(j^s3PEQY=JMpvQPtqglt4|v~ED-OqoyyTF zVo&f^`W-nlJfSNpswc?pqD z5oN9VW#H#ne~R0_I-;_&S9YUL7@PEEV)f(!<}!M%SY{d+u&UC|ZENjM9-RC!^keee zc;!Ry*DvBGN2_0s&zi#jB)WB`Nv&RQc%Jdqm*$0(?>u+; znD1gcroEr#YMRdK=yM+>eK0mr~W+{6pzfO$rBP5e2V)}NE8;?x}Zq5*xa|+kcqnLtVo+!(H*eEKJtE!PyPU z(%ae^>XbMx@n~YHPd7isIk8zX+{*Re@Vz3DjI6# zypFw{@tX`OQs{vP#-_khW26;`3%^|au2Moa(@;iPq1ELXQ{Y5nUXl42G_?e?Wnc2bqwVt#Gvp-y=0H+SBs>-=4!9{7uD zXK-7IavPeD67|Hf$)~I<)MaYZHD!#NRVyi`JHLgihBDD(qH5C53C|OcB|MI=K=hg> zU*=rJNI^n@aj9mfD-as}A@TL+7xO}y%+5(w5w+(CbWL+5^H1WZEpIX0P z`tE()!*GR!yz$FIBSeSjV4C%*Uqto_)QUJAd|>Q0SH%_hSTTNC^0!Izldpvex|M^a zqJ~HNBU<>5_-FW*Xxr>ri6S8nYetIjepn~1+;5G)DSA)wkMs_r9lRV4CrnQGE%~mQ!s+YObF-+LFVSD!pUc-BU&5BYdF^ z;TQNFt_kn8K9V;b_7@2x_@aF;=!bSm%_H+zm%;u`zC>>R93Dk64d4edHZq@n+p8f z1Y^vMJ7s2a-va7n^@bpCp=Z!P;s|I@ZyeRHf$Dhd4+o`OW6+~ z2RXA{xMJn{57|8lo@2v1&j5B1Lp5y-8jkF^l}3Pa-JtH@iKyD8S7jZJFcHkD33$y- z>Uvkf_$E*IYDOY@Ba0mCHj^G~VD+=HWiIP;<-!hwRM1 zy-##N3s-_kjik184SdDx&eQ}{YauM$1;i;6a8p_VQV~?Pf>bR7uWE~qssl&O#%Ih0 zJzYvgN`s}hkK=y?wK)KeFbtHUDOFrQJh0km80RZ1`OHq>6i-08rh?A*pnkdl6v9I1 zSQT7iA*k9<+?{gZKsIOL`O(M02J&7-&`GxC>T|=0cm%$8i6gK4&*SP5S}sq~nF@^K z3E1Br5WutGVT;ih9)vv+!QJpwa^5Fw#to__;~NJ8YP+6FaV?0F&9hL5JKT;>7|8q> z1lpH^QSJ`nIdK$=w%rCD` z!84BQ>7HGBX(TXvbdb(+pi{3Hg-nb>3OXgc0vYpk@SjoHnS8f2pI8*cssztL6+XoU zf%Ej{UZ3m}%=1sY+W}R(3`XasQJJU4=*PM0~+ z=*4n}?&F+3(yh;!I&=%kK;8OJ?%`8@Zx>hQ`Ikwws5KdZI`}*F1VygJy_(P6idIf= zJ%zZRg&D*0CNsywTHunxJ|q z_}t9A+nYyTfA0up@pYb=y&zyGnXUUc&x?$U%6o#~Y92oM5oGdDetL*G_wYZI)uP&7 zoNFu3jLXQ%^NRUP-B#Jk5A4 zSY(*r^Eyp<&$g!neZ#RmUmj0`ot@eGHRoJ`e|s3Pr*ro@P<#Fj9tNEDzp?#>=dT8H zun5W6BzG_!V{3BX@9zwCk=&Ykvr5B{LdHQf9@pzyH}o* zj91I>e3;_@L&YEQE)RqEx>wsAB|Yy*=9-`I{{+r9%-NfqrRP%Md3<>8DPD(?SA70! z-s2(X>6u5_Irpr5wuhp7dUtQdc)>eN))KEmmW?}91Q#{$&U>C(k*qEM)75(`iRZ`Q z`A~Ut)|=4@jFyM+d)j&L{$*eUGV&Q-HNu-WIsTh1_1ML{jxX<-_a9-xJf>@99rrD} zc{jW_)7$ZM<7*_NmEV=_uwEvkus!MD;uuOVqqaSfjuZoNlANY=Bz|as?y?3?^$vFs zyLGagQgl~}(L1NUvH@-TL@>VRRGpTHJK*c>#0BbIj^d+VUoO<|SEzk;q03H9JUACC zWpUwb!d~_h)uLSL31yNyh$^2~BU=yS|U1B*=3XEa`dW8+$dc1@X&{8^^IGJ?>9mT>wWh#-E~?sYxl?#eCJDe z2-DD6_oCLcjQ>4iw=RtOxi~w|G0tcK_bMfv((KAQ-g$!6YX|G|7G{fvJ~V=Vy`_Hm zi1~kx*Le4Dx-+e%>U;)2gAv3fx81QyepqZ3lo{OT+sw!7?zdFauDW{|``7M||BcCa zJaMff%+CI~N?+q*aT;|w5`V@X(M0SZz%y9=ES3B-u zJyxvQ>|2w0?n+T_)TuCrIO+|ekgwblBAVVD+c~Z+gW?qR!-mvP((wGwbw4=oP*DBA zYSjLzmff>Ej#i=*x%jV4e(V@yK$fzIoKnUsOLRp3@gxGu$-F( z-@^)Y-{=TOyqWw&1$VtW1Lga_@C~BWYuYWbO|7iOi%qbE8_`|xE;F(+dVpkjQbS}V z_p@w{_I5G#pUl)dy#At{_^bd=R7akmzOWi+^g>X#=L36Eb+kv$_005 zCK1+aR^dFvdoz`Jc-D4RwhEJHqB-|rD=SbuT&K}+wSE9S%L4mwn3D|G<&o16PJ2~+ zE4tH@bTz%bPU9V$7L}+W+d3QUZMghqwX4ZGT=`&qopM@z?!TZ72#ya_*9Hf#8Lf=p z{L7Uh>NyeTWD-eE3$r5Z!&TN}IP#;c^~}fJ?s)aSn@_ExZ&EYCpo~@n`XRNF+Chxv znfM!@E0@_h!Kah07hv6^O=*sjzlwKy3SVx0kWnSl7r7xaS41Ww82G{WyY`QE z(;h(o$n<7Y6p*iyN~5Xq%iG+Ge99UWHQ)Q1`RCx{zT9Z8uht#qs#8!tfW6ey$^}b0 z!W?9kaOQ$Q^l%4?HCi?!tmVRY|2dyDU7IFGC^g_M&}G&xZM`xF;&z_LxoYomp2)RI zOM0K(QX6X~%=R33u%A#{X~*eporRu)^{u8Te7^$?jkVLrLCjfJGG_TOQBt`>2h|F2 z*3Q|nFsP!fIc6uE*{8xEk2I^9`DHPsBr@Kjk+*yuqm-D1QOje~2fOG)^%K++-@IduJAxRh9I{M^MED^nGc8#-_DDrFu)*=eKaDhk*?nV`dUzaUlGm-T6Z0pO2u%*9 zg0VQn?B`q)i+#@nef^f6-uTv-%Q^0JrS&S@H2e!%iTLn5Ol=xFlf~a!I{hYE_q@hr z`1w1vB)63l!rQ+)ccyo^Zn(5{(CMZ0L?KsP-DDJstQVQW-%oAAlYiZn^0_qt+^xR( z+Sw=POL|k_Uf@Gxv{pIKwO_Me*?sJ;R#JF#_^nl1`sFIT6OMs(Pq40=T^wC69Mv=B z@QCQZ!l<;tP}H=jN7RC^B~?k<>`YJInmj4oDDj&0L>x215thHLF)UCZ*b!z^R_!WI z5(`3Q&?6N~K8LfywJ_NeUi&qT<65Gg3Jup1^JHjGxR`ZR7FH{0 zo#=QwLMun##9sP3wY+R3^`guU5nY<4$aSsCPeWg3dT(_rgowa9jH&y$!5Trxm-?zvyH8DX*woPaw+eODCoI%=}d_v#!`{onFomr-&@TP95*G zv^&Fl+|84^*RJDK);b5%q!=DEA<#RjY{W?al8Cccm&HIOFI!rw=~p$*p>DDlqz(6Yn4}h7TxO4g?mtIIOM>shV7C~ouWU`KcM1Uq1F_*+M-*^=B%=+qTP9Gb*G0>Q+j8N z7d_C)ZPd!?t9-eAe;YH^$zESXYo68pKb=ozyQ96>O+zo~;c7L}hM4OV%*s1xK{i_p zVW-vSx*On0a?H8Uew&Bg=)HU|Cy^zn?B50zhivW!`9gUwisD3GoBpwx4O`1<^oR)h zy68Pvsrstp;qz!B==^BK!l&BGZ)bFcwixc(Ui{0i!N^)B8tT2pHgp%q?FvqUo!KeP zb92oqCXb7K#teURRN5<)P2e~GkkQSR8LT$w$@|&E-OHl3UfTFp%ZV%c26e7D??%b_ z_CWKUnPhK7Gtiw5hg=`7;YGoHW}#O&1z>+>q4X1$2;pPyF)Zeu6aDoqLe}nh*RBNlPiPJZ` zH(?UDAuBiqVr?Xd{(B4 zJ!)eyOzA~U>bm$@NdV2NrMwhZ*!99x9tMeL?kr`js>$=(VfotKqDI5LGV~N8sASR} zy0^tew~jVm4pu8F%iRh3D{Hr5%9F|=^&k1Q9&1nYcXcMYL;Qa=T#x^t1(J@`l=Ol=@&&z+g69jYNK<03!7?yv8p##30Nl1tQ*au3~`?z_#^?M{Eyp~p*YwG($8M|HKc zGlwJ8l;zc5-C|~hc?bCXk2g_ur3d_|26JdwiZ&>I3Z)5)mj@X4Ck@_&^{tclCz~pU-!LUD{LF4 zHNZWomNIMj_lH+#{oNdLx#qL)YG<8V?ksJ%IZF??cdhUIf$#@4owCS|)hgJplw;0T zCFH!3QR*%$R=wc-$ZA{ET`uXC=r)4o@ji50k9DHu6s?2#z1Gvo?`{+~?6CV# z6B>k3G{nioYTL%ytCn#tgAG-drugJ+P&$)G(+R|>LHMD!E z&z*eAI8n%+rRWyK!@;i{PgD|V6l4A$N zKG~f6c=aQXfc#^w7NL%8Y0PUN>>J)>QFSIJO-utgWM`RJqRa*0asxU ztW6%$k=(2us6!<_D;aI;LvSvWJA56S>Ncp{4fwL}_`4zqNiOieFF1Z?Uggo61$lR6 zaLckFL=Wi?xu4wc9KZh;YxHr@u9IZEclcYQDx8{g_M8~Y^C^$q9yq>r=V&k7a%6Sq z!1wNuo9`obSVxX_fbVSZ#)_vRNY}|kRFR$B3S8rC#_8%dtIQ?6%KyC+YO{Vzgm-Jbg644%yVXm~cePdMW;3T|oabw@yw z3gE7G#$CnSqoXoNVta6e-?*oR#dq#(VvnBaJ#2W%L#b8#fO=;$sL4LMblf7x_PB|s z$PoLhomoK!s&!F1o)dq9U9?s5iEJnb3W-8+A=fZxKCuqGBUdhgt}KGx@{zj9X`>WZ zzaSGnCB9VN!B?BiCoRJ>B7};!4}MMM+_LI8#%zsSL99^n$+2p4a+SGSEB6oQtXcyF z(*}W>(>*LQI3MY(x}U1jE1|hDtfxN_ll-m@bOY`+aawk8cW9gC6?=sKi_%G^rkXTK z^psI>yWhyqL@aU6Zgmm$s1-22e|A4u(~Jx9q3P<8O4u5&z83%5CzQ`xjQLu( z*JiQWz2rHcDOZYd@&a8lOt-4`2mHzRTC}x7d9B~EMiK3`laEAJ8LbX-Q6wuvv?A67 z<&O3yTp9M|-%fz;Yg6r!&O4upm)d)`vbI;LY>m`^N9DIsQN<*2$4R5MQEPyorHi>or3a;*WbXk9ImDQ3 zwyr3Dsw=I}ZYgydYh7ixl(?g>v!^MAwEN-*W|*q(aZ)H{=}OX8t>ET0|54s)eXX(1 z9yKey%;+Ud4Em4w9>vyVwG}fj$V@#hCey7()3&&qYUwlBhFkO^aZh{$Hv#Zl@y#leyYSkhmFRPt4-utTfKl%POrub$W9rVq5 zjNTLHzoM+x8NiE9P;bpD{{n-chZZW(&CVb4BTw2bR=;(ugxOhhyP}sHfYz@&)z5X# zGJMRk+jEGsbu>@|&^m-r9p_gHs=IMgEGKS=o$7GZEX6?EUV`UjlHzbJ2iU!0QKH z!@Y|SU7@8??+7!tf1m~ZTY|IkHkrOp@4 zh=*?CX*k##VCS=&Syjx+=2_MT*U@D|ls9LbLGl~#?#Ow#C1m1y-#Y!A-u60c9o}=v zD2=w;Q*o?F<=l2A!nCUaHggaT-vSVf67tA@s_g0DZ~wx^OXH+)TA@wL4Cgg~E7}{G z22A`FtNvnkknhR9o`O~{WF~ZEPkg|RI1cQ4G&}Nf{@o$3;LMlViT|R_!k|ZH&uCl+C;R%X(Nmpa2NWPA3HEyST@+lmB2m!{6tS1+Z?z9^h@7IT=)kcXh^F)eKCe62@mT5*JsFMmoIw|UzJLnBFGNZw zdG~s%4=0HL&NF%+iEFk{UB5#t^NuRk8Dg;~jPE1z;@iCI6PZFu&aWxarnGB;A)(dTgiGi zqFy?Hqr+ZM=I8VQ`+~cgpE23Yxg8_oxkVMli*a6ZPPxIp(+~|ta;-X*<{08ao4I}n z+}tDzx=Y;VIe%a0j1xF-uReQ-IBf%a)DXs?75BO+cOWl!AR7osTGrT9Xqg1s@+_<+ zS;5Y8(y^)uIB^4JOb149Fu%KsBmBWpA2JR)Yq-~+!0V+{n#yDb?payJza-b^DVR4Y z$%;;G={o!CFFd)k#4fnpvKWxP%Vp*V!ps$#xR_a1E z+|xGoL0{d73S%1L?Z%vC73yUTsOZ%JJ$Oo;{GQTTD@gwQNPY#Q`MuQy9o-45z1<&X zTs-?j9a-OPE?c8G%Y^EF5PC%6){=**2V}wjp}S15PvC|!62@#9`wo?X1fywGdjBpx z&X+AvD7r@UufZC@%X$G(hIP(X*U4h08TyXS)2(nym~K~eev-LG2cw12Tc4%*)R{(C ze>vlz)|q~;3aHFxTruO#ukd?%YSoexWLGC6%I)Q%2HsoE^+@d%c;_gsnYKf~R!7&| z)0ywQu?yjO)!j<#)L^_W5`VVW^ZRXoRbz+xk9t8JufB50=gdx?50N$1GV$u$ihHc* z0-fKjimLiMX24}x(Af^#H9h<7SI!4KX0owkrjjZg;W+ykJMiz$Yg`sLnsclNu)MyD z85wM@{SeFbTpy*rMNc_`XIMHbSu2-2g+Q7I z7W8|0@s;S~cvYI^AkQQ0#?JS2_ETk5Sjdy<%~ys!cp9s83$C}He1M?7JaFTXVoiEpi*Cnnm3#N z*z6fy?YH5#$s>~Mh5OnIWFPY9JxXrvu94DT9!HrQDBfqO4MbYEgdMOF%#BW@`p`Wn zE5PB4F$`leO5!6hjV9tweVO`BAM2TYf$H*OyuQxZFIj==%0ArdOjO*;xP4_^Mr9ff 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 literal 0 HcmV?d00001 diff --git a/test/regression/chan3.sph b/test/regression/chan3.sph new file mode 100644 index 0000000000000000000000000000000000000000..19965df525998dadc2cea41be982b630c1d06698 GIT binary patch literal 461240 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�@zTItjOyGPMp&1VJ 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

(?VHmts%;{!Kq{y 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 literal 0 HcmV?d00001 diff --git a/test/regression/chan3.wav b/test/regression/chan3.wav new file mode 100644 index 0000000000000000000000000000000000000000..252cf5e5dc6a7b3f2ff2e13687034e0b73eaabf0 GIT binary patch literal 460260 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

&_Pm4~$HAveBu!9z5`2 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ɫal2 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

GFzZ&hHN->{^@wPv=5x^SO+3<{qdQ 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

%OV0)oRg#R605TJ3CKW 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

ZTsfU#lmUM(Uz$)&{ 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 literal 0 HcmV?d00001 diff --git a/test/regression/polite.gram b/test/regression/polite.gram new file mode 100644 index 000000000..b4a05501e --- /dev/null +++ b/test/regression/polite.gram @@ -0,0 +1,12 @@ +#JSGF V1.0; + +/** + * JSGF Grammar for Hello World example + */ + +grammar polite; + +public = [please | kindly | could you | oh mighty computer]; +public = [please | thanks | thank you]; + +public = ( | )*; diff --git a/test/regression/test-cepview.sh b/test/regression/test-cepview.sh new file mode 100755 index 000000000..62d9a2b1e --- /dev/null +++ b/test/regression/test-cepview.sh @@ -0,0 +1,14 @@ +#!/bin/sh +. ./testfuncs.sh + +echo "CEPVIEW TEST" +tmpout="test-cepview.out" + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f $tests/regression/chan3.mfc \ +> $tmpout 2>test-cepview.err +if diff -w $tmpout $tests/regression/chan3.cepview > /dev/null 2>&1; then +pass "CEPVIEW test"; else +fail "CEPVIEW test"; fi diff --git a/test/regression/test-sphinx_fe-ctl.sh b/test/regression/test-sphinx_fe-ctl.sh new file mode 100755 index 000000000..b289438c0 --- /dev/null +++ b/test/regression/test-sphinx_fe-ctl.sh @@ -0,0 +1,62 @@ +#!/bin/sh +. ./testfuncs.sh + +tmpout="test-sphinx_fe-ctl.out" + +echo "WAVE2FEAT CTL/WAV/SPH TEST" +run_program sphinx_fe/sphinx_fe \ +-samprate 11025 \ +-vad_threshold 2.0 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-ncep 13 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-verbose yes \ +-c $tests/regression/chan3.ctl \ +-di $tests/regression \ +-do . \ +-eo mfc \ +-input_endian little \ +> $tmpout 2>&1 + +run_program sphinx_fe/sphinx_fe \ +-samprate 11025 \ +-vad_threshold 2.0 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-ncep 13 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-nchans 2 \ +-i $tests/regression/chan3.2chan.wav \ +-o chan3.2chan.wav.mfc +> $tmpout 2>&1 + +if ! cmp chan3.wav.mfc chan3.raw.mfc; then + fail "WAV and RAW compare" +fi + +if ! cmp chan3.2chan.wav.mfc chan3.wav.mfc; then + fail "WAV2 and WAV compare" +fi + +if ! cmp chan3.raw.mfc chan3.sph.mfc; then + fail "SPH and RAW compare" +fi + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f chan3.wav.mfc \ +> test-sphinx_fe.cepview 2>>$tmpout + +compare_table "WAVE2FEAT test" test-sphinx_fe.cepview $tests/regression/chan3.cepview 0.1 diff --git a/test/regression/test-sphinx_fe-dct.sh b/test/regression/test-sphinx_fe-dct.sh new file mode 100755 index 000000000..5923805d0 --- /dev/null +++ b/test/regression/test-sphinx_fe-dct.sh @@ -0,0 +1,30 @@ +#!/bin/sh +. ./testfuncs.sh + +tmpout="test-sphinx_fe-dct.out" + +echo "WAVE2FEAT-DCT INVERTIBLE TEST" +run_program sphinx_fe/sphinx_fe \ +-transform dct \ +-cep2spec yes \ +-nfilt 36 \ +-i $tests/regression/chan3.mfc \ +-o test-sphinx_fe-dct.logspec.out \ +> $tmpout 2>&1 + +run_program sphinx_fe/sphinx_fe \ +-transform dct \ +-spec2cep yes \ +-nfilt 36 \ +-i test-sphinx_fe-dct.logspec.out \ +-o test-sphinx_fe-dct.mfc.out \ +>> $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f test-sphinx_fe-dct.mfc.out \ +> test-sphinx_fe-dct.cepview.out 2>>$tmpout + +compare_table "WAVE2FEAT-DCT INVERTIBLE test" test-sphinx_fe-dct.cepview.out \ + $tests/regression/chan3.cepview diff --git a/test/regression/test-sphinx_fe-dither-seed.sh b/test/regression/test-sphinx_fe-dither-seed.sh new file mode 100755 index 000000000..b00dc303d --- /dev/null +++ b/test/regression/test-sphinx_fe-dither-seed.sh @@ -0,0 +1,35 @@ +#!/bin/sh +. ./testfuncs.sh + +tmpout="test-sphinx_fe-dither-seed.out" + +# Run sphinx_fe with dither and seed, so it is repeatable. There's +# nothing special about the seed. Just chose it because it's pretty +echo "WAVE2FEAT-DITHER-SEED TEST" +run_program sphinx_fe/sphinx_fe \ +-dither 1 \ +-vad_threshold 2.0 \ +-seed 1234 \ +-samprate 11025 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-ncep 13 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-i $tests/regression/chan3.raw \ +-input_endian little \ +-o test-sphinx_fe-dither-seed.mfc.out \ +-raw 1 > $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f test-sphinx_fe-dither-seed.mfc.out \ +> test-sphinx_fe-dither-seed.cepview.out 2>>$tmpout + +compare_table "WAVE2FEAT-DITHER-SEED test" test-sphinx_fe-dither-seed.cepview.out \ + $tests/regression/chan3-dither.cepview 0.1 diff --git a/test/regression/test-sphinx_fe-logspec.sh b/test/regression/test-sphinx_fe-logspec.sh new file mode 100755 index 000000000..933ff2e4d --- /dev/null +++ b/test/regression/test-sphinx_fe-logspec.sh @@ -0,0 +1,31 @@ +#!/bin/sh +. ./testfuncs.sh + +tmpout="test-sphinx_fe-logspec.out" + +echo "WAVE2FEAT-LOGSPEC TEST" +run_program sphinx_fe/sphinx_fe \ +-logspec 1 \ +-vad_threshold 2.0 \ +-samprate 11025 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-i $tests/regression/chan3.raw \ +-input_endian little \ +-o test-sphinx_fe-logspec.mfc.out \ +-raw 1 > $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 36 \ +-d 36 \ +-f test-sphinx_fe-logspec.mfc.out \ +> test-sphinx_fe-logspec.cepview.out 2>>$tmpout + +compare_table "WAVE2FEAT-LOGSPEC test" test-sphinx_fe-logspec.cepview.out \ + $tests/regression/chan3-logspec.cepview 0.2 diff --git a/test/regression/test-sphinx_fe-logspec2cep.sh b/test/regression/test-sphinx_fe-logspec2cep.sh new file mode 100755 index 000000000..e9730e344 --- /dev/null +++ b/test/regression/test-sphinx_fe-logspec2cep.sh @@ -0,0 +1,21 @@ +#!/bin/sh +. ./testfuncs.sh + +tmpout="test-sphinx_fe-logspec2cep.out" + +echo "WAVE2FEAT-LOGSPEC2CEP TEST" +run_program sphinx_fe/sphinx_fe \ +-spec2cep yes \ +-nfilt 36 \ +-i $tests/regression/chan3.logspec \ +-o test-sphinx_fe-logspec2cep.mfc.out \ +> $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f test-sphinx_fe-logspec2cep.mfc.out \ +> test-sphinx_fe-logspec2cep.cepview.out 2>>$tmpout + +compare_table "WAVE2FEAT-LOGSPEC2CEP test" test-sphinx_fe-logspec2cep.cepview.out \ + $tests/regression/chan3.cepview diff --git a/test/regression/test-sphinx_fe-smoothspec.sh b/test/regression/test-sphinx_fe-smoothspec.sh new file mode 100755 index 000000000..42ed5338a --- /dev/null +++ b/test/regression/test-sphinx_fe-smoothspec.sh @@ -0,0 +1,31 @@ +#!/bin/sh +. ./testfuncs.sh + +tmpout="test-sphinx_fe-smoothspec.out" + +echo "WAVE2FEAT-SMOOTHSPEC TEST" +run_program sphinx_fe/sphinx_fe \ +-smoothspec yes \ +-samprate 11025 \ +-vad_threshold 2.0 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-i $tests/regression/chan3.raw \ +-input_endian little \ +-o test-sphinx_fe-smoothspec.logspec.out \ +-raw yes > $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 36 \ +-d 36 \ +-f test-sphinx_fe-smoothspec.logspec.out \ +> test-sphinx_fe-smoothspec.cepview.out 2>>$tmpout + +compare_table "WAVE2FEAT-SMOOTHSPEC test" test-sphinx_fe-smoothspec.cepview.out \ + $tests/regression/chan3-smoothspec.cepview 0.1 diff --git a/test/regression/test-sphinx_fe.sh b/test/regression/test-sphinx_fe.sh new file mode 100755 index 000000000..10409daa9 --- /dev/null +++ b/test/regression/test-sphinx_fe.sh @@ -0,0 +1,30 @@ +#!/bin/sh +. ./testfuncs.sh + +tmpout="test-sphinx_fe.out" + +echo "WAVE2FEAT TEST" +run_program sphinx_fe/sphinx_fe \ +-vad_threshold 2.0 \ +-samprate 11025 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-ncep 13 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-i $tests/regression/chan3.raw \ +-input_endian little \ +-o test-sphinx_fe.mfc \ +-raw 1 > $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f test-sphinx_fe.mfc \ +> test-sphinx_fe.cepview 2>>$tmpout + +compare_table "WAVE2FEAT test" test-sphinx_fe.cepview $tests/regression/chan3.cepview 0.1 diff --git a/test/regression/test-sphinx_jsgf2fsg.sh b/test/regression/test-sphinx_jsgf2fsg.sh new file mode 100755 index 000000000..10e94a881 --- /dev/null +++ b/test/regression/test-sphinx_jsgf2fsg.sh @@ -0,0 +1,17 @@ +#!/bin/sh +. ./testfuncs.sh + +echo "JSGF2FSG TEST" +rules="test.rightRecursion test.nestedRightRecursion test.kleene test.nulltest test.command" + +tmpout="test-jsgf2fsg.out" +rm -f $tmpout + +JSGF_PATH=$tests/regression +export JSGF_PATH +for r in $rules; do + run_program sphinx_jsgf2fsg/sphinx_jsgf2fsg \ + -jsgf $tests/regression/test.gram -toprule $r -fsg $r.out 2>>$tmpout + compare_table $r $r.out $tests/regression/$r.fsg +done + diff --git a/test/regression/test-sphinx_pitch.sh b/test/regression/test-sphinx_pitch.sh new file mode 100755 index 000000000..02f6e9671 --- /dev/null +++ b/test/regression/test-sphinx_pitch.sh @@ -0,0 +1,14 @@ +#!/bin/sh +. ./testfuncs.sh + +tmpout="test-sphinx_pitch.out" + +echo "PITCH TEST" +run_program sphinx_adtools/sphinx_pitch \ +-samprate 11025 \ +-i $tests/regression/chan3.raw \ +-input_endian little \ +-o test-sphinx_pitch.f0 \ +-raw yes > $tmpout 2>&1 + +compare_table "PITCH test" test-sphinx_pitch.f0 $tests/regression/chan3.f0 0.1 diff --git a/test/regression/test.command.fsg b/test/regression/test.command.fsg new file mode 100644 index 000000000..c6b055507 --- /dev/null +++ b/test/regression/test.command.fsg @@ -0,0 +1,24 @@ +FSG_BEGIN +NUM_STATES 10 +START_STATE 0 +FINAL_STATE 8 +TRANSITION 0 1 1.000000 please +TRANSITION 0 1 1.000000 kindly +TRANSITION 0 2 1.000000 oh +TRANSITION 0 4 1.000000 could +TRANSITION 0 1 1.000000 +TRANSITION 1 5 1.000000 stop +TRANSITION 1 6 1.000000 stop +TRANSITION 1 7 1.000000 go +TRANSITION 1 5 1.000000 +TRANSITION 2 3 1.000000 mighty +TRANSITION 3 1 1.000000 computer +TRANSITION 4 1 1.000000 you +TRANSITION 5 8 1.000000 please +TRANSITION 5 8 1.000000 thanks +TRANSITION 5 9 1.000000 thank +TRANSITION 5 8 1.000000 +TRANSITION 6 1 1.000000 +TRANSITION 7 1 1.000000 +TRANSITION 9 8 1.000000 you +FSG_END diff --git a/test/regression/test.gram b/test/regression/test.gram new file mode 100644 index 000000000..d0ec99416 --- /dev/null +++ b/test/regression/test.gram @@ -0,0 +1,36 @@ +#JSGF V1.0; + +/** + * JSGF Grammar for Hello World example + */ + +grammar test; + +import ; +import ; + + +public = | ( and ) ; + = stop | start; + + +public = something | ; + = another | ; + + +public = * don't crash; + = please | kindly | oh mighty computer; + + +public = ; + + = (one [and] one); + = (two [and] two); + = (three [and] three); + + + +public = ; + + = go* | stop+; + diff --git a/test/regression/test.kleene.fsg b/test/regression/test.kleene.fsg new file mode 100644 index 000000000..c628f1664 --- /dev/null +++ b/test/regression/test.kleene.fsg @@ -0,0 +1,14 @@ +FSG_BEGIN +NUM_STATES 7 +START_STATE 0 +FINAL_STATE 6 +TRANSITION 0 2 1.000000 oh +TRANSITION 0 4 1.000000 please +TRANSITION 0 4 1.000000 kindly +TRANSITION 0 1 1.000000 +TRANSITION 1 5 1.000000 don't +TRANSITION 2 3 1.000000 mighty +TRANSITION 3 4 1.000000 computer +TRANSITION 4 0 1.000000 +TRANSITION 5 6 1.000000 crash +FSG_END diff --git a/test/regression/test.nestedRightRecursion.fsg b/test/regression/test.nestedRightRecursion.fsg new file mode 100644 index 000000000..58856325c --- /dev/null +++ b/test/regression/test.nestedRightRecursion.fsg @@ -0,0 +1,7 @@ +FSG_BEGIN +NUM_STATES 2 +START_STATE 0 +FINAL_STATE 1 +TRANSITION 0 1 1.000000 something +TRANSITION 0 1 1.000000 another +FSG_END diff --git a/test/regression/test.nulltest.fsg b/test/regression/test.nulltest.fsg new file mode 100644 index 000000000..7fbdd54c7 --- /dev/null +++ b/test/regression/test.nulltest.fsg @@ -0,0 +1,17 @@ +FSG_BEGIN +NUM_STATES 10 +START_STATE 0 +FINAL_STATE 9 +TRANSITION 0 1 1.000000 one +TRANSITION 1 2 1.000000 and +TRANSITION 1 2 1.000000 +TRANSITION 2 3 1.000000 one +TRANSITION 3 4 1.000000 two +TRANSITION 4 5 1.000000 and +TRANSITION 4 5 1.000000 +TRANSITION 5 6 1.000000 two +TRANSITION 6 7 1.000000 three +TRANSITION 7 8 1.000000 and +TRANSITION 7 8 1.000000 +TRANSITION 8 9 1.000000 three +FSG_END diff --git a/test/regression/test.rightRecursion.fsg b/test/regression/test.rightRecursion.fsg new file mode 100644 index 000000000..29c1d267c --- /dev/null +++ b/test/regression/test.rightRecursion.fsg @@ -0,0 +1,11 @@ +FSG_BEGIN +NUM_STATES 3 +START_STATE 0 +FINAL_STATE 0 +TRANSITION 0 0 1.000000 stop +TRANSITION 0 0 1.000000 start +TRANSITION 0 1 1.000000 stop +TRANSITION 0 1 1.000000 start +TRANSITION 1 2 1.000000 and +TRANSITION 2 0 1.000000 +FSG_END diff --git a/test/regression/testfuncs.sh.in b/test/regression/testfuncs.sh.in new file mode 100644 index 000000000..8cabcbe4d --- /dev/null +++ b/test/regression/testfuncs.sh.in @@ -0,0 +1,60 @@ +# Utility functions and parameters for regression tests + +# Predefined directories you may need +# Stupid broken RedHat autoconf doesn't do @abs_top_srcdir@ +builddir="@top_builddir@" +sourcedir="@top_srcdir@" +tests=$sourcedir/test + +# Automatically report failures on exit +failures="" +trap "report_failures" 0 + +run_program() { + program="$1" + shift + $builddir/libtool --mode=execute "$builddir/src/$program" $@ +} + +debug_program() { + program="$1" + shift + $builddir/libtool --mode=execute gdb --args "$builddir/src/$program" $@ +} + +memcheck_program() { + program="$1" + shift + $builddir/libtool --mode=execute valgrind --leak-check=full "$builddir/src/$program" $@ +} + +pass() { + title="$1" + echo "$title PASSED" +} + +fail() { + title="$1" + echo "$title FAILED" + failures="$failures,$title" +} + +compare_table() { + title="$1" + shift + if perl "$tests/compare_table.pl" $@ | grep SUCCESS >/dev/null 2>&1; then + pass "$title" + else + fail "$title" + fi +} + +report_failures() { + if test x"$failures" = x; then + echo "All sub-tests passed" + exit 0 + else + echo "Sub-tests failed:$failures" | sed -e 's/,/ /g' + exit 1 + fi +} diff --git a/test/unit/test_alloc/Makefile.am b/test/unit/test_alloc/Makefile.am new file mode 100644 index 000000000..a9d50c1a7 --- /dev/null +++ b/test/unit/test_alloc/Makefile.am @@ -0,0 +1,15 @@ +check_PROGRAMS = test_ckd_alloc test_ckd_alloc_catch test_ckd_alloc_fail test_ckd_alloc_abort \ + test_listelem_alloc + +TESTS = test_ckd_alloc test_ckd_alloc_catch test_ckd_alloc_fail.sh test_ckd_alloc_abort.sh \ + test_listelem_alloc +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include \ + -DTESTDATADIR=\"$(top_srcdir)/test/regression\" + +noinst_HEADERS = test_macros.h +EXTRA_DIST = test_ckd_alloc_fail.sh test_ckd_alloc_abort.sh + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la diff --git a/test/unit/test_alloc/test_ckd_alloc.c b/test/unit/test_alloc/test_ckd_alloc.c new file mode 100644 index 000000000..5d6925d2f --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc.c @@ -0,0 +1,103 @@ +#include + +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + int *alloc1; + int **alloc2; + int ***alloc3; + int i; + + TEST_ASSERT(alloc1 = ckd_calloc(3*3*3, sizeof(*alloc1))); + TEST_ASSERT(alloc2 = ckd_calloc_2d(3, 3, sizeof(**alloc2))); + TEST_ASSERT(alloc3 = ckd_calloc_3d(3, 3, 3, sizeof(***alloc3))); + + for (i = 0; i < 27; ++i) { + TEST_EQUAL(alloc1[i], 0); + alloc1[i] = i + 1; + } + for (i = 0; i < 27; ++i) + TEST_EQUAL(alloc1[i], i+1); + + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + TEST_EQUAL(alloc2[i][j], 0); + alloc2[i][j] = i * 3 + j + 1; + } + } + /* Verify that row-major ordering is in use. */ + for (i = 0; i < 9; ++i) { + TEST_EQUAL(alloc2[0][i], i+1); + TEST_EQUAL(alloc2[0][i], alloc1[i]); + } + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + TEST_EQUAL(alloc2[i][j], i * 3 + j + 1); + } + } + /* Now test alloc_ptr. */ + ckd_free_2d(alloc2); + alloc2 = ckd_alloc_2d_ptr(3, 3, alloc1, sizeof(*alloc1)); + for (i = 0; i < 9; ++i) { + TEST_EQUAL(alloc2[0][i], i+1); + TEST_EQUAL(alloc2[0][i], alloc1[i]); + } + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + TEST_EQUAL(alloc2[i][j], i * 3 + j + 1); + } + } + ckd_free_2d_ptr(alloc2); + + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + int k; + for (k = 0; k < 3; ++k) { + TEST_EQUAL(alloc3[i][j][k], 0); + alloc3[i][j][k] = i * 3 * 3 + j * 3 + k + 1; + } + } + } + /* Verify that row-major ordering is in use. */ + for (i = 0; i < 27; ++i) { + TEST_EQUAL(alloc3[0][0][i], i+1); + TEST_EQUAL(alloc3[0][0][i], alloc1[i]); + } + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + int k; + for (k = 0; k < 3; ++k) { + TEST_EQUAL(alloc3[i][j][k], i * 3 * 3 + j * 3 + k + 1); + } + } + } + /* Now test alloc_ptr. */ + ckd_free_3d(alloc3); + alloc3 = ckd_alloc_3d_ptr(3, 3, 3, alloc1, sizeof(*alloc1)); + for (i = 0; i < 27; ++i) { + TEST_EQUAL(alloc3[0][0][i], i+1); + TEST_EQUAL(alloc3[0][0][i], alloc1[i]); + } + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + int k; + for (k = 0; k < 3; ++k) { + TEST_EQUAL(alloc3[i][j][k], i * 3 * 3 + j * 3 + k + 1); + } + } + } + ckd_free_3d_ptr(alloc3); + ckd_free(alloc1); + + return 0; +} diff --git a/test/unit/test_alloc/test_ckd_alloc_abort.c b/test/unit/test_alloc/test_ckd_alloc_abort.c new file mode 100644 index 000000000..db9dc7d1d --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc_abort.c @@ -0,0 +1,19 @@ +#include + +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + int *alloc1; + int bad_alloc_did_not_fail = FALSE; + + ckd_set_jump(NULL, TRUE); + /* Guaranteed to fail, we hope!. */ + alloc1 = ckd_calloc(-1,-1); + TEST_ASSERT(bad_alloc_did_not_fail); + + return 0; +} diff --git a/test/unit/test_alloc/test_ckd_alloc_abort.sh b/test/unit/test_alloc/test_ckd_alloc_abort.sh new file mode 100755 index 000000000..6f1123e8e --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc_abort.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +. ../testfuncs.sh + +ulimit -c 0 +if ./test_ckd_alloc_abort; then + fail expected_failure +else + pass expected_failure +fi + diff --git a/test/unit/test_alloc/test_ckd_alloc_catch.c b/test/unit/test_alloc/test_ckd_alloc_catch.c new file mode 100644 index 000000000..35ec9e2c3 --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc_catch.c @@ -0,0 +1,26 @@ +#include + +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + int *alloc1; + jmp_buf env; + + ckd_set_jump(&env, FALSE); + if (setjmp(env)) { + printf("Successfully caught bad allocation!\n"); + } + else { + int failed_to_catch_bad_alloc = FALSE; + + /* Guaranteed to fail, we hope!. */ + alloc1 = ckd_calloc(-1,-1); + TEST_ASSERT(failed_to_catch_bad_alloc); + } + + return 0; +} diff --git a/test/unit/test_alloc/test_ckd_alloc_fail.c b/test/unit/test_alloc/test_ckd_alloc_fail.c new file mode 100644 index 000000000..845d87a3e --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc_fail.c @@ -0,0 +1,19 @@ +#include + +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + int *alloc1; + int bad_alloc_did_not_fail = FALSE; + + ckd_set_jump(NULL, FALSE); + /* Guaranteed to fail, we hope!. */ + alloc1 = ckd_calloc(-1,-1); + TEST_ASSERT(bad_alloc_did_not_fail); + + return 0; +} diff --git a/test/unit/test_alloc/test_ckd_alloc_fail.sh b/test/unit/test_alloc/test_ckd_alloc_fail.sh new file mode 100755 index 000000000..7758811ab --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc_fail.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +. ../testfuncs.sh + +./test_ckd_alloc_fail +if [ $? = 255 ]; then + pass expected_failure +else + fail expected_failure +fi + diff --git a/test/unit/test_alloc/test_listelem_alloc.c b/test/unit/test_alloc/test_listelem_alloc.c new file mode 100644 index 000000000..e2fd4589f --- /dev/null +++ b/test/unit/test_alloc/test_listelem_alloc.c @@ -0,0 +1,64 @@ +#include +#include + +#include + +#include "test_macros.h" + +struct bogus { + char const *str; + long foobie; +}; + +int +main(int argc, char *argv[]) +{ + listelem_alloc_t *le; + struct bogus *bogus1, *bogus2; + int i; + + TEST_ASSERT(le = listelem_alloc_init(sizeof(struct bogus))); + bogus1 = listelem_malloc(le); + bogus1->str = "hello"; + bogus1->foobie = 42; + bogus2 = listelem_malloc(le); + bogus2->str = "goodbye"; + bogus2->foobie = 69; + TEST_EQUAL(bogus1->foobie, 42); + TEST_EQUAL(0, strcmp(bogus1->str, "hello")); + listelem_free(le, bogus1); + listelem_free(le, bogus2); + listelem_alloc_free(le); + + TEST_ASSERT(le = listelem_alloc_init(sizeof(struct bogus))); + listelem_stats(le); + for (i = 0; i < 60; ++i) + bogus1 = listelem_malloc(le); + listelem_stats(le); + listelem_alloc_free(le); + + { + struct bogus *bogus[600]; + int32 bogus_id[600]; + + le = listelem_alloc_init(sizeof(struct bogus)); + for (i = 0; i < 600; ++i) + bogus[i] = listelem_malloc_id(le, bogus_id + i); + listelem_stats(le); + for (i = 0; i < 600; ++i) { + TEST_EQUAL(bogus[i], listelem_get_item(le, bogus_id[i])); + } + for (i = 0; i < 600; ++i) + listelem_free(le, bogus[i]); + listelem_stats(le); + for (i = 0; i < 600; ++i) + bogus[i] = listelem_malloc_id(le, bogus_id + i); + listelem_stats(le); + for (i = 0; i < 600; ++i) + TEST_EQUAL(bogus[i], listelem_get_item(le, bogus_id[i])); + listelem_alloc_free(le); + } + + + return 0; +} diff --git a/test/unit/test_alloc/test_macros.h b/test/unit/test_alloc/test_macros.h new file mode 100644 index 000000000..12cd03f50 --- /dev/null +++ b/test/unit/test_alloc/test_macros.h @@ -0,0 +1,11 @@ +#include +#include + +#include "logmath.h" + +#define EPSILON 0.01 +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define LOG_EPSILON 20 +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_bitvec/Makefile.am b/test/unit/test_bitvec/Makefile.am new file mode 100644 index 000000000..01d3c8c04 --- /dev/null +++ b/test/unit/test_bitvec/Makefile.am @@ -0,0 +1,12 @@ +check_PROGRAMS = test_bitvec + +TESTS = test_bitvec +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include \ + -DTESTDATADIR=\"$(top_srcdir)/test/regression\" + +noinst_HEADERS = test_macros.h + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la diff --git a/test/unit/test_bitvec/test_bitvec.c b/test/unit/test_bitvec/test_bitvec.c new file mode 100644 index 000000000..36f676035 --- /dev/null +++ b/test/unit/test_bitvec/test_bitvec.c @@ -0,0 +1,62 @@ +#include +#include + +#include "bitvec.h" +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + bitvec_t *bv; + int i, j; + clock_t c; + + TEST_ASSERT(bv = bitvec_alloc(199)); + bitvec_set(bv,198); + bitvec_set(bv,0); + bitvec_set(bv,42); + bitvec_set(bv,43); + bitvec_set(bv,44); + TEST_ASSERT(bitvec_is_set(bv,198)); + TEST_ASSERT(bitvec_is_set(bv,0)); + TEST_ASSERT(bitvec_is_set(bv,42)); + TEST_ASSERT(bitvec_is_set(bv,43)); + TEST_ASSERT(bitvec_is_set(bv,44)); + TEST_EQUAL(5, bitvec_count_set(bv, 199)); + bitvec_clear(bv, 43); + TEST_EQUAL(0, bitvec_is_set(bv,43)); + + c = clock(); + for (j = 0; j < 1000000; ++j) + bitvec_count_set(bv, 199); + c = clock() - c; + printf("1000000 * 199 bitvec_count_set in %.2f sec\n", + (double)c / CLOCKS_PER_SEC); + bitvec_free(bv); + + bv = bitvec_alloc(1314); + c = clock(); + for (j = 0; j < 50000; ++j) + for (i = 0; i < 1314; ++i) + bitvec_set(bv, i); + c = clock() - c; + printf("50000 * 1314 bitvec_set in %.2f sec\n", + (double)c / CLOCKS_PER_SEC); + bitvec_free(bv); + + /* Test realloc */ + bv = bitvec_alloc(13); + for (i = 1; i < 13; i+=2) + bitvec_set(bv, i); + printf("Bits set %d\n", bitvec_count_set(bv, 13)); + TEST_EQUAL(6, bitvec_count_set(bv, 13)); + bv = bitvec_realloc(bv, 13, 2000); + for (i = 0; i < 2000; i++) { + /* printf("%d %d\n", i, bitvec_is_set(bv, i) != 0); */ + } + printf("Bits set after realloc %d\n", bitvec_count_set(bv, 2000)); + TEST_EQUAL(6, bitvec_count_set(bv, 2000)); + bitvec_free(bv); + + return 0; +} diff --git a/test/unit/test_bitvec/test_macros.h b/test/unit/test_bitvec/test_macros.h new file mode 100644 index 000000000..12cd03f50 --- /dev/null +++ b/test/unit/test_bitvec/test_macros.h @@ -0,0 +1,11 @@ +#include +#include + +#include "logmath.h" + +#define EPSILON 0.01 +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define LOG_EPSILON 20 +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_case/Makefile.am b/test/unit/test_case/Makefile.am new file mode 100644 index 000000000..1cafbaf50 --- /dev/null +++ b/test/unit/test_case/Makefile.am @@ -0,0 +1,21 @@ +check_PROGRAMS = chgCase + + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la -lm + +TESTS = _lcase1.test \ + _lcase2.test \ + _lcase3.test \ + _strcmp1.test \ + _strcmp2.test \ + _strcmp3.test \ + _ucase1.test \ + _ucase2.test \ + _ucase3.test + +EXTRA_DIST = $(TESTS) diff --git a/test/unit/test_case/_lcase1.test b/test/unit/test_case/_lcase1.test new file mode 100755 index 000000000..4785356ae --- /dev/null +++ b/test/unit/test_case/_lcase1.test @@ -0,0 +1,2 @@ +#!/bin/sh +./chgCase lcase 5 3 diff --git a/test/unit/test_case/_lcase2.test b/test/unit/test_case/_lcase2.test new file mode 100755 index 000000000..43afe47e3 --- /dev/null +++ b/test/unit/test_case/_lcase2.test @@ -0,0 +1,2 @@ +#!/bin/sh +./chgCase lcase 1 1 diff --git a/test/unit/test_case/_lcase3.test b/test/unit/test_case/_lcase3.test new file mode 100755 index 000000000..144afbd36 --- /dev/null +++ b/test/unit/test_case/_lcase3.test @@ -0,0 +1,2 @@ +#!/bin/sh +./chgCase lcase \ No newline at end of file diff --git a/test/unit/test_case/_strcmp1.test b/test/unit/test_case/_strcmp1.test new file mode 100755 index 000000000..9462226b3 --- /dev/null +++ b/test/unit/test_case/_strcmp1.test @@ -0,0 +1,2 @@ +#!/bin/sh +./chgCase strcmp_nocase 2 3 \ No newline at end of file diff --git a/test/unit/test_case/_strcmp2.test b/test/unit/test_case/_strcmp2.test new file mode 100755 index 000000000..245aa1a36 --- /dev/null +++ b/test/unit/test_case/_strcmp2.test @@ -0,0 +1,2 @@ +#!/bin/sh +./chgCase strcmp_nocase 1 1 \ No newline at end of file diff --git a/test/unit/test_case/_strcmp3.test b/test/unit/test_case/_strcmp3.test new file mode 100755 index 000000000..0fb9741ec --- /dev/null +++ b/test/unit/test_case/_strcmp3.test @@ -0,0 +1,2 @@ +#!/bin/sh +./chgCase strcmp_nocase \ No newline at end of file diff --git a/test/unit/test_case/_ucase1.test b/test/unit/test_case/_ucase1.test new file mode 100755 index 000000000..cd635b535 --- /dev/null +++ b/test/unit/test_case/_ucase1.test @@ -0,0 +1,2 @@ +#!/bin/sh +./chgCase ucase 2 4 \ No newline at end of file diff --git a/test/unit/test_case/_ucase2.test b/test/unit/test_case/_ucase2.test new file mode 100755 index 000000000..4a191534a --- /dev/null +++ b/test/unit/test_case/_ucase2.test @@ -0,0 +1,2 @@ +#!/bin/sh +./chgCase ucase 1 1 \ No newline at end of file diff --git a/test/unit/test_case/_ucase3.test b/test/unit/test_case/_ucase3.test new file mode 100755 index 000000000..f2a48ad01 --- /dev/null +++ b/test/unit/test_case/_ucase3.test @@ -0,0 +1,2 @@ +#!/bin/sh +./chgCase ucase \ No newline at end of file diff --git a/test/unit/test_case/chgCase.c b/test/unit/test_case/chgCase.c new file mode 100644 index 000000000..ed4f3e0ff --- /dev/null +++ b/test/unit/test_case/chgCase.c @@ -0,0 +1,99 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +#include +#include +#include +#include +#include + +#define MAX_STR_LEN 64 +#define NUM_STRS 6 + +#define STR0 "this string should NEVER show up" +#define STR1 "" +#define STR2 "az3o%\tW@^#\\\n\r[]{}|\() '\"" +#define STR3 "az3o%\tw@^#\\\n\r[]{}|\() '\"" +#define STR4 "AZ3O%\tW@^#\\\n\r[]{}|\() '\"" +#define STR5 "AZ3O%\tw@^#\\\n\r[]{}|\() '\"" + + +int +main(int argc, char **argv) +{ + int cmp; + char *n1 = NULL; + char *n2 = NULL; + + char s1[MAX_STR_LEN]; + char s2[MAX_STR_LEN]; + + char strs[NUM_STRS][MAX_STR_LEN] = { STR0, + STR1, + STR2, + STR3, + STR4, + STR5 + }; + + if (argc < 2 || + 3 == argc || + argc > 4 || + (strcmp(argv[1], "lcase") && + strcmp(argv[1], "ucase") && strcmp(argv[1], "strcmp_nocase") + )) { + /*printf("INVALID PARAMETERS to chgCase\n"); */ + exit(1); + } + + + if (2 == argc) { + if (0 == strcmp(argv[1], "ucase")) { + ucase(n1); + } + else if (0 == strcmp(argv[1], "lcase")) { + lcase(n1); + } + else { + strcmp_nocase(n1, n2); + } + /* + if we're still alive we obviously didn't segfault + */ + exit(0); + } + + if (4 == argc) { + + if (0 >= atoi(argv[2]) || + atoi(argv[2]) >= NUM_STRS || + 0 >= atoi(argv[3]) || atoi(argv[3]) >= NUM_STRS) { + E_INFO("INVALID PARAMS TO chkCase\n"); + exit(1); + } + + strcpy(s1, strs[atoi(argv[2])]); + strcpy(s2, strs[atoi(argv[3])]); + + if (0 == strcmp(argv[1], "ucase")) { + ucase(s1); + cmp = strcmp(s1, s2); + } + else if (0 == strcmp(argv[1], "lcase")) { + lcase(s1); + cmp = strcmp(s1, s2); + } + else { + cmp = strcmp_nocase(s1, s2); + } + + /* E_INFO("Value of cmp %d\n", cmp); */ + if (0 != cmp) { + E_FATAL("test failed\nstr1:|%s|\nstr2:|%s|\n", s1, s2); + } + + return (cmp != 0); + } + + /*somehow we got here and we shouldn't have */ + + exit(1); +} diff --git a/test/unit/test_cmdln/Makefile.am b/test/unit/test_cmdln/Makefile.am new file mode 100644 index 000000000..8795033ca --- /dev/null +++ b/test/unit/test_cmdln/Makefile.am @@ -0,0 +1,24 @@ +check_PROGRAMS = cmdln_parse cmdln_parse_multiple cmdln_parse_r + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la -lm + +CLEANFILES = _test*.err _test*.out + +TESTS = _test_parse_badargs.test \ + _test_parse_defaults_r.test \ + _test_parse_defaults.test \ + _test_parse_goodargs.test \ + _test_parse_multiple.test + + +EXTRA_DIST = $(TESTS) \ + _test_parse_badargs.res \ + _test_parse_defaults.res \ + _test_parse_defaults_r.res \ + _test_parse_goodargs.res \ + _test_parse_multiple.res diff --git a/test/unit/test_cmdln/_test_parse_badargs.res b/test/unit/test_cmdln/_test_parse_badargs.res new file mode 100644 index 000000000..748ddb830 --- /dev/null +++ b/test/unit/test_cmdln/_test_parse_badargs.res @@ -0,0 +1,9 @@ +ERROR: Bad argument value for -a: foobar +ERROR: Failed to parse arguments list +ERROR: Failed to parse arguments list, forced exit +ERROR: Unknown argument name '-noarg' +ERROR: Failed to parse arguments list +ERROR: Failed to parse arguments list, forced exit +ERROR: Argument value for '-c' missing +ERROR: Failed to parse arguments list +ERROR: Failed to parse arguments list, forced exit diff --git a/test/unit/test_cmdln/_test_parse_badargs.test b/test/unit/test_cmdln/_test_parse_badargs.test new file mode 100755 index 000000000..429615483 --- /dev/null +++ b/test/unit/test_cmdln/_test_parse_badargs.test @@ -0,0 +1,14 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +testname=`basename $0 .test` + +./cmdln_parse -a foobar > $testname.out 2>&1 && exit 1 +./cmdln_parse -a 42 -noarg >> $testname.out 2>&1 && exit 1 +./cmdln_parse -a 42 -c >> $testname.out 2>&1 && exit 1 + +sed -ne 's,^ERROR:.*line [0-9]*:,ERROR:,p' < $testname.out > $testname.tmp.out \ + && mv $testname.tmp.out $testname.out +compare_table defaults $testname.out $tests/unit/test_cmdln/$testname.res 100 +#rm -f $testname.out diff --git a/test/unit/test_cmdln/_test_parse_defaults.res b/test/unit/test_cmdln/_test_parse_defaults.res new file mode 100644 index 000000000..b237a7c6a --- /dev/null +++ b/test/unit/test_cmdln/_test_parse_defaults.res @@ -0,0 +1,6 @@ +-a 42 This is the first argument. +-b This is the second argument. +-c no This is the third argument. +-d 1e-50 This is the fourth argument. +-l This is the fifth argument. + diff --git a/test/unit/test_cmdln/_test_parse_defaults.test b/test/unit/test_cmdln/_test_parse_defaults.test new file mode 100755 index 000000000..867895dd3 --- /dev/null +++ b/test/unit/test_cmdln/_test_parse_defaults.test @@ -0,0 +1,10 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +testname=`basename $0 .test` +./cmdln_parse > $testname.out 2>&1 || true +sed -ne 's,^-,-,p' < $testname.out > $testname.tmp.out \ + && mv $testname.tmp.out $testname.out +compare_table defaults $testname.out $tests/unit/test_cmdln/$testname.res 100 +rm -f $testname.out diff --git a/test/unit/test_cmdln/_test_parse_defaults_r.res b/test/unit/test_cmdln/_test_parse_defaults_r.res new file mode 100644 index 000000000..8be304ed4 --- /dev/null +++ b/test/unit/test_cmdln/_test_parse_defaults_r.res @@ -0,0 +1,10 @@ +-a 42 42 +-b +-c no no +-d 1e-50 1.000000e-50 +-l +-a 42 42 +-b foobie +-c no no +-d 1e-50 1.000000e-50 +-l diff --git a/test/unit/test_cmdln/_test_parse_defaults_r.test b/test/unit/test_cmdln/_test_parse_defaults_r.test new file mode 100755 index 000000000..a494ec678 --- /dev/null +++ b/test/unit/test_cmdln/_test_parse_defaults_r.test @@ -0,0 +1,10 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +testname=`basename $0 .test` +./cmdln_parse_r -a 42 > $testname.out 2>&1 +sed -ne 's,^-,-,p' < $testname.out > $testname.tmp.out \ + && mv $testname.tmp.out $testname.out +compare_table defaults $testname.out $tests/unit/test_cmdln/$testname.res 100 +rm -f $testname.out diff --git a/test/unit/test_cmdln/_test_parse_goodargs.res b/test/unit/test_cmdln/_test_parse_goodargs.res new file mode 100644 index 000000000..0e6e6ec76 --- /dev/null +++ b/test/unit/test_cmdln/_test_parse_goodargs.res @@ -0,0 +1 @@ +36 hello 1 4.500000 diff --git a/test/unit/test_cmdln/_test_parse_goodargs.test b/test/unit/test_cmdln/_test_parse_goodargs.test new file mode 100755 index 000000000..eebb0da70 --- /dev/null +++ b/test/unit/test_cmdln/_test_parse_goodargs.test @@ -0,0 +1,8 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +testname=`basename $0 .test` +./cmdln_parse -a 36 -b hello -c yes -d 4.5 > $testname.out 2>/dev/null +compare_table defaults $testname.out $tests/unit/test_cmdln/$testname.res +rm -f $testname.out diff --git a/test/unit/test_cmdln/_test_parse_multiple.res b/test/unit/test_cmdln/_test_parse_multiple.res new file mode 100644 index 000000000..792023ee0 --- /dev/null +++ b/test/unit/test_cmdln/_test_parse_multiple.res @@ -0,0 +1 @@ +42 (null) 0 4.500000 diff --git a/test/unit/test_cmdln/_test_parse_multiple.test b/test/unit/test_cmdln/_test_parse_multiple.test new file mode 100755 index 000000000..5ac96f04e --- /dev/null +++ b/test/unit/test_cmdln/_test_parse_multiple.test @@ -0,0 +1,8 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +testname=`basename $0 .test` +./cmdln_parse_multiple -a 42 -d 4.5 > $testname.out 2>/dev/null +compare_table defaults $testname.out $tests/unit/test_cmdln/$testname.res +rm -f $testname.out diff --git a/test/unit/test_cmdln/cmdln_parse.c b/test/unit/test_cmdln/cmdln_parse.c new file mode 100644 index 000000000..b4cf436d2 --- /dev/null +++ b/test/unit/test_cmdln/cmdln_parse.c @@ -0,0 +1,31 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +#include +#include + +#include "cmd_ln.h" +#include "ckd_alloc.h" + +const arg_t defs[] = { + { "-a", ARG_INT32, "42", "This is the first argument." }, + { "-b", ARG_STRING, NULL, "This is the second argument." }, + { "-c", ARG_BOOLEAN, "no", "This is the third argument." }, + { "-d", ARG_FLOAT64, "1e-50", "This is the fourth argument." }, + { "-l", ARG_STRING_LIST, NULL, "This is the fifth argument." }, + { NULL, 0, NULL, NULL } +}; + +int +main(int argc, char *argv[]) +{ + cmd_ln_parse(defs, argc, argv, TRUE); + printf("%d %s %d %f\n", + cmd_ln_int32("-a"), + cmd_ln_str("-b") ? cmd_ln_str("-b") : "(null)", + cmd_ln_boolean("-c"), + cmd_ln_float64("-d")); + + cmd_ln_free(); + + return 0; +} diff --git a/test/unit/test_cmdln/cmdln_parse_multiple.c b/test/unit/test_cmdln/cmdln_parse_multiple.c new file mode 100644 index 000000000..b6e0a14d1 --- /dev/null +++ b/test/unit/test_cmdln/cmdln_parse_multiple.c @@ -0,0 +1,36 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +#include +#include + +#include "cmd_ln.h" +#include "ckd_alloc.h" + +const arg_t defs[] = { + { "-a", ARG_INT32, "42", "This is the first argument." }, + { "-b", ARG_STRING, NULL, "This is the second argument." }, + { "-c", ARG_BOOLEAN, "no", "This is the third argument." }, + { "-d", ARG_FLOAT64, "1e-50", "This is the fourth argument." }, + { NULL, 0, NULL, NULL } +}; + +static char *orig_argv[] = { + "foobie", + "-a", "69" +}; +static int orig_argc = sizeof(orig_argv) / sizeof(orig_argv[0]); + +int +main(int argc, char *argv[]) +{ + cmd_ln_parse(defs, orig_argc, orig_argv, TRUE); + cmd_ln_parse(defs, argc, argv, FALSE); + printf("%d %s %d %f\n", + cmd_ln_int32("-a"), + cmd_ln_str("-b") ? cmd_ln_str("-b") : "(null)", + cmd_ln_boolean("-c"), + cmd_ln_float64("-d")); + cmd_ln_free(); + + return 0; +} diff --git a/test/unit/test_cmdln/cmdln_parse_r.c b/test/unit/test_cmdln/cmdln_parse_r.c new file mode 100644 index 000000000..bc4d2249f --- /dev/null +++ b/test/unit/test_cmdln/cmdln_parse_r.c @@ -0,0 +1,62 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +#include +#include + +#include "cmd_ln.h" +#include "ckd_alloc.h" + +const arg_t defs[] = { + { "-a", ARG_INT32, "42", "This is the first argument." }, + { "-b", ARG_STRING, NULL, "This is the second argument." }, + { "-c", ARG_BOOLEAN, "no", "This is the third argument." }, + { "-d", ARG_FLOAT64, "1e-50", "This is the fourth argument." }, + { "-l", ARG_STRING_LIST, NULL, "This is the fifth argument." }, + { NULL, 0, NULL, NULL } +}; + +int +main(int argc, char *argv[]) +{ + cmd_ln_t *config; + + config = cmd_ln_parse_r(NULL, defs, argc, argv, TRUE); + if (config == NULL) + return 1; + printf("%d %s %d %f\n", + cmd_ln_int32_r(config, "-a"), + cmd_ln_str_r(config, "-b") ? cmd_ln_str_r(config, "-b") : "(null)", + cmd_ln_boolean_r(config, "-c"), + cmd_ln_float64_r(config, "-d")); + cmd_ln_free_r(config); + + config = cmd_ln_init(NULL, NULL, FALSE, + "-b", "foobie", NULL); + if (config == NULL) + return 1; + cmd_ln_free_r(config); + + config = cmd_ln_init(NULL, defs, TRUE, + "-b", "foobie", NULL); + if (config == NULL) + return 1; + printf("%d %s %d %f\n", + cmd_ln_int32_r(config, "-a"), + cmd_ln_str_r(config, "-b") ? cmd_ln_str_r(config, "-b") : "(null)", + cmd_ln_boolean_r(config, "-c"), + cmd_ln_float64_r(config, "-d")); + cmd_ln_free_r(config); + + config = cmd_ln_init(NULL, NULL, FALSE, + "-b", "foobie", NULL); + if (config == NULL) + return 1; + printf("%s\n", + cmd_ln_str_r(config, "-b") ? cmd_ln_str_r(config, "-b") : "(null)"); + cmd_ln_set_str_r(config, "-b", "blatz"); + printf("%s\n", + cmd_ln_str_r(config, "-b") ? cmd_ln_str_r(config, "-b") : "(null)"); + cmd_ln_free_r(config); + + return 0; +} diff --git a/test/unit/test_fe/Makefile.am b/test/unit/test_fe/Makefile.am new file mode 100644 index 000000000..6184d96f9 --- /dev/null +++ b/test/unit/test_fe/Makefile.am @@ -0,0 +1,12 @@ +check_PROGRAMS = test_fe test_pitch + +TESTS = test_fe test_pitch +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include \ + -DTESTDATADIR=\"$(top_srcdir)/test/regression\" + +noinst_HEADERS = test_macros.h + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la diff --git a/test/unit/test_fe/test_fe.c b/test/unit/test_fe/test_fe.c new file mode 100644 index 000000000..c4f6123ce --- /dev/null +++ b/test/unit/test_fe/test_fe.c @@ -0,0 +1,218 @@ +#include +#include + +#include "fe.h" +#include "cmd_ln.h" +#include "ckd_alloc.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + static const arg_t fe_args[] = { + waveform_to_cepstral_command_line_macro(), + { NULL, 0, NULL, NULL } + }; + FILE *raw; + cmd_ln_t *config; + fe_t *fe; + int16 buf[1024]; + int16 const *inptr; + int32 frame_shift, frame_size; + mfcc_t **cepbuf1, **cepbuf2, **cptr; + int32 nfr, i; + size_t nsamp; + + TEST_ASSERT(config = cmd_ln_parse_r(NULL, fe_args, argc, argv, FALSE)); + TEST_ASSERT(fe = fe_init_auto_r(config)); + + TEST_EQUAL(fe_get_output_size(fe), DEFAULT_NUM_CEPSTRA); + + fe_get_input_size(fe, &frame_shift, &frame_size); + TEST_EQUAL(frame_shift, DEFAULT_FRAME_SHIFT); + TEST_EQUAL(frame_size, (int)(DEFAULT_WINDOW_LENGTH*DEFAULT_SAMPLING_RATE)); + + TEST_ASSERT(raw = fopen(TESTDATADIR "/chan3.raw", "rb")); + + fe_start_stream(fe); + TEST_EQUAL(0, fe_start_utt(fe)); + TEST_EQUAL(1024, fread(buf, sizeof(int16), 1024, raw)); + + nsamp = 1024; + TEST_ASSERT(fe_process_frames(fe, NULL, &nsamp, NULL, &nfr, NULL) >= 0); + TEST_EQUAL(1024, nsamp); + TEST_EQUAL(4, nfr); + + cepbuf1 = ckd_calloc_2d(5, DEFAULT_NUM_CEPSTRA, sizeof(**cepbuf1)); + inptr = &buf[0]; + nfr = 1; + + printf("frame_size %d frame_shift %d\n", frame_size, frame_shift); + /* Process the first frame. */ + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[0], &nfr, NULL) >= 0); + printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, nfr); + /* First frame assumed to be unvoiced to init noise reduction */ + TEST_EQUAL(nfr, 0); + + /* Note that this next one won't actually consume any frames + * of input, because it already got sufficient overflow + * samples last time around. This is implementation-dependent + * so we shouldn't actually test for it. + * First 1024 samples of chan3.raw is silence, nfr is expected to stay 0 */ + nfr = 1; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[1], &nfr, NULL) >= 0); + printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, nfr); + TEST_EQUAL(nfr, 0); + + nfr = 1; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[2], &nfr, NULL) >= 0); + printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, nfr); + TEST_EQUAL(nfr, 0); + + nfr = 1; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[3], &nfr, NULL) >= 0); + printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, nfr); + TEST_EQUAL(nfr, 0); + + nfr = 1; + TEST_ASSERT(fe_end_utt(fe, cepbuf1[4], &nfr) >= 0); + printf("nfr %d\n", nfr); + TEST_EQUAL(nfr, 0); + + /* What we *should* test is that the output we get by + * processing one frame at a time is exactly the same as what + * we get from doing them all at once. So let's do that */ + cepbuf2 = ckd_calloc_2d(5, DEFAULT_NUM_CEPSTRA, sizeof(**cepbuf2)); + inptr = &buf[0]; + nfr = 5; + nsamp = 1024; + fe_start_stream(fe); + TEST_EQUAL(0, fe_start_utt(fe)); + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cepbuf2, &nfr, NULL) >= 0); + /* First 1024 samples of chan3.raw is silence, nfr is expected to stay 0 */ + printf("nfr %d\n", nfr); + TEST_EQUAL(nfr, 0); + nfr = 1; + TEST_ASSERT(fe_end_utt(fe, cepbuf2[4], &nfr) >= 0); + printf("nfr %d\n", nfr); + TEST_EQUAL(nfr, 0); + + /* output features stored in cepbuf[4] by fe_end_utt + * should be the same */ + printf("%d: ", 4); + for (i = 0; i < DEFAULT_NUM_CEPSTRA; ++i) { + printf("%.2f,%.2f ", + MFCC2FLOAT(cepbuf1[4][i]), + MFCC2FLOAT(cepbuf2[4][i])); + TEST_EQUAL_FLOAT(cepbuf1[4][i], cepbuf2[4][i]); + } + printf("\n"); + + /* Now, also test to make sure that even if we feed data in + * little tiny bits we can still make things work. */ + memset(cepbuf2[0], 0, 5 * DEFAULT_NUM_CEPSTRA * sizeof(**cepbuf2)); + inptr = &buf[0]; + cptr = &cepbuf2[0]; + nfr = 5; + i = 5; + nsamp = 256; + fe_start_stream(fe); + TEST_EQUAL(0, fe_start_utt(fe)); + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i, NULL) >= 0); + printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, i); + cptr += i; + nfr -= i; + i = nfr; + nsamp = 256; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i, NULL) >= 0); + printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, i); + cptr += i; + nfr -= i; + i = nfr; + nsamp = 256; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i, NULL) >= 0); + printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, i); + cptr += i; + nfr -= i; + i = nfr; + nsamp = 256; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i, NULL) >= 0); + printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, i); + cptr += i; + nfr -= i; + printf("nfr %d\n", nfr); + TEST_EQUAL(nfr, 5); + /* inptr contains unvoiced audio, + * no out feature frames will be produced */ + TEST_ASSERT(fe_end_utt(fe, *cptr, &nfr) >= 0); + printf("nfr %d\n", nfr); + TEST_EQUAL(nfr, 0); + + /* fe_process_frames overwrites features if frame is unvoiced, + * so for cepbuf2 last frame is at 0 and previous are lost */ + printf("%d: ", 4); + for (i = 0; i < DEFAULT_NUM_CEPSTRA; ++i) { + printf("%.2f,%.2f ", + MFCC2FLOAT(cepbuf1[4][i]), + MFCC2FLOAT(cepbuf2[0][i])); + TEST_EQUAL_FLOAT(cepbuf1[4][i], cepbuf2[0][i]); + } + printf("\n"); + + /* And now, finally, test fe_process_utt() */ + inptr = &buf[0]; + i = 0; + fe_start_stream(fe); + TEST_EQUAL(0, fe_start_utt(fe)); + TEST_ASSERT(fe_process_utt(fe, inptr, 256, &cptr, &nfr) >= 0); + printf("i %d nfr %d\n", i, nfr); + if (nfr) + memcpy(cepbuf2[i], cptr[0], nfr * DEFAULT_NUM_CEPSTRA * sizeof(**cptr)); + ckd_free_2d(cptr); + i += nfr; + inptr += 256; + TEST_ASSERT(fe_process_utt(fe, inptr, 256, &cptr, &nfr) >= 0); + printf("i %d nfr %d\n", i, nfr); + if (nfr) + memcpy(cepbuf2[i], cptr[0], nfr * DEFAULT_NUM_CEPSTRA * sizeof(**cptr)); + ckd_free_2d(cptr); + i += nfr; + inptr += 256; + TEST_ASSERT(fe_process_utt(fe, inptr, 256, &cptr, &nfr) >= 0); + printf("i %d nfr %d\n", i, nfr); + if (nfr) + memcpy(cepbuf2[i], cptr[0], nfr * DEFAULT_NUM_CEPSTRA * sizeof(**cptr)); + ckd_free_2d(cptr); + i += nfr; + inptr += 256; + TEST_ASSERT(fe_process_utt(fe, inptr, 256, &cptr, &nfr) >= 0); + printf("i %d nfr %d\n", i, nfr); + if (nfr) + memcpy(cepbuf2[i], cptr[0], nfr * DEFAULT_NUM_CEPSTRA * sizeof(**cptr)); + ckd_free_2d(cptr); + i += nfr; + inptr += 256; + TEST_ASSERT(fe_end_utt(fe, cepbuf2[i], &nfr) >= 0); + printf("i %d nfr %d\n", i, nfr); + TEST_EQUAL(nfr, 0); + + /* fe_process_utt overwrites features if frame is unvoiced, + * so for cepbuf2 last frame is at 0 and previous are lost */ + printf("%d: ", 4); + for (i = 0; i < DEFAULT_NUM_CEPSTRA; ++i) { + printf("%.2f,%.2f ", + MFCC2FLOAT(cepbuf1[4][i]), + MFCC2FLOAT(cepbuf2[0][i])); + TEST_EQUAL_FLOAT(cepbuf1[4][i], cepbuf2[0][i]); + } + printf("\n"); + + ckd_free_2d(cepbuf1); + ckd_free_2d(cepbuf2); + fclose(raw); + fe_free(fe); + cmd_ln_free_r(config); + + return 0; +} diff --git a/test/unit/test_fe/test_macros.h b/test/unit/test_fe/test_macros.h new file mode 100644 index 000000000..a88d229e8 --- /dev/null +++ b/test/unit/test_fe/test_macros.h @@ -0,0 +1,12 @@ +#include +#include +#include + +#include "logmath.h" + +#define EPSILON 0.01 +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define LOG_EPSILON 20 +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_fe/test_pitch.c b/test/unit/test_fe/test_pitch.c new file mode 100644 index 000000000..02c9de73f --- /dev/null +++ b/test/unit/test_fe/test_pitch.c @@ -0,0 +1,55 @@ +#include + +#include "yin.h" +#include "ckd_alloc.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + /* This is 11025Hz data (yikes) */ + static const int frame_shift = 110, frame_size = 265; + FILE *raw; + yin_t *pe; + int16 *buf; + size_t nsamp, start; + uint16 period, bestdiff; + int nfr; + + /* To make life easier, read the whole thing. */ + TEST_ASSERT(raw = fopen(TESTDATADIR "/chan3.raw", "rb")); + fseek(raw, 0, SEEK_END); + nsamp = ftell(raw) / 2; + buf = ckd_calloc(nsamp, 2); + fseek(raw, 0, SEEK_SET); + TEST_EQUAL(nsamp, fread(buf, 2, nsamp, raw)); + fclose(raw); + + TEST_ASSERT(pe = yin_init(frame_size, 0.1, 0.2, 2)); + yin_start(pe); + nfr = 0; + for (start = 0; start + frame_size < nsamp; start += frame_shift) { + yin_write(pe, buf + start); + if (yin_read(pe, &period, &bestdiff)) { + if (bestdiff < 0.2 * 32768) + printf("%d ", period ? 11025/period : 0); + else + printf("0 "); + ++nfr; + } + } + yin_end(pe); + while (yin_read(pe, &period, &bestdiff)) { + if (bestdiff < 0.2 * 32768) + printf("%d ", period ? 11025/period : 0); + else + printf("0 "); + ++nfr; + } + printf("\n"); + yin_free(pe); + ckd_free(buf); + + return 0; +} diff --git a/test/unit/test_feat/Makefile.am b/test/unit/test_feat/Makefile.am new file mode 100644 index 000000000..d7353121e --- /dev/null +++ b/test/unit/test_feat/Makefile.am @@ -0,0 +1,15 @@ +check_PROGRAMS = test_feat test_feat_live test_feat_fe test_subvq +noinst_HEADERS = test_macros.h + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include \ + -DTESTDATADIR=\"$(top_srcdir)/test/regression\" + + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la + +TESTS = _test_feat.test test_feat_live test_feat_fe test_subvq +EXTRA_DIST = _test_feat.res _test_feat.test +CLEANFILES = *.out diff --git a/test/unit/test_feat/_test_feat.res b/test/unit/test_feat/_test_feat.res new file mode 100644 index 000000000..b104b55be --- /dev/null +++ b/test/unit/test_feat/_test_feat.res @@ -0,0 +1,18 @@ +15.114 -1.424 -0.953 0.186 -0.656 -0.226 -0.105 -0.412 -0.024 -0.091 -0.124 -0.158 -0.197 +14.729 -1.313 -0.892 0.140 -0.676 -0.089 -0.313 -0.422 -0.058 -0.101 -0.100 -0.128 -0.123 +14.502 -1.351 -1.028 -0.189 -0.718 -0.139 -0.121 -0.365 -0.139 -0.154 0.041 0.009 -0.073 +14.557 -1.676 -0.864 0.118 -0.445 -0.168 -0.069 -0.503 -0.013 0.007 -0.056 -0.075 -0.237 +14.665 -1.498 -0.582 0.209 -0.487 -0.247 -0.142 -0.439 0.059 -0.058 -0.265 -0.109 -0.196 +15.025 -1.199 -0.607 0.235 -0.499 -0.080 -0.062 -0.554 -0.209 -0.124 -0.445 -0.352 -0.400 +15.114 -1.424 -0.953 0.186 -0.656 -0.226 -0.105 -0.412 -0.024 -0.091 -0.124 -0.158 -0.197 15.114 -1.424 -0.953 0.186 -0.656 -0.226 -0.105 -0.412 -0.024 -0.091 -0.124 -0.158 -0.197 14.729 -1.313 -0.892 0.140 -0.676 -0.089 -0.313 -0.422 -0.058 -0.101 -0.100 -0.128 -0.123 +15.114 -1.424 -0.953 0.186 -0.656 -0.226 -0.105 -0.412 -0.024 -0.091 -0.124 -0.158 -0.197 14.729 -1.313 -0.892 0.140 -0.676 -0.089 -0.313 -0.422 -0.058 -0.101 -0.100 -0.128 -0.123 14.502 -1.351 -1.028 -0.189 -0.718 -0.139 -0.121 -0.365 -0.139 -0.154 0.041 0.009 -0.073 +14.729 -1.313 -0.892 0.140 -0.676 -0.089 -0.313 -0.422 -0.058 -0.101 -0.100 -0.128 -0.123 14.502 -1.351 -1.028 -0.189 -0.718 -0.139 -0.121 -0.365 -0.139 -0.154 0.041 0.009 -0.073 14.557 -1.676 -0.864 0.118 -0.445 -0.168 -0.069 -0.503 -0.013 0.007 -0.056 -0.075 -0.237 +14.502 -1.351 -1.028 -0.189 -0.718 -0.139 -0.121 -0.365 -0.139 -0.154 0.041 0.009 -0.073 14.557 -1.676 -0.864 0.118 -0.445 -0.168 -0.069 -0.503 -0.013 0.007 -0.056 -0.075 -0.237 14.665 -1.498 -0.582 0.209 -0.487 -0.247 -0.142 -0.439 0.059 -0.058 -0.265 -0.109 -0.196 +14.557 -1.676 -0.864 0.118 -0.445 -0.168 -0.069 -0.503 -0.013 0.007 -0.056 -0.075 -0.237 14.665 -1.498 -0.582 0.209 -0.487 -0.247 -0.142 -0.439 0.059 -0.058 -0.265 -0.109 -0.196 15.025 -1.199 -0.607 0.235 -0.499 -0.080 -0.062 -0.554 -0.209 -0.124 -0.445 -0.352 -0.400 +14.665 -1.498 -0.582 0.209 -0.487 -0.247 -0.142 -0.439 0.059 -0.058 -0.265 -0.109 -0.196 15.025 -1.199 -0.607 0.235 -0.499 -0.080 -0.062 -0.554 -0.209 -0.124 -0.445 -0.352 -0.400 15.025 -1.199 -0.607 0.235 -0.499 -0.080 -0.062 -0.554 -0.209 -0.124 -0.445 -0.352 -0.400 +15.114 -1.424 -0.953 0.186 -0.656 -0.226 -0.105 -0.412 -0.024 -0.091 -0.124 -0.158 -0.197 -0.612 0.073 -0.075 -0.375 -0.062 0.087 -0.016 0.047 -0.115 -0.063 0.165 0.167 0.124 -0.172 -0.363 0.028 -0.022 0.231 -0.079 0.244 -0.081 0.045 0.108 0.044 0.053 -0.114 +14.729 -1.313 -0.892 0.140 -0.676 -0.089 -0.313 -0.422 -0.058 -0.101 -0.100 -0.128 -0.123 -0.557 -0.252 0.089 -0.068 0.211 0.058 0.036 -0.091 0.011 0.098 0.068 0.083 -0.040 0.163 -0.147 0.446 0.398 0.231 -0.108 -0.021 -0.074 0.198 0.096 -0.306 -0.118 -0.123 +14.502 -1.351 -1.028 -0.189 -0.718 -0.139 -0.121 -0.365 -0.139 -0.154 0.041 0.009 -0.073 -0.449 -0.074 0.371 0.023 0.169 -0.021 -0.037 -0.027 0.083 0.033 -0.141 0.049 0.001 0.853 0.366 0.196 0.163 -0.034 -0.049 0.215 -0.041 -0.162 -0.121 -0.413 -0.307 -0.237 +14.557 -1.676 -0.864 0.118 -0.445 -0.168 -0.069 -0.503 -0.013 0.007 -0.056 -0.075 -0.237 0.296 0.114 0.285 0.095 0.177 0.009 0.251 -0.132 -0.151 -0.023 -0.345 -0.224 -0.277 0.972 0.226 0.050 0.401 0.050 0.080 0.096 -0.162 -0.153 -0.003 -0.345 -0.410 -0.328 +14.665 -1.498 -0.582 0.209 -0.487 -0.247 -0.142 -0.439 0.059 -0.058 -0.265 -0.109 -0.196 0.523 0.152 0.421 0.424 0.219 0.059 0.059 -0.189 -0.070 0.030 -0.486 -0.361 -0.327 0.172 0.363 -0.028 0.022 -0.231 0.079 -0.244 0.081 -0.045 -0.108 -0.044 -0.053 0.114 +15.025 -1.199 -0.607 0.235 -0.499 -0.080 -0.062 -0.554 -0.209 -0.124 -0.445 -0.352 -0.400 0.468 0.477 0.257 0.117 -0.054 0.088 0.007 -0.051 -0.196 -0.131 -0.389 -0.277 -0.163 -0.163 0.147 -0.446 -0.398 -0.231 0.108 0.021 0.074 -0.198 -0.096 0.306 0.118 0.123 diff --git a/test/unit/test_feat/_test_feat.test b/test/unit/test_feat/_test_feat.test new file mode 100755 index 000000000..0c6144b9c --- /dev/null +++ b/test/unit/test_feat/_test_feat.test @@ -0,0 +1,7 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +./test_feat > _test_feat.out +compare_table feat _test_feat.out $tests/unit/test_feat/_test_feat.res +rm -f _test_feat.out diff --git a/test/unit/test_feat/test_feat.c b/test/unit/test_feat/test_feat.c new file mode 100644 index 000000000..e937c6dd5 --- /dev/null +++ b/test/unit/test_feat/test_feat.c @@ -0,0 +1,108 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "feat.h" +#include "ckd_alloc.h" + +const mfcc_t data[6][13] = { + { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), + FLOAT2MFCC(0.186), FLOAT2MFCC(-0.656), FLOAT2MFCC(-0.226), + FLOAT2MFCC(-0.105), FLOAT2MFCC(-0.412), FLOAT2MFCC(-0.024), + FLOAT2MFCC(-0.091), FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.158), FLOAT2MFCC(-0.197)}, + { FLOAT2MFCC(14.729), FLOAT2MFCC(-1.313), FLOAT2MFCC(-0.892), + FLOAT2MFCC(0.140), FLOAT2MFCC(-0.676), FLOAT2MFCC(-0.089), + FLOAT2MFCC(-0.313), FLOAT2MFCC(-0.422), FLOAT2MFCC(-0.058), + FLOAT2MFCC(-0.101), FLOAT2MFCC(-0.100), FLOAT2MFCC(-0.128), FLOAT2MFCC(-0.123)}, + { FLOAT2MFCC(14.502), FLOAT2MFCC(-1.351), FLOAT2MFCC(-1.028), + FLOAT2MFCC(-0.189), FLOAT2MFCC(-0.718), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.121), FLOAT2MFCC(-0.365), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.154), FLOAT2MFCC(0.041), FLOAT2MFCC(0.009), FLOAT2MFCC(-0.073)}, + { FLOAT2MFCC(14.557), FLOAT2MFCC(-1.676), FLOAT2MFCC(-0.864), + FLOAT2MFCC(0.118), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.168), + FLOAT2MFCC(-0.069), FLOAT2MFCC(-0.503), FLOAT2MFCC(-0.013), + FLOAT2MFCC(0.007), FLOAT2MFCC(-0.056), FLOAT2MFCC(-0.075), FLOAT2MFCC(-0.237)}, + { FLOAT2MFCC(14.665), FLOAT2MFCC(-1.498), FLOAT2MFCC(-0.582), + FLOAT2MFCC(0.209), FLOAT2MFCC(-0.487), FLOAT2MFCC(-0.247), + FLOAT2MFCC(-0.142), FLOAT2MFCC(-0.439), FLOAT2MFCC(0.059), + FLOAT2MFCC(-0.058), FLOAT2MFCC(-0.265), FLOAT2MFCC(-0.109), FLOAT2MFCC(-0.196)}, + { FLOAT2MFCC(15.025), FLOAT2MFCC(-1.199), FLOAT2MFCC(-0.607), + FLOAT2MFCC(0.235), FLOAT2MFCC(-0.499), FLOAT2MFCC(-0.080), + FLOAT2MFCC(-0.062), FLOAT2MFCC(-0.554), FLOAT2MFCC(-0.209), + FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.352), FLOAT2MFCC(-0.400)}, +}; + +int +main(int argc, char *argv[]) +{ + feat_t *fcb; + mfcc_t **in_feats, ***out_feats; + int32 i, j, ncep; + + /* Test "raw" features without concatenation */ + fcb = feat_init("13", CMN_NONE, 0, AGC_NONE, 1, 13); + + in_feats = (mfcc_t **)ckd_alloc_2d_ptr(6, 13, data, sizeof(mfcc_t)); + out_feats = (mfcc_t ***)ckd_calloc_3d(6, 1, 13, sizeof(mfcc_t)); + ncep = 6; + feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats); + + for (i = 0; i < 6; ++i) { + for (j = 0; j < 13; ++j) { + printf("%.3f ", MFCC2FLOAT(out_feats[i][0][j])); + } + printf("\n"); + } + feat_free(fcb); + ckd_free(in_feats); + ckd_free_3d(out_feats); + + /* Test "raw" features with concatenation */ + fcb = feat_init("13:1", CMN_NONE, 0, AGC_NONE, 1, 13); + + in_feats = (mfcc_t **)ckd_alloc_2d_ptr(6, 13, data, sizeof(mfcc_t)); + out_feats = (mfcc_t ***)ckd_calloc_3d(8, 1, 39, sizeof(mfcc_t)); + ncep = 6; + feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats); + + for (i = 0; i < 6; ++i) { + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(out_feats[i][0][j])); + } + printf("\n"); + } + feat_free(fcb); + + /* Test 1s_c_d_dd features */ + fcb = feat_init("1s_c_d_dd", CMN_NONE, 0, AGC_NONE, 1, 13); + ncep = 6; + feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats); + + for (i = 0; i < 6; ++i) { + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(out_feats[i][0][j])); + } + printf("\n"); + } + + /* Verify that the deltas are correct. */ + for (i = 2; i < 4; ++i) { + for (j = 0; j < 13; ++j) { + if (fabs(MFCC2FLOAT(out_feats[i][0][13+j] - + (out_feats[i+2][0][j] + - out_feats[i-2][0][j]))) > 0.01) { + printf("Delta mismatch in [%d][%d]\n", i, j); + return 1; + } + } + } + feat_free(fcb); + ckd_free(in_feats); + ckd_free_3d(out_feats); + + return 0; +} diff --git a/test/unit/test_feat/test_feat_fe.c b/test/unit/test_feat/test_feat_fe.c new file mode 100644 index 000000000..0ad42b29b --- /dev/null +++ b/test/unit/test_feat/test_feat_fe.c @@ -0,0 +1,153 @@ +#include +#include + +#include "fe.h" +#include "feat.h" +#include "cmd_ln.h" +#include "ckd_alloc.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + static const arg_t fe_args[] = { + waveform_to_cepstral_command_line_macro(), + { NULL, 0, NULL, NULL } + }; + FILE *raw; + cmd_ln_t *config; + fe_t *fe; + feat_t *fcb; + int16 buf[2048]; + mfcc_t **cepbuf, **cptr; + mfcc_t ***featbuf1, ***featbuf2, ***fptr; + size_t nsamp; + int32 total_frames, ncep, nfr, i; + + if ((raw = fopen(TESTDATADIR "/chan3.raw", "rb")) == NULL) { + perror(TESTDATADIR "/chan3.raw"); + return 1; + } + + config = cmd_ln_parse_r(NULL, fe_args, argc, argv, FALSE); + fe = fe_init_auto_r(config); + fcb = feat_init("1s_c_d_dd", CMN_NONE, FALSE, AGC_NONE, + TRUE, fe_get_output_size(fe)); + + /* Determine how much data and how many MFCC frames we need. */ + fseek(raw, 0, SEEK_END); + nsamp = ftell(raw) / sizeof(int16); + fe_process_frames(fe, NULL, &nsamp, NULL, &total_frames, NULL); + printf("%d samples, %d + 1 frames\n", nsamp, total_frames); + total_frames++; /* For the possible fe_end_utt() frame */ + cepbuf = ckd_calloc_2d(total_frames + 1, fe_get_output_size(fe), sizeof(**cepbuf)); + fseek(raw, 0, SEEK_SET); + + /* Pay close attention, kids. This is how you use fe_process_frames(). */ + fe_start_utt(fe); + cptr = cepbuf; + nfr = total_frames; + while ((nsamp = fread(buf, sizeof(int16), 2048, raw)) > 0) { + int16 const *bptr = buf; + while (nsamp) { + int32 ncep = nfr; + fe_process_frames(fe, &bptr, &nsamp, cptr, &ncep, NULL); + cptr += ncep; + nfr -= ncep; + } + } + fe_end_utt(fe, *cptr, &nfr); + + /* Now test some feature extraction problems. */ + featbuf1 = feat_array_alloc(fcb, total_frames); + featbuf2 = feat_array_alloc(fcb, total_frames); + + /* Whole utterance: canonical, assumed to be correct. */ + ncep = total_frames; + TEST_EQUAL(total_frames, + feat_s2mfc2feat_live(fcb, cepbuf, + &ncep, TRUE, TRUE, + featbuf1)); + TEST_EQUAL(ncep, total_frames); + + /* Process one frame at a time. */ + cptr = cepbuf; + fptr = featbuf2; + ncep = 1; + nfr = feat_s2mfc2feat_live(fcb, cptr, &ncep, TRUE, FALSE, fptr); + TEST_EQUAL(nfr, 0); /* Not possible to make any frames yet. */ + TEST_EQUAL(ncep, 1); /* But we shold have consumed one. */ + cptr += ncep; + for (i = 1; i < total_frames - 1; ++i) { + ncep = 1; + nfr = feat_s2mfc2feat_live(fcb, cptr, &ncep, FALSE, FALSE, fptr); + cptr += ncep; + fptr += nfr; + } + nfr = feat_s2mfc2feat_live(fcb, cptr, &ncep, FALSE, TRUE, fptr); + TEST_EQUAL(nfr, 4); /* This should have dumped the trailing window. */ + TEST_EQUAL(ncep, 1); /* And only consumed one frame of MFCCs. */ + cptr += ncep; + fptr += nfr; + /* Verify that we actually got the correct number of frames. */ + TEST_EQUAL(cptr - cepbuf, total_frames); + TEST_EQUAL(fptr - featbuf2, total_frames); + + /* Now verify that the results are equal. */ + for (i = 0; i < total_frames; ++i) { + int32 j; + printf("%-4d ", i); + for (j = 0; j < feat_dimension(fcb); ++j) { + TEST_EQUAL_FLOAT(featbuf1[i][0][j], featbuf2[i][0][j]); + } + if (i % 10 == 9) + printf("\n"); + } + printf("\n"); + + /* Process large chunks of frames at once, so as to exceed the + * internal ringbuffer size in feat_s2mfc2feat_live(). */ + cptr = cepbuf; + fptr = featbuf2; + ncep = total_frames; + nfr = feat_s2mfc2feat_live(fcb, cptr, &ncep, TRUE, FALSE, fptr); + TEST_ASSERT(ncep != nfr); + cptr += ncep; + fptr += nfr; + ncep = total_frames - ncep; + while (ncep) { + int32 tmp_ncep; + tmp_ncep = ncep; + nfr = feat_s2mfc2feat_live(fcb, cptr, &tmp_ncep, FALSE, FALSE, fptr); + cptr += tmp_ncep; + fptr += nfr; + ncep -= tmp_ncep; + } + nfr = feat_s2mfc2feat_live(fcb, cptr, &ncep, FALSE, TRUE, fptr); + cptr += ncep; + fptr += nfr; + TEST_EQUAL(cptr - cepbuf, total_frames); + TEST_EQUAL(fptr - featbuf2, total_frames); + + /* Now verify that the results are equal. */ + for (i = 0; i < total_frames; ++i) { + int32 j; + printf("%-4d ", i); + for (j = 0; j < feat_dimension(fcb); ++j) + TEST_EQUAL_FLOAT(featbuf1[i][0][j], featbuf2[i][0][j]); + if (i % 10 == 9) + printf("\n"); + } + printf("\n"); + + fclose(raw); + fe_free(fe); + feat_array_free(featbuf1); + feat_array_free(featbuf2); + feat_free(fcb); + ckd_free_2d(cepbuf); + cmd_ln_free_r(config); + + return 0; +} diff --git a/test/unit/test_feat/test_feat_live.c b/test/unit/test_feat/test_feat_live.c new file mode 100644 index 000000000..ac1c2d6bf --- /dev/null +++ b/test/unit/test_feat/test_feat_live.c @@ -0,0 +1,118 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "feat.h" +#include "ckd_alloc.h" +#include "test_macros.h" + +const mfcc_t data[6][13] = { + { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), + FLOAT2MFCC(0.186), FLOAT2MFCC(-0.656), FLOAT2MFCC(-0.226), + FLOAT2MFCC(-0.105), FLOAT2MFCC(-0.412), FLOAT2MFCC(-0.024), + FLOAT2MFCC(-0.091), FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.158), FLOAT2MFCC(-0.197)}, + { FLOAT2MFCC(14.729), FLOAT2MFCC(-1.313), FLOAT2MFCC(-0.892), + FLOAT2MFCC(0.140), FLOAT2MFCC(-0.676), FLOAT2MFCC(-0.089), + FLOAT2MFCC(-0.313), FLOAT2MFCC(-0.422), FLOAT2MFCC(-0.058), + FLOAT2MFCC(-0.101), FLOAT2MFCC(-0.100), FLOAT2MFCC(-0.128), FLOAT2MFCC(-0.123)}, + { FLOAT2MFCC(14.502), FLOAT2MFCC(-1.351), FLOAT2MFCC(-1.028), + FLOAT2MFCC(-0.189), FLOAT2MFCC(-0.718), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.121), FLOAT2MFCC(-0.365), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.154), FLOAT2MFCC(0.041), FLOAT2MFCC(0.009), FLOAT2MFCC(-0.073)}, + { FLOAT2MFCC(14.557), FLOAT2MFCC(-1.676), FLOAT2MFCC(-0.864), + FLOAT2MFCC(0.118), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.168), + FLOAT2MFCC(-0.069), FLOAT2MFCC(-0.503), FLOAT2MFCC(-0.013), + FLOAT2MFCC(0.007), FLOAT2MFCC(-0.056), FLOAT2MFCC(-0.075), FLOAT2MFCC(-0.237)}, + { FLOAT2MFCC(14.665), FLOAT2MFCC(-1.498), FLOAT2MFCC(-0.582), + FLOAT2MFCC(0.209), FLOAT2MFCC(-0.487), FLOAT2MFCC(-0.247), + FLOAT2MFCC(-0.142), FLOAT2MFCC(-0.439), FLOAT2MFCC(0.059), + FLOAT2MFCC(-0.058), FLOAT2MFCC(-0.265), FLOAT2MFCC(-0.109), FLOAT2MFCC(-0.196)}, + { FLOAT2MFCC(15.025), FLOAT2MFCC(-1.199), FLOAT2MFCC(-0.607), + FLOAT2MFCC(0.235), FLOAT2MFCC(-0.499), FLOAT2MFCC(-0.080), + FLOAT2MFCC(-0.062), FLOAT2MFCC(-0.554), FLOAT2MFCC(-0.209), + FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.352), FLOAT2MFCC(-0.400)}, +}; + +int +main(int argc, char *argv[]) +{ + feat_t *fcb; + mfcc_t **in_feats, ***out_feats, ***out_feats2, ***optr; + int32 i, j, ncep, nfr, nfr1, nfr2; + + in_feats = (mfcc_t **)ckd_alloc_2d_ptr(6, 13, data, sizeof(mfcc_t)); + out_feats = (mfcc_t ***)ckd_calloc_3d(8, 1, 39, sizeof(mfcc_t)); + /* Test 1s_c_d_dd features */ + fcb = feat_init("1s_c_d_dd", CMN_NONE, 0, AGC_NONE, 1, 13); + ncep = 6; + nfr1 = feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats); + printf("Processed %d input %d output frames\n", ncep, nfr1); + for (i = 0; i < nfr1; ++i) { + printf("%d: ", i); + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(out_feats[i][0][j])); + } + printf("\n"); + } + feat_free(fcb); + + /* Test in "live" mode. */ + fcb = feat_init("1s_c_d_dd", CMN_NONE, 0, AGC_NONE, 1, 13); + optr = out_feats2 = (mfcc_t ***)ckd_calloc_3d(8, 1, 39, sizeof(mfcc_t)); + nfr2 = 0; + ncep = 2; + nfr = feat_s2mfc2feat_live(fcb, in_feats, &ncep, TRUE, FALSE, optr); + printf("Processed %d input %d output frames\n", ncep, nfr); + nfr2 += nfr; + for (i = 0; i < nfr; ++i) { + printf("%d: ", i); + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(optr[i][0][j])); + } + printf("\n"); + } + optr += nfr; + + ncep = 2; + nfr = feat_s2mfc2feat_live(fcb, in_feats + 2, &ncep, FALSE, FALSE, optr); + nfr2 += nfr; + printf("Processed %d input %d output frames\n", ncep, nfr); + for (i = 0; i < nfr; ++i) { + printf("%d: ", i); + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(optr[i][0][j])); + } + printf("\n"); + } + optr += nfr; + + ncep = 2; + nfr = feat_s2mfc2feat_live(fcb, in_feats + 4, &ncep, FALSE, TRUE, optr); + nfr2 += nfr; + printf("Processed %d input %d output frames\n", ncep, nfr); + for (i = 0; i < nfr; ++i) { + printf("%d: ", i); + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(optr[i][0][j])); + } + printf("\n"); + } + optr += nfr; + feat_free(fcb); + + TEST_EQUAL(nfr1, nfr2); + for (i = 0; i < nfr1; ++i) { + for (j = 0; j < 39; ++j) { + TEST_EQUAL(out_feats[i][0][j], out_feats2[i][0][j]); + } + } + ckd_free_3d(out_feats2); + ckd_free_3d(out_feats); + ckd_free(in_feats); + + return 0; +} diff --git a/test/unit/test_feat/test_macros.h b/test/unit/test_feat/test_macros.h new file mode 100644 index 000000000..12cd03f50 --- /dev/null +++ b/test/unit/test_feat/test_macros.h @@ -0,0 +1,11 @@ +#include +#include + +#include "logmath.h" + +#define EPSILON 0.01 +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define LOG_EPSILON 20 +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_feat/test_subvq.c b/test/unit/test_feat/test_subvq.c new file mode 100644 index 000000000..2f0fb343d --- /dev/null +++ b/test/unit/test_feat/test_subvq.c @@ -0,0 +1,91 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "feat.h" +#include "test_macros.h" +#include "ckd_alloc.h" + +const mfcc_t data[6][13] = { + { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), + FLOAT2MFCC(0.186), FLOAT2MFCC(-0.656), FLOAT2MFCC(-0.226), + FLOAT2MFCC(-0.105), FLOAT2MFCC(-0.412), FLOAT2MFCC(-0.024), + FLOAT2MFCC(-0.091), FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.158), FLOAT2MFCC(-0.197)}, + { FLOAT2MFCC(14.729), FLOAT2MFCC(-1.313), FLOAT2MFCC(-0.892), + FLOAT2MFCC(0.140), FLOAT2MFCC(-0.676), FLOAT2MFCC(-0.089), + FLOAT2MFCC(-0.313), FLOAT2MFCC(-0.422), FLOAT2MFCC(-0.058), + FLOAT2MFCC(-0.101), FLOAT2MFCC(-0.100), FLOAT2MFCC(-0.128), FLOAT2MFCC(-0.123)}, + { FLOAT2MFCC(14.502), FLOAT2MFCC(-1.351), FLOAT2MFCC(-1.028), + FLOAT2MFCC(-0.189), FLOAT2MFCC(-0.718), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.121), FLOAT2MFCC(-0.365), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.154), FLOAT2MFCC(0.041), FLOAT2MFCC(0.009), FLOAT2MFCC(-0.073)}, + { FLOAT2MFCC(14.557), FLOAT2MFCC(-1.676), FLOAT2MFCC(-0.864), + FLOAT2MFCC(0.118), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.168), + FLOAT2MFCC(-0.069), FLOAT2MFCC(-0.503), FLOAT2MFCC(-0.013), + FLOAT2MFCC(0.007), FLOAT2MFCC(-0.056), FLOAT2MFCC(-0.075), FLOAT2MFCC(-0.237)}, + { FLOAT2MFCC(14.665), FLOAT2MFCC(-1.498), FLOAT2MFCC(-0.582), + FLOAT2MFCC(0.209), FLOAT2MFCC(-0.487), FLOAT2MFCC(-0.247), + FLOAT2MFCC(-0.142), FLOAT2MFCC(-0.439), FLOAT2MFCC(0.059), + FLOAT2MFCC(-0.058), FLOAT2MFCC(-0.265), FLOAT2MFCC(-0.109), FLOAT2MFCC(-0.196)}, + { FLOAT2MFCC(15.025), FLOAT2MFCC(-1.199), FLOAT2MFCC(-0.607), + FLOAT2MFCC(0.235), FLOAT2MFCC(-0.499), FLOAT2MFCC(-0.080), + FLOAT2MFCC(-0.062), FLOAT2MFCC(-0.554), FLOAT2MFCC(-0.209), + FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.352), FLOAT2MFCC(-0.400)}, +}; + +int +main(int argc, char *argv[]) +{ + static char const svspec[] = "1-12/14-25/0,13,26/27-38"; + int32 **subvecs, i, j, k, ncep; + mfcc_t **in_feats, ***out_feats; + feat_t *fcb; + + /* Test parsing of a subvector spec. */ + subvecs = parse_subvecs(svspec); + TEST_ASSERT(subvecs); + for (i = 0; i < 12; ++i) { + TEST_EQUAL(subvecs[0][i], i+1); + } + for (i = 0; i < 12; ++i) { + TEST_EQUAL(subvecs[1][i], i+14); + } + TEST_EQUAL(subvecs[2][0], 0); + TEST_EQUAL(subvecs[2][1], 13); + TEST_EQUAL(subvecs[2][2], 26); + for (i = 0; i < 12; ++i) { + TEST_EQUAL(subvecs[3][i], i+27); + } + + /* Create a 1s_c_d_dd feature stream and split it into subvectors. */ + fcb = feat_init("1s_c_d_dd", CMN_NONE, 0, AGC_NONE, 1, 13); + TEST_ASSERT(fcb); + feat_set_subvecs(fcb, subvecs); + + in_feats = (mfcc_t **)ckd_alloc_2d_ptr(6, 13, data, sizeof(mfcc_t)); + out_feats = feat_array_alloc(fcb, 6); + TEST_ASSERT(out_feats); + + ncep = 6; + feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats); + + for (i = 0; i < 6; ++i) { + for (j = 0; j < feat_dimension1(fcb); ++j) { + for (k = 0; k < feat_dimension2(fcb, j); ++k) { + printf("%.3f ", MFCC2FLOAT(out_feats[i][j][k])); + } + printf("\n"); + } + printf("\n"); + } + + feat_array_free(out_feats); + ckd_free(in_feats); + feat_free(fcb); + + return 0; +} diff --git a/test/unit/test_fsg/Makefile.am b/test/unit/test_fsg/Makefile.am new file mode 100644 index 000000000..9838ed9e3 --- /dev/null +++ b/test/unit/test_fsg/Makefile.am @@ -0,0 +1,18 @@ +check_PROGRAMS = \ + test_fsg_read \ + test_fsg_jsgf \ + test_fsg_write_fsm + +TESTS = $(check_PROGRAMS) + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include \ + -DLMDIR=\"${srcdir}\" + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la + +noinst_HEADERS = test_macros.h + +EXTRA_DIST = goforward.fsg polite.gram public.gram diff --git a/test/unit/test_fsg/goforward.fsg b/test/unit/test_fsg/goforward.fsg new file mode 100644 index 000000000..89b6f110e --- /dev/null +++ b/test/unit/test_fsg/goforward.fsg @@ -0,0 +1,24 @@ +FSG_BEGIN turtle +NUM_STATES 7 +START_STATE 0 +FINAL_STATE 6 + +# Transitions +TRANSITION 0 1 1.0 GO +TRANSITION 1 2 0.5 FORWARD +TRANSITION 1 3 0.5 BACKWARD +TRANSITION 2 4 1.0 +TRANSITION 3 4 1.0 +TRANSITION 4 5 0.1 ONE +TRANSITION 4 5 0.1 TWO +TRANSITION 4 5 0.1 THREE +TRANSITION 4 5 0.1 FOUR +TRANSITION 4 5 0.1 FIVE +TRANSITION 4 5 0.1 SIX +TRANSITION 4 5 0.1 SEVEN +TRANSITION 4 5 0.1 EIGHT +TRANSITION 4 5 0.1 NINE +TRANSITION 4 5 0.1 TEN +TRANSITION 5 6 0.1 METER +TRANSITION 5 6 0.9 METERS +FSG_END diff --git a/test/unit/test_fsg/polite.gram b/test/unit/test_fsg/polite.gram new file mode 100644 index 000000000..49805f0f9 --- /dev/null +++ b/test/unit/test_fsg/polite.gram @@ -0,0 +1,10 @@ +#JSGF V1.0; + +/** + * JSGF Grammar for Hello World example + */ + +grammar polite; + +public = [please | kindly | could you | oh mighty computer]; +public = [please | thanks | thank you]; diff --git a/test/unit/test_fsg/public.gram b/test/unit/test_fsg/public.gram new file mode 100644 index 000000000..127f2a388 --- /dev/null +++ b/test/unit/test_fsg/public.gram @@ -0,0 +1,7 @@ +#JSGF V1.0; + +/* Grammar that uses reserved keywords in tokens */ + +grammar public; + +public = grammar /* some comment */ | public | import; diff --git a/test/unit/test_fsg/test_fsg_jsgf.c b/test/unit/test_fsg/test_fsg_jsgf.c new file mode 100644 index 000000000..aa6c1d346 --- /dev/null +++ b/test/unit/test_fsg/test_fsg_jsgf.c @@ -0,0 +1,55 @@ +#include +#include +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + fsg_model_t *fsg; + jsgf_t *jsgf; + jsgf_rule_t *rule; + + lmath = logmath_init(1.0001, 0, 0); + + /* Test loading */ + jsgf = jsgf_parse_file(LMDIR "/polite.gram", NULL); + TEST_ASSERT(jsgf); + rule = jsgf_get_rule(jsgf, "polite.startPolite"); + TEST_ASSERT(rule); + fsg = jsgf_build_fsg(jsgf, rule, lmath, 7.5); + TEST_ASSERT(fsg); + TEST_EQUAL_STRING("polite", jsgf_grammar_name(jsgf)); + + TEST_ASSERT(fsg_model_add_silence(fsg, "", -1, 0.3)); + TEST_ASSERT(fsg_model_add_silence(fsg, "++NOISE++", -1, 0.3)); + TEST_ASSERT(fsg_model_add_alt(fsg, "please", "please(2)")); + + jsgf_grammar_free(jsgf); + fsg_model_write(fsg, stdout); + fsg_model_free(fsg); + + /* Or do everything at once */ + fsg = jsgf_read_file(LMDIR "/public.gram", lmath, 1.0); + fsg_model_free(fsg); + + /* Test grammar with keywords inside */ + jsgf = jsgf_parse_file(LMDIR "/public.gram", NULL); + TEST_ASSERT(jsgf); + jsgf_grammar_free(jsgf); + + jsgf = jsgf_parse_string("#JSGF V1.0; grammar test; public = yes | no;", NULL); + TEST_ASSERT(jsgf); + rule = jsgf_get_rule(jsgf, "test.choice"); + TEST_ASSERT(rule); + fsg = jsgf_build_fsg(jsgf, rule, lmath, 7.5); + fsg_model_write(fsg, stdout); + fsg_model_free(fsg); + jsgf_grammar_free(jsgf); + + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_fsg/test_fsg_read.c b/test/unit/test_fsg/test_fsg_read.c new file mode 100644 index 000000000..60fd63591 --- /dev/null +++ b/test/unit/test_fsg/test_fsg_read.c @@ -0,0 +1,56 @@ +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + fsg_model_t *fsg; + fsg_arciter_t *itor; + + /* Initialize a logmath object to pass to fsg_model_read */ + lmath = logmath_init(1.0001, 0, 0); + /* Read a FSG. */ + fsg = fsg_model_readfile(LMDIR "/goforward.fsg", lmath, 7.5); + TEST_ASSERT(fsg); + + TEST_ASSERT(fsg_model_add_silence(fsg, "", -1, 0.3)); + TEST_ASSERT(fsg_model_add_silence(fsg, "++NOISE++", -1, 0.3)); + TEST_ASSERT(fsg_model_add_alt(fsg, "FORWARD", "FORWARD(2)")); + + fsg_model_write(fsg, stdout); + + /* Test reference counting. */ + TEST_ASSERT(fsg = fsg_model_retain(fsg)); + TEST_EQUAL(1, fsg_model_free(fsg)); + fsg_model_write(fsg, stdout); + + /* Test iteration. */ + for (itor = fsg_model_arcs(fsg, 3); + itor; itor = fsg_arciter_next(itor)) { + fsg_link_t *link = fsg_arciter_get(itor); + + TEST_EQUAL(fsg_link_from_state(link), 3); + if (fsg_link_wid(link) == -1) { + TEST_EQUAL(fsg_link_to_state(link), 4); + TEST_EQUAL(fsg_link_logs2prob(link), 0); + } + else if (fsg_link_wid(link) == fsg_model_word_id(fsg, "++NOISE++") + || fsg_link_wid(link) == fsg_model_word_id(fsg, "")) { + TEST_EQUAL(fsg_link_to_state(link), 3); + TEST_EQUAL_LOG(fsg_link_logs2prob(link), -90300); + } + printf("%d => %d %s %d\n", + fsg_link_from_state(link), + fsg_link_to_state(link), + fsg_link_wid(link) == -1 + ? "ε" : fsg_model_word_str(fsg, fsg_link_wid(link)), + fsg_link_logs2prob(link)); + } + + TEST_EQUAL(0, fsg_model_free(fsg)); + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_fsg/test_fsg_write_fsm.c b/test/unit/test_fsg/test_fsg_write_fsm.c new file mode 100644 index 000000000..fd7fecfda --- /dev/null +++ b/test/unit/test_fsg/test_fsg_write_fsm.c @@ -0,0 +1,34 @@ +#include +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + fsg_model_t *fsg; + jsgf_t *jsgf; + jsgf_rule_t *rule; + + /* Initialize a logmath object to pass to fsg_model_read */ + lmath = logmath_init(1.0001, 0, 0); + jsgf = jsgf_parse_file(LMDIR "/polite.gram", NULL); + TEST_ASSERT(jsgf); + rule = jsgf_get_rule(jsgf, "polite.startPolite"); + TEST_ASSERT(rule); + fsg = jsgf_build_fsg(jsgf, rule, lmath, 7.5); + TEST_ASSERT(fsg); + + TEST_ASSERT(fsg_model_add_silence(fsg, "", -1, 0.3)); + TEST_ASSERT(fsg_model_add_silence(fsg, "++NOISE++", -1, 0.3)); + TEST_ASSERT(fsg_model_add_alt(fsg, "please", "please(2)")); + + jsgf_grammar_free(jsgf); + fsg_model_write_fsm(fsg, stdout); + fsg_model_write_symtab(fsg, stdout); + fsg_model_free(fsg); + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_fsg/test_macros.h b/test/unit/test_fsg/test_macros.h new file mode 100644 index 000000000..8ade6918a --- /dev/null +++ b/test/unit/test_fsg/test_macros.h @@ -0,0 +1,11 @@ +#include +#include + +#include "logmath.h" + +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define TEST_EQUAL_STRING(a,b) TEST_ASSERT(0 == strcmp((a), (b))) +#define LOG_EPSILON 20 +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_hash/Makefile.am b/test/unit/test_hash/Makefile.am new file mode 100644 index 000000000..b9b3f7f33 --- /dev/null +++ b/test/unit/test_hash/Makefile.am @@ -0,0 +1,31 @@ +check_PROGRAMS = displayhash deletehash test_hash_iter + +noinst_HEADERS = test_macros.h + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la + +TESTS = test_hash_iter \ + _hash_delete1.test \ + _hash_delete2.test \ + _hash_delete3.test \ + _hash_delete4.test \ + _hash_delete5.test + +EXTRA_DIST = display.res \ + _hash_delete1.res \ + _hash_delete1.test \ + _hash_delete2.res \ + _hash_delete2.test \ + _hash_delete3.res \ + _hash_delete3.test \ + _hash_delete4.res \ + _hash_delete4.test \ + _hash_delete5.res \ + _hash_delete5.test + +CLEANFILES = *.out \ No newline at end of file diff --git a/test/unit/test_hash/_hash_delete1.res b/test/unit/test_hash/_hash_delete1.res new file mode 100644 index 000000000..1fb42371e --- /dev/null +++ b/test/unit/test_hash/_hash_delete1.res @@ -0,0 +1,6 @@ +Hash with chaining representation of the hash table +|key:-bla|len:4|val=8|->NULL +|key:-hmmdump|len:8|val=1|->|key:-subvq|len:6|val=7|->|key:-outlatdir|len:10|val=3|->NULL +|key:-svq4svq|len:8|val=2|->|key:-lminmemory|len:11|val=6|->NULL +|key:-beam|len:5|val=5|->NULL +The total number of keys =7 diff --git a/test/unit/test_hash/_hash_delete1.test b/test/unit/test_hash/_hash_delete1.test new file mode 100755 index 000000000..814d39635 --- /dev/null +++ b/test/unit/test_hash/_hash_delete1.test @@ -0,0 +1,7 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +./deletehash -lm > _hash_delete1.out 2>&1 +compare_table delete1 _hash_delete1.out $tests/unit/test_hash/_hash_delete1.res +rm -f _hash_delete1.out diff --git a/test/unit/test_hash/_hash_delete2.res b/test/unit/test_hash/_hash_delete2.res new file mode 100644 index 000000000..5f8151a63 --- /dev/null +++ b/test/unit/test_hash/_hash_delete2.res @@ -0,0 +1,7 @@ +Hash with chaining representation of the hash table +|key:-bla|len:4|val=8|->NULL +|key:-hmmdump|len:8|val=1|->|key:-outlatdir|len:10|val=3|->NULL +|key:-svq4svq|len:8|val=2|->|key:-lminmemory|len:11|val=6|->NULL +|key:-lm|len:3|val=4|->NULL +|key:-beam|len:5|val=5|->NULL +The total number of keys =7 diff --git a/test/unit/test_hash/_hash_delete2.test b/test/unit/test_hash/_hash_delete2.test new file mode 100755 index 000000000..7b14909a1 --- /dev/null +++ b/test/unit/test_hash/_hash_delete2.test @@ -0,0 +1,7 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +./deletehash -subvq > _hash_delete2.out 2>&1 +compare_table delete2 _hash_delete2.out $tests/unit/test_hash/_hash_delete2.res +rm -f _hash_delete2.out \ No newline at end of file diff --git a/test/unit/test_hash/_hash_delete3.res b/test/unit/test_hash/_hash_delete3.res new file mode 100644 index 000000000..949300efc --- /dev/null +++ b/test/unit/test_hash/_hash_delete3.res @@ -0,0 +1,7 @@ +Hash with chaining representation of the hash table +|key:-bla|len:4|val=8|->NULL +|key:-hmmdump|len:8|val=1|->|key:-subvq|len:6|val=7|->|key:-outlatdir|len:10|val=3|->NULL +|key:-lminmemory|len:11|val=6|->NULL +|key:-lm|len:3|val=4|->NULL +|key:-beam|len:5|val=5|->NULL +The total number of keys =7 diff --git a/test/unit/test_hash/_hash_delete3.test b/test/unit/test_hash/_hash_delete3.test new file mode 100755 index 000000000..7179a9584 --- /dev/null +++ b/test/unit/test_hash/_hash_delete3.test @@ -0,0 +1,7 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +./deletehash -svq4svq > _hash_delete3.out 2>&1 +compare_table delete3 _hash_delete3.out $tests/unit/test_hash/_hash_delete3.res +rm -f _hash_delete3.out \ No newline at end of file diff --git a/test/unit/test_hash/_hash_delete4.res b/test/unit/test_hash/_hash_delete4.res new file mode 100644 index 000000000..5ee8c0368 --- /dev/null +++ b/test/unit/test_hash/_hash_delete4.res @@ -0,0 +1,7 @@ +Hash with chaining representation of the hash table +|key:-bla|len:4|val=8|->NULL +|key:-subvq|len:6|val=7|->|key:-outlatdir|len:10|val=3|->NULL +|key:-svq4svq|len:8|val=2|->|key:-lminmemory|len:11|val=6|->NULL +|key:-lm|len:3|val=4|->NULL +|key:-beam|len:5|val=5|->NULL +The total number of keys =7 diff --git a/test/unit/test_hash/_hash_delete4.test b/test/unit/test_hash/_hash_delete4.test new file mode 100755 index 000000000..24858f00e --- /dev/null +++ b/test/unit/test_hash/_hash_delete4.test @@ -0,0 +1,7 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +./deletehash -hmmdump > _hash_delete4.out 2>&1 +compare_table delete4 _hash_delete4.out $tests/unit/test_hash/_hash_delete4.res +rm -f _hash_delete4.out \ No newline at end of file diff --git a/test/unit/test_hash/_hash_delete5.res b/test/unit/test_hash/_hash_delete5.res new file mode 100644 index 000000000..d203c2fea --- /dev/null +++ b/test/unit/test_hash/_hash_delete5.res @@ -0,0 +1 @@ +Failed as expected diff --git a/test/unit/test_hash/_hash_delete5.test b/test/unit/test_hash/_hash_delete5.test new file mode 100755 index 000000000..d309e3d2d --- /dev/null +++ b/test/unit/test_hash/_hash_delete5.test @@ -0,0 +1,7 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +./deletehash -foo > _hash_delete5.out 2>&1 +compare_table delete5 _hash_delete5.out $tests/unit/test_hash/_hash_delete5.res +rm -f _hash_delete5.out \ No newline at end of file diff --git a/test/unit/test_hash/deletehash.c b/test/unit/test_hash/deletehash.c new file mode 100644 index 000000000..811abb262 --- /dev/null +++ b/test/unit/test_hash/deletehash.c @@ -0,0 +1,116 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +#include +#include +#include +#include +#include + +/* Explore a more complicated case for deletion */ +int +main(int argc, char **argv) +{ + hash_table_t *ht; + void *val; + char *bkey = "key"; + + if (argc != 2) { + printf("deletehash \n"); + exit(-1); + } + + ht = hash_table_new(75, 0); + + if (hash_table_enter(ht, "-hmmdump", (void *)1) != (void *)1) { + E_FATAL("Insertion of -hmmdump failed\n"); + } + + if (hash_table_enter(ht, "-svq4svq", (void *)2) != (void *)2) { + E_FATAL("Insertion of -svq4svq failed\n"); + } + + if (hash_table_enter(ht, "-outlatdir", (void *)3) != (void *)3) { + E_FATAL("Insertion of -svq4svq failed\n"); + } + + if (hash_table_enter(ht, "-lm", (void *)4) != (void *)4) { + E_FATAL("Insertion of -lm failed\n"); + } + + if (hash_table_enter(ht, "-beam", (void *)5) != (void *)5) { + E_FATAL("Insertion of -beam failed\n"); + } + + if (hash_table_enter(ht, "-lminmemory", (void *)6) != (void *)6) { + E_FATAL("Insertion of -lminmemory failed\n"); + } + + if (hash_table_enter(ht, "-subvq", (void *)7) != (void *)7) { + E_FATAL("Insertion of -outlatdir failed\n"); + } + + if (hash_table_enter(ht, "-bla", (void *)8) != (void *)8) { + E_FATAL("Insertion of -bla failed\n"); + } + + /* hash_table_display(ht,1); */ + if (hash_table_delete(ht, argv[1]) == NULL) { + E_INFOCONT("Failed as expected\n"); + return 0; + } + else { + hash_table_display(ht, 1); + } + + /* Test emptying */ + hash_table_empty(ht); + if (hash_table_lookup(ht, "-beam", &val) == 0) { + E_FATAL("Emptying hash table failed\n"); + } + + hash_table_free(ht); + ht = NULL; + + /* Test bkey */ + ht = hash_table_new(75, HASH_CASE_YES); + + if (hash_table_enter_bkey(ht, bkey, 3, (void *)1) != (void *)1) { + E_FATAL("Insertion of bkey failed\n"); + } + if (hash_table_lookup_bkey(ht, bkey, 3, &val) != 0) { + E_FATAL("Lookup failed\n"); + } + if (hash_table_delete_bkey(ht, bkey, 3) == NULL) { + E_FATAL("Delete bkey failed\n"); + } + if (hash_table_lookup_bkey(ht, bkey, 3, &val) != -1) { + E_FATAL("Second bkey lookup failed\n"); + } + hash_table_empty(ht); + hash_table_free(ht); + ht = NULL; + + return 0; +} + + +#if 0 +E_INFO("Hash table in the command line\n"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -lm\n"); +hash_table_delete(ht, "-lm"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -lm\n"); + +hash_table_delete(ht, "-lm"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -svq4svq\n"); +hash_table_delete(ht, "-svq4svq"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -beam\n"); +hash_table_delete(ht, "-beam"); +hash_table_display(ht, 1); +#endif diff --git a/test/unit/test_hash/display.res b/test/unit/test_hash/display.res new file mode 100644 index 000000000..addb1d5f9 --- /dev/null +++ b/test/unit/test_hash/display.res @@ -0,0 +1,6 @@ +Hash with chaining representation of the hash table +|key:-hmmdump|len:8|val=1|->NULL +|key:-svq4svq|len:8|val=1|->|key:-lminmemory|len:11|val=1|->NULL +|key:-lm|len:3|val=1|->NULL +|key:-beam|len:5|val=1|->NULL +The total number of keys =5 diff --git a/test/unit/test_hash/displayhash.c b/test/unit/test_hash/displayhash.c new file mode 100644 index 000000000..3d8ab04ed --- /dev/null +++ b/test/unit/test_hash/displayhash.c @@ -0,0 +1,63 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +#include +#include +#include +#include +#include + +/* Insert -hmmdump, -lm, -svq4svq, -beam, -lminmemory into a hash and display it. */ +int +main(int argc, char **argv) +{ + hash_table_t *ht; + ht = hash_table_new(75, 0); + + if (hash_table_enter(ht, "-hmmdump", (void *)1) != (void *)1) { + E_FATAL("Insertion of -hmmdump failed\n"); + } + + if (hash_table_enter(ht, "-svq4svq", (void *)1) != (void *)1) { + E_FATAL("Insertion of -svq4svq failed\n"); + } + + if (hash_table_enter(ht, "-lm", (void *)1) != (void *)1) { + E_FATAL("Insertion of -lm failed\n"); + } + + if (hash_table_enter(ht, "-beam", (void *)1) != (void *)1) { + E_FATAL("Insertion of -beam failed\n"); + } + + if (hash_table_enter(ht, "-lminmemory", (void *)1) != (void *)1) { + E_FATAL("Insertion of -lminmemory failed\n"); + } + + hash_table_display(ht, 1); + + hash_table_free(ht); + ht = NULL; + return 0; +} + + +#if 0 +E_INFO("Hash table in the command line\n"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -lm\n"); +hash_table_delete(ht, "-lm"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -lm\n"); + +hash_table_delete(ht, "-lm"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -svq4svq\n"); +hash_table_delete(ht, "-svq4svq"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -beam\n"); +hash_table_delete(ht, "-beam"); +hash_table_display(ht, 1); +#endif diff --git a/test/unit/test_hash/test_hash_iter.c b/test/unit/test_hash/test_hash_iter.c new file mode 100644 index 000000000..1bc9cd663 --- /dev/null +++ b/test/unit/test_hash/test_hash_iter.c @@ -0,0 +1,52 @@ +/** + * @file test_hash_iter.c Test hash table iterators + * @author David Huggins-Daines + */ + +#include "hash_table.h" +#include "ckd_alloc.h" +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + hash_table_t *h; + hash_iter_t *itor; + char *foo2 = ckd_salloc("foo"); + char *foo3 = ckd_salloc("foo"); + + /* Test insertion and replacement. */ + TEST_ASSERT(h = hash_table_new(42, FALSE)); + TEST_EQUAL((void*)0xdeadbeef, hash_table_enter(h, "foo", (void*)0xdeadbeef)); + TEST_EQUAL((void*)0xdeadbeef, hash_table_replace(h, foo2, (void*)0xd0d0feed)); + TEST_EQUAL((void*)0xd0d0feed, hash_table_replace(h, foo3, (void*)0xdeadbeaf)); + TEST_EQUAL((void*)0xcafec0de, hash_table_enter(h, "bar", (void*)0xcafec0de)); + TEST_EQUAL((void*)0xeeefeeef, hash_table_enter(h, "baz", (void*)0xeeefeeef)); + TEST_EQUAL((void*)0xbabababa, hash_table_enter(h, "quux", (void*)0xbabababa)); + + hash_table_display(h, TRUE); + /* Now test iterators. */ + for (itor = hash_table_iter(h); itor; itor = hash_table_iter_next(itor)) { + printf("%s %p\n", itor->ent->key, itor->ent->val); + if (0 == strcmp(itor->ent->key, "foo")) { + TEST_EQUAL(itor->ent->val, (void*)0xdeadbeaf); + } + else if (0 == strcmp(itor->ent->key, "bar")) { + TEST_EQUAL(itor->ent->val, (void*)0xcafec0de); + } + else if (0 == strcmp(itor->ent->key, "baz")) { + TEST_EQUAL(itor->ent->val, (void*)0xeeefeeef); + } + else if (0 == strcmp(itor->ent->key, "quux")) { + TEST_EQUAL(itor->ent->val, (void*)0xbabababa); + } + } + ckd_free(foo2); + ckd_free(foo3); + + return 0; +} diff --git a/test/unit/test_hash/test_macros.h b/test/unit/test_hash/test_macros.h new file mode 100644 index 000000000..c315ced37 --- /dev/null +++ b/test/unit/test_hash/test_macros.h @@ -0,0 +1,7 @@ +#include +#include + +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define EPSILON 0.001 +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) diff --git a/test/unit/test_lineiter/Makefile.am b/test/unit/test_lineiter/Makefile.am new file mode 100644 index 000000000..820d08c4e --- /dev/null +++ b/test/unit/test_lineiter/Makefile.am @@ -0,0 +1,16 @@ +check_PROGRAMS = test_lineiter +TESTS = test_lineiter + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include \ + -DFILEDIR=\"$(srcdir)\" + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la -lm + +noinst_HEADERS = test_macros.h + +EXTRA_DIST = test.txt + +CLEANFILES = *.out tmp.* diff --git a/test/unit/test_lineiter/test.txt b/test/unit/test_lineiter/test.txt new file mode 100644 index 000000000..5bc8a5d5a --- /dev/null +++ b/test/unit/test_lineiter/test.txt @@ -0,0 +1,7 @@ +# This is a comment +# This is too +This is a line +This is too +# This is a comment again + Foo +Bar diff --git a/test/unit/test_lineiter/test_lineiter.c b/test/unit/test_lineiter/test_lineiter.c new file mode 100644 index 000000000..c041ea3ad --- /dev/null +++ b/test/unit/test_lineiter/test_lineiter.c @@ -0,0 +1,37 @@ +#include +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + FILE *fp; + fp = fopen(FILEDIR "/test.txt", "rb"); + lineiter_t *li; + int i; + + for (i = 0, li = lineiter_start(fp); i < 3 && li; li = lineiter_next(li), i++) { + printf ("Line is %s\n", li->buf); + } + + printf("Buf is %s\n", li->buf); + TEST_EQUAL_STRING(li->buf, "This is too\n"); + TEST_EQUAL(lineiter_lineno(li), 4); + + lineiter_free(li); + + fseek(fp, 0L, SEEK_SET); + + for (i = 0, li = lineiter_start_clean(fp); i < 3 && li; li = lineiter_next(li), i++) { + printf ("Clean line is %s\n", li->buf); + } + + TEST_EQUAL_STRING(li->buf, "Bar"); + TEST_EQUAL(lineiter_lineno(li), 7); + + lineiter_free(li); + fclose(fp); + + return 0; +} diff --git a/test/unit/test_lineiter/test_macros.h b/test/unit/test_lineiter/test_macros.h new file mode 100644 index 000000000..47a0893f1 --- /dev/null +++ b/test/unit/test_lineiter/test_macros.h @@ -0,0 +1,11 @@ +#include +#include +#include + +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define EPSILON 0.01 +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) +#define TEST_EQUAL_STRING(a,b) TEST_ASSERT(strcmp((a), (b)) == 0) + diff --git a/test/unit/test_logmath/Makefile.am b/test/unit/test_logmath/Makefile.am new file mode 100644 index 000000000..0e895c753 --- /dev/null +++ b/test/unit/test_logmath/Makefile.am @@ -0,0 +1,13 @@ +check_PROGRAMS = test_log_int16 test_log_int8 test_log_shifted +TESTS = test_log_int16 test_log_int8 test_log_shifted + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la -lm + +noinst_HEADERS = test_macros.h + +CLEANFILES = *.out tmp.* diff --git a/test/unit/test_logmath/test_log_int16.c b/test/unit/test_logmath/test_log_int16.c new file mode 100644 index 000000000..754517299 --- /dev/null +++ b/test/unit/test_logmath/test_log_int16.c @@ -0,0 +1,77 @@ +#include + +#include "test_macros.h" + +#define LOG_EPSILON 1500 + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + int32 rv; + + lmath = logmath_init(1.0001, 0, 1); + TEST_ASSERT(lmath); + printf("log(1e-150) = %d\n", logmath_log(lmath, 1e-150)); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-150), -3454050); + printf("exp(log(1e-150)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-150))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-150)), 1e-150); + printf("log(1e-48) = %d\n", logmath_log(lmath, 1e-48)); + printf("exp(log(1e-48)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-48))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-48)), 1e-48); + printf("log(42) = %d\n", logmath_log(lmath, 42)); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 37378); + printf("exp(log(42)) = %f\n",logmath_exp(lmath, logmath_log(lmath, 42))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 42)), 42); + printf("log(1e-3 + 5e-3) = %d l+ %d = %d\n", + logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3), + logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3))); + printf("log(1e-3 + 5e-3) = %e + %e = %e\n", + logmath_exp(lmath, logmath_log(lmath, 1e-3)), + logmath_exp(lmath, logmath_log(lmath, 5e-3)), + logmath_exp(lmath, logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3)))); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), + logmath_log(lmath, 42)); + + rv = logmath_write(lmath, "tmp.logadd"); + TEST_EQUAL(rv, 0); + logmath_free(lmath); + lmath = logmath_read("tmp.logadd"); + TEST_ASSERT(lmath); + printf("log(1e-150) = %d\n", logmath_log(lmath, 1e-150)); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-150), -3454050); + printf("exp(log(1e-150)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-150))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-150)), 1e-150); + printf("log(1e-48) = %d\n", logmath_log(lmath, 1e-48)); + printf("exp(log(1e-48)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-48))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-48)), 1e-48); + printf("log(42) = %d\n", logmath_log(lmath, 42)); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 37378); + printf("exp(log(42)) = %f\n",logmath_exp(lmath, logmath_log(lmath, 42))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 42)), 41.99); + printf("log(1e-3 + 5e-3) = %d l+ %d = %d\n", + logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3), + logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3))); + printf("log(1e-3 + 5e-3) = %e + %e = %e\n", + logmath_exp(lmath, logmath_log(lmath, 1e-3)), + logmath_exp(lmath, logmath_log(lmath, 5e-3)), + logmath_exp(lmath, logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3)))); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), + logmath_log(lmath, 42)); + + return 0; +} diff --git a/test/unit/test_logmath/test_log_int8.c b/test/unit/test_logmath/test_log_int8.c new file mode 100644 index 000000000..a1f3838df --- /dev/null +++ b/test/unit/test_logmath/test_log_int8.c @@ -0,0 +1,44 @@ +#include + +#include "test_macros.h" + +#define LOG_EPSILON 1500 + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + int32 rv; + + lmath = logmath_init(1.003, 0, 1); + TEST_ASSERT(lmath); + printf("log(1e-48) = %d\n", logmath_log(lmath, 1e-48)); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-48), -36896); + printf("exp(log(1e-48)) = %e\n",logmath_exp(lmath, -36896)); + TEST_EQUAL_FLOAT(logmath_exp(lmath, -36896), 1e-48); + printf("log(42) = %d\n", logmath_log(lmath, 42)); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 1247); + printf("exp(log(42)) = %f\n",logmath_exp(lmath, 1247)); + TEST_EQUAL_FLOAT(logmath_exp(lmath, 1247), 41.9); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), 1247); + + rv = logmath_write(lmath, "tmp.logadd"); + TEST_EQUAL(rv, 0); + logmath_free(lmath); + lmath = logmath_read("tmp.logadd"); + TEST_ASSERT(lmath); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-48), -36896); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 1247); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), 1247); + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_logmath/test_log_shifted.c b/test/unit/test_logmath/test_log_shifted.c new file mode 100644 index 000000000..006adf17b --- /dev/null +++ b/test/unit/test_logmath/test_log_shifted.c @@ -0,0 +1,77 @@ +#include + +#include "test_macros.h" + +#define LOG_EPSILON 1500 + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + int32 rv; + + lmath = logmath_init(1.0001, 8, 1); + TEST_ASSERT(lmath); + printf("log(1e-150) = %d\n", logmath_log(lmath, 1e-150)); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-150), -13493); + printf("exp(log(1e-150)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-150))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-150)), 1e-150); + printf("log(1e-48) = %d\n", logmath_log(lmath, 1e-48)); + printf("exp(log(1e-48)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-48))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-48)), 1e-48); + printf("log(42) = %d\n", logmath_log(lmath, 42)); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 146); + printf("exp(log(42)) = %f\n",logmath_exp(lmath, logmath_log(lmath, 42))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 42)), 41.99); + printf("log(1e-3 + 5e-3) = %d l+ %d = %d\n", + logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3), + logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3))); + printf("log(1e-3 + 5e-3) = %e + %e = %e\n", + logmath_exp(lmath, logmath_log(lmath, 1e-3)), + logmath_exp(lmath, logmath_log(lmath, 5e-3)), + logmath_exp(lmath, logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3)))); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), + logmath_log(lmath, 42)); + + rv = logmath_write(lmath, "tmp.logadd"); + TEST_EQUAL(rv, 0); + logmath_free(lmath); + lmath = logmath_read("tmp.logadd"); + TEST_ASSERT(lmath); + printf("log(1e-150) = %d\n", logmath_log(lmath, 1e-150)); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-150), -13493); + printf("exp(log(1e-150)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-150))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-150)), 1e-150); + printf("log(1e-48) = %d\n", logmath_log(lmath, 1e-48)); + printf("exp(log(1e-48)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-48))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-48)), 1e-48); + printf("log(42) = %d\n", logmath_log(lmath, 42)); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 146); + printf("exp(log(42)) = %f\n",logmath_exp(lmath, logmath_log(lmath, 42))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 42)), 41.99); + printf("log(1e-3 + 5e-3) = %d l+ %d = %d\n", + logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3), + logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3))); + printf("log(1e-3 + 5e-3) = %e + %e = %e\n", + logmath_exp(lmath, logmath_log(lmath, 1e-3)), + logmath_exp(lmath, logmath_log(lmath, 5e-3)), + logmath_exp(lmath, logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3)))); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), + logmath_log(lmath, 42)); + + return 0; +} diff --git a/test/unit/test_logmath/test_macros.h b/test/unit/test_logmath/test_macros.h new file mode 100644 index 000000000..3dac99fb5 --- /dev/null +++ b/test/unit/test_logmath/test_macros.h @@ -0,0 +1,9 @@ +#include +#include +#include + +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define EPSILON 0.01 +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_matrix/Makefile.am b/test/unit/test_matrix/Makefile.am new file mode 100644 index 000000000..dabc4c1a1 --- /dev/null +++ b/test/unit/test_matrix/Makefile.am @@ -0,0 +1,27 @@ + +check_PROGRAMS = test_solve test_invert test_determinant + +test_solve_SRCS = test_solve.c +test_invert_SRCS = test_invert.c +test_determinant_SRCS = test_determinant.c + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la -lm + + +TESTS = _test_determinant.test \ + _test_invert.test \ + _test_solve.test + +EXTRA_DIST = _test_determinant.res \ + _test_determinant.test \ + _test_invert.res \ + _test_invert.test \ + _test_solve.res \ + _test_solve.test + +CLEANFILES = *.out diff --git a/test/unit/test_matrix/_test_determinant.res b/test/unit/test_matrix/_test_determinant.res new file mode 100644 index 000000000..24a5f5514 --- /dev/null +++ b/test/unit/test_matrix/_test_determinant.res @@ -0,0 +1,2 @@ +5.22 +-1.00 diff --git a/test/unit/test_matrix/_test_determinant.test b/test/unit/test_matrix/_test_determinant.test new file mode 100755 index 000000000..bd63a19b6 --- /dev/null +++ b/test/unit/test_matrix/_test_determinant.test @@ -0,0 +1,7 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +./test_determinant | sed -e 's,-0\.0,0.0,g' > _test_determinant.out +compare_table determinant _test_determinant.out $tests/unit/test_matrix/_test_determinant.res +rm -f _test_determinant.out diff --git a/test/unit/test_matrix/_test_invert.res b/test/unit/test_matrix/_test_invert.res new file mode 100644 index 000000000..edcd0e602 --- /dev/null +++ b/test/unit/test_matrix/_test_invert.res @@ -0,0 +1,19 @@ +0 +0.75 -0.25 -0.25 +-0.25 0.75 -0.25 +-0.25 -0.25 0.75 +1.00 0.00 0.00 +0.00 1.00 0.00 +0.00 0.00 1.00 +0 +0.67 0.00 -0.33 +0.00 0.67 -0.33 +-0.33 -0.33 0.83 +1.00 0.00 0.00 +0.00 1.00 0.00 +0.00 0.00 1.00 +0 +0 +0.75 -0.25 -0.25 +-0.25 0.75 -0.25 +-0.25 -0.25 0.75 diff --git a/test/unit/test_matrix/_test_invert.test b/test/unit/test_matrix/_test_invert.test new file mode 100755 index 000000000..33bef0536 --- /dev/null +++ b/test/unit/test_matrix/_test_invert.test @@ -0,0 +1,7 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +./test_invert | sed -e 's,-0\.0,0.0,g' > _test_invert.out +compare_table invert _test_invert.out $tests/unit/test_matrix/_test_invert.res +rm -f _test_invert.out diff --git a/test/unit/test_matrix/_test_solve.res b/test/unit/test_matrix/_test_solve.res new file mode 100644 index 000000000..f5f338a1b --- /dev/null +++ b/test/unit/test_matrix/_test_solve.res @@ -0,0 +1 @@ +-0.25 1.75 -0.25 diff --git a/test/unit/test_matrix/_test_solve.test b/test/unit/test_matrix/_test_solve.test new file mode 100755 index 000000000..c17168417 --- /dev/null +++ b/test/unit/test_matrix/_test_solve.test @@ -0,0 +1,7 @@ +#!/bin/sh +. ../testfuncs.sh + +set -e +./test_solve > _test_solve.out +compare_table solve _test_solve.out $tests/unit/test_matrix/_test_solve.res +rm -f _test_solve.out diff --git a/test/unit/test_matrix/test_determinant.c b/test/unit/test_matrix/test_determinant.c new file mode 100644 index 000000000..e7ca81c2b --- /dev/null +++ b/test/unit/test_matrix/test_determinant.c @@ -0,0 +1,36 @@ +#include +#include + +#include "matrix.h" +#include "ckd_alloc.h" + +const float32 foo[3][3] = { + {2, 0.42, 1}, + {0.42, 2, -0.3}, + {1, -0.3, 2} +}; +const float32 bar[3][3] = { + {1, 0, 1}, + {0, 1, 0}, + {0, 0, 1} +}; + +int +main(int argc, char *argv[]) +{ + float32 **a; + + a = (float32 **)ckd_calloc_2d(3, 3, sizeof(float32)); + + memcpy(a[0], foo, sizeof(float32) * 3 * 3); + /* Should see 5.22 */ + printf("%.2f\n", determinant(a, 3)); + + /* Should see -1.0 */ + memcpy(a[0], bar, sizeof(float32) * 3 * 3); + printf("%.2f\n", determinant(a, 3)); + + ckd_free_2d((void **)a); + + return 0; +} diff --git a/test/unit/test_matrix/test_invert.c b/test/unit/test_matrix/test_invert.c new file mode 100644 index 000000000..e650797a0 --- /dev/null +++ b/test/unit/test_matrix/test_invert.c @@ -0,0 +1,104 @@ +#include +#include + +#include "matrix.h" +#include "ckd_alloc.h" + +const float32 foo[3][3] = { + {2, 1, 1}, + {1, 2, 1}, + {1, 1, 2} +}; +const float32 bar[3][3] = { + {2, 0.5, 1}, + {0.5, 2, 1}, + {1, 1, 2} +}; + +int +main(int argc, char *argv[]) +{ + float32 **a, **ainv, **ii; + int i, j; + + a = (float32 **)ckd_calloc_2d(3, 3, sizeof(float32)); + ainv = (float32 **)ckd_calloc_2d(3, 3, sizeof(float32)); + ii = (float32 **)ckd_calloc_2d(3, 3, sizeof(float32)); + + memcpy(a[0], foo, sizeof(float32) * 3 * 3); + printf("%d\n", invert(ainv, a, 3)); + /* Should see: + 0.75 -0.25 -0.25 + -0.25 0.75 -0.25 + -0.25 -0.25 0.75 + */ + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + printf("%.2f ", ainv[i][j]); + } + printf("\n"); + } + /* Should see: + 1.00 0.00 0.00 + 0.00 1.00 0.00 + 0.00 0.00 1.00 + */ + matrixmultiply(ii, ainv, a, 3); + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + printf("%.2f ", ii[i][j]); + } + printf("\n"); + } + + memcpy(a[0], bar, sizeof(float32) * 3 * 3); + printf("%d\n", invert(ainv, a, 3)); + /* Should see: + */ + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + printf("%.2f ", ainv[i][j]); + } + printf("\n"); + } + /* Should see: + 1.00 0.00 0.00 + 0.00 1.00 0.00 + 0.00 0.00 1.00 + */ + memset(ii[0], 0, sizeof(float32) * 3 * 3); + matrixmultiply(ii, ainv, a, 3); + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + printf("%.2f ", ii[i][j]); + } + printf("\n"); + } + + /* Should see: + -1 + */ + a[0][0] = 1.0; + printf("%d\n", invert(ainv, a, 3)); + + + memcpy(a[0], foo, sizeof(float32) * 3 * 3); + printf("%d\n", invert(a, a, 3)); + /* Should see: + 0.75 -0.25 -0.25 + -0.25 0.75 -0.25 + -0.25 -0.25 0.75 + */ + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + printf("%.2f ", a[i][j]); + } + printf("\n"); + } + + ckd_free_2d((void **)a); + ckd_free_2d((void **)ainv); + ckd_free_2d((void **)ii); + + return 0; +} diff --git a/test/unit/test_matrix/test_solve.c b/test/unit/test_matrix/test_solve.c new file mode 100644 index 000000000..ad237bee9 --- /dev/null +++ b/test/unit/test_matrix/test_solve.c @@ -0,0 +1,36 @@ +#include +#include + +#include "matrix.h" +#include "ckd_alloc.h" + +const float32 foo[3][3] = { + {2, 1, 1}, + {1, 2, 1}, + {1, 1, 2} +}; +float32 bar[3] = {1, 3, 1}; + +int +main(int argc, char *argv[]) +{ + float32 **a, *x; + int i; + + a = (float32 **)ckd_calloc_2d(3, 3, sizeof(float32)); + memcpy(a[0], foo, sizeof(float32) * 3 * 3); + x = ckd_calloc(3, sizeof(float32)); + + /* Should see: + -0.25 1.75 -0.25 + */ + solve(a, bar, x, 3); + for (i = 0; i < 3; ++i) + printf("%.2f ", x[i]); + printf("\n"); + + ckd_free_2d((void **)a); + ckd_free(x); + + return 0; +} diff --git a/test/unit/test_ngram/100.lm.bin b/test/unit/test_ngram/100.lm.bin new file mode 100644 index 0000000000000000000000000000000000000000..93f58e1ff865ab353e239e583ebf3b25458ab5db GIT binary patch literal 804990 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 zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNVBqUEu=b`V(;cF=r%8l-IXwud zxFG5d+1PwagnU^&*wC^~gnT(YcpS4q)E)A|-AjagIX%!_-Aja^2QctI8`x&uQ-q)g zFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE z00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p z126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ys zFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE z00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p z126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ys zFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE z00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p z126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ys zFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE z00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p z126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ys zFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE z00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p z126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p12FLaHz0iXa~*;nzyJ)u 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 literal 0 HcmV?d00001 diff --git a/test/unit/test_ngram/100.lm.dmp b/test/unit/test_ngram/100.lm.dmp new file mode 100644 index 0000000000000000000000000000000000000000..1eb9cc519c4eb1a857c1db76c5ef34bedda673ed GIT binary patch literal 26194 zcmb8Y2YgmV_WwU~385tP5<(3{NC-6`JrwC6T{?(?JSmXm2`Lmsk*=WF1rf1}h-GCh zh&=a3>2ZYhl&j`*WYm?%mz*{`d9Q%suxr^~{-b&di)AJZWHz8Ie;~nv-@$ zSz&%zPI21l6HGFhJ$v-%ru=UCXPZCyk1W%gblS+#V<)DK8hiT4v{93$P8fDZ+K7?U zhEE+k`HZoXCYmAC7!%3Kjg+O8SCkc&=s7;4lf%cQa&i*?QyTxR%Q0}*ty?#Zv8*s!S)Rre%2uW=ik4Iq zmQ+S^k@L!vQ;g=tS^RH(4G+zmuLL9Zl;C0 zDT?MVSeU<{JVHAAUuBHo@*-uDcwSkwI4w7lms43(5s02)PMY&QM8iQ>BW`h6=@42X@j*|jsLyYLci93=2yh?yHLOApS@-FOsg#M)xVtS z{X;FK7=M#87)zkX)rnrKxkU>R8S|n#t0s3`PGqSt(?A|r2OIpvY ze*dV}E9?KP*vp)Ia^N`QSjx$9!;0%qC8&Ws(t2eDJy-mHG4KyIEAs!__!*|jze~1c zL1|fZVb*^Z_}O#ko8JG~VqtW_@`|i~RfK=zIpaUu#aqpt|3BLG`p@yiO0WOF&HP6H zbF|Y!qow9oq?^qiuiwB^yV zlWsL|E#+O({;9|RbgyZ7(K25jGfYqV8TPMj|3&%#&qgh2G;-pI|LXrOFj6U;k-4Ii)hIDs$6D?BUd-8Is-*tG0syn`W**zn`8t=u| zHhR-T^;f^O!J8SvC!XEt%?e@lH#@+RN7DUy?wkOtKPPijY+it8e$}XI#Fkaw{80N5 zTh@DdAw2)xjb8pg>L*nlSW?R^2(bF^mw%BL4Y2zEOSMg2X@E7KW*uK~%L06`;)J&~ zv4>Y4;FIeif28@VKaF=@fPehGe%0-#KJTsxmG6A)EO%pomreS^8+_~<_ksXx{Aj~< z-qiuVeP-RN^z#y`wg*`AU9oeayCc9Fzs0VN-mVaSYr#hE`T(oHuEW=RHw5_7o+(wO z3wFCVh02dKzAkoKfHmJwZe8c?4zToNc*`%{J45wfHXFVB11x=Tuip`SFjVf<-5Gl* zz|!B?)T?6$0xbD-9x&C7h3ePLzBVR>KPkW1)ERD7fYpB2H~H?N5FYW{2JeXgOTM4J z*v@+{z?!dj?sc&j0<8Jm_{&S~ivia7J+E2pz8YZ3uift(z1KtKNuwg}8v#~-6Bk|@ zdn<%b%-i6-9crIldz1HWfM)iK3^*`yeBlbzC{=m|W-jM){|AD1j-A@B7 zeqa1+s`q)QzU<}8081YVqm#X_Lgm@lZt%Viwcow+N%xyjx!Qjl!s7S4081V}CoXWm z53uI@p}W!hF;uSg{#$_MA1*mm>HZpEt^b&hcDR3p+E%BoS#8A@ zw_1QT{`Gq|cnJa4{O>Ak?bZmjm%pkV!m`h#Q2RT+o9ZS9Sp3vDe2rT-z?x6pHJ(fW@EIw|%JmlUuKibqJM9pH2y3)$bU>@&}zl z_`35qdg&o7{m=L}+&P4$FPQAeULxy8>%mR?ia!zoxR@cA8IfD1_n6p4-UD50xW%cZgov}Sg8HM ziYsCxLRkK1WPrs_()}B~Q6a4LA04VMe>o;pE`1yu!jk{E0Bii3ceZrL2YBc$HL5mz z`I0*^RA2kwv;a%KLr&f0o)KWlV|&R|cV>WPKaIZs$ekT(ul?@Kf0Ui%FTm2b4<>E!@&l~#idg}r#{g8ca43+0RI?cTx)L#4N<`C|XzR}wf!YaQg!0K=NdsoCR z4wXyaw}#4fUbrN{;%CP-vt6CTPWmV5&*cHu{&@66E$@l|OCF04{utX9s;~9F{@?Ho z0apKg25sTL+$0? z?h3Hh>!Y*pbMFqY&U2H7R`d1+SnH+pgBxJ!$EV-_>3RXy`d5r<>^>UcSnO6MG}Tn!o(&a@>Sax#pJ`!Vg`%(W?<)jj#QnW~f~CYX!JN`ro{ix3;>qL-jwNwJlaZ zz*?_IU)ka|2(ZT2dAVtTC4b4gSqRHMQv)pfZ?S8a+dROMXM-mPxUE9dW7m<^YGQN ztN?31@@Kt5<=PK>2Uz_TM(ca0hVa(P3%x#}`tslX1FZ30Td~I-5W;6vJmzKpTm8Wy ze9x5|ydeSBc&|VHygMww;!peW$Pm_gjtXJzkD~+Z%Y*%BOn|k1c^52l$A-$={J7p5 zAHp^7+!>n?;AJ0v<$eDb<4p{;*Zw&#z~V>#aDITbf9U*sW`Lz%YdYTKE)1~bG53|7 zZfSruzXdf8yX7Igd20uEd4Scw^yBORi~mP|DsayUVflk|LwL*Y5qEW{z3h2SfF%#z zZ`X#()&Kec%b#uRx7FJaV2!up>p+iL#X`T$xGZD1FZGa{q^P$*8Sj?0LwmqnRc^#Yk(!M^mnH#)=0oHuAUWWoK{ZGDPkNaq-eEaEF z#hwVT{Ov8J=ekdZ%B4Tg1z7Xd{rUM&dD*X*#9j=r=BM+^O92)?2gbJaUJjMZf4&;R z;{UY(i@*K%tc$%KD%W}Q%>awPp^dEfR)D3i-TusRKM1ha`_dcwxgUkv%U^vK;FI=p zG*m8sbu5IX&z}ca^X<{O(ETF7TCY(LyyAWpVD%?^{yKzT_<5c8ZGa^Y`Sb5XSnKyg zfHj}PcWm;046yjWr8L|9HNcwR&9KJ;37sg`cOn ziJ@}od(99QKea+w<+TH>^?0wtZEjM4HQt2v8@#$9tax7iPBUE4gO$xB|@7oPyW0M1{ z{&hZ?7U0H19Q^C2?(_glUcVg5b>{_G@{~TD8N$++1)=(n<}P;63h=}Gt5>~o^Na4n z0BgQiy?U=#7+}fsvh%KWmjqbn@3GxHweb7+N-ubsZY-5p@{Cwtf%!kX`$A*}uUt`L^|?+&o!*SzXl z_nrWY-w!@q=j{uy`1x!|u6thykAG^k`#`AvM@j3v{Q*{da?(9Nx(5O*{v^N011x*w zJnB9XV9Bq~^AEev1z6+DUS15fm;SvR!qWd&LhZL!zU00dYJc|wYrQu^^|e2|9pDqs ze&#h?cZ2&*s9f?m8eq*=_I)gbi;u4Jz6h}RO?mJo_jrJ{9uIe#W11$MP?nrYx2iWJ2`%>2c>%RH*oI`H60H5Tye}MH_g_1rKNi~-Ljk%1cLpq-z zVm03Me*$lfN!9tko2^D^qL~OyFf~juG||*Ft9?|wwzbV5(+ZqmhMG3CN;1PtJ8C7H(@c9x>zEOy6XkWyDAR-TdVB!h8(QCt zG1JI*%vdu6YRxz^ll%r|ygAdace*L{%O{vsKAmXJgC_Dh{sx{6&17?>UvG-J$uFO3 zZUH;=x*IMUndxQ^xUrdQ_EO%&%s2a>P3iqU_)0Mg%n@)ibCx+uy;PH9j)9w-h303< zTbM=WcfbE!lV}r7OA|3QY%+7rGs$4b`Hl3t-{?c>EJ%huvo8kU%mwl*>; zHlu7Elg4buf!msLGl_cb_~_2w+w(4-@suFO8eTxhy6`&6^p42IS-TabJs`nd>6 zh+a%iW7FAeHJ3mgp4gVq;TdCjGTx(|7Ch%|_{3XEO4M@7F>27X>cg^P}(}MZ5F*j2$0o}L-E)uAFYf%3- zxTYR%o|E2v}c zLH?V{QqCKnM-`vk!nwtUU0rMVO;Ft$ZXDhnj z^tR2>`iD#bG|3!b-I}BQ5A)vAWSbZxX#%t(44Y^u<}R{R3XBkzi$Rw)&IbZg;dBp{dX(Vx2X@dN8x7s>xf`*hm>gvMo<3FdF6t4%i( zvF=H>GhXBu{9iNr`wbp5NhfHV$@qWgnF;^DGlKH}Fy~p(Kk2UvvNd)sG{IQ=7Id<4 zY(3kB`qgZ2+to~A^+(!nW~!-fM?vv%wt#Z{tlet6n=?#JyAD3_ueQRUcap7cd%#Ds zoeUjq>ezbyjKyR(TDhR!3_d!!D+o#`ZoRH(}fq zd}&kr672`zoj&(zGx(GLPqqD^NDQfowm`e9vDPhZ0n{>lWByx9xT4AaI|^XsQE zo1XC5)(%In=9u<&DEj1>4t6;F;*snPSZO`e(f;Vmt&?4d+#Hi`bA6h@Y_&gOP4G7j zZ}K&xCzvkw2)WHzojT-?W_PNfztc>2yAL_d#oHW#&NDr2OKLlK*XnqIPNo-LwKw+F zoAOifX{Xws$ahR1yWF0Nm+x!OvAyWIzdb?k1I+-|C4qSk#A@5pZjhaczD>Z3CE9lE z27~P;XgxC|kjGHu*ax3A%*OrGX|@tCl4FM3Wq9w2X0+W4KTXUS_-V?nG1jlQ2&=8| z`5X`bmXg!qFU91V321Fy_N|HbM(6~za0%r@&18T6^UM^x0y|7JQ|YfC>pKlT8o=)v zNVx$soX&U+*o9_LuOH*jq+So|%>wtQ-E6xCnrG%P&t~Y~Tsw*R=40J8(Siaq-}Yp@ z1a^_@e7XRBEj^rtHDt1~Id%u@S7;X6ccBx_BKsz_hnie_G5uti2;*7go`<}&d**}t zgA456>7|}2q`&@VG1eNl>m}%??6Jt+ihpduDPt}DG&CjlTXZN z<~xX8vkbX6LT=^s*NC1g>=ybd!fPx>gHAQe=wJKEa_Ti>cU^&8o5Ar)r{#rAEn+>vpUd&HGY1C-KDnA$2$5?FlA=FJq}JV8|*lrZnT4-j@g8r z^~Y~tV4sGof#yQ=Sa>t@=+8X1z;8CY`$cvW|AA z^GQQbcH$?bm)B7*3%%HdJhRY)>sfF4uN&-c_*iakwBw=E%uVo>U{;u$gLSwCdz3%C z)y`!+Yi{%9)5PpXKQk%0-Tp#<^~@f-z#?sP2XY@w&R$!@PBhfqX>a3swz)?kRb0F|X44b1uGX&Zs>0p=OI3Odm| zYiqH)t})Ni+X%DPJZ}%No31l2;&n3d?=RUjyzwS}p#}Bd!hf{jH1{@su?2j-V{@R6d6#`a_&xe-ZZ?|t(Wgwa z$$W@iWx?M^*jX0q^0B|J&CMss$D)Tv*qto%`PAMFbBlIl69JSv<9dish$i6?f zXJFs;%ojEb`L;1%!bbvr_$$^Y!CYXDGtXw6F24@!<{R{+88iPDnt})Z&i8wB&G&W= z^&Rtr&1JP6^P}x(bsGK24zr`soWI#=V8{H7m5*k;U+fB>{%YU$>2J1|9nCyW*uHiQ z_5O}O8*R3j-?7utoCp43KOMtq_D?(5*H`0w!g#E-qxm*BjgRCOMbTuVa$wPj*~~dUf&lb)7S)mu~7g z#b~Ev8aSIcWo$K#oQ|w4XKCk5G=QDKX~-!h-86MlIGJ=d&75Z77ADo{=bx*aJ5$J? zXj(W|__(EWl}}qaJD^=mYv)xc`>*pkbf`&lmLjP{)7DvIPdAsEc24~K)6v=G>uo3J zerSS8cShNM+yOJ3arQKGxyf|uqL0>ef&VPlr>k=Wnrpf-uL(7rq0+z8ooCUbiDm-z6U;U< z(TP#3y_p2x3Dle%%zFy;r%->-}9Wi{qp(nKgBdOXF6|kI$LHIIPdCoVse~gLV}AZV=X6H8*O?X0xp3u}mCiPBk~!PSKpL6m9H%z*9doWT z61&y!6}BZ`_y6~4@8Cn@{jj4U*P)>JzF&hAcmn6Dnr0mQ?&8j_ee`-xxyrwR5jb0t zm&|FWF=yyHoV90gYpaXx&*awDfcs2i_LGL(Xl8PIYs87B8TQ$f9vUEr6nutgGxHR5 zD04n+`oVc~PLBQ1hZdaNHQ$!(kSX-pinFx#-PWA^buM5hV83wK>qgrC>~C#3*Y{w* zZwFtx_qCTTk>7zDx*wcEy^hSkBPWhjxa!2op(D4+boM04A%iv3`KB{BI-PGaxyfl? z?7|5|Z>U`1-E5+)#sZNIKW;)&9M|yJR!Rl$-o_oXqEa?byyNxqwJLbF_jt^5e z%khZyfiyx||EgbK{gBKb;oRlL?%RGm+IqPQ==` zCvnfpq--*B(m8mFzs@=-R)F)+d7TgTVgqqKna&LvYhi8U{m-IZUE0m&x*9L7JBv)CLYxB#C&7cS0XKJ&Ok<{+mz$T^prsOm*bKRcIs z#Cn zh8vUODCv}1C3=T9)-U4Wv5&K?c!^;^lURX=1lZp3nyUt z1 z3gccK#O=0m6Vdr?JL^%G*<1sMx_9g_r}_O|i{>rB26iGb+22j9uVoc(hA-h;%t1zX zu$*D&!+NCiDROUtcEtVk?aW(NvB%f{{eB##Bc5R|5=%u|cOrpQ^x-aAq+(-t6A_5V zVUA&&S0L%G*yjNx+JgS4B1!GP4WKAW)Xjh`>}_h+9wWh z!Z$ajR%>(+Qo>FX#a4zA*tLW5)zNY#P4a3AQznv51I4rS+shT`81=|- z%6PhOen$WD*GIWg_CxN+(9Z@~<>%ax8lXR4P*3~xmr%+7D`c+w!6TRwa9wYA3nf2{y673q_Z`ZI%R(`vt ztqV;uwTQ1|&`<5)9++h3vtAR4zr_7u9nQr%Z`8G`(WA$SzntysQGI(M-s1_=z`o(z zX+vAXU-w3K3$zGpjjv-9TOaJ8ox|v-CaW^SU&m&6r3S2Hs*Ru1n%nO1Z;8K5;+*y* z@fXSaDdH~u;X8@A%K(4BNwc+l{@dE=@NJ38UkG*Bh2r~Q2m228WsyQl=CAn6so0le zI?>;Bv^JglK?3*9&fJIOw=+3cYaP1KUiYr9>?X34ZnT#Ecekhe{PsZGg?rlCtj}1i ztOfcri(T?LsKf4}_)JscF7bV#4|13O_O+itGw|y1_3qC&I>!v)zS$J(Axh}?KZtzk zQ?`GPt0ewn+4~cSztr~QqC+_yDlR&V-Jvx)cAAYsE%BG@pb2J#-3x7kmhFSi#rp1p zZYD1CINF!QF7gbR&lhZpZOuB2v!kJo8E+L=eU`Y)cxV!F8O2v`B`&ksFP~(4BQ05X zfA**Z;xGfzO2?dGhhq)Tqs?Q$Nm$8PKYuo-+g$v~Tssx&5N}ydem&wX=RqeDZ&^eB zP19@NtDrwRw2?N;|;EE6^kL!|n=ABwjM# ziqCVnujjH~t+Em5P~s+wZ9Y-s^K22gA=bMbnqb!1)zo*0lUxkWFdJ>Tzn+^|Plxrq zz%GS0AU?7KT1b54e)J)M_{akMV;ABh+(p0_bHA^TH{8nl72pl8v@dh^sz=ipEkrbjnVFY@F`5 zhhBpGULg*o@m^)!mT)?H&F1;|b>E-#AYSn}rF>36oH+%*@)rIf6aVnG%|d=j#4FKJkhlI3s>Qyy8bN`xEOhM*EYU;KvcZA)d38 z)77{1GX_2S-YROGK%8O*9{NM#6HD2*5{XZo3mr;)VmA7fNPOZxYE?JC5_iz~^EcZH z%D%)r6^H%1ec1Plzr%ljJlh}mEyWG~4CZT`xp4at@rebT8$KpJ5%<3d+z%~&tU6fd zfJE+zihI{^vP=i`rKYn6I+VD?I(DT5Q`@-@{0VW1FTfLtOMC~m#3ee}4%kgSXNGOh zJnB0|wv4^9fm3YD+2tD%H|T(!G^JeoL5kBJs~AXJVhUEANL*qc_%qX-euZ0d&&}YR z(~5Q(v}+B2iYvB(-%KQ&#{F04S;ZrCuW09tf^YUEXQ59!IDf*eV@{!+{C`I$iFT7s zCnp)o=K{`YKFx4uqZgx1=V1Ps@K+a!b_wqLU7a+}^rsT9=z|qz60hhBP9R>f16)YF z;##mnyke(Mdpi%2pG3UkHMIVy;Wt-_+}AUGkLR~Mw3C0F>|`K^dS;32ziWGCE~lZt;1Vh2m7xAyEH>D=-<@X1*-^ym~$5<0hZgl~O5 z)5%1@L(%Q{c_V|pMsdQ<%s~2?$^3OY>w-M=d1%+*KG7|R7j);WAU*E^zghUxp4g7! z^jY*bp15%@avC%5-n4JTj!eWFnt|oV$o~cnI04>_PZ-I4aTXHO=Npp9Vmp&lGM{;X z9XKqqUTX- z=%*F54V<=P2JLCl3ETtRn>3C08KjxKpGhj^eHH0E(gxC%5GjmcsCRExqg{ z%|Pxk>PfEE8M`K0yp(tCq2hNdN&P)XS`WV)NQOStMz)}S_4`jj7mM|jVnOz)3Fv%nL0*QrDER9~Xa`F|#!D3SHqL~2O; zFQ}`&cCgmZvc}?7yh#ob(qPIok2j!usdIul=kc!js!z#8@2Vdq?IBO{7p~yO_BeG@ z8AttAr)^LA(3_rP|P%YPgv zX)NiC;w*D)E9Bn_zt!5Wd$MoEjP!d4t)MMPv*=sx#p@d0cLaT_FMS@Pxt&EHTgX4i zyY38sA!%*Yr#`zGN%^hN7yY)$*tjLi)WqcZb<&V+18$8C;He?IM>2Myep~zert|(T z_4_gQjZn#0d};i8e!XNO2Iw$Jd24AexjX^xNE$~wwK;^HX$pB@48_0Ib~$ZpljfRs@YLSVJ4C+5 z?v88}&y?Pa-yWoOyx&36+O#D3GJ`Ma%y{tYjIF()8Y!E8pN6Wf#u|k`s=(jWp}sx` zNF~WuB)?Xa>wO|ra*$jqpjyjjylZ{3DeDN9y{o-^s*=j4lGl}_^)JS6=yUL6a43KF z0ZHR8_50Dgd}TauApNYPo#dqS4(SroSEQPx2xa1{1@Cj9aX-`8|GmUw@^l*5L=q1f z)IE#O(`6HxvMJ_!h`A+DK7%s-PFa7_60r6f>8ET+Iwm<*qii-QnfIoQ)Y(s}8}|z* z$k*qn^0$|ew2ot;aoM5+yleg%M|+NZ$CpsaOKYey&7~{p2l!HdveEIR^Qcpc)Qhq% zQ1PqJf6x{7s`{7OipNt;QMLn8T`n8z_vbykZ=kuR@t z$Yw2NT^Kuw{I9A1F7NU+l0{#}(s@F2s?K>05h;V(6#% zZIan{lZpB{*sA<_od0_$8xFs+7tL)DcnWj@So*vSI-JxWZ5%-A&AF~WJr2h@$8dT% zk8~mF7aG&|UtelsYpS6Yh)>7yoi1MiZD24!gX#Lhe#gllD4oVMnBK?Lm13aF5`A6L!BpcP$`H#CJG`=p<;Yrln5|j_6kLt*6 z1!Jut)x!Q7`g!SmGL*r--OiWIBh(ik4?wjaXl%(!KJGf`XC%o?YdoJkjV=9qi+Y;x z6tMie^tl(bGx@bCSDOo=EuiZE@8s(<#66@};9F;_q3Hc|u-a?x8n1w|YLs=Lrz$MB zna$*!Z<&YojmEw$)!}_N?Zl_%D0wa>ts_rzm(59z?~pDa?^3Ax9#85^(s(-m4Pu;f zu-a(7<$HBjP}`ckOE2ZK(x{)qnl2@+A*r8bB;VJ;=UXIeJM)`aL~cmpX$MLDst=uE z_EUc%{U}DRG1@TxHKdb!q2?!l@H*ukvCGYrNk)=&HhHVTvRnC|Q^=D)5pT`ub09SC zU*ftn3fzf&@h6>7+*<2V39jo?=0|=z@bh5#U-?(@+rh8f1DIfbRv&kTmReu6lg%$d=1-HhfOYQC{@8$g$w7RJH_=q` zWiM(sFQAgM&MvQlwLbFS^1tFud7A4oQVDsQdx}49GVudTj5V3)C+&IH7=FLtj->Nx zqxze9e++$o%5?Yj`33S$%0fI%B`*khWwS}Eg^|V`3~8q#+S_X`v>CnE_|5oELuOE z4`k=sgS0jcNNTIGBvR=D8u;W&|%Qrdj>G(SKCUxXrej#a3(^=pU=gx7Ik0+AI{OD8NGdlBWb7%Be zekIdi55=Iiz(YsuX;Dy5vYNtNW$TjJZRAVGSEDbVlYT>I#-cN`NDD~%*BEc&3FNEs zT>d96qIZJDyJY$rX#xF>hw5&i^TV^~h1#aT``yrOgOTK zI??JjZYJXEHufRi9d+(m$2@daxR-qSjE|vO?@`RPz?Y+bZ$UPjOyBYQV{PhuO`i4} z>6G>q@i)@nbL*k+x|eeG;qbYJ^fW0ISzk|?WG&w*Ive^ONq5&q;Fp-&=OoEg z{Y#Hlli!_pt>X>g%_R8^oxwH+RKBf`w#N zrChopo|o{hF*Wx4(8DD0cmOKjmqWX$$V=t*z_OQ~l=lwW>9?>Q%G1EI*-4Z)5^2_2_JS$)KV)3MU z`J`E-h4hz8(!TRH<@$6_=h%^qseQ38d21LU$@1HEq%Ni%e!m_1*N%8#x_?KO9*GaF zx%$7H6t_G49`BhX>5u9SBwbBi?JM$u@?mqKI=kreBJGR118d&mxs19OLsd^Yss6X9 zJ$`5kGTVX7 zjwIQ_5a?+$h$B#Kaaj0K@f;aJ{8@;WSQ@q-5 zw2yt*_0osS-*Bp4tF_;IaABLO{jKl!`Zj;c(|2L4oVDL;^W#O{o?GsAe>=X!t$%hO z?~AJzdXL?^)$LyLSMP!KUwL~PO+NU^le64WS1$7wtsd)@Z9b27PkG-DyTsf6UZYsv z&$qaj&%4`8EkEi_S+dz{*6|1T%{7mDKOgzXD?NO>mwZJ=tZMFl@5cOUUX8=|dM3Km zTd@5rw?+4CZ^h1=yqhoY?2UTh9q-PT5TtPb9+zIdauJvA*R}Z+(!I9p=`m?-hwQ9R7lGeLRvk!Q`O#8vB zKWim(n$0-VkW1ZI$7zqdKUaPj`+C&}?zrT&-ZPK>=4BjDt=ie^4sU+(U0&NZ9hlP~ z&#T+go8IGP@7P=Gy^@=&R~_GVrPt|(HC}X0Z}sEVKYNC^VO0FZkD31c;H|Nb++Mx@I{52VZM?3-lf66dO7}XXxArFgy_wf} zKs)dDnY9Pk`1b19Z^yqJm~{VVLmv8jjX{ZPs(T+ys*}CEwNKYm3XIc@MUS9)A8>HdSQ<{XJ- zeO5Af*xKKQ-132YaNl*^z1)G_(Shc%d1*b-vGyLk3{3rayPNx5Z1DPBU0J6~-R~Cd z9OCxK@Z27$v7L{7=x+P7hxbVTM&7#xL%l0ERgcx%*~>exRX^|cCo;Y1kEF*w&AHJ{ zEl=^jdAgT(;O*vK^_#OieOJuk)C-5y+T7iHam1{H14}0kN*ngl;B`};&c5;W-tLem z26+YTTB5h_xM$ybWJt<`J-v4}clFL4Qr$cCoBeKTLLcvfA0Hk(>XcKw#5JdQ?cd4p zc3ktT+n9!h(H`Dak(#kaIqkh#o7=eKXKx(%+1;mjr{7lF{bP7%zGvrf?78`w_>C!p zTg}OJJ5Foj{WLDad*t>G-qP$Z(B&*|x!cA)uw>8RlHTWMFWBDFOBqvt@WT4(-oEQr z4_Wr%&g`lC2gA>ME^9I9=fpN%r$ZYD-~Pn2vDGII#8Sq*80&N>G5g|et-ZOYb@OJY zY#Y4j>(1U!@AUNse$d@ZY}f&RVZDw=)(x6>N!Ad2)`0xij>fR1LG#kudYPLZaM6*6 z+rRUW+wIb{n3Gu}cGasH9^V&v;EuH~#s1!`*WkCZf6YF=Yv=Tf7Hf8tPv4>V@v{I)j;G zhIilWQ{9{HOYy$`vdVpaU^j2-*y|pueseo~-lXhz3+j7ymUh8L^Tg+Yc13TxAAerm ztG41xcYU1~Vy$-<99-VDt@qWG{evT^3kP+awjtJXRZsY+!Fr^+)2?pd)&IQ4khXvM z-kp~=#mhSBw|_Yl`|ihQ-0xqmURC>zYq8;ORjYFLc`HBvo45V+4c^tmuRzzTkoN-b z*y45Gu(erUQLS3uoS&}o=3UazV@7Z7I}5MzU;0oejd%T^!Zi+p%ePHa0J!@V0>AxmF?PXuv1Yh}~tNmi}gqyvp zxd~Nu-BRz5S68@0W{zi^2fTzCS9@3NIpqGFc+^|`ep|2Lvf|h!(|Y^g)vD>7M@avT z1Y?}q#tfQ1ar|J@sho|GkATgf?&bUoE|PwiaX}78q@0CC5gsMcvf`W~Udp3Il@;VH zs;K0fY*(6`+}uKat+vU@AyuSXG&vT~}zlgTTJ#+R9wC=K;wWcQDTpqY{7gY*KHv6FCzS}6DHR%Y zBgYixnL;$xx6ZgOVhVgS{UWq12ZiAKt*OVi)AN=q*HDOpmPl3TtOC~nUB)-_7v{(1 zR#dHl{)ji_Jxah zMwjrY;KP$*sbq1^k_ZpnOmPm9=7Dv|mlfx%#9!b(iX%u{k8)G&D;9r1AW{T?(23kh zaTHE?uwccN=%l{h-W0DSC|;tul`y{l@U^8RYD!Qq5}9#NinHUDk;(D@v_U}1O?2U6 zv|CmdU5FD{7MEq{T~$=TFws1I_{#-By{Z4C1$;*FaHR%^%3o)Y z3;f4hxn5zVvM7gKl|;%=$l{YUM~g-tYDCon4N_W^qr4*I#FCewyQL@~{p(4kC>pyE zK1!n%lotBpE#(hPRKT>pxSefPm}s*shYoZUdrl|@B4rkv4fSI(YC!r}5~2qdC7@gW|)9E&aYeUSe| zVC4nAFNQ3qQeknSq|au8T(zZWs6sYbUlYm;SAbUd%2bZqFy-vVMe!%=#fDlQ6^lIL z-mSb8SB+vAy|AuW8E-65c`4p+g}yAl#9(Xc1fcz?ymFz0SuSlZUx`H)^BWHpIYmo& zu*0&BBxI+D1XQ8DjR!e+4N_s5p0p}ZRo`>)T*+&^I?r+ec{+&Rwb${i%rEdsxy}I< z1v)Oxx6vo^mX6WhuVC59_IEk^ry$6dxI0dtDo9~`IqH%YWwN!cXiu0 z6HFNA^D@Hlx<`J$>EMsQcJ=d1fw-nKx!vPq0zYl-fKE`+B#4u05OKXlzxP+b|xcHxI_#&h7qe zc8!z1`S{c6<2UBx&)l!iKYsV_ovhNEAAbC&zr9tIa2fMze!ey)ehs8v{qVy-CUa{> zV4=QVVexq|KmYAt-|!+pW*(b*21M;B0y7|kQFG_mdj0Uv!*F=}(=xgPJ+#w)So+!h z?IZ|ATHko>`*Jdccx5;zi*6efvbmMP4G{ex*` z0aLQn*u=zL{A++b)D=#eRXT`##T#g$rEd_8xD-&ACCSvUFY1% zZbJXK1JC$&I37X$o!_3!E1dS))L;!K@YKDNK{uR0U);IF>3&zwHOpZ7^5NmH&IEfW zQc$*o!(AXYd})4hfB*8(Bm42!{iu2S#PrK$2Q~zANc|=rnf%VkWHr+M&PdB6AAVu# zUp~MI;IP{P{@}BD_$3i^B53%Pc+o!mVr7iI8w0h zWfFE0+o;gYzP0a?0?hg=a6^Cj2&@Bs9^NMJin2`2r_)Do<9AUOBPcD4)O_~QTd=e| zE5gjrX-p#1zFaKexwrnb-4u=*TOOJ?Dokx9~n~{gd0zD0SQ9P&mG&Z-QM7HfjO!O!JiFnVbJS4_9OhRJN3{*DLsi zes%{B=Mz^ME?MTK^A{xSC>NH;5n_9Dff=|&lH#&Sk^(!JsG;^1Q6lF#(aAe`c*dtk z)^{b%X=+bB*+E*Bvf?x?mxj*XqVQ~<0N*q6mgwVLPAJSGFT#25h|4kyTD~LI%c>+y z+%@3)Xo-~Qp78&OC`Zz!L1X_=`Noxz;^A3l1n0`dOHvt(-l!b z#!Le%D?~{wNuCAJo*6BIY$5+c!R9s>dvd_Q67334Wbd@jDOVJSl>tUeCzTk|9%RjW zl;&#a#Fk_$wbs;3v{IBQ=rZxC#+4$wOf4HzmPNs6_6_j>UPKXY#u>^0J}OZlhR@7j zWaTW*w7;Y%6WR0GDJ>pR6p3dc@If34EAsvfsUh+RnM~|#I812vkA8wJ6@4jXa1UiA zR=V#7e+V8{SdiZ`g* z4z6go8f z_RwtjbKoh6#hDa1&(vCnKv6npScp{~n&Z;@QzID+&b% z8|buqLa`s(;}Hs^Xq#IpEPSX&vJqs#%J~=k(veBKa~D#5@?5l zq9y?BXcCehJBXhTpm6MwKpSyD9#ZemTOe@Hr^?oZ%0OU9c`3Ttq{;;6l4G1vs4N7b zd<3N^P}4ymU^kRXG=wsYQ=CMl1v5Zf5Q)1S0D$B3d}eRsJvE^|Ku*N+u$i1X zz%OmDyaDYP-Cy(J+KlbR`_hu!F&dtrCQ44MsMxXI&us5<7RTo1!(1j3Iku2?HQo=U zEBLdRfv3@)ma&nr90qrdShN7UjcWyuGtJ~KECq|WN&))B8Du2qa_k0n+dd^^Q3GNa z$thIgY7yG_*evlC;Vh3dRawh%=(^$7>O_!}kt31Mk}_ALM}Hn^9E|fgEF*_RQN`mj zQXc1{9PbiYuvL|Y(>T@Om??fovBXXQL-xdhJ*_G|9uXw*EE4uk&8&rmCvs}pO{SGd z5GzJqE6~t^J+FxGBnE8NIs-eqQhe-bX{JeMsJIX(M2UpkbA8yPgJ;*y>2=bM{1BMJ zL7ZfY#CXs~g5o+;N(z;ZXwPTciR}+aDSZLb^a}Az|q;blyn-Ha|B(yJ7`@YNok8DL>-&7xVfP)#SOv?RHvg z0#-aNI;=ddByDczX|vd`%jLSMkAGdfyDP;#Kk8xw={@$tjVl8YcUP;zM0o6iwW%QD z0@|uNN3vb}2u06%7!F(wiq?0OZr$yn8&2(>4@wFu@Su;9mxQ6SOb5kEY-}!+HdeBS zOGs%{AL3F!lFSP$-s*y7uCM8NkxLDp6n?p$c=x=K`=x%~HQMi?|GjXXTZsrS4SCbJ zR3Xj*Cv9XXu?r;7|$#X8t zp1o%(j{CCs`N|z%Rv`(;^^(@{B0aZ7vOJXTcwy$M|5aVzQ@n z1@x~A-TI$RwRoa74W+G8E21wj?BuB~z{EEX2)Y})` z+ZFQG*%xEVOx@)`?TP6;+#x#ekfKb(_swD9%tJ>A#Be;pYMN(^dQluXLO#UmD(Sof zPUpIRtVd~adR!yD6LySaQ%~HYh*gjvFdbU1s%WTFH_ZZ`uph?5CM1o`3G%~f6NJa+ zGCYwBvZV?+26qbSYEKLDH%)55Q~Z`$Q70r<&q&T1ZoA z+SlAa&B!4^4BKDBDu%3&-wFSQ{&WCw&mKIj9_H z8+odin{_oxTk~yzEJ~%rjnJ8sk*EmTJDo$XtJM2|w0zQyOWJgMX}fydXv@@k--RJd zpr=mdwf;ccc~Q}-kVg2_ejtOh>YUpTs+1R{n>v?VqHc*6O_!R>b4(sIblu0KgQE6F zMx_9q#&F>zCzHz-2MpbhJgU?Vug$(aa&oD?t3yCsn0?}q=_x)N*GhH;`XA?RxKRl}b~^>$@>!^O+zmZxd6B8vO}iGfGeDPa<3g#r zPyt}Civm~>=aYwr0#Jf2K-q9sj0S(Dq8mb2*&9=6M{j&3s#{c62&Qr^Dx?QCpSc$g zQN{)V0(3c%2qRmBmVg6KeD7w96?R(RdV3~I*s*Vr^pDAkL;c~=ls63cJwi4r(uSu6Cvbb|q*^(21N(>*t#rqLGx z`09&%w7LNTXy>!JNYNfTRZ_A$xt*z`vQBFLXj;Erx==?6-`bg1Qk@wGMPfe1=X~f1UCUIU*i3fM$1*1wfrA*_@I0{*y?IF! z^BMfd4Z-^~cVk;R7~~~5GAlKdQy#q}V=--8x;TcPJU`i7*q6rv|00GUFl%U2KF!+*1cP+@@=| zd!Jx1sI19^8{cqN3h6F#MRtlBUgjE=n*;=1o+=IkF}|mJX&rp5_#zwvlxTv+3?m7J zYWT4J`K6W5ts*W%saqdV)TKmJi*k+QHSP9Dwh*nw-J*Kue9I_c)XO4@vXwB~899vC zGzKDFa`VZrIP}CwnXgCp4J}D=Bhbc9ihB-PQZNp5e0Sre!%-~)gK?5N@F4Pp@VFM# zi|KkA)$%VLEY;yJt))y=ji>rEj8`@>IcC3D8g(iK zr870Zy&|=zdZkPYM6@SS%>dVKslk@^5X(Ma#JK2 z_(0zad7&|i}h%IN1+W{24J&aooK+Y?%49IhAit);{3;XAILc6oq4H!T-3KX!6%_W-6h?gCToQsGZ%SlWIDR3imBFLdl28lDqYf2{0~SgnFqpJ*Igg^|t}(Ux zgzyaMlQ+qSg7(T8Kl^i<_Ur^ zxu!!ZBsMQ6U;E3p3tL5I2j#g+Z5eha1cuTl1Uker;`#y!>^o_tONz*SRzQ37F53h7 zo#IR5d(2Wxo35aI9jTeg^V~YrD%7QTkp?Os=Qz)oF%j#Kz)4e*B-YDNT-3WOD@1s? z$8jtXkPpZ|uGB3OjlVT(&3aq5kny;m{x%lx&6SCJ~C!~ngr$8nJGicgHX7Ksncbj*I%GP?p@O`wIAS)`)5 ze#WOjIydrg?@S5K%`JehG-A~(b4a;5+cd`ZYwKW`3)ZN^d8D8^>0uD}E=tO080eln zNo^Ov{N_L}mu5*sEhHxlFofp_Er~b%)?(@D3<2MjZ^Fv#AU{OC$XFXH#&cMMj8F zB);_-aO^(h;c2j%Dg^>H_3}rpCev;Wx0k44AQNBcgV1SkF99FyNU7jA7;??f4PqN0 zm8Ado0#57IK1d}UmRgt+%rFZ?jP8iJ?s`@s*^F7aNnQiLqFVJSx$s%lJ6<1>SRJ$L+j#Ess9GaN z{cXg?q+Fq-o1oqT9Gp}Z{6s3ctiHP9<~DVAU&5~vk+2|tf2F@ek%V?LYHc=m$om4q zT4sU1@VbvV*jZEPd%t{-UUwDl(Ilx9-^*{8_N@6BiIG`-VRp|OM5Hx-y|b|Dh;(WE(%(MJSkH+_)jTpz-nV&o@^08i%ASgdv519WGWefOw;E8hI-p-Spbz*p}K$Sf1HT4Js-OL9{;ftu-f*%*(s| za?u8$-sW4?-XpEnRX-V9#hqX-Gj5hEz(y9KF*vtc$|eEnSQ)^2xn1Q$dB))UpA1yD z%5j-17;+75;=OqM{ee8)(7a8%#RlFqG7j50>v*Oe65sLx7u2$XIMxq+-XnN=PakYM zg^O0G5BC+747$O>^F#2-!$`IUo(R<>C)jks)Usw)=|obKIS>)z&e%fZRrdwTvz1 zGR{0o54Heqq_@;`O1t&P;^lHQ9(I$44iqXRcoY6jk?ueuBB8~^JAg0UvB)K@k zyIMYMYAk-H3WE?+%=AcCWJGrAGCJ(aMG_9zv{E-z&CDN;nc8ohMHH1V36(9+AW5iZ z)(8+bf6;D%si_pk8y;j?PoD)sEv z`~97!fe6cGnqxG%`okC1!q)rP=mtox!B{@K{jy$^r;`5xh_e1-Uda&mCNjjkL#`+& zh$j-p43z=-K25=rQSp$*sHvt}2btk#vt4$~O-XRd@c=Q0y?cK%tNNwqxtV!g$G&cILr!ctW5;Pv~RtByYkm3X{sn{3ll^2pXV#=SZ0w{ZqPeR!5=C{V?o z9=`H-(SeejUwoDFl$N&7krDD*f%FHGpqfzKO6bDS9zjW%pq8y;C%q~(hy6jYn>q>I z%^ufC#6Ox5*Q=E(?iSjSqCr9``OJ_P4U6l*u*RdxLNpIVO)CY96?%ikYQD=JJ? zXkCKCa8IjDGzu}>nNx7P&5i$bo`waD{rlhcOcu8J(BHujmN)grX38+b%Oc|3#6a!m zsVQBcJMPzs$}u_^+D1S3as0D};UeFt!%QsPj`zsD<7%LBxnd9C{vP2(8G;-Jj-+E)lbZjo{D?P2`p? zcw2|ep35q7TZa{b@#k&&Q%lL%hsPn~Fjx)1yDpXV*2!f~>_-a#=3d09lY)76Q@#d%J=$ zQahzM6Agm$DZF=<_TCi%*&}|8vus27b9IDGI5&M4qCcfU(0KHUBf2XUdUd>hcZf4x~h+dzh#?l+v5^X1Uop|u` zCjKWMHEqesO@GRVwSR4Ck$HZXX?W+Tek0k!q>>Jy>3kd6I(WPo6%D=?b#xA~)55}i z?5Kr<-1;t-9S1!Wu{9(O4dxr^ig;C^&1wP2JBIa9qNkcjguBY4eU^iAXU49*5Z|KH5uCYfOYzO&g|W+Vv`*d6X_H(zwY6 zV&NzGFv-cvI`(`*5k}+*rI&*(5h-PWhm!n3qf`a1zBr~TEd`;>N?kU*9=%iFu0qb-{Ad>bp^)tF_Kl^WR3!P<%`1haLL_k)s8|7I zwahF?jQ5D&VVD$99J#Tm2vP50>aq#7rKp?al6Ll${>2jcA%(4S!>)GgjPjG1wz}pM z@r))nRO@{jgVxXVtA?h8Dlo1x>z{x4<$80FYFNhC7RO^6p2U2r$r~2PnB?-c&6%{? z9t=n0=Utpk=cgCc`tSoz3E47tA);%y_8IP2)Uc{fc)`fJ6w=(t+8H6F5wN)c4lFhb zja1Di5w+IRdDyv%h%)vP>^8(5kNlZHQz=Hai=bZfqXyp%kVB^JkG4#ZsgpRH3VbXA ztW^l}%nl4U$qy`t!FrYK6Tk25d_;T_G)K1m$yX)3zK}henPsje`g60rf57{D)|6o* z&&|rmyFRL@hz}kY>lb~c)a<028~9_Y;yzJ|(h)AZ-#C&h+G@}Hd{vqbI`Ue-1xBjo za=kB~!$8BSs{t*C)plp(XVB~X2Am<8^ky&{60;U>Gq0Xhbx6Mp{mG$!7+8=)tXky<@Cmh)lIWcl(I}G9*u?*;hLk}p0#nduoC{!%{oC#Ke6>23z{56V zr2&A4Xunj2M?|ZE*_Jr$`3Wyiv*$)HG0c%J&dqW`h!&}W6Dp7vk zHQ+?ZKU6IDzd@$>!37!QiPM|Hc|pc;K~!dMZO19^KWFz;-VsZVqS_EB#uENwJ7{S! zEc&DtMc%9u1?Mw@AYKsuJP-=4N?wV4w@Qc}7@RInVR4$pZ;UQu@AOIuj3_oLz3FJv zR-z&G3fXiTwY}P>WUgDdOeK=JBJM&UD}g~JVhJG4f?ORph3+Rku$X)ZUvay3nPnEO zx4ZO%S@2_xno-E=9GLHGu}j?w6DuFxJ%ZcHsyU8C3|PN9uN8FEOn?PPz*teo8uROz zg+a{Hn>_^L?=Y(-Sly5gPyC9nya8pSN-|F~Ps&UJc`+=wji?D2p{gpw$8^`}h*J$5 z7bQnaM)vJ|*m{*ow|uR4>)aVuY0~9?G+%^uhKrKKg`?u6vj_4jd!>q5CYig>C&4Jo z#W5;VhRnNIuk%09#IKgQE#KQA&XW>u=J{ehhmGJ8NMdg(l{GY~#=?c|9j_eFZikE| zW0hTQuP#uA+Y~Lq@JaBNAJvnW-^ii1vGK-OlOOj;<$@sZgIO_4atZy`=NUCer~VTYmS=3vAV{Ky zEr=s#iF{T##w>v5)|16?J)JBxiDKW>l3jH=NzyUM6!X;@rc%{>7VYk3rYMF<|7o$t zoX4rV+;5JR-jAp2=~e^{{o11Bk=X<2oD!JyX_z$N8HW=q&ewwAAT7{!RVCZ3ciWKb zujcewuA+j_I>Gxve%~kRR(KkIhw&d%!~C0`*?a-Uj4KBufQojO>bgWI;P)M+D*R699J_-sIN_pJ}n& zE#x1xa*_AHRf8zD$EDG)pgFJZe0J-=&nt#(u2;vs0%?ufizI{>X;_jzEYTs?7p%|m z6eXrV0n66(YhX@Emsvz?RMNf1q+91=vXDRABg_bu)fk1m?;Lc1y1owDSS)TshpJ!V z->6vS#K6{y+umLY#d5qX>o#-%s0F!^_V=I^1`iCzL;EI+8E!WQV&cW0JSFpz7o?CfbYguw0MYb(WVFX3o0jY~pdpvFh{mVd>U znxUb{sG17VQVLZTvy7AUx5EA#eC`6r4bn@(yndHUbz27+YWIx5#r<(mKU=Vg7i~Yt zSa+%Bq3%d=cI5O{G5~Td0%+060Z|!gyMraE=7#stkEh#Y`o{}0Q=dd4;ZjU+GM9^5 zYG(JKdnt|;Qe`Jfd^^2qD_fM1S~>eWr8O~MO9Dx5m-yS)>NWMLbYmbNaG+)B0>++J zCr`6K!dbxXCS^sJi%P)2#Fc>!fWjqwA6wzSqE9IcFzhpmv|{0i(|Tsw4$uRsBCn1v zy%`H$Y;oWCM=ECh0#cO?{VG`e@tqsH5MgC4$se337ss(Ta&Y#|HMyj+9>j`I7a{xS zx4VsbuXih~ zim86wpW3lKlPF#Xcwqmg*^T zpcjYtD1|vZ_i_)WC1tW*>nFPD{l)z|Ft1KmVyy>M%k|n@yrtuj_T`(n81dw?r~Y*< zRY10j(bVTu3s4+4(%Q&R&dB1i(Gr&d+tP>EfN&qLdAE?ZI^snj=J2>%49K>zZ~|MxoBaSH#9*gFqd(G{jpx7HOCLM4C0R>~3ePyI0Gd5e z;z@>SVdkG5bk4pEvL~k1)p2^wBD(2;(?um(IVU;PbvK4gO6n$9dUMzz{HFF@&G>;2 zk|6O1JLLt);EuzB5ii4xu0D0c&4VAjmSs(5D{#C)iaXmyFckMTE;uUCVX-T`cP#}X zibSBINik5!*{_JXO5uwESk!V|ToR*>XQ3wo=*ked1h3fJ4=WYfL67Tofm^kJ``@wI zEG1Z|#L(`JieF`__K=)J>8$}nf>D$a48sAI;v)TO4}GiC1y9P zoHh|Ir-q1e&#h&fCg1^*d87P>RD6v9Dj5Ov8z%@RBHl8v=WV3P-0i7G1t$_Y3p? zohIJwhsR4jr-pY49c9KtenqegwNe;l3}`gwHn?!LF$+r^Km;{L`5V8a6l|8)5`%bF zJOmHb==-%4MnX9**TsHHQxoGIUBF zfB@)fI4t+&vXtOqJ;#^mT7&$j|E;Mf|M<@u8VxQ+jR$Qs`1%0}Q3wZ#%8um_IPNym zTX0w*iQp1-T=$zb@&Q6dwEz+A;y|tvd_eyyrQZVh-6I8&60u)E1apg6@s7(y_7>C^ z8)o1A7OC<{+Tc42k~Wc}Y(Y{pPEJ_GalHdjv-yOTu8ug@b#{Z>WPT})-^t<)?o(s| z+>S|r)VnV!5{;~7y1uowvH@eK`)b&><)x?56MMTZ_i7@`VFSys)=l5{yejkfo?w8C4 zTWn{)sqB{eYQhunM(^RfdPlh|i@JC*x+cP5obcl*j|WZ4eMVZT8>BX1#R_g$+% zK#JrGqg$*F&VU|t=zg_z$~dF>L2mvRz;k4?4kAY{3Ywu*Y5=a<4jXg z(Og2f8ft;8??e%->4CIV<-sc#VOZNTn2lN}*Zfiq(j;b<|>bM2{rVNRd%bT zGf`FC-Cfz=ejo`T75`!@-5{HZ&7>0g$Vs=!5)P8>xV0> z`)PyP6fid11GcCAgfo4$GMq%hQdk6lbQH9fIZY@ebrKzOA@U5k6NP}K=c`p&gdhevr`tJ(vFt-cWp*nb{Oc|ew_%5sA~s%2-y%(H@TU3 zh)^}}v;pb{$ggru2?dE5i@v|72;b&hepP_3j5P$G> z>3~h*2?RW(LYojI_gx5WZgb|lQb9d#@oe?}w!EvXyRD>c;M@`E72nVM+VbLYDsiIP z>X!BH{A8{Y+LM3?;p?toH2@t3pmxJttSC6hq^ZemzY4=@5Xc_4yc(dxtpMy7Rh}5XRl(YV-nX3e~{LMhWfExvfE{6c=#An)TYu#Vu6j%DY9ITmENjm)nZIM6G<7>V*po5yEk!3~_KM zVmDTP@Bwa700J)XzP9{7SW{c$4KW3@v<*{4K-Y-Ff_bc;EiabnX3PIol#Mt=4b~VKv&>vRV*ikBj07Irax01FatAd$5rD0Ix@lzwjtP^1CW zK({>|wa+a7=pf+6xepzQbR$5l63ffw z1s^r~<%0E(KrR-W^JUZAsll@N=`tWEMqu;YKk&qyw9ZBMi(Gnpm|mETb7@0++gul@ z0C0~Xt%c~C3w@8m+QSUj9yTvUg*jr$0EXtdZ@B5Gb1v9@mYcNsxNRUTLeMz3ntGsd z?i*UTvuiGyG88IpbI;cf&N3QcP%+i>{{!Au$<+tMTjr{UyWKAiMaG8rTW)sCf)bZ1 zjdc01g*Lj+6SA6Dz~M^Gb8!K6v1YHMA7i%VGjfkth0Lm`R*r&$TmM7hB( ziqfUIu8U#?hxWQ)S!$hi+2U5u8PsjFr!KJX*lN*Nm*cyztM0!WSqt>$!(}hsFC@-q zD_v8Im|l)?3JCBOC3-CO(DegJR9OU2ah^2Rb=f*^N3C_yu#9bWSG!Y_1)cPC`Du68E|duk{ail4;9eYaBVX&-F`$ji8J2; zTIT*lqf+aa%M2j8<&x0lt#UyFOT=S#e@kYceRBD$E0?z*3nouiYl5Q*5L38>L%ue= za#=p5Ij-mJ#M*z<;D|U29^I--6f;l~O>MZrn;)hBO+0Qi&iy?fhI-~A8{vkzMc=@F zxtb<{P;HlsNA=%~yK?YO3Bq7Y&^zsNQJtOk$_3*C4mn>@-)T*9ec$vEoT}Y%%9ITG zjyvVLBl{ir^W=fAR!F0LtSjVg&A`YG$tkUOZVBwL*12Y}W^xVEK}=h3678in)+lHx z@}B5r!mgoTE}e&wBp?MHfqe63ZAtS+xkXrb;@zS>a>;v`4RT$MC7?^&&>gpm=^PP6 z4_I_WW{cPwH%{QO+1*u4r(zoUi$e*U;-aqsI^vS-j4-sEVSwsd!ZSo)Tp7UElp;S2 zVv;(~*JFzUd%;47jND2K7DUzP!J7lS;`V?5lncxDv9`Fl*u5uiTL`r$F0-`!AZG6O z1tv`24RI#An2zAomZ)Okz^m(xLB{`YzPrapAwHm=+_^jM!1sFgdTc=c5v^%2*@Sz`UW>%{r+VQqP6ooi z;7|2JL4-v2fH)#T3|KzWOLG_^1{OV>s#)ICx+mCgL;VKx63OI zh}OjQ*y*i_`LH?{ACMRsM0`gpF(V>sG0CE$naBnnZ)=<(3iuGy9d)g?P=fx#Edz8i z${`Z^8WQ2VBbk~*=J9oVC@b<}*$IoX+^?~{)pJ8GBDS>MA^G8m` zZImqq*rv=b%2L53rkM0l=D>={0Dfugv5Z~|Xt4YTO~~ww66*>^cCDP48ZeWAHo7m< zlEl`_q|$reO_OX01>H2={2F z^PkS(8-B28&TMf61qnYj)1wzqa2Xe)pMP~)FpgmiqBhO3!FB40&g4k`?9t4zc+c;j z0i{bbtXFxm7YV?mpJ++lkLDuYwRr?Uia5O5?1CsKf~M1j+CUcz zKT3hf<5&s|!*)EyZPL_*F7`4}NQ}&@%JK4WE{=RauTjS@9s~ad&MU8f#KZd#8wiUD z+lBTS-p#<>%jLp;JTO`%!LVZ}+uOXAb;N7L<G??PhFL|@o$=9@k zMYV@EzfLyLp3+;*<2nM;FL-g34%$>BhKjkIIJFC6q==n)_iQNL6IXbasT>AL&x8%0 zDftQQOz52bXQiIY*5uHqH{eXkmE1jC$dh|&i%5R(E2LZllC^G3HH(Q#26&ApfZo}h zli*WR18vGD!1mc^B4ZE~e`Ab)nj+8~xM9*+GN`Z8!#5rj@&WnW=Qi1Xk`EoNhoU3% zkP)+&zz*5U9wc%Znq!BD*$gHCf!zdJX4m>3Y>A7aGI~|?%WmR5l_@IE%z-plsPRD= zU>qtm8^K|<&`O)E-1e-{OdHcN>Ef>~5ws1sc`GrP+UqW{<-q%ClfMx2J~c6PEMCof(MvCWO6Cnf-w{gmss@Z1`8v#=Vqyhn{$)l zoLh638cW=o8x2*Et8kOXg*jpC%KZfyY}ET9<~k{(#ZSr2xO=czRb|rNCc>wFzt1?~ z|Dq8R=JA5Xo=?!AY2<5;ie}u*Jks$=jwz}T#&3iUUfx_6u0UmF1}BaO57^{LF)u;L zQ4eBJ3g}9cq#MCMUqp#CJ1vBYU;+&VFQUaIJ948`2;PB*$1)l!8t^x+hEo)EYeA{P zYrE6@20|1S(-1@X918v1r-jM*AZ=FM7EA~son|eIYm0%7KSHbPz-tG)a`Q^0mfUO) zXvKTVd9G$vs{0zb1#IZW@>Ag+N;K-?QIH;HFsTD8pj(tQ0n$5BsM&>^E0kq<2r5?K z(Y~Ba6b1lXTvSDZ{*Kta-9YR`KS>g>k^&_mgj2NGl!IA{#6Z9jPD=n?0c=zBhT9gK zR_GRfQ>Zs8#*@WmSgwV?PJNGzFvEdUMLH4j?6>S8+kju}#&>rqtMMUGne$fas7554 zFJh^m8dL~fvl6NS-PE@hlb@m|sO@fJF9l*RQMR(rL`=;8*^rJuLO_V2rjL z@FX0D-XCl_bQB;`CNv zK&G*7m}4TCjA);rO+~KQ9;ml?;ee;m^XU(8k%0T>{twaSrGX`5Vk*cw?p14ukX%*nE!wYbr*&rgVpzVCWQz zsotv}0bIRopjiynEz(A7EOdGR>tSdn|JiYCB?jG_g@_iswigtwEGQgOvSMP+MuWtZaZ$Qz^rs=-&|Fp2V_J> z`hLCiffhZ?PeehR_%he3l_NY78(_Wa_j@o^1?6__J+u*OB+RxHWUsOq z=miucKuk8tNO9q4Ad^6rd+OAVN$Yf{%mOBOCjtRvvcG>ZTEhU%{5{Y3GZvSLkYv1W z=;X_oKFg5+4Esru)Jv}fO`sLtOjdvK(v5jIT(WRu8ON3-sI0@vTskcHFuZUb90p1a z8Uin9q{?dJlw@zk#wkxzd%?Gd^VnRZWhiNG`%46A=5D`ycrIQ^uT#=3N>FU)%x@I7 zdwc{knkQqpu)JP@Jlc^OP8cL|-H@njZGbM}9m`45o#&gXUAhRLaS^&0c33&r^|7b|kM2?iYlN<@0p@M#0Q~T6t3aF=%f@uX&65B*4Q3k@ywMkud-YF96VI{u6x4Xa>Wz zzYEw4;XsjpdXcC~9C@7x{hYmfBeda84A?IUN8?pIN#V}B_HLT}w>jvWq*+AAyIic$FJF)CG-+Jb>w?_7lbWb%heC5PK^E`UV$M~zQ z5;<_=1{u%Asknr5KKuzvdEj_2pwVblQzK`|?7TQzU16q=bt<7;p>d^C%0Gx*eaO(BMpC+3g0~I?rpn{nl40su2@- z)~|tkRu+S3{W53~r3!wLYflzVO{QkOdH5b7&d_BdIiWSkF#D#-(X2#{i?jwEY#p`Q zApZm>l;>_gc2X7asG1g6`ofaR{`vLM?7+*q&IQP7)CFK`1+g6uQbCOCH#62so#v}X zXP1W=ag^@ish~a<16jMO(xc!L1D>AA)Xv$lBuot?jk+-BO4E3XyV$(*M(GA)hFpwwDcXc!R>{)4_ z&W&GO_$Q-O_*^g-Gag&kAIfXVz|h+VZvpH>y&I2J5zDdBktb}calsXh!%ltWg2y39 zWMU+-r0C>AeAFAqb)uJSl)Y2?|9D-JDTopxRQaNlJJU2#HjU~Mv7JS<;Bde5?L7p- ybS5bH%p_BOhF;6FkTMe78rLkQ?IE2$=zl3?@E`v&APhkis&lp@B7@o<6FzV`+qXreHgO2ld_3#+5Gm8q)20kPWDsF6j5CAH;^ zIV6=;*O#kMDp3-v*30lBGo2=;BTcNfq#AJwD`GTJQWFiU4f$Uh{Ike^X>vGCHVUvX znn=dtwS~3yHKj;7pe_+jMr%`rv5Jbqg(cPX(ZX@X660{EPJ9n>3Txu!v5Ht(NlGoH zVl~lZs-&ilL8_5#2fYi!ma`*j>^`fN#zFj_+W2oxPC~k&Lx-x5g|T>jvXCJp78jPq zYg4h>`e-?NUfejuctuvk|JK&Q&PazB4oF24HRzspDhrd*Q|hC&Wzj;~$V#3p`ftt5 zcABY4|KA7^=|I^x_5ry@&!2(D! zyg$uSh7qfcRu`H2#`4*ADPQ{Eix=)Qn(P!!p@URWVYH;I3j1objN&09h7B1xxNyYC z{r)UAYUKY~aFkir*l|{HR!U>PuHgnl2}_`l!cil`mQ(*<0{kgvs`9_}Ut~J$soC0j zb%}WC$p6d;l8-;pjQ-CWrSW+UsgeI~2z$s}^q=*zwT?gW|EM?WKl_s?qyGO^3o8Ae zy&dHAHXs;7qe&DE`_pW(kAHJ4|1s8momR4$S}Ua`$>{$nz#&f6+4VI8N~)_18{&yZ zw;H;ZP)|PaDcpHKVtlduu1Z5i9@Bm*)CZ3-bNzT5K)oxYGARto(EK zJIZh7;AGWIKW7h|8{)$r{Cj5CfW7_ZA^!BAmt>52YMTr?yP-X`?Y+0G-!a6Jr*uO{ zf0lzguWs+luc`d1U0t_Eo}BK_3Gq*#bl5s-)F}U02RH9l;GYy?_22*c$$n{w)&40P zTlz@{zi|2_KNaG}@hx=nH{R9RZ*Xwkj!FI^2cK}sLH-h_e#ywW{!#}odwG;E4+yyDc}~9M zS?A#N$8-E^_rU8zEP2%5bxywQV?&77e%5+xdR9mO1_wV>I>EnnkMf&Be9?fSt%a`+ z^Y3ZQZxz`(X~ypKeNO&k4yn~x9pX|9IX7G_rU)OvE-F}zc~4tzh51!`n&hQzd3l?D>MDy9W49#!@*6Dn&ulEV55C$ z{;Y#l-V3qjv*iQ*{3apRdN^-qw@kz-FL`nuto7a8!D_!nh)XwkTaWG3Khx65SN%32 zR)3d{*w=6CU@1AA_Ld-*88gOjiM?BZax*VVxq zf42}f&d1(PzVz2U#FDq)>_hzmCtu_3>0q_j%fXVbw^M)0Gl%qA7b@?RqZT) zfP+6erjtL=so%2C0Dq8^FaJNp!I9B>`9ni2edG-p=?@EWqrV>Ml-GVY%E|BCZ?-?i z!P3`0A=dbBS=-d#*U8uT_II%C;Q$BA-;Q;#=3|_LrQhNZtNp6WhWO*1e6>H(!II}7 z2WveZ?9`Y34+*jKsr~hEr@ZP+gyXD?V(q?h1cZh^24EZ`U~GrQfw7)_8Yxndz@{%FF*;=akoYHtd0KaIo}o zV~AxBZPq0-H-%X9_v;Bm{F_7EXTY18zb#qi-xgxYr~Tux5KErijeGlBoci-}ruhnh z8~wlRbz6vKpA(+i+u!cwOJC18SoZL&gEgM#94vi4zXyK7!7Be^h$U}vi%$LyCtvz} z$-(j$FFRQEUvaSHdDX$1zt)I>eg4-_9NFf8*rKzklb{SA6)rlP`a`)4{U$ zA04dyZ#pPYP+{}%^qzJCp|>}&KH{WH6re3k!w5Bx`nwZ5OcWQ1=xFg4mw z@~v5ZlMris+HabMSo+j{)XXU_edIV;^5i<@70)$y^3{IJ5bsxMw*EZ(EWcHVB~Q+G z9sPDrdCh+Z2Wx&hI#}zgQ;0SGm*42l0^f}eRJ?|OmPYbceC;4VLSo1N{!J5BWA=Y{M zfXnanXFK_-UlL-;pEIwsU+Uzmep!e${-+<^&oBQIf1kOm%`fTL9_1H0SoYQsVzn=Q zEpqZT|4SUK@t^8o`MaeKR{pXOE1o|7wWa=PPQL8_tPra|?FVN&`HII@IQcs7oa5vx z-Z?MC8n5VIj;NdF2aU*lixV9oE94%U3Eaqtg4 zX8Bh+Sp8icV%dAq3Df;+oP70vt&?AWMQ49~h$WBw({)aH^?$vSul2RT$=CY1!O53? zZglcxZ#O&nvY%U=e9hmj4wn9JbFlJnck0Vu-r?kHJa;-+_O#K#%D>CO($C!vmOX58 zu=4M5uR{>PaR*Dk z+Z-(aygkI4PsOWGIJo1lE&ZpQ^3wOyPQK>nnGnlJJ-o?&{yR>-#`ms+6;HnBVCnm>A=db{ zpSLahEinEqtuW2e04{}ZRY?r%PIa79Hw|BDc-KaKY*r@r=& zuN|!U|Hi?ZzkfJb^}h|V)>9n^Ru;x7;Z=#y9HEbFl2U$sV|=gJtiL5Nmw0pJpMJ{&e1N;gpxX zw{pslxO$-9I>f<#IAM(6HpH)O*`E32tOCD-Q(xm7y$2q%2i_;djq|s!ldt~w53%B# zhc`9x4+!xS2mP4oH+zMDpi^G@p3;apU;TFO&h*qq%=(bN<~UgPF*n3Izx}cK*Yr^# zmOP68PYiL%oNbxw##Q?#IrY_EgM;PI7KK>$EqhuVVzsCEcd1ie`Z;Y6eEJ^v3aTM0 zCI8h9mOR%uSoXL!#L|cCcb${3`qzb6@_pBFl7GFEFMZzN)W3Of6aPjhU-fTxu;jhP zDSu|NnSX1D)xPZecBj1bb>|*jzk5O~|Jv`9gZ+D*eEEw99IW;K zpo1m5K?LX_3mp#4cVBPQR2(iZh$yq05UJ9|~pZoX#|7EAV?Bi7jYy7W;Sn;povDZT^ z`@HaxmYI+DDF3;GHQp~AtoFVPv3~0k={LAHxm4zuXeL}5U!w>0fcQ>)VXrk~BF zh4yAFJi;%+Q@jwAF&vj-}-m zv~wIa#E++h_z9*k;3t}X@b=~;vma7K%sf*J?_f&JfkA$`nHlgXEva4wEwwToO(iX~ zM4BpdZjc@`=LLMeS&x*R%>uIl+{ILzn}YNja|^tysWrC-IBsqW`l~Z{1UP9nF{*AR zWj2HJ%&F#ncw4j7JQCzDGmi)SG_#%d_co`SXTaUfa`OVbz?^Az1o>x~*Wf+O+2+Fl zuP~p$J#!9vZo!z(H9rUVJk!j!=IwlwV_TS>W~J!>E?{;#!h4yEOi!!vU2J-RTbWDD zfPi0WhEqObE;EM({BkoL?wKphOn7&*${Z72Zde2AiubQ*r5v-#P<=dgHZ2BAK zHr8n#t6aS|F>jes;D~vfmc-vdC;9w&#b0Pa_1~pjd&d4AEwwfKn7^6>ZF~B89}Rox z;set%sQ)1|qWXWsraMscBj&UN_+vAb)zb>AJTbtZvhtMvnJEwW=OzKqGhbk_s`n-B zc3^FO#Y`#v?`WBxWIG{86Wb5&;q7JwIAUwzeOQh00O#22 z1Dez>l!!1bhl|YTZq>KBXh(Nc(BPr`dzhZ!5fOYx2jM8H_WZU3Mn( zqV+o~)W__w{v10lC^y$$7tG&Lwl~-_N85*ZM)1m42IuwHP z2bwB-LePH9_M={VGv8K&4`p}AWfvI3?y#6$Ai}D<13me@1k9;<&Y&+d51Bj6FU zjPe@CY3wf2^XcI@&tUy@Vf@Q&J$5(QoQWQ~Q0^?dit>4Q(d@cd5%znI{WY+=bM0>d zKac*q(Es`NxuE*k7ul8QZK}E0ZlZjFxdeHwInrE;9M()T zm)T)hQ!8`1{g`pJH&@sxjANu(WseQUzuHd39z1g;_L!(JM5#( zUk~PQ3+ueV%rR-^yPcU}eCo?DWb8ZeR%WZs!#~e8k7M_pnD=cq2mgJP*>2B=w=_@K z+wjME=1F^d;Fq6b7P_zwpSI1Ix3T6K^xg%3@vI$-eC*S90HY}|&(mJMIoiBnlY!hX zlCJz6=xreT_Di;gdG*Z8whb)~HLuvcgYmq|cx1<~*+KA#dEM?4@Hg=9D*tAm z;;|omY!3+J_#|BapE9mN$o(1iGME_nbL?#pG4L12J(y_vOYC|GvG7;+DkS#I-$Oh6 zI#{n0%{PpvD|`Jv*oCw|eaC3KvFCqpx4_w#SvN}m!RE0)Ma)h+B;Y^VQ{i3BF4jd? zqVk`@_WosC1@ir3H&ZLm{K|X|H7A?hwiLM{<~O@K;J;(%gRsj#Y?nYTrDm|OM2D}XB_Q34<0f3UVAtz(3?OMNX&yA!;z!2R~6)U z@u~yf)msJUMBuFr@ZR3F0q^c@zzal8f%ip#dwaWRr^58{dRw*M&npgifA8vm5Ad!D zc#(H2oPF236P|Adc`eXGD>K;3?w3OtUvK7VsF$_B;pm|Vxkh;N;1M&@yBzMBQRqec z)o4$nJIRdkIcMi*%jQNni%8J{yg84{~ux&pg+&lm};*eC|`qJb|HeP^%~$!P29`w`*qInbB;E3%*~D90$N&0e>(YhL+)O9To1cHh0}L- zAIl|TlpdP1Mr1E7C?&tx5|6JquvOsAnsS!SVc&0uM)TlvIh`ycE=XWG?}LvcXN(2`M(q62iq{Lx zQ*aN>Jco7FGlFa!-iH%KKJiIkA_L85KXzt~qd)Q%n1yBl=jHv_Z;Obu3ph&-X1uHl zG(R2g;fr$7(HLeV>pzCmmf9IX`-)#ik}iFWg6jrlG$~qNV>q!4G>bS<)e{FSHv5Hq zf68eeKfp|5{vyoyQ0k8+qF)KGA!6SEZ)(PK4v{~bKn$jJdLSo5wL6i>SNtGz2izl4 z%R>`mDK!vYfOPM{JtD3vh=(IYTAOS;v%i^yo@G~)8K3O;2zFqd1E(-w1L1PEeTgi1!X#eMi=l%1D z!1C$k{J;(;Vm(?px#gh0vE1`y&l78DRrfCIuo&sR z5A5%HB3aqx2ILuy7H*(idq#a@DBn#)_!{5MV4W*(A>!1z^H%zmz21i1X&v59WUKkQ z1Gzo?$em&RjmV?;{w{75v`^g4iAHhjCQ}f!dk=X7==WaQQyjjT`!cn6U$7p}wYNf2Oj2L&NADNpm*(Ok1;-vwzh;gO*zH+K04MoGT}UJ#ghm> z9?H3mo~7UIA%23JBIQ3B;-{FWUd;Z}NUMG88OGHMD|i+Q?ZtdN$BgyDPM$YUknb^z zZ8$Nkz$^5yy_nA(VLLB#LejqRN{C+#{mN_HXlUH8c-{=gIf;9sH%ZUu zo@hJI!Q2yl3~$dpQ7z*;fP12k$#0K$X$bW3SLUEMR`~%ZW$FDxRzW^C{x{Z>^!E{( z&Bvd8%zDu|_Y-DB`~Iiw7xHGGA>Uri_vfrg`6t~EwPS=|;zx9j{|XCkLVtf}-9^yJ z*R1zG+;;vWlz%7f?av+UkDMgsuYL~idH%(`5-o7Qlhwno^dr04jSa{z{TABw@1$$r z{)2XUvx1lpn=-+A^=BNpH(}b&R#h8{vMZ7T$;Zoz3uN>~i_+ZC$zF z=>(5(zjJiJ$J&zvKF%%)c(Gj?@bUI+_P|!$@2mi0VfOqWeWJZ0;0M{)$iEotd>cLs ztHp9nFLsab$nVbm&M)9gxZn9Ts6W|8tor5GihxhCZ38~l=G#L^KhpLO@O18v4raZ~ zu=@shrY(i%bDy(>a+jLf_H=jxuW|~GlSH1bW&+Vc_CB-Tb_mXc3+cTpKCHnWVs$=T%soUmeq~sK zzPeHWRC_Hvf;Y;pn`PLu;-J&OgOK-hI|A;RGZ^<^_NwLFp9~__I*WUOL9F+)8Rrmo zu@!bbc&s@O`7OKI`F1F=&l+~q{V5f}yNri-=f39f0AFlp2mBISLQE9lzGeZqfavGc zAbmCWM3c2I+Uo1j|lfHS$lbvRVKgnnw=l$<8@mY`0F?9TzGfxSy~6>-vVoYdK-P` z6HUKkFQ-->_bgd||1NU$#=hRO|0F%a{Yv(J-~;j%w|~feau@F9{ubzYKl2gt<>L=O z4)ys-sK-x3zxY|uPap1C6i*a$&ysELOSHQeE8;8L6dvK8r7uy$TJyE71Q&3>lHC`+ z4gLRj_JKg2@5A>0X`3L&72LCA&-*)Bx4L)yG0fi;$TyRFmXg2@ezw{D|6fGwisOH= zufQYRx6BLt`fhtez<)#DBK+|0_OifV{}IY-xF69tE$39lfu46I{+r)Fyf@)h+_#(? z`0)t$4(+kmW?nX~%H_Q3nKILy^XW9A#TMT3K+cxl&FC|qdzNsY^qvjI*T(D1*>f%T zEjoF%<(_2%kvn&7?aKBOq<`-K}=Yf4pC+{0LzaM))z}X*>FBkc`dY$2%X1xh; z&X3;20C)E;4tRmLI^aDxpR3(MZ+u{HJ-q}x&-6mR?nJY_y(WQu_wz;s_S4@xlh!;l zz}qLlMIJ|K{x^_&0UN}A&B?tT>c9+jgG!+&bSv~LE95R_JVSmP>JNZFjg+%&Ge%`u z7fQG6QkL29f>=lK+P}yf4bP!|4)wK@=NwMRIYfp!edlo6%*EDniL-Lp zV{^FY%fYuaXW!2yhRPvs%3*9Rh{|*LMK*`1JBNrnhiE&O2s?+Es3q}g4l!H~k#7!B zYz|{#}{V-@c zG!r@oS^!m(R|~I)%loh3{e0fn6ItB}-%Q&5q>V*iM?rsK?D|bp@uX%}ak*ytJ*Yjm z((hwGhr^Yp7+3cQccIDSm{r|5E4>W;s-9x{3_m$$97aMPX1ZQAb-*qt2meU&5+j91j@;N z&!>MPE^NbN4P~hZ>3aVIQad_d=`QgFxMD=vWFD;!gmy!+Kl!lxNdE=8l6RdICqqeS z0CYV4EkUkTMQSC6MCqYbbLHBs-FAYHwHrjbW}&hpvXEa&FQ%bg!X%z4>tM ziQ6Hyp?=lpfRGoGruk9&-Ei52?r6p3yEWeC(6zivPU-zla6Z%odILNOeifux?Lyl+ zxZBa+ai~4Xnu9#Dd&wZu*-CRH-Kk%_>po6r%Jty$cvoBVc~^c5-ZfU)jLM28VuSBP z(!(tBzJlI@I)KaJ70?h!{l8DU%~|{UO;BT3TQf-4_!{j;>;EWrBKdRqk;Tw0P$^h) z9t}yBe(=*F>E&cd^ZXF$`W;nc7MJdKlQsdaXjL+(uKMl>ss2rnWX=oHEjqN^hj^T9 zEpd=#T#5{`en9>EypMtF{QyXEZzE0Z-V1Gjq$lZFY1hLqgzLRG)BtHtFH}0Db|yk< zvm0$mHmwKAsyR}=Zp;+T=}x~<{#!`bZ;?w$KOa&(`7g!Ul1a8VnKBy7O5Ww`q$|yt zPSEm$nn(G!b0GN{{r0JL?xDW?kbKU1_!PM0(BB9se>7b8+#1(-NOwX?7qy2TB(I*e zvJ`4e|DE(7pdx4&?W;f8Lm4My$)NV-zpiF1mDGEc_m?59f$QLECkA~64W-O%NVczZ zt%c_FJQtn_({6(+UH(Y6*(itlYSiJyq@M}i5af3-QTCL(*-upVAY{`V$VbS2_+^^Y zG&hpaIgsXN74#f*J0z@r+F)6~L3#Wg%&E{)PRzQy)_%ANAFTT>jkS?p0jm%F-BmH^ zeHqsR=px=F#~iqHAep5P`9a-j98H<;paf~UTR9Z2`E3nfE(~=H=3T#U=%krlZ~MX3 z?$uDE3`Mk4i_T>?It^-We}tQmOFrdm|5Dt0S=h#xydMS~2c1dUFi7h#tKX*RQa)39 z$*vLgcNb-4>*quA=hB;OOtRm}dm6fy_kM7-a}^_cj@3DX_t&BCp`qyV6DY{vmn`)>Z%`&Rec=6`!2ZFQa?z0&?&TWIs0)f5!)Dkk6ubl_yO(cH!}IAan#ZI zOMR%ljgahT8gwu9ZlwQ>l=%*<^(6l;IdlTM8~Per57ruy9MZ4a(K_l6>0Km0E4ikj zuL~$6Qd#LvHY{J#6)s!^muzaU1Nd_I6VO0N@A3it;e*JNe%00*bfR@Hf9hd_>hlsv z?PyL`(DzFEmcP)tQ9mj(0=j~C`Lt&t+21@Ru>aSf5BLoz z!WtL@EhJC6lP)fXjzcc}%@=1E&dDA(r&*g&+})IP{Vl8HITaFbB-x4H_hL+HPkNAl zy9lna$fs)^D(=u2R9;;3Jr;>KG1qOFYsKyz7_;Ip^|=rE`kSCQyvU&VPmV7k+ijoV-mz*kdeNa}h zYg6tGvN}Enu9zk}hu8vT)$YuYKhJx1jM~4lepNASYbc+*^+-}od!>xmmAA3aHq?>* z%GNc9l1q7KQ~xQ_WSiTeyTIcDjID=dI)Ja?y-^2^d(Cpv^8#XjqTgKkL}(yX49$g> z1@DRhBiLAkGnxLPF>5DXXjAsrC~qgQ-rFNb6{O#3`MbKnhLx^$qBuhKtG!ZV)%tIg zS7l0|IgotWeUNnecd+hcl;4-~+Cy4~eW}eYkj5x|$bT$D2RX<(hIQ1&=5b@5t@|ll z>uD|JE(zZyi~N}OwG*M$;Ksh!f@P;_cLVSD!XJPp@ctzveVzaomz}F^#k8fQjfD1w znt(mVpt)AL3mDTX=m6gPKszDrQPM{<(lxKz*R{T-E7dI{?@>s7NMB0VzNdW=Z@~?E z*7w{9S06=Cc6~|@T6_F`0Hkq9hu6V}1@d&^SBoxz{S<*^TZ((thV*(Rq<7tG$=9iV z0y&OC&VzZ^`jcK{^J-Uh#eakvbtsu9L5CyhU!mi%pGvUe+&190_-OfBtzp?gjQ1R( zIsJ{|Qs@lmSJJh|N+!vmy>JLJXq=~kWh2TH4Tf~~AIG@9g(TB<(sXm9zdpSJQv9Vf zohNUk9m%Zy;Rr}=Y=W+)p6o*7*StOm9Z#Cd%Acy7*4$$1x8{8lX-(jVfG0!KdDnQd z<+A=Tjy(DsR<$YpDUMYPa5r4K)IEmgRbx~c_0{N43P_Xx7M8ALukr~hqj5;zvJ2^6 zbEQ3AYeD;t*3|ycWl%2ZnzJL}Z^DN|x=riGJk*n>u`6zu3=4P{mwjp+r$VaR9U2QM zPk#6Q@LlJc){yp$t)#7i_k_!)Wm}2~J0qw1$&RmUFqTr%yO6H2)I%2`PaoE<_KOe5 zn@!$tyenRoe^*_}QBFJhEmUcZ>Hp+iV~|XWopndKni0;&j&#=8OuE*z+R(Q$_1}2R z*qxi{b@3a1^Oc)2IXm9*_w9OBX6PRqGPO58o;fi8oy>TJmT^3C(Xcc2EGc0cv@$y_pfw13D2 z8#5h$-JYp9ueX2X+28nm>(9*G(&DJhd1Vh|9{l0j%s1SrsAhLnf}{4W@hy_nM*!-HM7r)YcmT^ zc`UQ-oJ^+a=dCi|b-XR}#XGAqW9z1EIrbd0^}}^vlJ^qn4`+Top?fC3rI8oh}~S-v4U#<}DvgZ=KdR45}CXlHPINtn|4Z-x>Enhf~wExG;d}I6vA6`&Awr1_;hjiDi?^0)K z`j>D1{#cif-cElo{i5+J@A+H$ogEG7)vupl+@|FN>G?+{(`)`{>+f1~VtU#umu-1x z$4}|k2Ys4udQ_f2=-gW-yzr0a{`@UFi~H7lKHsECpIGzcmi7~#+VXk#{^Rb7os?d6 zZp1(L*0<97?}u}~dvN?)qrXkt_uFOA$(GfxH}~5vd9e7$NB*+K+p;44(U+^o4ZZaG zaXWvTlOE9Kg5rW(tH$wNfZ`ARJicx8V*16gJJQoi+xn|^?V5m2w#<(7PM2(dt+;28 zRQitZXECQ8#y4BOx_Ir}55`YF@QU<^+>KkdMB4dpeEwB><;CUcc)PRGGZ$QwKJx4r z$73tS^NOaVPkgVLKlXz*{(Du%|E9G+?)IB@q<8-I`ePsZcaMMY?A_^O&v`g~Y^QzG zHypZ8di!fvOql!lZRz{I`k}a+l#Kn|_S6*CN3+a;)7E8ncb<*yo{_om-9^}K&#h}e z>#+5ZUvAF)9__*RaxUP%5!;->-WdO^Ot)256!{mV`N>T1(JY5FgW5<3lI zZyh%*Io^zein&lefuM6<30}CQv^vToUY{~0Wo7j>_0=V*c!GC6L7R$|@sg_Ndz6b! zNqM;`sZ2yE9ZS^36O^xxF5*!QCHO!vMXHl=Q&Pjfcx|OAspTJaYEyB(xC&n!7ptp_ zmL!tm)#2xMO-Z7xDwc}UQ-T5_@{ zBd@F^5!0hKS{aL)G6_;fLN$W%jF!~$MO{-CuMv?S=PSDbX8b~R)zMTG)#)`6t%}wr zW6Xw7J)h*|rM4oLQ03ZGNvxJ8d5JEfk9eXEd6)tu3%+g(K*cF4i>a4#Q%;>|5|%2_ zBg%u;dBl{r*p#DZ9;Nk_e0Z4((Xv=M`Oz}IbR6K|Grc58^C8P-D1px)leREgZOW^H z7U&6cC|BdLauo6BSATg+P=PNhOPVt4dA*6oDyw*}CL65>Ji(+_n`jMRhc;0r zfp1AOjHo^=&3nAQvI>TF0-Q)-iU^SiOeeaiOp_g56fLU{97nsH~3Gl~kgr$~Z+6CFS*+ zxyt$|7FA`cO3IyE<9qjk(hHu=wY^cSm*rD7%3u_Y>m(eg}2 zS@|#&TiwXjhf?^gbnp^OVc)zljePMtXeSj1FXW@zvC6Fd#*&8hIN!{VSJj&N_!=U+ z1yR~C3u1M3jATJALs_6D6O_cU(r1e@@GRd?Vq+w`DIIf9S z_-Z&SBzTgjPl(e%yu6+X#0SV$U@@DkNB)}nvML_ITj*(P7IU-2=ep}L zDU`?RDCd!a8X)`wwWFpM1Com3CSF=Ct;Q3Jd1Zc3vx!&mkMEgBO}xs)s~6*PNUY@_ zDYdkU#RNhiT0Dh8k<0u-NqLDlYfjps=Q>k|6;`vnlBN!|*Hx*Fx>#8)?x0TN!Oh7Z z*Tu`2z+_!jtacFq1!-%+@$qqR7*a-S#MwhIc3yB)NLp8q_+{Lwol+kwTYzKePhcfUJVlvyODsCccDz8(C?gIhFU$0`XlgLU^pz?p z!{5MEB~_A;KTm2w@(uYYTYmOa@-Q5Vh5}z4^eXdC*4HUuV9bk?DHM=0DJ{8_Dzev9 z)y7$ui+RO42G)f?2eBsfP%|mK;)3imDMn5e4OB&A2|Xzt_{3nODi8}w#}X(ApcKLx z?fI!H`SDa$eIlvVnTp}X^tJ!sLAf~pf{ZwRTt=9Zwdq3BefEvfy#?<)Aa_o98LV``vWBBSxyGq1^>ScC|+M@*y~u8^?{#R zXu|&=1mcTLV519Tl;n4z1|qEBLH`XzP7Ngsp~bvJ`G@mFj%pq%CCxQRUp#{0HB`yc zd1AQ@Qbt281?J=9dQdlrK^hW-XNc6mo>!?S?tPJ2j89t3PPjN;FG>WDs96%L z-A`|w;Mni320#C`Hfz7EecKG|Kb!HiH8Ar#(ea@lPwYn_hNphTk-xLr|MR4HF!+DN z(zmC%xv;?ybCJZnVTWdcgMy|s>{+zUVFO*eF>z#BTCuB`yXDOTW7l)vp4ov*>9bE? zcAvh1zlQ<;v3&aY_~1&GV9En6%dVF5$FLi%#=V$+3SaY6QXN|v#RJ*2-gCyt^NCc&SQC9Ghv zoTRCt)XtzPVu1n{_>i+pXulHl^zOzQmF#|4<8mTmpG^ut}ryQ>m0<-*Y)S*6+&NsW_C_KvdqVR z^gNh`#3zz?Mfky|dy;$UgLzwo%PZ1iIUESXU*!7V41@F`hXtMD0o>tRaXf;;OJ}{X zS2*o8Ye4@`;GRb*gF&3)2>A}&{kB;fEraEYhljsNyBnoQLBl$UyFftrg1wi&zke8! z{P?SJrnJ3a<90cK)xaF3bc-ID{Km+{8=3yb$W)Jfc&}Ig;sH2-!>%3tqIvW1K5^*8 zq2aH@i1y)q>c*sZW8klpJv?yWI$3#So@a}2qTlCvebU1h%I9a z`C378gk(vaviEAoq?V8rKV8Uvt%hqUDS5z<}lz1KP;9FjnpgIe zP1|l4@Yj%SIG&gp;HG4JRD{+sL9AOd3^%E}tzt3F@h z-~;~<2&XY}rNj*oe!822tFt2$n_&@(`zcxVqQ*sJO_@7|JB6_bgzjEO8Y`BNol*DBs-I5YYL14Ik zToq*B<%v!$vNQ(R(x1i)A2sjeQlg@=s#&vY#wB+2LDS{dl&;dr-2y|4l39xas`ZjG zhxHJYN4c}(18{T(=8;)!>9C|P3GnxXXCFl_FX4#j2W^y0Af16jdPw=EQ==2IKhHh)ltmX?uJ%DT*A zhBlejrITx`jU+D8${Is!^to_!x6Rx;#nq&=x+V!Y*cwGa`!`GUS_1AY?Es3UD6h$0 z18-zd44Bu7OJFi!M+fZbL;hes9T zv7ax2#sPeV3TxTfXI%M*P>WhIPe$GuU1u|zk~XImPf9ZMM)|BL0zaq(Uy(KW0gKj? z_A5ETw0#%4766OR9=N24Bjmm-Rqs5m;MiPxQVmYYa0%YiPmK}d&fd>_pqxhi>CUR` z4)mu};ZupxFrn8`k}|9B#x;;^*B_5if*DLoF*6V-=3YtDoK~$bvFUvsqENg1DP+VCd@JrJV+BLfLfEy=DtdWnvOU`F2 z8IqRq5lWo1*2{!|S2CVx9G_>E+QbQQOd!PBglf+T@el2`glf+}@OImc)BMAvRm)Q# zZ~@ZQm{n>_HItrN1JIzgu8QZJrOP6jsYh=^11O6RW*|9 z72}$WU5VRq@$1y@lqOhzQqiIiPQsanKK@Av?eTLmTZq%Zr{=`NSalMsTg1TTrrWIN zr-L`XER>8Gw2GZoZk#!%dTzSFI?s?Q>5`;YqQ!*stb<8hka_`td!gXWn=YW~EIX*w zuVKjt&m#Ir@u^)F4zJ<1r9X7 ze$?|Fhjarv5C?b*K7sGHv59Cg!40>78~xa?eKYj`3{|Wjr!6!;U=yELs(I@CNMR+@`{kpB8JbM{dMpNtFopL3rXMxWg);f`VOx1fzKH7c~tS;*; zgHtFe#H2CsOF;N9;vAMjzidlb&WH8h6JK>fl4g$1r+%6?ui{5-c^Z|f#%19Y{Yj?a z{D~$DxUzP2q&6IyX%$nDwnAyJ1}*`@1)p64XV&D6IaN*8aqDfH;8u(Yc|dE0_| zq@h3bBAnhIyowyX>d-%FOHVU0($w^MZCN#l6U}f?BmmPUgej4kE>5BA9d!4>tHK7M z$s~pbuqV2C6cs5`Mx85HiiBU9C*$7S&X;Dq1uA-JLR|*ffd@Y7Vpeos^ukRvBb>b8 zcdQ_oUm#vU*ikMea^e7O0#nn)B55LA`epHgqS;e^n^0Dg*FMzb7G!ZK434HTl~eFG zaLRBLBGiyNH;A*8oKk>~GO0+G-@{FK%1G?Jh}jgnU}$t>qx+;xxoquu2WUp-gteRN zw0Zf*AZcmW9F=V2G|vc3IfSZ;$m9>&@JLcP zdi^jnQmlbEt&1UC67Dbtau}o+74t376LEle@J!Pg-3S#J{?e4xJ>q!mTTWSpG>EfK zb)5-_;dZeFy3%6gs?cnWRKvBZD`x73Bq1A(JE=Nk2%}fSnC<7lN8;DBCD2>bvZd)W zz!qB-lUOC7rWtIn%E$o=bmfyXQqWA0WerfCm=2VSE7MLFWIEfnCTTNIeLL#zFm3uw z?#Ql_JxR~bT`r=vW)dv~sAW3$;|HaCi966Fz#$xlut=L`e&k`lT7J(NxNa(;kVx)DxGa7|p|=FW|jFr`@y)IPR$<~8d~ zSA`Zco%>0M9ozE$*>gyCLMu)()iR#BOz13$GZ`3ZM_J75%+5|aHFLKFhBI>_TB43K zzsN*zc4}i0Xum;12k=RZq^01-Z+pe%%-6Z+&m?YH#BTD$J$ndQh5R>7_BvPm&`o?V0;=>khFv(K?I}L!i)0 zJNJ|6C=!iccqll4T>_^of#C;?#ddFEA812iQIaK0tx$M_SFUq%rB>Q77OtyaukD0T z)95IiN0r|+OzlnD{E$!Vr27jb8rCXY{9JnFg0N4dOG$vK-HMb%SYG4ir!1e6(D<#9t+J&n!7BTCnnPe5AZkt>A^+aZ5@nfD5 zKe$Z1c?w(;K)JD)tRP_Ptc!$50Kx0r^kb-Hlb+$_Hc*VU{1)o=YLZ4z|JG(+O-)Cc zt_u#YtY75S6jS)-6ukE>VOh7%tA+{uw$~h9Z2CsL+OkdZgQk~2V2E38%c>2k$TF*0 zrlsnXWz{LXrzopFh)3B9av25G6=5d7f;T47+QWE(0J#TF&J@;8k`ib;FeH~+&&~Km zy|!9HLY1E@io%{6z?!4#t5u%JmCw2w$Ou_y-p_$d02;R5SJT7sqCQ$i=-DLLqZVrt zfX=Hnj!OCIxInPJCJ<$01+gve8=q@it!Le5jN_UP-{!?s6P~ns^Z8npFW5I*`-@2; zoimg`9WqM1WS}^#vg0%&sv>qb5-0AG4DwNObswdPn8j#{Fj8u-rUa#YcSd~=-Loed zmAk-zSBQ~qv+ne{*PR@H-S}d=wj^^|uY7psjzvbSR}&TDN<|_is4E@@k_ocgZQ_Ai zsIMM*?7EPfOkFs6#0pNc+1s2nSwk^wQ()fP!soCTzb(%GoPs?Ea(z}8O|?2Z z?#YiE0nIKaB3}rf`$c!4(%99%*TD9#jdqY!ND@dTZD#A62=o%jwRzr|e)Iat7=*9d z^~WyAUAbvK5nm2^Fa$pM%6Gc=SL2B^jd<>>_Afp`XKOzGfzBp#q?Q8Efm0c)vDVm0 zv3~7WJwGQW5OYV5ucnJxpEYs4ovZmq9G3-Q>D;f}suVfzY%jK?uKoh3(&MTiAzp`Z z;*M`T41_oHrG(VlH?ir=z**5vH^1|YbR;D(G@yU>QxKs3Wk-<vIz=-JB-dvh#$ zj1pM77Ij_&{E1Mdhw8SP8eCG0ILpyx7Lx^RK}R{Hak?lVTNs4QZ^NBQ3JHA8 zijr<5vj#kD9ML%{;36W*=*g7JR-%Yd6j79AN@!ogA9)g+Mdb+kTro4RJm`DHcJ*b% zLdm^0dk~5q_=jEiWf!Whd+nl>gwqtyR@ZTiV7vxIIA{^Ayx*Heskex{lC!rsUJltq zbiRC&q(}_BM_WjW!Y4>xypUVRiO*B{*>-OS{BlbWNm^xyIHMvZRqhR!U-Gmp{dMpQ z-QET=mt#um)g9ut$GGz@hvY{%YPeCX7=eS+wD1P^7pI^UJUT7(z|*$N8t)s=9*cVI zVPgMa_$5Y}VN`mU0ikv7YlZx5vbX=hB{)qIUj(w*zc*aA?49v@2-|ELN1yOYRT?*U4j_UYmLE z?(f{N_Rm?I)rh*PXsfy`b^<0N>h!U{Jw$p9_s@!1(fFYtzlruy>frvpx zQOGbVe}-;%6V58)E|7#EcdCK_g?u4|-}-{njCgy9C{S6K8Ttm?$7Z<{vCsmc0AGb* zbDNpCA3Mcfw%yxE-M8JxJS*+FN8qha>ZmM6UK8A#kQivGT|$CQu60gJycZXDvw$33oKC(os~gbM7q$SHA^cvEgl_(ol|PN>3T z*EI002{u|CmkmxmI0=x-2HdL?Kl1G0wcdH=N*<=@$Dp+Mmd#E1YEC&U8dOu9%&j&X z(b*~T`X=?Sc82}RN#m(OYHt%2sym@pTc~Stz>Y?412mtRi5v}Tw|X{6`SE3E&RyC@ z!2P^4TsE=-R{&n&}YB`xV9s@Lm`NFU+AehIj8pxK>+>8wbV zN}9Lw{gR2JS(Oktw-*KO<$-yWIMQI3*r4{drk;V93P&VD~R`DPCbTVmm9TFiqZE^g5#*yQacP*ll7yidj<26*ieL(OS~^` zR#wld@NzX3l18rX?rA_1UR+_@L>Z(on3;N+pOG*&S@z68VFn>WO+n1G#})ZT>y7|* zjC`<`PCy!bRniXAn{{frwPM!_;Sc+LknM-^|N6PVhNgP+}sR5kq@EI?HQ8FHBZpj%^XX zB$~WN3Rl6`f%{3Ac_OI3lFvb$KSgXa=m%Pa-|fW^wo`^8SNZgbx?-p(FjY;v?>2hKJHg zRGNmEkuQO1+Sise4fk>`_O@4Gb3|SJ8u~51f`~@Y z!gNMf5gm{1`&;(0pLOsE-YpOkYJ2gws#=U#+hMHLz2xQ+ZuGY7&cC0qXF#A-!bw4u zlfDHGqLnIz65mrbQI%*gPPK)KOn7cOl&_()zf0CB58|7?g*cAePv~L4Mz1EL|K$kj zePgRlpfP*$3OQ;I8F4h=8eYiZ0<*JS-fUNK$Wr>nr#yfYUX%rpNWd2=GsCDOwH#`0uc9 zpc?5gT{WWAc`aV6p7Vd7hw+p8CTi@VQ z-lvcGbobb61sWD#b!;(<3ZX_v;N^N1W>JOBi3P(Pgr13&bSZ@0US71Q+? zXB64FL)Lqjy^?E_E@NZG^4qpcFB}Ga6b7P$_HW zN=t>~v}GjhWFl9%&OE1Y|cFXV<*p4=9Se2BR`p10x!AvE`s+_4LvZY#{x3|}~Cb9XWyG35X zUpyW$NI~yM{M9mchP{cYHz3fJ{&u&HMOjT7Y_Qb_43goWbuf*5HmyE6obdOP9bllX zw`ZI+$Vy=jm}hoT7*?z-!@u)<@l}7Jtv1?_4s`3)>SjS~_cJr~?Z{Yj@k6K9CJbTX z5iW-56!^}S%BXxDmCY7gq3EYyiguOfMd6+fb}75x7bct-d#Vnf@I=3I!Qm?|5{^zA z((P_Ha9KY_m+ZFKykm<>oPj3P(WCx$%`y*9twYD$))_ciRUi*k&|$HmC)E_+pT6Fkstp3O?`3Ud$YY+*2H@Wqvpj|CAYvS zc#m&m7!i~L{Yg(+bp4l$zhcL?-x-;mS_Y>?@9^kOyzoqAM7-?JX#ED1mOlICgNr4V zLh>_SFAIj?7LqJe?sfxD{%hJ-Q!t2B*bie371vDZ$-p71&<;PcCaY|UXvyn-;3fL} z<&dr1^rGtx!PDKudLQdy`#ToA7{uj69WThTu2^dM4H41PTaB<=7zq+hux!(OvUF5D zP|$^elkY2WH6qV<$Jnw&@eq`#ueqBYJ@SK?iy_gZC(UCsp#_eq)oLq3TNYQVHC=-` zPQnu-*#+%!S@VMx_lGQX$0toTQ)iy#31b>`{vw&f%k9iZG7EBt3^$!iS~OggD`hRq zig0{M)mHbz^&r)4<(rtIqy`a5l;=5*2}^A)nZRg zTQSw@jSEE*|%KDeXCeZcl0=R2|<(G;~UjT*>XjVHsI zBBB?%@uP|IA~j9j%-nC$ZD=lQL$-n_-<|Kn)kxdA3)S8FK3fd_#6y~6nqIGEmb@`B z(y-aCX@ctIv?pj}s*rhsvX{9rX#a*J-5HitX8f&kIVKt@& z_a-KLuB^pD!)_eIn)OfOIO?L=h-KrM77b5S@?}~yPW#>^DLyMCr~-ac>lv&BGKVCMOtZ-g z&OAC9#~$}d@n`Xvm-7eLC=FjpeL2(Q_^kS-n`5sw+a&3z$g&?||JW-ke(xIOHsM$qGUI%;ydx*kNBd24L;^H8Sb28OA+W9L~Vqg1G-edVdTS^D?vY!+^4U0)bMKRsm zM%C@?Cc+>lmf&7F-BvWE%K6kEqOu&*>#HP0U?_}V1N(_325A>X zVI!Z9ICEVfkKqs*G0cplmxdD`PH?c%)i0t!6rIjy9^3QrIQ=Zmj`_j6o8SBctz#t0 z?BX*#SEj|ogTg#4HKwVR#R5g7AF+t7f-EZ*0~8fEzpW|faypjPIYu#?d4Rkhk z*!F4#7_h_ahs*h(2Ii_{e3`C~!8FqG(yfi>toUD{QRn^3WH__+OM-$tc(d3!MfNyT zBn2;lzJYTF4Vy&nXrIr_A!&xDrp_swybO2qq}XU!-GBkyL?xUu1*iQ)hn6Lp(|IKh zRC$EMR@dFD1cIj^e#=^NmaSHjMs?qKvr%YSGW#Inz6c;H&J;oeLg7@7#%W1gHlk`+^wOU^>d?Y(w{D!ccRRF$3J{|>KpAJY5@8c;EdUX&y{3#5MeWcV=Fb$bplnIGk* zTaK7sW?u^-%T`u0zKR>t1cj%A*ARb!MI(1Gj2jZcIi4l&cjQjlYCh(}lo2xp7IO>c z(v9}SDf7E{pvrbxomHeU5UIB3{g^eBH*0cN=0)NK1Y2$hI7$a44e>UGA9lmUI7MhbwBBf12jMNNVn-n&fOlClR5B7G!CSyJvDs_OQl}VN(Zd;&1tA=!qM_Uz~W>$8J9wf6PHA*1Xde==KX^ETD#@9kZy+kg>GdGzhnax%=!n2~d= zY`+;5T~4`Y^MCE%&aH?eUv*oPZM$%&1DBIpT^f!@rFB(YPQjLGpp%JD#?l*1@|iJ?imvbSD$L{m zCXwh);Gu|;VU|^6z-JU3sC(ROKu_q1h>7Dbz z0oqaSMu2z2%MtCVgk27E^rCQZbWxx`=`(JxR|AcRud8cpTmruIi6aG0XA+T|agAL~ zDD@rzQofTU4dK3#uOTF23oQ_R5^>rt06xv{Y8>;f_l1!|$p!!qTj2D*gVI#IL3-WL zO6M>wlq$o!7_7vT9eGkZp~WC}qGHTRflk}{@+1DbPKsMC?@)-riGL8htEZK3hdKF_ zO8gM3fhQ#L{W0H8I0f&NJ_z*{KdTo9w8 zsuwJQkhc*2P3Qpe@86k`AS>MnmiQ#4NMr%Ixm?S?crc4j{S=ur;+CHzItp4OEg!&O zTf%k3cmX`w00^497VcU7lhB&{9npVLt>jaKjfD^I5Jw2D^0RCQF-kr)*dGmssk8uJqjo1n=Eb-(xl5#}4&ley*wnu^8);>$?KMT;YR6Q{4oXQr!U-J`XrYQF}J1i^Z zc{_A(+}z{>?yEc8t7ZvfVde;n{aV-YGdHv>IE;DLmx5Y0m4a$273!+Uqf*gGqEZDu z8S&1Z3`MMEm)jd#?0_2~oehgmIH@IvZT zZZbvzDv}RV9fXEt+l^-ysJJpN>8>RJo@68LoPmfIXISI03B&MO7C>lf5oGu%2{KZS z257|HP-BZ~pf-?gaC8N}6@MhmSwnfNu>S-~%kE`&}JUH~!H zTwdS!w)p!`9ap=n+pS~1qQyVZi^AB<*qe zADOHgFi(TP(20>jKF5EFhZ%w|k|!Sig@mbqK3zQLJATnjLLh#<_zwTxWtkcTzg<9| zOU11(cLlho|AAjT!?d*AMJWk{s4fBuqVfTNP2zHpdPZ!3ICClrBI_c8oN+M*&0Qw= zi_vul$^GCK7zPY5MT-EQ9CQSUI1PfH>WB@@{|Qj<4}u11YmTww1-i^jpN*qH*I`1z z_nnfeX8sA!;L=tA`WzdXyHisnRk`%j5}4GjgtI1>S-w+*HMu_1dy!@=K`&Iz&!$YW6@v|t~2{ne?6?6rJ zc~Se0Nly)cKg@Wr{1_&354{4oAnB4cLjw#)I39ISW-I8vDaArt{5?yREj+N43R`D0 zKDl%*uoX@+Xtd8&Cx5k<*YX)b?L7l9H7{X_By+lL-sOY~Il_;4bi<-rrTb5FtRf0M zIt4MLG8a4;p@_S86tI}9V)6$87t`VoUrK3d5}r;Rp-tI&?G4YcKq3k$Hxag^XSoHR zGY{4b(z!LzJgtaUVuMt8!WAsr__=UsLULb{tAT*R6A_;^Auq#4MhL3Gb%% zA~a{&Qtl7uf|$y~py(cb*i)KBw4)x@&vw2E@{?f-7} zj8B0IT(p^#@>|ANC2_64WyvF;joCE5A7}`Nq2;xl_MrThs_ZF&>RXRE#bJrKr+Yni zlj>2z4`cRX#jVe%fYf?h|APBstu0>9vD6lg2RAE-dIo6v3w%wrr$>#g&wPKVu!Y(N zl-F{Lm!t}3$Ai5&T=fg69-;hzOM?9@Ah37nM68VSX)Wj)AzAvnlRh+5?>Q6vF}x?9{)wdfZ2{Si{s5gPg75N*CgRNHbUWQg{emIko1TNS16 zveXtIB(l;LZR}oWOZWV2on^K>JcDIfXDim#Y(SN^XekX#gPu4GE*TLLiwavfA=*Vg z_t&=FGa8t&xE9~I7S^&nBKf=0P)wgZ>S`VEF;r8F+sCqX_=;#&(=vx$NU)X`Zo6DZ zixr`-&6B^zsTLr}cabR6&*D3f4Y;+OdJV0jtUw8^hl*NC#e!;j4gjrY7JjuTn02DF zhL_6%%{oeDiCF_$TA?hSuv8|iShmP8MspXA_lI+ZGgoZrBv2fS{XZa}?Xx<=wXaj0 z?r{EUwP05Hv66mHZPx_Ob0Xi+DrV&noJ9Flx@iWG=C|=`T476bSSWy#O%AGQeJ=Nj zT3R$ptdN!tb%r16+7~AcSC$i{*c`r1aJvg^{Ov@|bVlY+w+d9xa#qfwA)8gR4v6x( zo4rwXj(sM?oHn}1rhpwc{H4CBFDx2=lT8W!CC6APjrG1q(RuPgkg&1h?jBeE@$q=b8zqt|84&Ch? z$9L4e!e0h;uiU#S{a|z-v(zz|jz72!6vGlfQW3col;NqS2#Y=OFQYZzCQIkUbu6Eq z6#3IM{&>Rdz=-$pQ%JQEMSZODW=@n+J#)3&?w~T(=hF0*4hAeKvyz3=9Hx?3vcR$^ z)4=4A@{=De#m?R$T{PHR<)Me7yP;%as^rSU-H?X(at~*FK?DT|)ob{bHez!Tzx!ag zTwSf}Nj8qB!ul%0$K=}?*{d`tMmSV$c=gA!Sr0roscIHYu0upfAmjlOfE8zS9H|d% zzbm*}=qiXTyMrGR8L?v@f^qZ$F!mS3bjd^{mPGjqtM#p`@plt4)`g0}s!&BbvwtwGjJfmO9oDu$XNBW+FrESgrTK|aOxwJr1*@8r<$eZ zNeg?O80fr8UeXK4%yWcn0wmPhm_*NR3nc_U^z(&Anp#Ib&-@e7oSr2$wkBKH?8M(a z%H(>jzZaAV>jdcEN13xMAu%M1Bk6j%XVwVo1cgY?1H;i2?SvAZj9Eh-NSb4y&WN07= zyCK4y0UsrphW7Nr(g27uVPX+a*ouVFN5BeUsEK2Buq4z^ zA|l(Ei>r7b(kaa5EjJzV0E&`f{EMt$nDNX4KguW0f9X`g9!9DZW?E$mzc%(yw^9v% z9D(8VKr~G12-d(mEe|GR8!=vd6Q{ZYB*0|&DCiPkhq1+UoAkm~$#+w=#0X=UZRFh0 zGy7J&ybPv9LxCqbLM(Hn0P6L|%pDZdDl%Y{Lrhz5OrMr*UeLRQa9QR_6iXPQI1}>S zJnZokw%u#qj?kuix4G3AD>KM9ZMTvEeBZTw=)lJoEKC@!EtU=K2kpr!O0B^jK{#%* zbSKY+2d%N5*jFCv$?e5MoA`2>QW7jtIt)VS3I(Nv{hxb33y5*A6n6$)^ePEnLLq)N z4^b%0uNOMf;a?9`z1oT^@e}_Go1S#qYj8X4-xH23t}Ax$=2dU(M(m(h=7nBbOd|sl z&&pzF(r2@-7;}z{YYa0CeTZ!LEP=jkl)+;(ZV3qQuO^DO* zFY4j|L%oPZxlkBr#LH)R+c%vbq1he^mG=VEJsvenEKV^B*9u`l^QbK}V-n5xDd?vB zWGWA4?%9~a98Jz=0hY}%{aHOsLjphm;h?BcWaY3&cLiAIL_itq2($AQRTd1P z!(vpXFv8?{1bM}_EiRw+}UIZM%M#?K3x{WKVf)Sl7YJ!#XgK`d&5$2#% z7cqbzqV+$3F?Z2838Z&C9rlcWx$DsT4t(gq#}0%=%(L6+#d5S3*6jm^0tymIV-kwY zfqE;CH+`mQLGktn66A*Ddpk&dhSy_kv5N5|uW3cfh_D#YP)ECiJ5E8_bevou z$3UJpEnf~&{3rG=Vs79j5xCl)uCrzl91^dmc~j`;$hO_%F~<{Z>Cd%vTnLV{1W8Ab?J zxsg^gV}l;#BB*y)1{)=3K@LL34W&3TAW5d(7~v2>MI#?@He^R`q;JRbgu3E`_}Rng z8LSZtoa5jZb(-fl7&&(tol*%=DYN3q$4X|rmIPzIaQ}an$*wXYQINKzqE?L6D$4GbXy)Vw16=VB^PT|&(CYV^xXz?V=BDWwr z7KzwML$3kmmJY8k$7fFxQEI42T)@_K2+N}w#Gp=L&}qbNWwhHYGo}+g!K`#x zpUW*gU-G93jfzr}K&$pt_0&Qs`wtj7cHeiVm5DPz`qp2}~obxT{w9 z{|l`2@>a!ud|Qla!gj1OO<^1|~L6T~xGMlAXz9m9-YWOrS@?S3ClQ z@d+6Pil)v+%5LSFxYfIGYM@2g06tniMuH|QED}2X(LMn!^54_R7MPucu%FEjC>lXd zDRW*^egP-)RIdLINK_Dwe_%K`G^NTSKQ5XWqaRb=iau2*|C(C4?K2Atkq{Mvk};>; z_O<%>P}GMmaLqP)6o#Pi&X~3svL5`DFx>nXX;WnF1lkm>ZGcmsX6ZIMmv}~=XV3s4 zV^_P>lfQau6$C(AxdP@F;m{W&wCT=jEnbqe-#7@MV9 zzTfY`cy76tGr@)EK#o!fhACCNIY$nq17ezpu*v5_(Gv8vJeLecNI4I@G?W5u6b$D< z0(S&?gn%hMAX3g!=}XQysm4o`TB=;48gURbzh_33F*$-60(e5el(gku7OwwZFrJ7h zvpD|3mvU7>0%jN`q6LWJh-Ja&MKqO?;ym3L;G3MD9yQ`c-U*BfWz2a#b&6c4ELS)@yNHi z|JbJS2FPP5?|5EK5zJaaE!q1(BSiBepZ9oKr5;jyBe z;|#>h$WRZ{I4TRF*dB~_50IvNVW5R#QY25@+9_fL$mWOVuXu^07mj1Mbn(IQ5t9g^ xghvg$4*4J2L%2+so+LPlx{K|hKQ`bQ?6T3W8Pe=&r|Y58=nvN4H|;|L004ZylNkU2 literal 0 HcmV?d00001 diff --git a/test/unit/test_ngram/105.lm.gz b/test/unit/test_ngram/105.lm.gz new file mode 100644 index 0000000000000000000000000000000000000000..06435f511d04e269f5b9a6e2dfe2b46e4d54e66d GIT binary patch literal 208 zcmV;>05AU^iwFp-5V2MO12Hf)E^KW8U5(2Q!XOkx*W9n*2hd(MPf8XLe?q=r9WDfgnwG(IG*x1y(+VQE67k7(1I3N45<94hc86Wx(=E}*QudZza zz_GT`9s$PA+ksnOfWQT! zGPz>uX|ldf6m^klBKXJdi6xPw!u-(I`SrI8N>Kw#-{*7(U+L&X@A)I~%)}oiA)2;+Ol0EI1#Bsb_X-7mbZW2x;Zh zUccS#766*oM%w^Py|*L7+N_hPk*}kydD_D=AHpj@$qyt+3xUP)C7hr%rZ|REk@QMy zL{d=V0a2Pt7CC9QzReW1;+hElV|T}bNRTo+dUO79_YZF2z1t!w1C7Fc~!LRZSjJ(%4dKqK~rQB+21m3y+@Et2HOw|?yY6;E>N#ggr&u6X}&p16`2IZo?oDMc3vl_yMO3SUjpY`%1~C-Lj!EajnWm0xJK0 z@hisJ4filJ9KJq3uD9~;t% +#include +#include + +#include "test_macros.h" + +#include +#include +#include + +void +run_tests(logmath_t *lmath, ngram_model_t *model) +{ + int32 score; + + ngram_model_add_word(model, "foobie", 1.0); + score = ngram_score(model, "foobie", NULL); + TEST_EQUAL_LOG(score, logmath_log(lmath, 1.0/401)); /* #unigrams */ + + ngram_model_add_word(model, "quux", 0.5); + score = ngram_score(model, "quux", NULL); + TEST_EQUAL_LOG(score, logmath_log(lmath, 0.5/402)); /* #unigrams */ +} + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + lmath = logmath_init(1.0001, 0, 0); + + model = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + run_tests(lmath, model); + ngram_model_free(model); + + model = ngram_model_read(NULL, LMDIR "/100.lm.gz", NGRAM_ARPA, lmath); + run_tests(lmath, model); + ngram_model_free(model); + + logmath_free(lmath); + return 0; +} diff --git a/test/unit/test_ngram/test_lm_casefold.c b/test/unit/test_ngram/test_lm_casefold.c new file mode 100755 index 000000000..8480b925b --- /dev/null +++ b/test/unit/test_ngram/test_lm_casefold.c @@ -0,0 +1,44 @@ +#include +#include +#include + +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + /* Initialize a logmath object to pass to ngram_read */ + lmath = logmath_init(1.0001, 0, 0); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + TEST_ASSERT(model); + + ngram_model_casefold(model, NGRAM_UPPER); + + TEST_EQUAL(0, strcmp("", ngram_word(model, 5))); + TEST_EQUAL(0, strcmp("BE", ngram_word(model, 42))); + TEST_EQUAL(0, strcmp("FLOORED", ngram_word(model, 130))); + TEST_EQUAL(0, strcmp("ZERO", ngram_word(model, 398))); + TEST_EQUAL(0, strcmp("~", ngram_word(model, 399))); + + ngram_model_casefold(model, NGRAM_LOWER); + + TEST_EQUAL(0, strcmp("", ngram_word(model, 5))); + TEST_EQUAL(0, strcmp("be", ngram_word(model, 42))); + TEST_EQUAL(0, strcmp("floored", ngram_word(model, 130))); + TEST_EQUAL(0, strcmp("zero", ngram_word(model, 398))); + TEST_EQUAL(0, strcmp("~", ngram_word(model, 399))); + + ngram_model_free(model); + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_ngram/test_lm_class.c b/test/unit/test_ngram/test_lm_class.c new file mode 100644 index 000000000..633ed5159 --- /dev/null +++ b/test/unit/test_ngram/test_lm_class.c @@ -0,0 +1,123 @@ +#include +#include +#include + +#include "test_macros.h" + +#include +#include +#include + +void +run_tests(logmath_t *lmath, ngram_model_t *model) +{ + int32 rv, i; + + TEST_ASSERT(model); + + TEST_EQUAL(ngram_wid(model, "scylla"), 285); + TEST_EQUAL(strcmp(ngram_word(model, 285), "scylla"), 0); + + rv = ngram_model_read_classdef(model, LMDIR "/100.probdef"); + TEST_EQUAL(rv, 0); + + /* Verify that class word IDs remain the same. */ + TEST_EQUAL(ngram_wid(model, "scylla"), 285); + TEST_EQUAL(strcmp(ngram_word(model, 285), "scylla"), 0); + + /* Verify in-class word IDs. */ + TEST_EQUAL(ngram_wid(model, "scylla:scylla"), 0x80000000 | 400); + + /* Verify in-class and out-class unigram scores. */ + TEST_EQUAL_LOG(ngram_score(model, "scylla:scylla", NULL), + logmath_log10_to_log(lmath, -2.7884) + logmath_log(lmath, 0.4)); + TEST_EQUAL_LOG(ngram_score(model, "scooby:scylla", NULL), + logmath_log10_to_log(lmath, -2.7884) + logmath_log(lmath, 0.1)); + TEST_EQUAL_LOG(ngram_score(model, "scylla", NULL), + logmath_log10_to_log(lmath, -2.7884)); + TEST_EQUAL_LOG(ngram_score(model, "oh:zero", NULL), + logmath_log10_to_log(lmath, -1.9038) + logmath_log(lmath, 0.7)); + TEST_EQUAL_LOG(ngram_score(model, "zero", NULL), + logmath_log10_to_log(lmath, -1.9038)); + + /* Verify class bigram scores. */ + TEST_EQUAL_LOG(ngram_score(model, "scylla", "on", NULL), + logmath_log10_to_log(lmath, -1.2642)); + TEST_EQUAL_LOG(ngram_score(model, "scylla:scylla", "on", NULL), + logmath_log10_to_log(lmath, -1.2642) + logmath_log(lmath, 0.4)); + TEST_EQUAL_LOG(ngram_score(model, "apparently", "scylla", NULL), + logmath_log10_to_log(lmath, -0.5172)); + TEST_EQUAL_LOG(ngram_score(model, "apparently", "karybdis:scylla", NULL), + logmath_log10_to_log(lmath, -0.5172)); + TEST_EQUAL_LOG(ngram_score(model, "apparently", "scooby:scylla", NULL), + logmath_log10_to_log(lmath, -0.5172)); + + /* Verify class trigram scores. */ + TEST_EQUAL_LOG(ngram_score(model, "zero", "be", "will", NULL), + logmath_log10_to_log(lmath, -0.5725)); + TEST_EQUAL_LOG(ngram_score(model, "oh:zero", "be", "will", NULL), + logmath_log10_to_log(lmath, -0.5725) + logmath_log(lmath, 0.7)); + TEST_EQUAL_LOG(ngram_score(model, "should", "variance", "zero", NULL), + logmath_log10_to_log(lmath, -0.9404)); + TEST_EQUAL_LOG(ngram_score(model, "should", "variance", "zero:zero", NULL), + logmath_log10_to_log(lmath, -0.9404)); + + /* Add words to classes. */ + rv = ngram_model_add_class_word(model, "scylla", "scrappy:scylla", 1.0); + TEST_ASSERT(rv >= 0); + TEST_EQUAL(ngram_wid(model, "scrappy:scylla"), 0x80000196); + TEST_EQUAL_LOG(ngram_score(model, "scrappy:scylla", NULL), + logmath_log10_to_log(lmath, -2.7884) + logmath_log(lmath, 0.2)); + printf("scrappy:scylla %08x %d %f\n", + ngram_wid(model, "scrappy:scylla"), + ngram_score(model, "scrappy:scylla", NULL), + logmath_exp(lmath, ngram_score(model, "scrappy:scylla", NULL))); + /* Add a lot of words to a class. */ + for (i = 0; i < 129; ++i) { + char word[32]; + sprintf(word, "%d:scylla", i); + rv = ngram_model_add_class_word(model, "scylla", word, 1.0); + printf("%s %08x %d %f\n", word, + ngram_wid(model, word), + ngram_score(model, word, NULL), + logmath_exp(lmath, ngram_score(model, word, NULL))); + TEST_ASSERT(rv >= 0); + TEST_EQUAL(ngram_wid(model, word), 0x80000197 + i); + } + + /* Add a new class. */ + { + char *words[] = { "blatz:foobie", "hurf:foobie" }; + float32 weights[] = { 0.6, 0.4 }; + int32 foobie_prob; + rv = ngram_model_add_class(model, "[foobie]", 1.0, + words, weights, 2); + TEST_ASSERT(rv >= 0); + foobie_prob = ngram_score(model, "[foobie]", NULL); + TEST_EQUAL_LOG(ngram_score(model, "blatz:foobie", NULL), + foobie_prob + logmath_log(lmath, 0.6)); + TEST_EQUAL_LOG(ngram_score(model, "hurf:foobie", NULL), + foobie_prob + logmath_log(lmath, 0.4)); + } +} + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + lmath = logmath_init(1.0001, 0, 0); + + model = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + run_tests(lmath, model); + ngram_model_free(model); + + model = ngram_model_read(NULL, LMDIR "/100.lm.gz", NGRAM_ARPA, lmath); + run_tests(lmath, model); + ngram_model_free(model); + + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_ngram/test_lm_read.c b/test/unit/test_ngram/test_lm_read.c new file mode 100644 index 000000000..e8de5120d --- /dev/null +++ b/test/unit/test_ngram/test_lm_read.c @@ -0,0 +1,103 @@ +#include +#include +#include + +#include "test_macros.h" + +#include +#include +#include +#include + +static int +test_lm_vals(ngram_model_t *model) +{ + int32 n_used; + TEST_ASSERT(model); + TEST_EQUAL(ngram_wid(model, ""), 0); + TEST_EQUAL(strcmp(ngram_word(model, 0), ""), 0); + TEST_EQUAL(ngram_wid(model, "absolute"), 13); + TEST_EQUAL(strcmp(ngram_word(model, 13), "absolute"), 0); + /* Test unigrams. */ + TEST_EQUAL(ngram_score(model, "", NULL), -75346); + TEST_EQUAL(ngram_bg_score(model, ngram_wid(model, ""), + NGRAM_INVALID_WID, &n_used), -75346); + TEST_EQUAL(n_used, 1); + TEST_EQUAL(ngram_score(model, "sphinxtrain", NULL), -64208); + TEST_EQUAL(ngram_bg_score(model, ngram_wid(model, "sphinxtrain"), + NGRAM_INVALID_WID, &n_used), -64208); + TEST_EQUAL(n_used, 1); + /* Test bigrams. */ + TEST_EQUAL(ngram_score(model, "huggins", "david", NULL), -831); + /* Test trigrams. */ + TEST_EQUAL_LOG(ngram_score(model, "daines", "huggins", "david", NULL), -9450); + return 0; +} + +static int +test_lm_ug_vals(ngram_model_t *model) +{ + TEST_ASSERT(model); + TEST_EQUAL(ngram_score(model, "BACKWARD", NULL), -53008); + return 0; +} + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + /* Initialize a logmath object to pass to ngram_read */ + lmath = logmath_init(1.0001, 0, 0); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/turtle.ug.lm", NGRAM_ARPA, lmath); + test_lm_ug_vals(model); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/turtle.ug.lm.dmp", NGRAM_BIN, lmath); + test_lm_ug_vals(model); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read a language model with missing backoffs */ + model = ngram_model_read(NULL, LMDIR "/104.lm.gz", NGRAM_ARPA, lmath); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read corrupted language model, error expected */ + model = ngram_model_read(NULL, LMDIR "/105.lm.gz", NGRAM_ARPA, lmath); + TEST_EQUAL(NULL, model); + + /* Read corrupted language model, error expected */ + model = ngram_model_read(NULL, LMDIR "/106.lm.gz", NGRAM_ARPA, lmath); + TEST_EQUAL(NULL, model); + + /* Read corrupted language model with wrong format line, error expected */ + model = ngram_model_read(NULL, LMDIR "/107.lm.gz", NGRAM_ARPA, lmath); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/100.lm.bz2", NGRAM_ARPA, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/100.lm.bin", NGRAM_BIN, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + test_lm_vals(model); + /* Test refcounting. */ + model = ngram_model_retain(model); + TEST_EQUAL(1, ngram_model_free(model)); + TEST_EQUAL(ngram_score(model, "daines", "huggins", "david", NULL), -9452); + TEST_EQUAL(0, ngram_model_free(model)); + + + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_ngram/test_lm_score.c b/test/unit/test_ngram/test_lm_score.c new file mode 100644 index 000000000..ae70c2629 --- /dev/null +++ b/test/unit/test_ngram/test_lm_score.c @@ -0,0 +1,88 @@ +#include +#include +#include + +#include "test_macros.h" + +#include +#include +#include + +void +run_tests(ngram_model_t *model) +{ + int32 n_used; + + ngram_tg_score(model, + ngram_wid(model, "daines"), + ngram_wid(model, "huggins"), + ngram_wid(model, "huggins"), &n_used); + TEST_EQUAL(n_used, 2); + ngram_tg_score(model, + ngram_wid(model, "david"), + ngram_wid(model, "david"), + ngram_wid(model, "david"), &n_used); + TEST_EQUAL(n_used, 1); + + /* Apply weights. */ + ngram_model_apply_weights(model, 7.5, 0.5); + /* -9452 * 7.5 + log(0.5) = -77821 */ + TEST_EQUAL_LOG(ngram_score(model, "daines", "huggins", "david", NULL), + -77821); + /* Recover original score. */ + TEST_EQUAL_LOG(ngram_probv(model, "daines", "huggins", "david", NULL), + -9452); + TEST_EQUAL_LOG(ngram_probv(model, "huggins", "david", NULL), -831); + + /* Un-apply weights. */ + ngram_model_apply_weights(model, 1.0, 1.0); + TEST_EQUAL_LOG(ngram_score(model, "daines", "huggins", "david", NULL), + -9452); + TEST_EQUAL_LOG(ngram_score(model, "huggins", "david", NULL), -831); + /* Recover original score. */ + TEST_EQUAL_LOG(ngram_probv(model, "daines", "huggins", "david", NULL), + -9452); + + /* Pre-weighting, this should give the "raw" score. */ + TEST_EQUAL_LOG(ngram_score(model, "daines", "huggins", "david", NULL), + -9452); + TEST_EQUAL_LOG(ngram_score(model, "huggins", "david", NULL), -831); + /* Verify that backoff mode calculations work. */ + ngram_bg_score(model, + ngram_wid(model, "huggins"), + ngram_wid(model, "david"), &n_used); + TEST_EQUAL(n_used, 2); + ngram_bg_score(model, + ngram_wid(model, "blorglehurfle"), + ngram_wid(model, "david"), &n_used); + TEST_EQUAL(n_used, 1); + ngram_bg_score(model, + ngram_wid(model, "david"), + ngram_wid(model, "david"), &n_used); + TEST_EQUAL(n_used, 1); + ngram_tg_score(model, + ngram_wid(model, "daines"), + ngram_wid(model, "huggins"), + ngram_wid(model, "david"), &n_used); + TEST_EQUAL(n_used, 3); +} + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + lmath = logmath_init(1.0001, 0, 0); + + model = ngram_model_read(NULL, LMDIR "/100.lm.bin", NGRAM_BIN, lmath); + run_tests(model); + ngram_model_free(model); + + model = ngram_model_read(NULL, LMDIR "/100.lm.gz", NGRAM_ARPA, lmath); + run_tests(model); + ngram_model_free(model); + + logmath_free(lmath); + return 0; +} diff --git a/test/unit/test_ngram/test_lm_set.c b/test/unit/test_ngram/test_lm_set.c new file mode 100644 index 000000000..4a8999808 --- /dev/null +++ b/test/unit/test_ngram/test_lm_set.c @@ -0,0 +1,197 @@ +#include +#include +#include + +#include "test_macros.h" + +#include +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *lms[3]; + ngram_model_t *lmset; + const char *names[] = { "100", "102" }; + const char *words[] = { + "", + "ROBOMAN", + "libio", + "sphinxtrain", + "bigbird", + "quuxfuzz" + }; + const int32 n_words = sizeof(words) / sizeof(words[0]); + float32 weights[] = { 0.6, 0.4 }; + + lmath = logmath_init(1.0001, 0, 0); + + lms[0] = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + lms[1] = ngram_model_read(NULL, LMDIR "/102.lm.dmp", NGRAM_BIN, lmath); + + lmset = ngram_model_set_init(NULL, lms, (char **)names, NULL, 2); + TEST_ASSERT(lmset); + TEST_EQUAL(ngram_model_set_select(lmset, "102"), lms[1]); + TEST_EQUAL(ngram_model_set_select(lmset, "100"), lms[0]); + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.7884)); + TEST_EQUAL(ngram_score(lmset, "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.0361)); + TEST_EQUAL_LOG(ngram_score(lmset, "daines", "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.4105)); + + TEST_EQUAL(ngram_model_set_select(lmset, "102"), lms[1]); + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.8192)); + TEST_EQUAL(ngram_score(lmset, "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.1597)); + TEST_EQUAL_LOG(ngram_score(lmset, "daines", "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.0512)); + + /* Test interpolation with default weights. */ + TEST_ASSERT(ngram_model_set_interp(lmset, NULL, NULL)); + TEST_EQUAL_LOG(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log(lmath, + 0.5 * pow(10, -2.7884) + + 0.5 * pow(10, -2.8192))); + + /* Test interpolation with set weights. */ + TEST_ASSERT(ngram_model_set_interp(lmset, names, weights)); + TEST_EQUAL_LOG(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log(lmath, + 0.6 * pow(10, -2.7884) + + 0.4 * pow(10, -2.8192))); + + /* Test switching back to selected mode. */ + TEST_EQUAL(ngram_model_set_select(lmset, "102"), lms[1]); + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.8192)); + TEST_EQUAL(ngram_score(lmset, "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.1597)); + TEST_EQUAL_LOG(ngram_score(lmset, "daines", "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.0512)); + + /* Test interpolation with previously set weights. */ + TEST_ASSERT(ngram_model_set_interp(lmset, NULL, NULL)); + TEST_EQUAL_LOG(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log(lmath, + 0.6 * pow(10, -2.7884) + + 0.4 * pow(10, -2.8192))); + + /* Test interpolation with closed-vocabulary models and OOVs. */ + lms[2] = ngram_model_read(NULL, LMDIR "/turtle.lm", NGRAM_ARPA, lmath); + TEST_ASSERT(ngram_model_set_add(lmset, lms[2], "turtle", 1.0, FALSE)); + TEST_EQUAL_LOG(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log(lmath, + 0.6 * (2.0 / 3.0) * pow(10, -2.7884) + + 0.4 * (2.0 / 3.0) * pow(10, -2.8192))); + ngram_model_free(lmset); + + /* Test adding and removing language models with preserved + * word ID mappings. */ + lms[0] = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + lms[1] = ngram_model_read(NULL, LMDIR "/102.lm.dmp", NGRAM_BIN, lmath); + lms[2] = ngram_model_read(NULL, LMDIR "/turtle.lm", NGRAM_ARPA, lmath); + lmset = ngram_model_set_init(NULL, lms, (char **)names, NULL, 1); + { + int32 wid; + wid = ngram_wid(lmset, "sphinxtrain"); + TEST_ASSERT(ngram_model_set_add(lmset, lms[1], "102", 1.0, TRUE)); + /* Verify that it is the same. */ + TEST_EQUAL(wid, ngram_wid(lmset, "sphinxtrain")); + /* Now add another model and verify that its words + * don't actually get added. */ + TEST_ASSERT(ngram_model_set_add(lmset, lms[2], "turtle", 1.0, TRUE)); + TEST_EQUAL(wid, ngram_wid(lmset, "sphinxtrain")); + TEST_EQUAL(ngram_unknown_wid(lmset), ngram_wid(lmset, "FORWARD")); + /* Remove language model, make sure this doesn't break horribly. */ + TEST_EQUAL(lms[1], ngram_model_set_remove(lmset, "102", TRUE)); + ngram_model_free(lms[1]); + TEST_EQUAL(wid, ngram_wid(lmset, "sphinxtrain")); + /* Now enable remapping of word IDs and verify that it works. */ + TEST_EQUAL(lms[2], ngram_model_set_remove(lmset, "turtle", TRUE)); + TEST_ASSERT(ngram_model_set_add(lmset, lms[2], "turtle", 1.0, FALSE)); + printf("FORWARD = %d\n", ngram_wid(lmset, "FORWARD")); + } + + ngram_model_free(lmset); + + /* Now test lmctl files. */ + lmset = ngram_model_set_read(NULL, LMDIR "/100.lmctl", lmath); + TEST_ASSERT(lmset); + /* Test iterators. */ + { + ngram_model_set_iter_t *itor; + char const *lmname; + + itor = ngram_model_set_iter(lmset); + TEST_ASSERT(itor); + ngram_model_set_iter_model(itor, &lmname); + printf("1: %s\n", lmname); + itor = ngram_model_set_iter_next(itor); + ngram_model_set_iter_model(itor, &lmname); + printf("2: %s\n", lmname); + itor = ngram_model_set_iter_next(itor); + ngram_model_set_iter_model(itor, &lmname); + printf("3: %s\n", lmname); + itor = ngram_model_set_iter_next(itor); + TEST_EQUAL(itor, NULL); + } + + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.7884)); + + TEST_ASSERT(ngram_model_set_interp(lmset, NULL, NULL)); + TEST_EQUAL_LOG(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log(lmath, + (1.0 / 3.0) * pow(10, -2.7884) + + (1.0 / 3.0) * pow(10, -2.8192))); + + ngram_model_set_select(lmset, "102"); + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.8192)); + TEST_EQUAL(ngram_score(lmset, "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.1597)); + TEST_EQUAL_LOG(ngram_score(lmset, "daines", "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.0512)); + + ngram_model_set_select(lmset, "100"); + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.7884)); + TEST_EQUAL(ngram_score(lmset, "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.0361)); + TEST_EQUAL_LOG(ngram_score(lmset, "daines", "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.4105)); + + /* Test class probabilities. */ + ngram_model_set_select(lmset, "100"); + TEST_EQUAL_LOG(ngram_score(lmset, "scylla:scylla", NULL), + logmath_log10_to_log(lmath, -2.7884) + logmath_log(lmath, 0.4)); + TEST_EQUAL_LOG(ngram_score(lmset, "scooby:scylla", NULL), + logmath_log10_to_log(lmath, -2.7884) + logmath_log(lmath, 0.1)); + TEST_EQUAL_LOG(ngram_score(lmset, "apparently", "karybdis:scylla", NULL), + logmath_log10_to_log(lmath, -0.5172)); + + /* Test word ID mapping. */ + ngram_model_set_select(lmset, "turtle"); + TEST_EQUAL(ngram_wid(lmset, "ROBOMAN"), + ngram_wid(lmset, ngram_word(lmset, ngram_wid(lmset, "ROBOMAN")))); + TEST_EQUAL(ngram_wid(lmset, "bigbird"), + ngram_wid(lmset, ngram_word(lmset, ngram_wid(lmset, "bigbird")))); + TEST_EQUAL(ngram_wid(lmset, "quuxfuzz"), ngram_unknown_wid(lmset)); + TEST_EQUAL(ngram_score(lmset, "quuxfuzz", NULL), ngram_zero(lmset)); + ngram_model_set_map_words(lmset, words, n_words); + TEST_EQUAL(ngram_wid(lmset, "ROBOMAN"), + ngram_wid(lmset, ngram_word(lmset, ngram_wid(lmset, "ROBOMAN")))); + TEST_EQUAL(ngram_wid(lmset, "bigbird"), + ngram_wid(lmset, ngram_word(lmset, ngram_wid(lmset, "bigbird")))); + TEST_EQUAL(ngram_wid(lmset, "quuxfuzz"), 5); + TEST_EQUAL(ngram_score(lmset, "quuxfuzz", NULL), ngram_zero(lmset)); + + ngram_model_free(lmset); + logmath_free(lmath); + return 0; +} diff --git a/test/unit/test_ngram/test_lm_write.c b/test/unit/test_ngram/test_lm_write.c new file mode 100644 index 000000000..0afe5ff6f --- /dev/null +++ b/test/unit/test_ngram/test_lm_write.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include + +#include "test_macros.h" + +#include +#include +#include + +static int +test_lm_vals(ngram_model_t *model) +{ + int32 n_used; + + TEST_ASSERT(model); + TEST_EQUAL(ngram_wid(model, ""), 0); + TEST_EQUAL(strcmp(ngram_word(model, 0), ""), 0); + TEST_EQUAL(ngram_wid(model, "absolute"), 13); + TEST_EQUAL(strcmp(ngram_word(model, 13), "absolute"), 0); + /* Test unigrams. */ + TEST_EQUAL_LOG(ngram_score(model, "", NULL), -75346); + TEST_EQUAL_LOG(ngram_bg_score(model, ngram_wid(model, ""), + NGRAM_INVALID_WID, &n_used), -75346); + TEST_EQUAL(n_used, 1); + TEST_EQUAL_LOG(ngram_score(model, "sphinxtrain", NULL), -64208); + TEST_EQUAL_LOG(ngram_bg_score(model, ngram_wid(model, "sphinxtrain"), + NGRAM_INVALID_WID, &n_used), -64208); + TEST_EQUAL(n_used, 1); + printf("FOO %d\n", ngram_score(model, "huggins", "david", NULL)); + printf("FOO %d\n", ngram_score(model, "daines", "huggins", "david", NULL)); + /* Test bigrams. */ + TEST_EQUAL_LOG(ngram_score(model, "huggins", "david", NULL), -831); + /* Test trigrams. */ + TEST_EQUAL_LOG(ngram_score(model, "daines", "huggins", "david", NULL), -9450); + return 0; +} + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + /* Initialize a logmath object to pass to ngram_read */ + lmath = logmath_init(1.0001, 0, 0); + + E_INFO("Converting ARPA to BIN\n"); + model = ngram_model_read(NULL, LMDIR "/100.lm.bz2", NGRAM_ARPA, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm.bin", NGRAM_BIN)); + ngram_model_free(model); + + E_INFO("Converting BIN to ARPA\n"); + model = ngram_model_read(NULL, LMDIR "/100.lm.bin", NGRAM_BIN, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm", NGRAM_ARPA)); + ngram_model_free(model); + + E_INFO("Testing converted BIN\n"); + model = ngram_model_read(NULL, "100.tmp.lm.bin", NGRAM_BIN, lmath); + test_lm_vals(model); + ngram_model_free(model); + + E_INFO("Testing converted ARPA\n"); + model = ngram_model_read(NULL, "100.tmp.lm", NGRAM_ARPA, lmath); + test_lm_vals(model); + ngram_model_free(model); + + E_INFO("Converting ARPA back to BIN\n"); + model = ngram_model_read(NULL, "100.tmp.lm", NGRAM_ARPA, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm.bin", NGRAM_BIN)); + ngram_model_free(model); + + E_INFO("Converting BIN back to ARPA\n"); + model = ngram_model_read(NULL, "100.tmp.lm.bin", NGRAM_BIN, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm", NGRAM_ARPA)); + ngram_model_free(model); + + E_INFO("Converting unigram ARPA to BIN\n"); + model = ngram_model_read(NULL, LMDIR "/turtle.ug.lm", NGRAM_ARPA, lmath); + TEST_EQUAL(0, ngram_model_write(model, "turtle.ug.tmp.lm.bin", NGRAM_BIN)); + ngram_model_free(model); + + logmath_free(lmath); + return 0; +} diff --git a/test/unit/test_ngram/test_macros.h b/test/unit/test_ngram/test_macros.h new file mode 100644 index 000000000..67b177bb2 --- /dev/null +++ b/test/unit/test_ngram/test_macros.h @@ -0,0 +1,11 @@ +#include +#include +#include + +#include "logmath.h" + +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define LOG_EPSILON 20 +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_ngram/turtle.lm b/test/unit/test_ngram/turtle.lm new file mode 100644 index 000000000..1cf3d7a0a --- /dev/null +++ b/test/unit/test_ngram/turtle.lm @@ -0,0 +1,498 @@ +Language model created by QuickLM on Wed Aug 4 14:21:56 EDT 1999 +Carnegie Mellon University (c) 1996 + +This model based on a corpus of sentences and words +The (fixed) discount mass is 0.5 + +\data\ +ngram 1=91 +ngram 2=212 +ngram 3=177 + +\1-grams: +-0.9129 -0.3010 +-0.9129 -0.2144 +-2.6031 A -0.2999 +-2.6031 AND -0.2989 +-2.3021 ARE -0.2978 +-2.6031 AROUND -0.2444 +-2.3021 BACKWARD -0.2338 +-2.9042 BACKWARDS -0.2444 +-2.6031 BYE -0.2432 +-2.9042 CENTIMETER -0.2444 +-2.9042 CENTIMETERS -0.2444 +-2.9042 CHASE -0.2989 +-2.9042 COLOR -0.2999 +-1.9499 DEGREES -0.2444 +-2.6031 DISPLAY -0.2999 +-2.9042 DO -0.2983 +-2.9042 DOING -0.2444 +-2.9042 EIGHT -0.2444 +-2.9042 EIGHTEEN -0.2444 +-2.4271 EIGHTY -0.2388 +-2.9042 ELEVEN -0.2444 +-2.9042 EXIT -0.2444 +-2.9042 EXPLORE -0.2444 +-2.6031 FIFTEEN -0.2388 +-2.9042 FIFTY -0.2444 +-2.9042 FIND -0.2989 +-2.9042 FINISH -0.2444 +-2.1260 FIVE -0.2338 +-2.3021 FORTY -0.2407 +-2.0011 FORWARD -0.2281 +-2.9042 FOUR -0.2444 +-2.9042 FOURTEEN -0.2444 +-1.7001 GO -0.2923 +-2.9042 GREY -0.2999 +-2.9042 GUARD -0.2989 +-2.4271 HALF -0.2420 +-2.9042 HALL -0.2444 +-2.9042 HALLWAY -0.2444 +-2.9042 HALT -0.2444 +-2.9042 HELLO -0.2444 +-2.9042 HOME -0.2444 +-2.6031 HUNDRED -0.2432 +-2.9042 KEVIN -0.2444 +-2.6031 LAB -0.2444 +-2.2052 LEFT -0.2338 +-2.9042 LISTENING -0.2444 +-2.9042 LOST -0.2444 +-2.3021 METER -0.2444 +-2.0011 METERS -0.2444 +-2.6031 MINUS -0.2983 +-2.9042 NINE -0.2444 +-2.9042 NINETEEN -0.2444 +-2.4271 NINETY -0.2388 +-2.9042 OFFICE -0.2444 +-2.0011 ONE -0.2351 +-2.9042 PERSON -0.2444 +-2.4271 QUARTER -0.2444 +-2.9042 QUARTERS -0.2444 +-2.9042 QUIT -0.2444 +-2.9042 READY -0.2444 +-2.9042 REID -0.2444 +-2.1260 RIGHT -0.2325 +-2.9042 ROBOMAN -0.2444 +-2.9042 ROOM -0.2444 +-2.0591 ROTATE -0.2950 +-2.6031 SAY -0.2994 +-2.9042 SEBASTIAN -0.2444 +-2.6031 SEVEN -0.2395 +-2.9042 SEVENTEEN -0.2444 +-2.9042 SEVENTY -0.2444 +-2.9042 SIX -0.2444 +-2.9042 SIXTEEN -0.2444 +-2.9042 SIXTY -0.2444 +-2.9042 STOP -0.2444 +-2.4271 TEN -0.2338 +-2.3021 THE -0.2432 +-2.9042 THEN -0.2444 +-2.9042 THIRTEEN -0.2444 +-2.6031 THIRTY -0.2388 +-2.3021 THREE -0.2370 +-2.6031 TO -0.2420 +-2.9042 TOM -0.2444 +-2.2052 TURN -0.2939 +-2.9042 TWELVE -0.2444 +-2.9042 TWENTY -0.2444 +-2.4271 TWO -0.2395 +-2.9042 UNDERSTAND -0.2444 +-2.9042 WANDER -0.2999 +-2.9042 WHAT -0.2989 +-2.6031 WINDOW -0.2444 +-2.2052 YOU -0.2967 + +\2-grams: +-2.2923 AND -0.1761 +-1.9912 ARE -0.0969 +-2.2923 CENTIMETER 0.0000 +-2.2923 CENTIMETERS 0.0000 +-2.2923 CHASE 0.0000 +-1.9912 DISPLAY 0.0000 +-2.2923 DO 0.0000 +-2.2923 EIGHT 0.0000 +-2.2923 EIGHTEEN 0.0000 +-2.2923 EIGHTY -0.2218 +-2.2923 ELEVEN 0.0000 +-2.2923 EXIT 0.0000 +-2.2923 EXPLORE 0.0000 +-2.2923 FIFTEEN -0.1761 +-2.2923 FIFTY 0.0000 +-2.2923 FIND 0.0000 +-2.2923 FINISH 0.0000 +-2.2923 FIVE -0.2218 +-1.9912 FORTY 0.0000 +-2.2923 FOUR 0.0000 +-2.2923 FOURTEEN 0.0000 +-1.0881 GO 0.0000 +-2.2923 GUARD 0.0000 +-2.2923 HALF -0.1249 +-2.2923 HALL 0.0000 +-2.2923 HALLWAY 0.0000 +-2.2923 HALT 0.0000 +-2.2923 HUNDRED -0.1761 +-2.2923 KEVIN 0.0000 +-2.2923 LAB 0.0000 +-2.2923 METER 0.0000 +-2.2923 METERS 0.0000 +-2.2923 NINE 0.0000 +-2.2923 NINETEEN 0.0000 +-2.2923 NINETY -0.2218 +-2.2923 OFFICE 0.0000 +-1.8151 ONE -0.1761 +-2.2923 PERSON 0.0000 +-2.2923 QUARTER 0.0000 +-2.2923 QUIT 0.0000 +-2.2923 REID 0.0000 +-2.2923 ROBOMAN 0.0000 +-2.2923 ROOM 0.0000 +-1.4472 ROTATE 0.0000 +-1.9912 SAY 0.0000 +-2.2923 SEBASTIAN 0.0000 +-2.2923 SEVEN -0.1761 +-2.2923 SEVENTEEN 0.0000 +-2.2923 SEVENTY 0.0000 +-2.2923 SIX 0.0000 +-2.2923 SIXTEEN 0.0000 +-2.2923 SIXTY 0.0000 +-2.2923 STOP 0.0000 +-2.2923 TEN -0.2218 +-2.2923 THIRTEEN 0.0000 +-2.2923 THIRTY -0.1761 +-1.8151 THREE -0.0969 +-2.2923 TOM 0.0000 +-1.5933 TURN 0.0000 +-2.2923 TWELVE 0.0000 +-2.2923 TWENTY 0.0000 +-2.2923 TWO -0.2218 +-2.2923 WANDER 0.0000 +-2.2923 WHAT 0.0000 +-2.2923 YOU -0.2553 +-0.6021 A COLOR 0.0000 +-0.6021 A GREY 0.0000 +-0.6021 AND EIGHTY -0.1249 +-0.6021 AND THEN 0.0000 +-0.9031 ARE LOST 0.0000 +-0.4260 ARE YOU -0.1461 +-0.3010 AROUND -0.3010 +-0.9031 BACKWARD -0.3010 +-0.9031 BACKWARD FIVE -0.2218 +-0.9031 BACKWARD ONE -0.2430 +-0.9031 BACKWARD TWO -0.1249 +-0.3010 BACKWARDS -0.3010 +-0.6021 BYE -0.3010 +-0.6021 BYE BYE -0.1761 +-0.3010 CENTIMETER -0.3010 +-0.3010 CENTIMETERS -0.3010 +-0.3010 CHASE THE -0.0969 +-0.3010 COLOR WINDOW 0.0000 +-0.3010 DEGREES -0.3010 +-0.3010 DISPLAY A 0.0000 +-0.3010 DO YOU -0.2553 +-0.3010 DOING -0.3010 +-0.3010 EIGHT -0.3010 +-0.3010 EIGHTEEN -0.3010 +-0.7782 EIGHTY -0.3010 +-0.4771 EIGHTY DEGREES 0.0000 +-0.3010 ELEVEN -0.3010 +-0.3010 EXIT -0.3010 +-0.3010 EXPLORE -0.3010 +-0.6021 FIFTEEN -0.3010 +-0.6021 FIFTEEN DEGREES 0.0000 +-0.3010 FIFTY -0.3010 +-0.3010 FIND THE -0.0969 +-0.3010 FINISH -0.3010 +-0.7782 FIVE -0.3010 +-0.7782 FIVE DEGREES 0.0000 +-0.7782 FIVE METERS 0.0000 +-0.9031 FORTY -0.3010 +-0.4260 FORTY FIVE -0.1249 +-1.2041 FORWARD -0.3010 +-1.2041 FORWARD FIVE -0.2218 +-0.9031 FORWARD ONE -0.1761 +-1.2041 FORWARD SEVEN -0.1761 +-1.2041 FORWARD TEN -0.2218 +-1.2041 FORWARD THREE -0.2430 +-1.2041 FORWARD TWO -0.1249 +-0.3010 FOUR -0.3010 +-0.3010 FOURTEEN -0.3010 +-0.9031 GO BACKWARD 0.0000 +-1.5051 GO BACKWARDS 0.0000 +-0.6021 GO FORWARD 0.0000 +-1.5051 GO HOME 0.0000 +-1.2041 GO TO 0.0000 +-0.3010 GREY WINDOW 0.0000 +-0.3010 GUARD THE -0.0969 +-0.4771 HALF -0.3010 +-0.7782 HALF METER 0.0000 +-0.3010 HALL -0.3010 +-0.3010 HALLWAY -0.3010 +-0.3010 HALT -0.3010 +-0.3010 HELLO -0.3010 +-0.3010 HOME -0.3010 +-0.6021 HUNDRED -0.3010 +-0.6021 HUNDRED AND -0.1761 +-0.3010 KEVIN -0.3010 +-0.3010 LAB -0.3010 +-1.0000 LEFT -0.3010 +-1.0000 LEFT FORTY -0.0969 +-1.0000 LEFT MINUS -0.1761 +-1.0000 LEFT NINETY -0.1249 +-1.0000 LEFT ONE -0.2730 +-0.3010 LISTENING -0.3010 +-0.3010 LOST -0.3010 +-0.3010 METER -0.3010 +-0.3010 METERS -0.3010 +-0.6021 MINUS NINETY -0.1249 +-0.6021 MINUS THIRTY -0.1761 +-0.3010 NINE -0.3010 +-0.3010 NINETEEN -0.3010 +-0.7782 NINETY -0.3010 +-0.4771 NINETY DEGREES 0.0000 +-0.3010 OFFICE -0.3010 +-1.2041 ONE -0.3010 +-1.2041 ONE EIGHTY -0.1249 +-0.9031 ONE HALF 0.0000 +-1.2041 ONE HUNDRED -0.1761 +-0.9031 ONE METER 0.0000 +-1.2041 ONE QUARTER 0.0000 +-0.3010 PERSON -0.3010 +-0.3010 QUARTER -0.3010 +-0.3010 QUARTERS -0.3010 +-0.3010 QUIT -0.3010 +-0.3010 READY -0.3010 +-0.3010 REID -0.3010 +-1.0792 RIGHT -0.3010 +-1.0792 RIGHT FIFTEEN -0.1761 +-1.0792 RIGHT FORTY -0.0969 +-1.0792 RIGHT MINUS -0.1761 +-1.0792 RIGHT ONE -0.2730 +-1.0792 RIGHT TEN -0.2218 +-0.3010 ROBOMAN -0.3010 +-0.3010 ROOM -0.3010 +-0.6690 ROTATE LEFT -0.1461 +-0.5441 ROTATE RIGHT -0.1249 +-0.6021 SAY BYE -0.1761 +-0.6021 SAY HELLO 0.0000 +-0.3010 SEBASTIAN -0.3010 +-0.6021 SEVEN -0.3010 +-0.6021 SEVEN METERS 0.0000 +-0.3010 SEVENTEEN -0.3010 +-0.3010 SEVENTY -0.3010 +-0.3010 SIX -0.3010 +-0.3010 SIXTEEN -0.3010 +-0.3010 SIXTY -0.3010 +-0.3010 STOP -0.3010 +-0.7782 TEN -0.3010 +-0.7782 TEN DEGREES 0.0000 +-0.7782 TEN METERS 0.0000 +-0.4260 THE -0.3010 +-0.9031 THE LAB 0.0000 +-0.3010 THEN -0.3010 +-0.3010 THIRTEEN -0.3010 +-0.6021 THIRTY -0.3010 +-0.6021 THIRTY DEGREES 0.0000 +-0.9031 THREE -0.3010 +-0.9031 THREE METERS 0.0000 +-0.9031 THREE QUARTER 0.0000 +-0.9031 THREE QUARTERS 0.0000 +-0.6021 TO -0.3010 +-0.6021 TO THE -0.2430 +-0.3010 TOM -0.3010 +-1.0000 TURN AROUND 0.0000 +-0.6990 TURN LEFT -0.2041 +-0.6990 TURN RIGHT -0.2218 +-0.3010 TWELVE -0.3010 +-0.3010 TWENTY -0.3010 +-0.7782 TWO -0.3010 +-0.4771 TWO METERS 0.0000 +-0.3010 UNDERSTAND -0.3010 +-0.3010 WANDER AROUND 0.0000 +-0.3010 WHAT ARE -0.0969 +-0.3010 WINDOW -0.3010 +-1.0000 YOU ARE -0.2430 +-1.0000 YOU DOING 0.0000 +-1.0000 YOU LISTENING 0.0000 +-1.0000 YOU READY 0.0000 +-1.0000 YOU UNDERSTAND 0.0000 + +\3-grams: +-0.3010 AND THEN +-0.3010 ARE YOU +-0.3010 CENTIMETER +-0.3010 CENTIMETERS +-0.3010 CHASE THE +-0.3010 DISPLAY A +-0.3010 DO YOU +-0.3010 EIGHT +-0.3010 EIGHTEEN +-0.3010 EIGHTY +-0.3010 ELEVEN +-0.3010 EXIT +-0.3010 EXPLORE +-0.3010 FIFTEEN +-0.3010 FIFTY +-0.3010 FIND THE +-0.3010 FINISH +-0.3010 FIVE +-0.6021 FORTY +-0.6021 FORTY FIVE +-0.3010 FOUR +-0.3010 FOURTEEN +-0.9031 GO BACKWARD +-1.5051 GO BACKWARDS +-0.6021 GO FORWARD +-1.5051 GO HOME +-1.2041 GO TO +-0.3010 GUARD THE +-0.3010 HALF +-0.3010 HALL +-0.3010 HALLWAY +-0.3010 HALT +-0.3010 HUNDRED +-0.3010 KEVIN +-0.3010 LAB +-0.3010 METER +-0.3010 METERS +-0.3010 NINE +-0.3010 NINETEEN +-0.3010 NINETY +-0.3010 OFFICE +-0.7782 ONE +-0.7782 ONE HALF +-0.7782 ONE QUARTER +-0.3010 PERSON +-0.3010 QUARTER +-0.3010 QUIT +-0.3010 REID +-0.3010 ROBOMAN +-0.3010 ROOM +-0.6690 ROTATE LEFT +-0.5441 ROTATE RIGHT +-0.6021 SAY BYE +-0.6021 SAY HELLO +-0.3010 SEBASTIAN +-0.3010 SEVEN +-0.3010 SEVENTEEN +-0.3010 SEVENTY +-0.3010 SIX +-0.3010 SIXTEEN +-0.3010 SIXTY +-0.3010 STOP +-0.3010 TEN +-0.3010 THIRTEEN +-0.3010 THIRTY +-0.7782 THREE +-0.7782 THREE QUARTER +-0.7782 THREE QUARTERS +-0.3010 TOM +-1.0000 TURN AROUND +-0.6990 TURN LEFT +-0.6990 TURN RIGHT +-0.3010 TWELVE +-0.3010 TWENTY +-0.3010 TWO +-0.3010 WANDER AROUND +-0.3010 WHAT ARE +-0.3010 YOU ARE +-0.3010 A COLOR WINDOW +-0.3010 A GREY WINDOW +-0.3010 AND EIGHTY DEGREES +-0.3010 AND THEN +-0.3010 ARE LOST +-0.7782 ARE YOU DOING +-0.7782 ARE YOU LISTENING +-0.7782 ARE YOU READY +-0.3010 BACKWARD FIVE METERS +-0.3010 BACKWARD ONE METER +-0.3010 BACKWARD TWO METERS +-0.3010 BYE BYE +-0.3010 CHASE THE +-0.3010 COLOR WINDOW +-0.6021 DISPLAY A COLOR +-0.6021 DISPLAY A GREY +-0.3010 DO YOU UNDERSTAND +-0.3010 EIGHTY DEGREES +-0.3010 FIFTEEN DEGREES +-0.3010 FIND THE +-0.3010 FIVE DEGREES +-0.3010 FIVE METERS +-0.7782 FORTY FIVE +-0.4771 FORTY FIVE DEGREES +-0.3010 FORWARD FIVE METERS +-0.6021 FORWARD ONE HALF +-0.6021 FORWARD ONE METER +-0.3010 FORWARD SEVEN METERS +-0.3010 FORWARD TEN METERS +-0.3010 FORWARD THREE METERS +-0.3010 FORWARD TWO METERS +-0.9031 GO BACKWARD +-0.9031 GO BACKWARD FIVE +-0.9031 GO BACKWARD ONE +-0.9031 GO BACKWARD TWO +-0.3010 GO BACKWARDS +-1.2041 GO FORWARD +-1.2041 GO FORWARD FIVE +-0.9031 GO FORWARD ONE +-1.2041 GO FORWARD SEVEN +-1.2041 GO FORWARD TEN +-1.2041 GO FORWARD THREE +-1.2041 GO FORWARD TWO +-0.3010 GO HOME +-0.6021 GO TO +-0.6021 GO TO THE +-0.3010 GREY WINDOW +-0.3010 GUARD THE +-0.3010 HALF METER +-0.3010 HUNDRED AND EIGHTY +-0.3010 LEFT FORTY FIVE +-0.3010 LEFT MINUS NINETY +-0.3010 LEFT NINETY DEGREES +-0.3010 LEFT ONE EIGHTY +-0.3010 MINUS NINETY DEGREES +-0.3010 MINUS THIRTY DEGREES +-0.3010 NINETY DEGREES +-0.3010 ONE EIGHTY DEGREES +-0.6021 ONE HALF +-0.6021 ONE HALF METER +-0.3010 ONE HUNDRED AND +-0.3010 ONE METER +-0.3010 ONE QUARTER +-0.3010 RIGHT FIFTEEN DEGREES +-0.3010 RIGHT FORTY FIVE +-0.3010 RIGHT MINUS THIRTY +-0.3010 RIGHT ONE HUNDRED +-0.3010 RIGHT TEN DEGREES +-0.7782 ROTATE LEFT FORTY +-0.7782 ROTATE LEFT MINUS +-0.7782 ROTATE LEFT ONE +-0.9031 ROTATE RIGHT FIFTEEN +-0.9031 ROTATE RIGHT MINUS +-0.9031 ROTATE RIGHT ONE +-0.9031 ROTATE RIGHT TEN +-0.3010 SAY BYE BYE +-0.3010 SAY HELLO +-0.3010 SEVEN METERS +-0.3010 TEN DEGREES +-0.3010 TEN METERS +-0.3010 THE LAB +-0.3010 THIRTY DEGREES +-0.3010 THREE METERS +-0.3010 THREE QUARTER +-0.3010 THREE QUARTERS +-0.3010 TO THE LAB +-0.3010 TURN AROUND +-0.6021 TURN LEFT +-0.6021 TURN LEFT NINETY +-0.6021 TURN RIGHT +-0.6021 TURN RIGHT FORTY +-0.3010 TWO METERS +-0.3010 WANDER AROUND +-0.3010 WHAT ARE YOU +-0.3010 YOU ARE LOST +-0.3010 YOU DOING +-0.3010 YOU LISTENING +-0.3010 YOU READY +-0.3010 YOU UNDERSTAND + +\end\ diff --git a/test/unit/test_ngram/turtle.lm.dmp b/test/unit/test_ngram/turtle.lm.dmp new file mode 100644 index 0000000000000000000000000000000000000000..cef559bb77ba1ea0ca132cade7e8dd28333ff34c GIT binary patch literal 6070 zcmb7|dvH|s6~})GBqTsccvxFOy@-#bLPCI|AfTJ%CRy0zhTRPzBElwYVC`mun+*tB zMYLkY2g>;1QMFa;qtr+3Oh-H3O&_CnY;FJWA3L3n|8%CEY5(Z7{iB_!_Vc}aFS)!# z7tTH3^ZT9O`JHoq=XdUfnZ}s5RDNg5O6D`$^QmDg)@3ecu(7decw}2T+msz{Dvad| z*|g6Zv%}^ye(TFWX}JW&7P}+bZM8>Zw$<*$yCO-e%}%t&qdm!}(`~Ltqcfe_md;zF zg?uKr-O8qO+Y39a`b@5{bV-Ai%54i~7#hruZIe4Hj6w3bGp`mr*-Cdp)|e_{gAb* zo2{{&SGc42ak74Nf|*=8+hDE^^hL$eXRa6+*|NK^L+o3(b2 zUb2de$%_it0=nV<{ ze*b2scw*jBSGX*Y4{q}0a^&VCSB~HL;1M?hp5)8f>Lac$>tyIy@9gn4d!BM_aD_kr zY3p8BZL89sZ_A9hY7|qTTmH0ST=Ow-6(sxF>OF23xH>ei?mIOk_kgGQvi4sOp6<)? zFAlDO5>Nc6DEkTU3@GqF39f~-|9fvg<@SQ>d|CP%z%xT~A9z+s-Uyxz9qXMt{=WkS zw;wzwG_Sns(gpF|1pZ1$-VDAFl0RC1Gx)2a`K{ou`Lg0mfiLo9`8NQb3k}p&jVqsn zV4b(}U$=LcI|SDIvvQUhpME&w?f~mG8Tc~-zBDB71Y6K2$3HG^eCcubR`7gC`pV}n zusW$^`Li3m08;!Pf4JMd4ScyjFaP#}uL#MvgRcz9cYv=7$=?FkhvYlK4Ny=IcY(hi zn!g*Yo~n86w;!yY{Mq~(FCX`S7ePV1_k$Zl@^`>Zkn*MV4}kSLR=y-31UHMYuljfp zyaWpDJq%Va3*<+@>WM);90GqMH2)ZQIVAft+@0=Wu=+}{{s{P5Nb9x#QSge;{4wy# zkbE3`T}b{ecvVP#8oU}(ecV1L=RN~o6PkYktdF8#{~v&FfY!Y~X?*q6C*2pp5lHd> zd+ibTWpE1==>HI`JFod~T|efY0IS&r^RI%{0|NOqaC=C89ju-Z%)bHd49PzRM?>

M zuZM#5zXZo2)mPo#C){6w6QTL{!0IW1{`+9{6#1+C{2HvD63l-9?(=2cuit<-`m*lV zZ^8YL{8c@C2)+^W_W$dX?(c;88T0NhL?0nfqGOlAC!2Eql+i!S7%Qi5icg|nich8w zmcuLPf08TdbK+CzZ{k(-wKBA->1UFs(#OQ7(Z9r})3>xw4gE^;4EmIKE&WNnj=rSz zGwDa#XBK@&<8$aY;ujc;=OnCM=E-yEBV~9qkN%c|P}E z{4(yZ_yX>&_~qPB@hiBO;#YDX<;PXrL&^2rzsaBm?w#a?+&A$>+$-@$?vHpA_e6X# z_d~pydr<*j!hKLY%eV&`UrznYuWP7#$=6cv;wz|g@s-rK_;u8^_$umId^L3}zt&Kn zlCP&OW#P&Jc^(7vquC#tF^&@#5bt4|5KFV0p#R*M8?j}>> z4(BZCnGP1SF=kmyuzza>8UEGc)SW;=E)jY zb(Z)#csX)Ee3JKtq4Ap-lYA31Q}Od=Uw_M4_%!slP+`;259YV}dSNaK ztoSB*sbO8#-)HzFuf)nEGmKX=;I~rI@-I&XO5Vds)WG-p`MJaQS8u@Sth|#7lz(~y zDsOjv0j@mU#TuPQpuf*wCtl0^K5keodD%xr>*n80CD-Ere&VcUr+a+;d(X+2VZXxM zOJ!-FZ~J=pg}Cy3AJOUDg7E{)E3XHrL*?rLH&*$%pPQ(>K0v&Z4|0Q)mj``&4}A$< zhlPjeOLf?Lh&bzr^I_tY{0Q;Y5#J%sua5J3)VHfQvhw>FonR&rJ;u$Pg@2DTrudG~ zIdpDEeLcN_mFHvBkH#fyz23xMlq)~SiBji#+^<8uxvLp}n!cty=*=yA&xE-4eTH?~ zSL3SNXIU@(XUUuR_vk$0-)CO>&rw%Xu>72F=XqkQW&U~Mos9=C5btdAp*Owu(;GhE z^7Ccv>l}meS6Hw6`wDAxzw`wl{S(Nw>~n(b%Kne&sN%2E`NUtNlZfk$uiqQ=p)z`a z-c%)82iN;5JQmEI&ZRpsR?b~5KPjtQPQjat8LNl);PI*Y;kD<(mDFh^xve~De`4R# z+J)@4nhaF2-&G+$PS-oTT(Z5ww_ia97n0A_P*}f$c=gs2_4}k-6X?{jei3vXr1zlS ziQ>V$_;h@m4{bPYd_t$vt4Xa}fL;?M9438T%!QUiy-;aw1!EQ7SSx%jfTc3V(oBPtc2i>iI?s0=P+9TLg z_O*}p4D4$^?I9l&g?_6Eb5+ym8nX(Dm`Hb@h#TG#bO;u9cYTKa9%YIi52 zU3SurhhW0Ac199RIx#11+U$}_^qV$^ztQdvV@EqWlclF^cb7oFv19fI zNgJcgZS28(L^U~1Jh1i!%p0Du-)m6BlO0-B^{1o`+n2WE9W~S zv35OT-lGq15R#_Tj>R0)>2%qqlVIa^n^|XXh<2M;q{YPS_N0kL6G^*UUdNn7(v%|h zo(a4yYysX5X z7N;xHZQ_p8#UmL>^5KWO3A-hdNJg1Scxm#U-i{@NMs%a7GzMoR>GT-9H_1+0BoHlS z#{>PyoRCR6{OvNy-Z&b4c8tuzy0MV#a}0SQf~3l#j|U<2bw-k=kHc{KOuy4>{txRw B0I2`~ literal 0 HcmV?d00001 diff --git a/test/unit/test_ngram/turtle.ug.lm b/test/unit/test_ngram/turtle.ug.lm new file mode 100644 index 000000000..77bb834e8 --- /dev/null +++ b/test/unit/test_ngram/turtle.ug.lm @@ -0,0 +1,98 @@ +This is an ARPA-format language model file, generated by CMU Sphinx +\data\ +ngram 1=91 + +\1-grams: +-0.9128 +-0.9128 +-2.6030 A +-2.6030 AND +-2.3020 ARE +-2.6030 AROUND +-2.3020 BACKWARD +-2.9042 BACKWARDS +-2.6030 BYE +-2.9042 CENTIMETER +-2.9042 CENTIMETERS +-2.9042 CHASE +-2.9042 COLOR +-1.9499 DEGREES +-2.6030 DISPLAY +-2.9042 DO +-2.9042 DOING +-2.9042 EIGHT +-2.9042 EIGHTEEN +-2.4271 EIGHTY +-2.9042 ELEVEN +-2.9042 EXIT +-2.9042 EXPLORE +-2.6030 FIFTEEN +-2.9042 FIFTY +-2.9042 FIND +-2.9042 FINISH +-2.1259 FIVE +-2.3020 FORTY +-2.0011 FORWARD +-2.9042 FOUR +-2.9042 FOURTEEN +-1.7000 GO +-2.9042 GREY +-2.9042 GUARD +-2.4271 HALF +-2.9042 HALL +-2.9042 HALLWAY +-2.9042 HALT +-2.9042 HELLO +-2.9042 HOME +-2.6030 HUNDRED +-2.9042 KEVIN +-2.6030 LAB +-2.2052 LEFT +-2.9042 LISTENING +-2.9042 LOST +-2.3020 METER +-2.0011 METERS +-2.6030 MINUS +-2.9042 NINE +-2.9042 NINETEEN +-2.4271 NINETY +-2.9042 OFFICE +-2.0011 ONE +-2.9042 PERSON +-2.4271 QUARTER +-2.9042 QUARTERS +-2.9042 QUIT +-2.9042 READY +-2.9042 REID +-2.1259 RIGHT +-2.9042 ROBOMAN +-2.9042 ROOM +-2.0590 ROTATE +-2.6030 SAY +-2.9042 SEBASTIAN +-2.6030 SEVEN +-2.9042 SEVENTEEN +-2.9042 SEVENTY +-2.9042 SIX +-2.9042 SIXTEEN +-2.9042 SIXTY +-2.9042 STOP +-2.4271 TEN +-2.3020 THE +-2.9042 THEN +-2.9042 THIRTEEN +-2.6030 THIRTY +-2.3020 THREE +-2.6030 TO +-2.9042 TOM +-2.2052 TURN +-2.9042 TWELVE +-2.9042 TWENTY +-2.4271 TWO +-2.9042 UNDERSTAND +-2.9042 WANDER +-2.9042 WHAT +-2.6030 WINDOW +-2.2052 YOU + +\end\ diff --git a/test/unit/test_ngram/turtle.ug.lm.dmp b/test/unit/test_ngram/turtle.ug.lm.dmp new file mode 100644 index 0000000000000000000000000000000000000000..d39a97d2786c5a5b9bb5ce4ff5e0542ee6541140 GIT binary patch literal 3685 zcmbtX-EQMl5FW8N+<;UqT!GMml~5wuv`tq0h<3q=Phx8wpI|#pL$!*W#K~InPw`Jz zi^O9fcnEj~xB_v_6++^Uhu{Li96N5~lcrWwD`$M>%*;36jK{9J2LQ4iUE0Ko++}3@ zMC-#I9wup&cupf-Hax!}_XqGFUU&}g;A+#Js*|p&QPO2bU$Tfy&5ofCES2f-8G0y= zJ$E7!Cy^U0iRT2%TVA5~7!6 z76yqMq|O}s{IV!9T;vqDVRhCjJtDQliG1um;w(w*e3d%E%pr)8Gmq=rV9YfbFI-Nh z%Sr6u`nud>Y}~?$c*hq}=##m#uv0HtwI0)Gtk;~hdlQr5`mzr1t;710q>;|T6r*c? z8Yg7xkSF|Uy&-x{Gq26_BtPFrfA0qEgJY5g**g$pdDmmf2g3~i5w=Qv-*WSkxxA09OK$#L`JYqwVOR>u~6QzXubW9~3i}O+Xux!-&(Hcr_-~w`Ze40 z$cr#4KC7!wOT15R=J@9GN)}<1&0`&o5l1S=mWKbhjj_Kbql!i`B*da*!Y0 zpYGDf-@X6yx?R-&G#~C{U;OpSo&KVISN->I|0&fY^4%3r^nWmXtHfWlSLyfV^TX?} zmhy}J|7{OS_9{Mu@Bb+EtIGer^;h9n^+&Y-{qAc!)mzms5xR(m;Rdx~ozPi{S@%dHZi+sg+(JtccI$t7R5wA)Y`H1=d{k-ujUx3%? zD*z{l@e??~C4r>NAQ==F8{)Ptb)JqS<7Q(*drYB2bxZA2iyCWN6FQ1yqLFFL0Gaj- zN==YebD&9MkQx3|y$4k7DON5i)$`35s7BAYcCMoBe1HfPx@yOK zG&6%AGb1C|WkUm%p^=637-0G_^oE?gB57SNv`mbU4JsBWRMQwJtWQC~Vht+8Q+lTA zph<1eXx9QwH7%-h)*3S{$ScmI34K)`nt(={i7YMGkQ3{6)eZ%QrU5lf{IBT?y^&AXFr#;D^H0*m3V57y8?j}g_dvv|`H!5T5ZzF-9wABzzREMcTb O7L4#=un~;e5dH^xq`RR2 literal 0 HcmV?d00001 diff --git a/test/unit/test_string/Makefile.am b/test/unit/test_string/Makefile.am new file mode 100644 index 000000000..ae3f3c6bd --- /dev/null +++ b/test/unit/test_string/Makefile.am @@ -0,0 +1,23 @@ +check_PROGRAMS = strtest test_atof + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include \ + -DTESTDATADIR=\"$(srcdir)\" + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la + +TESTS = _fread_line.test \ + _nextword.test \ + _str2words.test \ + _string_join.test \ + _string_trim.test \ + test_atof + +EXTRA_DIST = _fread_line.txt \ + _fread_line.test \ + _nextword.test \ + _str2words.test \ + _string_join.test \ + _string_trim.test diff --git a/test/unit/test_string/_fread_line.test b/test/unit/test_string/_fread_line.test new file mode 100755 index 000000000..dd3827e94 --- /dev/null +++ b/test/unit/test_string/_fread_line.test @@ -0,0 +1,2 @@ +#!/bin/sh +exec ./strtest fread_line diff --git a/test/unit/test_string/_fread_line.txt b/test/unit/test_string/_fread_line.txt new file mode 100644 index 000000000..e00c12982 --- /dev/null +++ b/test/unit/test_string/_fread_line.txt @@ -0,0 +1,3 @@ +Hello world! +123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 +All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. diff --git a/test/unit/test_string/_nextword.test b/test/unit/test_string/_nextword.test new file mode 100755 index 000000000..bccbf6df5 --- /dev/null +++ b/test/unit/test_string/_nextword.test @@ -0,0 +1,2 @@ +#!/bin/sh +exec ./strtest nextword diff --git a/test/unit/test_string/_str2words.test b/test/unit/test_string/_str2words.test new file mode 100755 index 000000000..49b35553d --- /dev/null +++ b/test/unit/test_string/_str2words.test @@ -0,0 +1,2 @@ +#!/bin/sh +exec ./strtest str2words diff --git a/test/unit/test_string/_string_join.test b/test/unit/test_string/_string_join.test new file mode 100755 index 000000000..cbdb6b6f9 --- /dev/null +++ b/test/unit/test_string/_string_join.test @@ -0,0 +1,2 @@ +#!/bin/sh +exec ./strtest string_join diff --git a/test/unit/test_string/_string_trim.test b/test/unit/test_string/_string_trim.test new file mode 100755 index 000000000..9ad5d9348 --- /dev/null +++ b/test/unit/test_string/_string_trim.test @@ -0,0 +1,2 @@ +#!/bin/sh +exec ./strtest string_trim diff --git a/test/unit/test_string/strtest.c b/test/unit/test_string/strtest.c new file mode 100644 index 000000000..bf71d6a43 --- /dev/null +++ b/test/unit/test_string/strtest.c @@ -0,0 +1,191 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +#include +#include + +#include "strfuncs.h" +#include "pio.h" +#include "ckd_alloc.h" + +int +main(int argc, char *argv[]) +{ + if (argc < 2) + return 1; + + if (!strcmp(argv[1], "string_join")) { + char *foo = string_join("bar", "baz", "quux", NULL); + if (strcmp(foo, "barbazquux") != 0) { + printf("%s != barbazquux\n", foo); + return 1; + } + foo = string_join("hello", NULL); + if (strcmp(foo, "hello") != 0) { + printf("%s != hello\n", foo); + return 1; + } + return 0; + } + else if (!strcmp(argv[1], "fread_line")) { + FILE *fp = fopen(TESTDATADIR "/_fread_line.txt", "r"); + char *line; + size_t len; + + if (fp == NULL) { + perror("Failed to open " TESTDATADIR "/_fread_line.txt"); + return 1; + } + line = fread_line(fp, &len); + printf("len = %zd orig = %zd\n", len, + strlen("Hello world!\n")); + if (strcmp(line, "Hello world!\n") != 0) { + printf("'%s' != 'Hello world!\\n'\n", line); + return 1; + } + ckd_free(line); + line = fread_line(fp, &len); + /* A line of exactly 127 characters. */ + printf("len = %zd orig = %zd\n", len, + strlen("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456\n")); + if (strcmp(line, "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456\n") != 0) { + printf("'%s' != '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456\\n'\n", line); + return 1; + } + ckd_free(line); + /* A very long line. */ + line = fread_line(fp, &len); + printf("len = %zd orig = %zd\n", len, + strlen("All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. \n")); + if (strcmp(line, "All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. \n") != 0) { + printf("'%s' != 'All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. \\n'\n", line); + return 1; + } + ckd_free(line); + line = fread_line(fp, &len); + if (line != NULL) { + printf("%p != NULL\n", line); + return 1; + } + } + else if (!strcmp(argv[1], "string_trim")) { + char *foo = ckd_salloc("\t foo bar baz \n"); + string_trim(foo, STRING_BOTH); + if (strcmp(foo, "foo bar baz") != 0) { + printf("'%s' != 'foo bar baz'\n", foo); + return 1; + } + string_trim(foo, STRING_BOTH); + if (strcmp(foo, "foo bar baz") != 0) { + printf("'%s' != 'foo bar baz'\n", foo); + return 1; + } + strcpy(foo, "foo\nbar\n\n"); + string_trim(foo, STRING_END); + if (strcmp(foo, "foo\nbar") != 0) { + printf("'%s' != 'foo\\nbar'\n", foo); + return 1; + } + strcpy(foo, " \t \t foobar\n"); + string_trim(foo, STRING_START); + if (strcmp(foo, "foobar\n") != 0) { + printf("'%s' != 'foobar\\n'\n", foo); + return 1; + } + } + else if (!strcmp(argv[1], "str2words")) { + char *line = ckd_salloc(" foo bar baz argh"); + char **words; + int n; + + n = str2words(line, NULL, 0); + if (n != 4) { + printf("%d != 4\n", n); + return 1; + } + words = ckd_calloc(n, sizeof(*words)); + n = str2words(line, words, n); + if (n != 4) { + printf("%d != 4\n", n); + return 1; + } + if (strcmp(words[0], "foo") != 0 + || strcmp(words[1], "bar") != 0 + || strcmp(words[2], "baz") != 0 + || strcmp(words[3], "argh") != 0) { + printf("%s, %s, %s, %s != foo, bar, baz, argh\n", + words[0], words[1], words[2], words[3]); + return 1; + } + return 0; + } + else if (!strcmp(argv[1], "nextword")) { + char *line = ckd_salloc(" \tfoo bar\nbaz argh"); + char *word; + const char *delim = " \t\n"; + char delimfound; + int n; + + n = nextword(line, delim, &word, &delimfound); + if (strcmp(word, "foo") != 0) { + printf("%s != foo\n", word); + return 1; + } + if (delimfound != ' ') { + printf("didn't find ' '\n"); + return 1; + } + word[n] = delimfound; + line = word + n; + n = nextword(line, delim, &word, &delimfound); + if (strcmp(word, "bar") != 0) { + printf("%s != bar\n", word); + return 1; + } + if (delimfound != '\n') { + printf("didn't find '\\n'\n"); + return 1; + } + word[n] = delimfound; + line = word + n; + n = nextword(line, delim, &word, &delimfound); + if (strcmp(word, "baz") != 0) { + printf("%s != baz\n", word); + return 1; + } + if (delimfound != ' ') { + printf("didn't find ' '\n"); + return 1; + } + word[n] = delimfound; + line = word + n; + n = nextword(line, delim, &word, &delimfound); + if (strcmp(word, "argh") != 0) { + printf("%s != argh\n", word); + return 1; + } + if (delimfound != '\0') { + printf("didn't find NUL\n"); + return 1; + } + word[n] = delimfound; + line = word + n; + n = nextword(line, delim, &word, &delimfound); + if (n != -1) { + printf("didn't get -1 at end of string\n"); + } + + line = ckd_salloc("FOO!"); + n = nextword(line, delim, &word, &delimfound); + if (strcmp(word, "FOO!") != 0) { + printf("%s != FOO!\n", word); + return 1; + } + if (delimfound != '\0') { + printf("didn't find NUL\n"); + return 1; + } + + return 0; + } + return 0; +} diff --git a/test/unit/test_string/test_atof.c b/test/unit/test_string/test_atof.c new file mode 100644 index 000000000..1cf110d2a --- /dev/null +++ b/test/unit/test_string/test_atof.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include + +#include "strfuncs.h" + +int +main(int argc, char *argv[]) +{ + double foo; + + /* Ensure that it's really locale-independent. */ + if (setlocale(LC_ALL, "fr_CA.UTF-8") == NULL) + fprintf(stderr, "Note: setlocale(LC_ALL, fr_CA.UTF-8) failed\n"); + + foo = atof("1.5324523524523423"); + printf("atof(): 1.5324523524523423 %f\n", foo); + + foo = atof_c("1.5324523524523423"); + printf("1.5324523524523423 %f\n", foo); + if (fabs(foo - 1.532) > 0.01) + return 1; + + foo = atof_c("5e-3"); + printf("5e-3 %f\n", foo); + if (fabs(foo - 0.005) > 0.01) + return 1; + + foo = atof_c("1.2e+2"); + printf("1.2e+2 %f\n", foo); + if (fabs(foo - 120.0) > 0.01) + return 1; + + foo = atof_c("1e-80"); + printf("1e-80 %g\n", foo); + + return 0; +} diff --git a/test/unit/test_thread/Makefile.am b/test/unit/test_thread/Makefile.am new file mode 100644 index 000000000..657e8387c --- /dev/null +++ b/test/unit/test_thread/Makefile.am @@ -0,0 +1,18 @@ +check_PROGRAMS = \ + test_thread \ + test_event \ + test_msgq + +TESTS = $(check_PROGRAMS) + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include \ + -DTESTDATADIR=\"$(top_srcdir)/test/regression\" + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la + +noinst_HEADERS = test_macros.h + +CLEANFILES = *.log diff --git a/test/unit/test_thread/test_event.c b/test/unit/test_thread/test_event.c new file mode 100644 index 000000000..a497d613a --- /dev/null +++ b/test/unit/test_thread/test_event.c @@ -0,0 +1,37 @@ +#include +#include +#include + +int +worker_main(sbthread_t *th) +{ + sbevent_t *cond; + + cond = sbthread_arg(th); + + /* Get the first signal. */ + sbevent_wait(cond, -1, -1); + E_INFO("Got signal\n"); + + /* Now wait a while and exit. */ + sbevent_wait(cond, 1, 500*1000*1000); + return 0; +} + +int +main(int argc, char *argv[]) +{ + sbthread_t *worker; + sbevent_t *cond; + + cond = sbevent_init(); + worker = sbthread_start(NULL, worker_main, cond); + + E_INFO("Signalling condition\n"); + sbevent_signal(cond); + + E_INFO("Waiting (about 1.5 sec) for thread termination\n"); + sbthread_free(worker); + sbevent_free(cond); + return 0; +} diff --git a/test/unit/test_thread/test_macros.h b/test/unit/test_thread/test_macros.h new file mode 100644 index 000000000..675d2e11a --- /dev/null +++ b/test/unit/test_thread/test_macros.h @@ -0,0 +1,10 @@ +#include +#include + +#include "logmath.h" + +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define LOG_EPSILON 20 +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_thread/test_msgq.c b/test/unit/test_thread/test_msgq.c new file mode 100644 index 000000000..c9f11eecd --- /dev/null +++ b/test/unit/test_thread/test_msgq.c @@ -0,0 +1,42 @@ +#include +#include +#include + +int +worker_main(sbthread_t *th) +{ + sbmsgq_t *msgq; + void *data; + size_t len; + + msgq = sbthread_msgq(th); + while ((data = sbmsgq_wait(msgq, &len, -1, -1)) != NULL) { + int msg = *(int *)data; + E_INFO("Got message: %d\n", msg); + if (msg == 32) + break; + } + + return 0; +} + +int +main(int argc, char *argv[]) +{ + sbthread_t *worker; + int i; + + worker = sbthread_start(NULL, worker_main, NULL); + for (i = 0; i <= 32; ++i) { + int ii[128]; + E_INFO("Sending message: %d\n", i); + ii[0] = i; + if (sbthread_send(worker, sizeof(ii), &ii) < 0) { + E_ERROR("sbthread_send failed\n"); + return 1; + } + } + sbthread_free(worker); + + return 0; +} diff --git a/test/unit/test_thread/test_thread.c b/test/unit/test_thread/test_thread.c new file mode 100644 index 000000000..956d554b2 --- /dev/null +++ b/test/unit/test_thread/test_thread.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include + +static const arg_t fe_args[] = { + waveform_to_cepstral_command_line_macro(), + { NULL, 0, NULL, NULL } +}; + +static int +process(sbthread_t *th) +{ + FILE *raw; + int16 *buf; + mfcc_t **cepbuf; + size_t nsamps; + fe_t *fe; + long fsize; + int32 nfr; + + if ((fe = fe_init_auto_r(sbthread_config(th))) == NULL) + return -1; + + if ((raw = fopen(TESTDATADIR "/chan3.raw", "rb")) == NULL) + return -1; + fseek(raw, 0, SEEK_END); + fsize = ftell(raw); + fseek(raw, 0, SEEK_SET); + buf = ckd_malloc(fsize); + fread(buf, 1, fsize, raw); + nsamps = fsize / 2; + + fe_process_utt(fe, buf, nsamps, &cepbuf, &nfr); + E_INFO("nfr = %d\n", nfr); + fe_free_2d(cepbuf); + ckd_free(buf); + fclose(raw); + fe_free(fe); + + return 0; +} + +int +main(int argc, char *argv[]) +{ + sbthread_t *threads[10]; + cmd_ln_t *config; + int i; + + E_INFO("Processing chan3.raw in 10 threads\n"); + if ((config = cmd_ln_parse_r(NULL, fe_args, 0, NULL, FALSE)) == NULL) + return -1; + for (i = 0; i < 10; ++i) { + config = cmd_ln_retain(config); + threads[i] = sbthread_start(config, process, NULL); + } + for (i = 0; i < 10; ++i) { + int rv; + rv = sbthread_wait(threads[i]); + E_INFO("Thread %d exited with status %d\n", i, rv); + sbthread_free(threads[i]); + } + cmd_ln_free_r(config); + return 0; +} diff --git a/test/unit/test_util/Makefile.am b/test/unit/test_util/Makefile.am new file mode 100644 index 000000000..56442e47c --- /dev/null +++ b/test/unit/test_util/Makefile.am @@ -0,0 +1,23 @@ +check_PROGRAMS = \ + test_fopen \ + test_bitarr \ + test_bit_encode \ + test_build_directory \ + test_heap \ + test_filename \ + test_readfile + +TESTS = $(check_PROGRAMS) + +AM_CFLAGS =\ + -I$(top_srcdir)/include/sphinxbase \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/include \ + -DTESTDATADIR=\"$(top_srcdir)/test/regression\" \ + -DLMDIR=\"${top_srcdir}/test/unit/test_ngram\" + +LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la + +noinst_HEADERS = test_macros.h + +CLEANFILES = *.log *.out diff --git a/test/unit/test_util/test_bit_encode.c b/test/unit/test_util/test_bit_encode.c new file mode 100644 index 000000000..5ead3f170 --- /dev/null +++ b/test/unit/test_util/test_bit_encode.c @@ -0,0 +1,51 @@ +/** + * @file test_bit_encode.c Test bitstream encoding + * @author David Huggins-Daines + */ + +#include "pio.h" +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + FILE *fh; + bit_encode_t *be; + int i; + static unsigned char const bits[] = "\xde\xad\xbe\xef"; + uint32 cw = 0xdeadbeef; + unsigned char inbits[16]; + + fh = fopen("bittest.out", "wb"); + be = bit_encode_attach(fh); + bit_encode_write(be, bits, 8); + bit_encode_write(be, bits + 1, 16); + bit_encode_write(be, bits + 3, 8); + bit_encode_write_cw(be, cw >> 24, 8); + bit_encode_write_cw(be, cw >> 16, 8); + bit_encode_write_cw(be, cw >> 8, 8); + bit_encode_write_cw(be, cw, 8); + bit_encode_write_cw(be, cw >> 26, 6); + bit_encode_write_cw(be, cw >> 14, 12); + bit_encode_write_cw(be, cw >> 8, 6); + bit_encode_write_cw(be, cw, 8); + for (i = 0; i < 32; ++i) { + bit_encode_write_cw(be, cw >> (31-i), 1); + } + bit_encode_flush(be); + bit_encode_free(be); + fclose(fh); + fh = fopen("bittest.out", "rb"); + i = fread(inbits, 1, 16, fh); + TEST_ASSERT(0 == memcmp(inbits, bits, 4)); + TEST_ASSERT(0 == memcmp(inbits + 4, bits, 4)); + TEST_ASSERT(0 == memcmp(inbits + 8, bits, 4)); + TEST_ASSERT(0 == memcmp(inbits + 12, bits, 4)); + fclose(fh); + + return 0; +} diff --git a/test/unit/test_util/test_bitarr.c b/test/unit/test_util/test_bitarr.c new file mode 100644 index 000000000..cfbf05e38 --- /dev/null +++ b/test/unit/test_util/test_bitarr.c @@ -0,0 +1,36 @@ +/** + * @file test_bitarr.c Test bit array io + */ + +#include "bitarr.h" +#include "test_macros.h" + +#include +#include +#include + +typedef union { + float f; + uint32 i; +} float_enc; + +int +main(int argc, char *argv[]) +{ + float_enc neg1 = { -1.0 }, pos1 = { 1.0 }; + uint64 test57 = 0x123456789abcdefULL; + char mem[57+8]; + bitarr_address_t address; + //sign bit should be 0x80000000 + TEST_EQUAL((neg1.i ^ pos1.i), 0x80000000); + memset(mem, 0, sizeof(mem)); + address.base = mem; + for (address.offset = 0; address.offset < 57 * 8; address.offset += 57) { + bitarr_write_int57(address, 57, test57); + } + for (address.offset = 0; address.offset < 57 * 8; address.offset += 57) { + TEST_EQUAL(test57, bitarr_read_int57(address, 57, ((1ULL << 57) - 1))); + } + // TODO: more checks. + return 0; +} diff --git a/test/unit/test_util/test_build_directory.c b/test/unit/test_util/test_build_directory.c new file mode 100644 index 000000000..5e7842799 --- /dev/null +++ b/test/unit/test_util/test_build_directory.c @@ -0,0 +1,26 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/** + * @file test_build_directory.c Test recursive directory creation + * @author David Huggins-Daines + */ + +#include "pio.h" +#include "test_macros.h" + +#include +#include + +int +main(int argc, char *argv[]) +{ + TEST_EQUAL(0, build_directory("foo/bar/baz")); + TEST_ASSERT(stat_mtime("foo/bar/baz") != -1); + TEST_EQUAL(0, build_directory("./quux/")); + TEST_ASSERT(stat_mtime("quux") != -1); + TEST_EQUAL(0, build_directory("./foo/bar/baz")); + TEST_ASSERT(stat_mtime("foo/bar/baz") != -1); + TEST_EQUAL(0, build_directory("/tmp/sphinxbase_foo_bar_baz")); + TEST_ASSERT(stat_mtime("/tmp/sphinxbase_foo_bar_baz") != -1); + + return 0; +} diff --git a/test/unit/test_util/test_filename.c b/test/unit/test_util/test_filename.c new file mode 100644 index 000000000..15ab025ad --- /dev/null +++ b/test/unit/test_util/test_filename.c @@ -0,0 +1,43 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/** + * @file test_filename.c Test file name operations + * @author David Huggins-Daines + */ + +#include "filename.h" +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ +#if defined(_WIN32) || defined(__CYGWIN__) + char const testname[] = "\\foo\\bar\\baz\\quux.argh"; + char const testname2[] = "foo\\bar\\baz"; + char const testname3[] = "\\foo"; + char const result1[] = "\\foo\\bar\\baz"; + char const result2[] = "foo\\bar"; +#else + char const testname[] = "/foo/bar/baz/quux.argh"; + char const testname2[] = "foo/bar/baz"; + char const testname3[] = "/foo"; + char const result1[] = "/foo/bar/baz"; + char const result2[] = "foo/bar"; +#endif + char testout[32]; + TEST_EQUAL(0, strcmp("quux.argh", path2basename(testname))); + + path2dirname(testname, testout); + TEST_EQUAL(0, strcmp(result1, testout)); + + path2dirname(testname2, testout); + TEST_EQUAL(0, strcmp(result2, testout)); + + path2dirname(testname3, testout); + TEST_EQUAL(0, strcmp(".", testout)); + + return 0; +} diff --git a/test/unit/test_util/test_fopen.c b/test/unit/test_util/test_fopen.c new file mode 100644 index 000000000..34c170fa0 --- /dev/null +++ b/test/unit/test_util/test_fopen.c @@ -0,0 +1,44 @@ +/** + * @file test_fopen.c Test file opening + * @author David Huggins-Daines + */ + +#include "pio.h" +#include "test_macros.h" + +#include +#include + +int +main(int argc, char *argv[]) +{ + FILE *fh; + char line[256], *c; + int ispipe; + + fh = fopen_comp(LMDIR "/100.lm.gz", "r", &ispipe); + TEST_ASSERT(fh != NULL); + c = fgets(line, sizeof(line), fh); + TEST_EQUAL('#', line[0]); + fclose_comp(fh, ispipe); + + fh = fopen_compchk(LMDIR "/100.lm.gz", &ispipe); + TEST_ASSERT(fh != NULL); + c = fgets(line, sizeof(line), fh); + TEST_EQUAL('#', line[0]); + fclose_comp(fh, ispipe); + + fh = fopen_compchk(LMDIR "/100.lm.bz2", &ispipe); + TEST_ASSERT(fh != NULL); + c = fgets(line, sizeof(line), fh); + TEST_EQUAL('#', line[0]); + fclose_comp(fh, ispipe); + + fh = fopen_compchk(LMDIR "/100.lm", &ispipe); + TEST_ASSERT(fh != NULL); + c = fgets(line, sizeof(line), fh); + TEST_EQUAL('#', line[0]); + fclose_comp(fh, ispipe); + + return 0; +} diff --git a/test/unit/test_util/test_heap.c b/test/unit/test_util/test_heap.c new file mode 100644 index 000000000..d3b0f8047 --- /dev/null +++ b/test/unit/test_util/test_heap.c @@ -0,0 +1,40 @@ +/** + * @file test_heap.c Test heaps + * @author David Huggins-Daines + */ + +#include "heap.h" +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + heap_t *heap; + int i; + + heap = heap_new(); + for (i = 0; i < 25; ++i) + heap_insert(heap, (void *)(long)i, i); + for (i = 0; i < 25; ++i) { + int32 val; + void *data; + TEST_EQUAL(1, heap_pop(heap, &data, &val)); + TEST_EQUAL(val, i); + TEST_EQUAL((int)(long)data, i); + TEST_EQUAL(heap_size(heap), 25 - i - 1); + } + for (i = 0; i < 25; ++i) + heap_insert(heap, (void *)(long)i, i); + TEST_EQUAL(0, heap_remove(heap, (void *)(long)10)); + TEST_EQUAL(-1, heap_remove(heap, (void *)(long)10)); + TEST_EQUAL(heap_size(heap), 24); + TEST_EQUAL(0, heap_remove(heap, (void *)(long)15)); + TEST_EQUAL(0, heap_remove(heap, (void *)(long)9)); + TEST_EQUAL(0, heap_remove(heap, (void *)(long)0)); + TEST_EQUAL(heap_size(heap), 21); + return 0; +} diff --git a/test/unit/test_util/test_macros.h b/test/unit/test_util/test_macros.h new file mode 100644 index 000000000..675d2e11a --- /dev/null +++ b/test/unit/test_util/test_macros.h @@ -0,0 +1,10 @@ +#include +#include + +#include "logmath.h" + +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define LOG_EPSILON 20 +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_util/test_readfile.c b/test/unit/test_util/test_readfile.c new file mode 100644 index 000000000..9b31c7ecd --- /dev/null +++ b/test/unit/test_util/test_readfile.c @@ -0,0 +1,27 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/** + * @file test_readfile.c: Test for the methods to read the file + * @author David Huggins-Daines + */ + +#include "ckd_alloc.h" +#include "bio.h" +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + size_t nsamps; + int16 *data; + + data = bio_read_wavfile(TESTDATADIR, "chan3", ".wav", 44, FALSE, &nsamps); + TEST_EQUAL(230108, nsamps); + + ckd_free(data); + + return 0; +} From 463bc1c4dcb9b363732c124a362184a250457374 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 18:02:33 -0400 Subject: [PATCH 03/94] build: remove visual studio projects --- pocketsphinx.sln | 56 ----- win32/pocketsphinx/pocketsphinx.vcxproj | 217 ------------------ .../pocketsphinx/pocketsphinx.vcxproj.filters | 74 ------ win32/pocketsphinx_batch/pocketsphinx.args | 6 - .../pocketsphinx_batch.vcxproj | 150 ------------ .../pocketsphinx_continuous/pocketsphinx.args | 3 - .../pocketsphinx_continuous.vcxproj | 150 ------------ .../pocketsphinx_mdef_convert.vcxproj | 98 -------- 8 files changed, 754 deletions(-) delete mode 100644 pocketsphinx.sln delete mode 100755 win32/pocketsphinx/pocketsphinx.vcxproj delete mode 100755 win32/pocketsphinx/pocketsphinx.vcxproj.filters delete mode 100755 win32/pocketsphinx_batch/pocketsphinx.args delete mode 100755 win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj delete mode 100755 win32/pocketsphinx_continuous/pocketsphinx.args delete mode 100755 win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj delete mode 100755 win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj diff --git a/pocketsphinx.sln b/pocketsphinx.sln deleted file mode 100644 index f14587837..000000000 --- a/pocketsphinx.sln +++ /dev/null @@ -1,56 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2012 for Windows Desktop -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx", "win32\pocketsphinx\pocketsphinx.vcxproj", "{94001A0E-A837-445C-8004-F918F10D0226}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx_continuous", "win32\pocketsphinx_continuous\pocketsphinx_continuous.vcxproj", "{1380AF76-C926-44D0-8002-06C228AC869A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx_batch", "win32\pocketsphinx_batch\pocketsphinx_batch.vcxproj", "{CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx_mdef_convert", "win32\pocketsphinx_mdef_convert\pocketsphinx_mdef_convert.vcxproj", "{4FB65800-11B8-46BD-95B8-6E4F73BDAD91}" -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 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.ActiveCfg = Debug|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.Build.0 = Debug|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.ActiveCfg = Debug|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.Build.0 = Debug|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.ActiveCfg = Release|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.Build.0 = Release|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.ActiveCfg = Release|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.Build.0 = Release|x64 - {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|Win32.ActiveCfg = Debug|Win32 - {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|Win32.Build.0 = Debug|Win32 - {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|x64.ActiveCfg = Debug|x64 - {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|x64.Build.0 = Debug|x64 - {1380AF76-C926-44D0-8002-06C228AC869A}.Release|Win32.ActiveCfg = Release|Win32 - {1380AF76-C926-44D0-8002-06C228AC869A}.Release|Win32.Build.0 = Release|Win32 - {1380AF76-C926-44D0-8002-06C228AC869A}.Release|x64.ActiveCfg = Release|x64 - {1380AF76-C926-44D0-8002-06C228AC869A}.Release|x64.Build.0 = Release|x64 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|Win32.ActiveCfg = Debug|Win32 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|Win32.Build.0 = Debug|Win32 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|x64.ActiveCfg = Debug|x64 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|x64.Build.0 = Debug|x64 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|Win32.ActiveCfg = Release|Win32 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|Win32.Build.0 = Release|Win32 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|x64.ActiveCfg = Release|x64 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|x64.Build.0 = Release|x64 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|Win32.ActiveCfg = Debug|Win32 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|Win32.Build.0 = Debug|Win32 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|x64.ActiveCfg = Debug|x64 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|x64.Build.0 = Debug|x64 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|Win32.ActiveCfg = Release|Win32 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|Win32.Build.0 = Release|Win32 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|x64.ActiveCfg = Release|x64 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/win32/pocketsphinx/pocketsphinx.vcxproj b/win32/pocketsphinx/pocketsphinx.vcxproj deleted file mode 100755 index 2c72cd34e..000000000 --- a/win32/pocketsphinx/pocketsphinx.vcxproj +++ /dev/null @@ -1,217 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - {94001A0E-A837-445C-8004-F918F10D0226} - pocketsphinx - - - - DynamicLibrary - false - MultiByte - v110 - - - - - - - - - Win32 - X64 - MachineX64 - MachineX86 - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - $(Configuration)\$(Platform)\ - false - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - $(TargetEnv) - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.tlb - - - - - MaxSpeed - OnlyExplicitInline - ../../include;../../src/libpocketsphinx;../../../sphinxbase/include;../../../sphinxbase/include/win32;%(AdditionalIncludeDirectories) - NDEBUG;_USRDLL;SPHINX_DLL;POCKETSPHINX_EXPORTS;HAVE_CONFIG_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - true - MultiThreadedDLL - true - .\$(Configuration)\$(Platform)/pocketsphinx.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;%(AdditionalDependencies) - ..\..\bin\$(Configuration)\$(Platform)\pocketsphinx.dll - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.pdb - false - - - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.lib - $(MachineArch) - - - true - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.bsc - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - $(TargetEnv) - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.tlb - - - - - Disabled - ../../include;../../src/libpocketsphinx;../../../sphinxbase/include;../../../sphinxbase/include/win32;%(AdditionalIncludeDirectories) - _DEBUG;_USRDLL;SPHINX_DLL;POCKETSPHINX_EXPORTS;HAVE_CONFIG_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - .\$(Configuration)\$(Platform)/pocketsphinx.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;%(AdditionalDependencies) - ../../bin/$(Configuration)/$(Platform)/pocketsphinx.dll - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - true - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.pdb - false - - - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.lib - $(MachineArch) - false - - - true - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.bsc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/win32/pocketsphinx/pocketsphinx.vcxproj.filters b/win32/pocketsphinx/pocketsphinx.vcxproj.filters deleted file mode 100755 index 26896a33a..000000000 --- a/win32/pocketsphinx/pocketsphinx.vcxproj.filters +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/pocketsphinx_batch/pocketsphinx.args b/win32/pocketsphinx_batch/pocketsphinx.args deleted file mode 100755 index d0800b0fc..000000000 --- a/win32/pocketsphinx_batch/pocketsphinx.args +++ /dev/null @@ -1,6 +0,0 @@ --hmm ../../model/en-us/en-us --lm ../../model/en-us/en-us.lm.bin --dict ../../model/en-us/cmudict-en-us.dict --ctl ../../test/data/wsj/test5k.s1.ctl --cepdir ../../test/data/wsj --backtrace yes \ No newline at end of file diff --git a/win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj b/win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj deleted file mode 100755 index b1a595e47..000000000 --- a/win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj +++ /dev/null @@ -1,150 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A} - pocketsphinx_batch - - - - Application - false - MultiByte - v110 - - - - - - - - - Win32 - X64 - MachineX64 - MachineX86 - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - $(Configuration)\$(Platform)\ - false - - - - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.tlb - - - - - MaxSpeed - OnlyExplicitInline - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) - true - MultiThreadedDLL - true - .\$(Configuration)\$(Platform)/pocketsphinx_batch.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;%(AdditionalDependencies) - ..\..\bin\$(Configuration)\$(Platform)\pocketsphinx_batch.exe - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.pdb - Console - false - - - $(MachineArch) - - - true - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.bsc - - - - - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.tlb - - - - - Disabled - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;HAVE_CONFIG_H;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - .\$(Configuration)\$(Platform)/pocketsphinx_batch.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;pocketsphinx.lib;%(AdditionalDependencies) - ../../bin/$(Configuration)/$(Platform)/pocketsphinx_batch.exe - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);..\..\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - true - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.pdb - Console - false - - - $(MachineArch) - false - - - true - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.bsc - - - - - - - - - - - {94001a0e-a837-445c-8004-f918f10d0226} - - - - - - \ No newline at end of file diff --git a/win32/pocketsphinx_continuous/pocketsphinx.args b/win32/pocketsphinx_continuous/pocketsphinx.args deleted file mode 100755 index 1bd955141..000000000 --- a/win32/pocketsphinx_continuous/pocketsphinx.args +++ /dev/null @@ -1,3 +0,0 @@ --hmm ../../model/en-us/en-us --lm ../../model/en-us/en-us.lm.bin --dict ../../model/en-us/cmudict-en-us.dict diff --git a/win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj b/win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj deleted file mode 100755 index 3c5cb3fa0..000000000 --- a/win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj +++ /dev/null @@ -1,150 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - - {1380AF76-C926-44D0-8002-06C228AC869A} - pocketsphinx_continuous - - - - Application - false - v110 - MultiByte - - - - - - - - - Win32 - X64 - MachineX64 - MachineX86 - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - $(Configuration)\$(Platform)\ - false - - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.tlb - - - - - Disabled - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;AD_BACKEND_WIN32;HAVE_CONFIG_H;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - .\$(Configuration)\$(Platform)/pocketsphinx_continuous.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;pocketsphinx.lib;%(AdditionalDependencies) - $(SolutionDir)\bin\$(Configuration)\$(Platform)\pocketsphinx_continuous.exe - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);..\..\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - true - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.pdb - Console - false - - - $(MachineArch) - false - - - true - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.bsc - - - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.tlb - - - - - MaxSpeed - OnlyExplicitInline - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;AD_BACKEND_WIN32;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) - true - MultiThreadedDLL - true - .\$(Configuration)\$(Platform)/pocketsphinx_continuous.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;%(AdditionalDependencies) - $(SolutionDir)\bin\$(Configuration)\$(Platform)\pocketsphinx_continuous.exe - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.pdb - Console - false - - - $(MachineArch) - - - true - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.bsc - - - - - - - - - - - {94001a0e-a837-445c-8004-f918f10d0226} - - - - - - \ No newline at end of file diff --git a/win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj b/win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj deleted file mode 100755 index 3a995c1c9..000000000 --- a/win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - - - - - - {94001a0e-a837-445c-8004-f918f10d0226} - - - - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91} - Win32Proj - pocketsphinx_mdef_convert - - - - Application - false - MultiByte - v110 - - - - - - - - - Win32 - X64 - MachineX64 - MachineX86 - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - $(Configuration)\$(Platform)\ - false - - - - - - Level3 - Disabled - _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - - - Console - true - sphinxbase.lib;pocketsphinx.lib;%(AdditionalDependencies) - $(SolutionDir)/bin/$(Configuration)/$(Platform)/pocketsphinx_mdef_convert.exe - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);..\..\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - false - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - - - Console - true - true - true - - - - - - \ No newline at end of file From 2dcc58028a00c020be04997ff479f86e8edd802c Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 18:02:52 -0400 Subject: [PATCH 04/94] build: remove m4 --- m4/ax_pkg_swig.m4 | 135 ------------------ m4/ax_python_devel.m4 | 324 ------------------------------------------ m4/pkg.m4 | 157 -------------------- 3 files changed, 616 deletions(-) delete mode 100644 m4/ax_pkg_swig.m4 delete mode 100644 m4/ax_python_devel.m4 delete mode 100644 m4/pkg.m4 diff --git a/m4/ax_pkg_swig.m4 b/m4/ax_pkg_swig.m4 deleted file mode 100644 index d836eec8f..000000000 --- a/m4/ax_pkg_swig.m4 +++ /dev/null @@ -1,135 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PKG_SWIG([major.minor.micro], [action-if-found], [action-if-not-found]) -# -# DESCRIPTION -# -# This macro searches for a SWIG installation on your system. If found, -# then SWIG is AC_SUBST'd; if not found, then $SWIG is empty. If SWIG is -# found, then SWIG_LIB is set to the SWIG library path, and AC_SUBST'd. -# -# You can use the optional first argument to check if the version of the -# available SWIG is greater than or equal to the value of the argument. It -# should have the format: N[.N[.N]] (N is a number between 0 and 999. Only -# the first N is mandatory.) If the version argument is given (e.g. -# 1.3.17), AX_PKG_SWIG checks that the swig package is this version number -# or higher. -# -# As usual, action-if-found is executed if SWIG is found, otherwise -# action-if-not-found is executed. -# -# In configure.in, use as: -# -# AX_PKG_SWIG(1.3.17, [], [ AC_MSG_ERROR([SWIG is required to build..]) ]) -# AX_SWIG_ENABLE_CXX -# AX_SWIG_MULTI_MODULE_SUPPORT -# AX_SWIG_PYTHON -# -# LICENSE -# -# Copyright (c) 2008 Sebastian Huber -# Copyright (c) 2008 Alan W. Irwin -# Copyright (c) 2008 Rafael Laboissiere -# Copyright (c) 2008 Andrew Collier -# Copyright (c) 2011 Murray Cumming -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 11 - -AC_DEFUN([AX_PKG_SWIG],[ - # Ubuntu has swig 2.0 as /usr/bin/swig2.0 - AC_PATH_PROGS([SWIG],[swig swig2.0]) - if test -z "$SWIG" ; then - m4_ifval([$3],[$3],[:]) - elif test -n "$1" ; then - AC_MSG_CHECKING([SWIG version]) - [swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`] - AC_MSG_RESULT([$swig_version]) - if test -n "$swig_version" ; then - # Calculate the required version number components - [required=$1] - [required_major=`echo $required | sed 's/[^0-9].*//'`] - if test -z "$required_major" ; then - [required_major=0] - fi - [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] - [required_minor=`echo $required | sed 's/[^0-9].*//'`] - if test -z "$required_minor" ; then - [required_minor=0] - fi - [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] - [required_patch=`echo $required | sed 's/[^0-9].*//'`] - if test -z "$required_patch" ; then - [required_patch=0] - fi - # Calculate the available version number components - [available=$swig_version] - [available_major=`echo $available | sed 's/[^0-9].*//'`] - if test -z "$available_major" ; then - [available_major=0] - fi - [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] - [available_minor=`echo $available | sed 's/[^0-9].*//'`] - if test -z "$available_minor" ; then - [available_minor=0] - fi - [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] - [available_patch=`echo $available | sed 's/[^0-9].*//'`] - if test -z "$available_patch" ; then - [available_patch=0] - fi - # Convert the version tuple into a single number for easier comparison. - # Using base 100 should be safe since SWIG internally uses BCD values - # to encode its version number. - required_swig_vernum=`expr $required_major \* 10000 \ - \+ $required_minor \* 100 \+ $required_patch` - available_swig_vernum=`expr $available_major \* 10000 \ - \+ $available_minor \* 100 \+ $available_patch` - - if test $available_swig_vernum -lt $required_swig_vernum; then - AC_MSG_WARN([SWIG version >= $1 is required. You have $swig_version.]) - SWIG='' - m4_ifval([$3],[$3],[]) - else - AC_MSG_CHECKING([for SWIG library]) - SWIG_LIB=`$SWIG -swiglib` - AC_MSG_RESULT([$SWIG_LIB]) - m4_ifval([$2],[$2],[]) - fi - else - AC_MSG_WARN([cannot determine SWIG version]) - SWIG='' - m4_ifval([$3],[$3],[]) - fi - fi - AC_SUBST([SWIG_LIB]) -]) diff --git a/m4/ax_python_devel.m4 b/m4/ax_python_devel.m4 deleted file mode 100644 index 59a2ff090..000000000 --- a/m4/ax_python_devel.m4 +++ /dev/null @@ -1,324 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_python_devel.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PYTHON_DEVEL([version]) -# -# DESCRIPTION -# -# Note: Defines as a precious variable "PYTHON_VERSION". Don't override it -# in your configure.ac. -# -# This macro checks for Python and tries to get the include path to -# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LDFLAGS) -# output variables. It also exports $(PYTHON_EXTRA_LIBS) and -# $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code. -# -# You can search for some particular version of Python by passing a -# parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please -# note that you *have* to pass also an operator along with the version to -# match, and pay special attention to the single quotes surrounding the -# version number. Don't use "PYTHON_VERSION" for this: that environment -# variable is declared as precious and thus reserved for the end-user. -# -# This macro should work for all versions of Python >= 2.1.0. As an end -# user, you can disable the check for the python version by setting the -# PYTHON_NOVERSIONCHECK environment variable to something else than the -# empty string. -# -# If you need to use this macro for an older Python version, please -# contact the authors. We're always open for feedback. -# -# LICENSE -# -# Copyright (c) 2009 Sebastian Huber -# Copyright (c) 2009 Alan W. Irwin -# Copyright (c) 2009 Rafael Laboissiere -# Copyright (c) 2009 Andrew Collier -# Copyright (c) 2009 Matteo Settenvini -# Copyright (c) 2009 Horst Knorr -# Copyright (c) 2013 Daniel Mullner -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 17 - -AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL]) -AC_DEFUN([AX_PYTHON_DEVEL],[ - # - # Allow the use of a (user set) custom python version - # - AC_ARG_VAR([PYTHON_VERSION],[The installed Python - version to use, for example '2.3'. This string - will be appended to the Python interpreter - canonical name.]) - - AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]]) - if test -z "$PYTHON"; then - AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path]) - PYTHON_VERSION="" - fi - - # - # Check for a version of Python >= 2.1.0 - # - AC_MSG_CHECKING([for a version of Python >= '2.1.0']) - ac_supports_python_ver=`$PYTHON -c "import sys; \ - ver = sys.version.split ()[[0]]; \ - print (ver >= '2.1.0')"` - if test "$ac_supports_python_ver" != "True"; then - if test -z "$PYTHON_NOVERSIONCHECK"; then - AC_MSG_RESULT([no]) - AC_MSG_FAILURE([ -This version of the AC@&t@_PYTHON_DEVEL macro -doesn't work properly with versions of Python before -2.1.0. You may need to re-run configure, setting the -variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG, -PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. -Moreover, to disable this check, set PYTHON_NOVERSIONCHECK -to something else than an empty string. -]) - else - AC_MSG_RESULT([skip at user request]) - fi - else - AC_MSG_RESULT([yes]) - fi - - # - # if the macro parameter ``version'' is set, honour it - # - if test -n "$1"; then - AC_MSG_CHECKING([for a version of Python $1]) - ac_supports_python_ver=`$PYTHON -c "import sys; \ - ver = sys.version.split ()[[0]]; \ - print (ver $1)"` - if test "$ac_supports_python_ver" = "True"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - AC_MSG_ERROR([this package requires Python $1. -If you have it installed, but it isn't the default Python -interpreter in your system path, please pass the PYTHON_VERSION -variable to configure. See ``configure --help'' for reference. -]) - PYTHON_VERSION="" - fi - fi - - # - # Check if you have distutils, else fail - # - AC_MSG_CHECKING([for the distutils Python package]) - ac_distutils_result=`$PYTHON -c "import distutils" 2>&1` - if test -z "$ac_distutils_result"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - AC_MSG_ERROR([cannot import Python module "distutils". -Please check your Python installation. The error was: -$ac_distutils_result]) - PYTHON_VERSION="" - fi - - # - # Check for Python include path - # - AC_MSG_CHECKING([for Python include path]) - if test -z "$PYTHON_CPPFLAGS"; then - python_path=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc ());"` - plat_python_path=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc (plat_specific=1));"` - if test -n "${python_path}"; then - if test "${plat_python_path}" != "${python_path}"; then - python_path="-I$python_path -I$plat_python_path" - else - python_path="-I$python_path" - fi - fi - PYTHON_CPPFLAGS=$python_path - fi - AC_MSG_RESULT([$PYTHON_CPPFLAGS]) - AC_SUBST([PYTHON_CPPFLAGS]) - - # - # Check for Python library path - # - AC_MSG_CHECKING([for Python library path]) - if test -z "$PYTHON_LDFLAGS"; then - # (makes two attempts to ensure we've got a version number - # from the interpreter) - ac_python_version=`cat<]], - [[Py_Initialize();]]) - ],[pythonexists=yes],[pythonexists=no]) - AC_LANG_POP([C]) - # turn back to default flags - CPPFLAGS="$ac_save_CPPFLAGS" - LIBS="$ac_save_LIBS" - - AC_MSG_RESULT([$pythonexists]) - - if test ! "x$pythonexists" = "xyes"; then - AC_MSG_FAILURE([ - Could not link test program to Python. Maybe the main Python library has been - installed in some non-standard library path. If so, pass it to configure, - via the LDFLAGS environment variable. - Example: ./configure LDFLAGS="-L/usr/non-standard-path/python/lib" - ============================================================================ - ERROR! - You probably have to install the development version of the Python package - for your distribution. The exact name of this package varies among them. - ============================================================================ - ]) - PYTHON_VERSION="" - fi - - # - # all done! - # -]) diff --git a/m4/pkg.m4 b/m4/pkg.m4 deleted file mode 100644 index 0048a3fa0..000000000 --- a/m4/pkg.m4 +++ /dev/null @@ -1,157 +0,0 @@ -# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# -# Copyright © 2004 Scott James Remnant . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -# ---------------------------------- -AC_DEFUN([PKG_PROG_PKG_CONFIG], -[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) -AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=m4_default([$1], [0.9.0]) - AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - PKG_CONFIG="" - fi - -fi[]dnl -])# PKG_PROG_PKG_CONFIG - -# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# Check to see whether a particular set of modules exists. Similar -# to PKG_CHECK_MODULES(), but does not set variables or print errors. -# -# -# Similar to PKG_CHECK_MODULES, make sure that the first instance of -# this or PKG_CHECK_MODULES is called, or make sure to call -# PKG_CHECK_EXISTS manually -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_EXISTS], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -if test -n "$PKG_CONFIG" && \ - AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then - m4_ifval([$2], [$2], [:]) -m4_ifvaln([$3], [else - $3])dnl -fi]) - - -# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -# --------------------------------------------- -m4_define([_PKG_CONFIG], -[if test -n "$PKG_CONFIG"; then - if test -n "$$1"; then - pkg_cv_[]$1="$$1" - else - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], - [pkg_failed=yes]) - fi -else - pkg_failed=untried -fi[]dnl -])# _PKG_CONFIG - -# _PKG_SHORT_ERRORS_SUPPORTED -# ----------------------------- -AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi[]dnl -])# _PKG_SHORT_ERRORS_SUPPORTED - - -# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# -# -# Note that if there is a possibility the first call to -# PKG_CHECK_MODULES might not happen, you should be sure to include an -# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -# -# -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl - -pkg_failed=no -AC_MSG_CHECKING([for $1]) - -_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -_PKG_CONFIG([$1][_LIBS], [libs], [$2]) - -m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -and $1[]_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details.]) - -if test $pkg_failed = yes; then - _PKG_SHORT_ERRORS_SUPPORTED - if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` - else - $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - fi - # Put the nasty error message in config.log where it belongs - echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - - ifelse([$4], , [AC_MSG_ERROR(dnl -[Package requirements ($2) were not met: - -$$1_PKG_ERRORS - -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. - -_PKG_TEXT -])], - [AC_MSG_RESULT([no]) - $4]) -elif test $pkg_failed = untried; then - ifelse([$4], , [AC_MSG_FAILURE(dnl -[The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. - -_PKG_TEXT - -To get pkg-config, see .])], - [$4]) -else - $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS - $1[]_LIBS=$pkg_cv_[]$1[]_LIBS - AC_MSG_RESULT([yes]) - ifelse([$3], , :, [$3]) -fi[]dnl -])# PKG_CHECK_MODULES From 49b6a01eb32a5ad5dc37314f36e6abc464deca59 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 18:03:47 -0400 Subject: [PATCH 05/94] begone, bad audio library --- src/libsphinxad/Makefile.am | 31 --- src/libsphinxad/ad_alsa.c | 344 ------------------------ src/libsphinxad/ad_base.c | 110 -------- src/libsphinxad/ad_openal.c | 128 --------- src/libsphinxad/ad_oss.c | 390 --------------------------- src/libsphinxad/ad_pulse.c | 162 ------------ src/libsphinxad/ad_win32.c | 506 ------------------------------------ 7 files changed, 1671 deletions(-) delete mode 100644 src/libsphinxad/Makefile.am delete mode 100644 src/libsphinxad/ad_alsa.c delete mode 100644 src/libsphinxad/ad_base.c delete mode 100644 src/libsphinxad/ad_openal.c delete mode 100644 src/libsphinxad/ad_oss.c delete mode 100644 src/libsphinxad/ad_pulse.c delete mode 100644 src/libsphinxad/ad_win32.c diff --git a/src/libsphinxad/Makefile.am b/src/libsphinxad/Makefile.am deleted file mode 100644 index 612126ef0..000000000 --- a/src/libsphinxad/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ - -# libsphinxad: Audio Device interface for Sphinx - -lib_LTLIBRARIES = libsphinxad.la - -# Confusing libtool version info means: -# -libsphinxad_la_LDFLAGS = -version-info 3:0:0 - -libsphinxad_la_SOURCES = - -EXTRA_libsphinxad_la_SOURCES = \ - ad_base.c \ - ad_oss.c \ - ad_alsa.c \ - ad_pulse.c \ - ad_openal.c \ - ad_win32.c - -libsphinxad_la_DEPENDENCIES = @ad_files@ - -libsphinxad_la_LIBADD = \ - @ad_files@ \ - @ad_libs@ \ - $(top_builddir)/src/libsphinxbase/libsphinxbase.la - -AM_CFLAGS =\ - @ad_cppflags@ \ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include diff --git a/src/libsphinxad/ad_alsa.c b/src/libsphinxad/ad_alsa.c deleted file mode 100644 index 6521cb196..000000000 --- a/src/libsphinxad/ad_alsa.c +++ /dev/null @@ -1,344 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 1999-2001 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ -/* -*- mode:c; indent-tabs-mode:t; c-basic-offset:4; comment-column:40 -*- - * - * Sphinx II libad (Linux) - * ^^^^^^^^^^^^^^^^^^^^^^^ - * $Id: ad_alsa.c,v 1.6 2001/12/11 00:24:48 lenzo Exp $ - * - * John G. Dorsey (jd5q+@andrew.cmu.edu) - * Engineering Design Research Center - * Carnegie Mellon University - * *************************************************************************** - * - * REVISION HISTORY - * - * 18-Mar-2006 David Huggins-Daines - * Update this to the ALSA 1.0 API. - * - * 12-Dec-2000 David Huggins-Daines at Cepstral LLC - * Make this at least compile with the new ALSA API. - * - * 05-Nov-1999 Sean Levy (snl@stalphonsos.com) at St. Alphonsos, LLC. - * Ported to ALSA so I can actually get working full-duplex. - * - * 09-Aug-1999 Kevin Lenzo (lenzo@cs.cmu.edu) at Cernegie Mellon University. - * Incorporated nickr@cs.cmu.edu's changes (marked below) and - * SPS_EPSILON to allow for sample rates that are "close enough". - * - * 15-Jun-1999 M. K. Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon Univ. - * Consolidated all ad functions into - * this one file. Added ad_open_sps(). - * Other cosmetic changes for consistency (e.g., use of err.h). - * - * 18-May-1999 Kevin Lenzo (lenzo@cs.cmu.edu) added . - */ - - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "prim_type.h" -#include "ad.h" - -#define AUDIO_FORMAT SND_PCM_SFMT_S16_LE /* 16-bit signed, little endian */ -#define INPUT_GAIN 85 -#define SPS_EPSILON 200 - -#define DEFAULT_DEVICE "default" - -struct ad_rec_s { - snd_pcm_t *dspH; - int32 recording; - int32 sps; - int32 bps; -}; - -static int -setparams(int32 sps, snd_pcm_t * handle) -{ - snd_pcm_hw_params_t *hwparams; - unsigned int out_sps, buffer_time, period_time; - int err; - - snd_pcm_hw_params_alloca(&hwparams); - err = snd_pcm_hw_params_any(handle, hwparams); - if (err < 0) { - fprintf(stderr, "Can not configure this PCM device: %s\n", - snd_strerror(err)); - return -1; - } - - err = - snd_pcm_hw_params_set_access(handle, hwparams, - SND_PCM_ACCESS_RW_INTERLEAVED); - if (err < 0) { - fprintf(stderr, - "Failed to set PCM device to interleaved: %s\n", - snd_strerror(err)); - return -1; - } - - err = - snd_pcm_hw_params_set_format(handle, hwparams, SND_PCM_FORMAT_S16); - if (err < 0) { - fprintf(stderr, - "Failed to set PCM device to 16-bit signed PCM: %s\n", - snd_strerror(err)); - return -1; - } - - err = snd_pcm_hw_params_set_channels(handle, hwparams, 1); - if (err < 0) { - fprintf(stderr, "Failed to set PCM device to mono: %s\n", - snd_strerror(err)); - return -1; - } - - out_sps = sps; - err = - snd_pcm_hw_params_set_rate_near(handle, hwparams, &out_sps, NULL); - if (err < 0) { - fprintf(stderr, "Failed to set sampling rate: %s\n", - snd_strerror(err)); - return -1; - } - if (abs(out_sps - sps) > SPS_EPSILON) { - fprintf(stderr, - "Available samping rate %d is too far from requested %d\n", - out_sps, sps); - return -1; - } - - /* Set buffer time to the maximum. */ - err = snd_pcm_hw_params_get_buffer_time_max(hwparams, &buffer_time, 0); - period_time = buffer_time / 4; - err = snd_pcm_hw_params_set_period_time_near(handle, hwparams, - &period_time, 0); - if (err < 0) { - fprintf(stderr, "Failed to set period time to %u: %s\n", - period_time, snd_strerror(err)); - return -1; - } - err = snd_pcm_hw_params_set_buffer_time_near(handle, hwparams, - &buffer_time, 0); - if (err < 0) { - fprintf(stderr, "Failed to set buffer time to %u: %s\n", - buffer_time, snd_strerror(err)); - return -1; - } - - err = snd_pcm_hw_params(handle, hwparams); - if (err < 0) { - fprintf(stderr, "Failed to set hwparams: %s\n", snd_strerror(err)); - return -1; - } - - err = snd_pcm_nonblock(handle, 1); - if (err < 0) { - fprintf(stderr, "Failed to set non-blocking mode: %s\n", - snd_strerror(err)); - return -1; - } - return 0; -} - -ad_rec_t * -ad_open_dev(const char *dev, int32 sps) -{ - ad_rec_t *handle; - snd_pcm_t *dspH; - - int err; - - if (dev == NULL) - dev = DEFAULT_DEVICE; - - err = snd_pcm_open(&dspH, dev, SND_PCM_STREAM_CAPTURE, 0); - if (err < 0) { - fprintf(stderr, - "Error opening audio device %s for capture: %s\n", - dev, snd_strerror(err)); - return NULL; - } - - if (setparams(sps, dspH) < 0) { - return NULL; - } - if ((handle = (ad_rec_t *) calloc(1, sizeof(ad_rec_t))) == NULL) { - fprintf(stderr, "calloc(%d) failed\n", (int)sizeof(ad_rec_t)); - abort(); - } - - handle->dspH = dspH; - handle->recording = 0; - handle->sps = sps; - handle->bps = sizeof(int16); - - return (handle); -} - -ad_rec_t * -ad_open_sps(int32 sps) -{ - return ad_open_dev(DEFAULT_DEVICE, sps); -} - -ad_rec_t * -ad_open(void) -{ - return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); -} - - -int32 -ad_close(ad_rec_t * handle) -{ - if (handle->dspH == NULL) - return AD_ERR_NOT_OPEN; - - if (handle->recording) { - if (ad_stop_rec(handle) < 0) - return AD_ERR_GEN; - } - snd_pcm_close(handle->dspH); - free(handle); - - return (0); -} - - -int32 -ad_start_rec(ad_rec_t * handle) -{ - int err; - - if (handle->dspH == NULL) - return AD_ERR_NOT_OPEN; - - if (handle->recording) - return AD_ERR_GEN; - - err = snd_pcm_prepare(handle->dspH); - if (err < 0) { - fprintf(stderr, "snd_pcm_prepare failed: %s\n", snd_strerror(err)); - return AD_ERR_GEN; - } - err = snd_pcm_start(handle->dspH); - if (err < 0) { - fprintf(stderr, "snd_pcm_start failed: %s\n", snd_strerror(err)); - return AD_ERR_GEN; - } - handle->recording = 1; - - return (0); -} - - -int32 -ad_stop_rec(ad_rec_t * handle) -{ - int err; - - if (handle->dspH == NULL) - return AD_ERR_NOT_OPEN; - - if (!handle->recording) - return AD_ERR_GEN; - - err = snd_pcm_drop(handle->dspH); - if (err < 0) { - fprintf(stderr, "snd_pcm_drop failed: %s\n", snd_strerror(err)); - return AD_ERR_GEN; - } - handle->recording = 0; - - return (0); -} - - -int32 -ad_read(ad_rec_t * handle, int16 * buf, int32 max) -{ - int32 length, err; - - if (!handle->recording) { - fprintf(stderr, "Recording is stopped, start recording with ad_start_rec\n"); - return AD_EOF; - } - - length = snd_pcm_readi(handle->dspH, buf, max); - if (length == -EAGAIN) { - length = 0; - } - else if (length == -EPIPE) { - fprintf(stderr, "Input overrun, read calls are too rare (non-fatal)\n"); - err = snd_pcm_prepare(handle->dspH); - if (err < 0) { - fprintf(stderr, "Can't recover from underrun: %s\n", - snd_strerror(err)); - return AD_ERR_GEN; - } - length = 0; - } - else if (length == -ESTRPIPE) { - fprintf(stderr, "Resuming sound driver (non-fatal)\n"); - while ((err = snd_pcm_resume(handle->dspH)) == -EAGAIN) - usleep(10000); /* Wait for the driver to wake up */ - if (err < 0) { - err = snd_pcm_prepare(handle->dspH); - if (err < 0) { - fprintf(stderr, "Can't recover from underrun: %s\n", - snd_strerror(err)); - return AD_ERR_GEN; - } - } - length = 0; - } - else if (length < 0) { - fprintf(stderr, "Audio read error: %s\n", - snd_strerror(length)); - return AD_ERR_GEN; - } - return length; -} diff --git a/src/libsphinxad/ad_base.c b/src/libsphinxad/ad_base.c deleted file mode 100644 index d248ccdbc..000000000 --- a/src/libsphinxad/ad_base.c +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 1999-2001 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ - -/* - * ad.c -- Wraps a "sphinx-II standard" audio interface around the basic audio - * utilities. - * - * HISTORY - * - * 11-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. - * Modified to conform to new A/D API. - * - * 12-May-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. - * Dummy template created. - */ - -#include -#include -#include - -#include "prim_type.h" -#include "ad.h" - -struct ad_rec_s { - int32 sps; /**< Samples/sec */ - int32 bps; /**< Bytes/sample */ -}; - -ad_rec_t * -ad_open_dev(const char *dev, int32 samples_per_sec) -{ - fprintf(stderr, "A/D library not implemented\n"); - return NULL; -} - - -ad_rec_t * -ad_open_sps(int32 samples_per_sec) -{ - fprintf(stderr, "A/D library not implemented\n"); - return NULL; -} - -ad_rec_t * -ad_open(void) -{ - return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); -} - - -int32 -ad_start_rec(ad_rec_t * r) -{ - return -1; -} - - -int32 -ad_stop_rec(ad_rec_t * r) -{ - return -1; -} - - -int32 -ad_read(ad_rec_t * r, int16 * buf, int32 max) -{ - return -1; -} - - -int32 -ad_close(ad_rec_t * r) -{ - return 0; -} diff --git a/src/libsphinxad/ad_openal.c b/src/libsphinxad/ad_openal.c deleted file mode 100644 index 18fe0425c..000000000 --- a/src/libsphinxad/ad_openal.c +++ /dev/null @@ -1,128 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 1999-2014 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ -#include -#include -#include - -#include "ad.h" - -#include -#include - -struct ad_rec_s { - ALCdevice * device; -}; - -ad_rec_t * -ad_open_dev(const char * dev, int32 samples_per_sec) -{ - ad_rec_t * handle = malloc(sizeof(ad_rec_t)); - - if (handle == NULL) { - fprintf(stderr, "%s\n", "failed to allocate memory"); - abort(); - } - - handle -> device = alcCaptureOpenDevice(dev, samples_per_sec, AL_FORMAT_MONO16, samples_per_sec * 10); - - if (handle -> device == NULL) { - free(handle); - fprintf(stderr, "%s\n", "failed to open capture device"); - abort(); - } - - return handle; -} - - -ad_rec_t * -ad_open_sps(int32 samples_per_sec) -{ - return ad_open_dev(NULL, samples_per_sec); -} - -ad_rec_t * -ad_open(void) -{ - return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); -} - - -int32 -ad_start_rec(ad_rec_t * r) -{ - alcCaptureStart(r -> device); - return 0; -} - - -int32 -ad_stop_rec(ad_rec_t * r) -{ - alcCaptureStop(r -> device); - return 0; -} - - -int32 -ad_read(ad_rec_t * r, int16 * buf, int32 max) -{ - ALCint number; - - alcGetIntegerv(r -> device, ALC_CAPTURE_SAMPLES, sizeof(number), &number); - if (number >= 0) { - number = (number < max ? number : max); - alcCaptureSamples(r -> device, buf, number); - } - - return number; -} - - -int32 -ad_close(ad_rec_t * r) -{ - ALCboolean isClosed; - - isClosed = alcCaptureCloseDevice(r -> device); - - if (isClosed) { - return 0; - } else { - return -1; - } -} diff --git a/src/libsphinxad/ad_oss.c b/src/libsphinxad/ad_oss.c deleted file mode 100644 index d3a936d97..000000000 --- a/src/libsphinxad/ad_oss.c +++ /dev/null @@ -1,390 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 1999-2001 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ -/* Sphinx II libad (Linux) - * ^^^^^^^^^^^^^^^^^^^^^^^ - * $Id: ad_oss.c,v 1.9 2004/07/16 00:57:12 egouvea Exp $ - * - * John G. Dorsey (jd5q+@andrew.cmu.edu) - * Engineering Design Research Center - * Carnegie Mellon University - * ******************************************************************** - * - * REVISION HISTORY - * - * 09-Aug-1999 Kevin Lenzo (lenzo@cs.cmu.edu) at Cernegie Mellon University. - * Incorporated nickr@cs.cmu.edu's changes (marked below) and - * SPS_EPSILON to allow for sample rates that are "close enough". - * - * 15-Jun-1999 M. K. Ravishankar (rkm@cs.cmu.edu) Consolidated all ad functions into - * this one file. Added ad_open_sps(). - * Other cosmetic changes for consistency (e.g., use of err.h). - * - * 18-May-1999 Kevin Lenzo (lenzo@cs.cmu.edu) added . - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "prim_type.h" -#include "ad.h" - -#define AUDIO_FORMAT AFMT_S16_LE /* 16-bit signed, little endian */ -#define INPUT_GAIN (80) - -#define SPS_EPSILON 200 -#define SAMPLERATE_TOLERANCE 0.01 - -#define DEFAULT_DEVICE "/dev/dsp" - -/** \struct ad_rec_t - * \brief Audio recording structure. - */ -struct ad_rec_s { - int32 dspFD; /* Audio device descriptor */ - int32 recording; - int32 sps; /* Samples/sec */ - int32 bps; /* Bytes/sample */ -}; - -ad_rec_t * -ad_open_dev(const char *dev, int32 sps) -{ - ad_rec_t *handle; - int32 dspFD, mixerFD; - int32 nonBlocking = 1, sourceMic = SOUND_MASK_MIC, inputGain = - INPUT_GAIN, devMask = 0; - int32 audioFormat = AUDIO_FORMAT; - int32 dspCaps = 0; - int32 sampleRate; - int32 numberChannels = 1; - - sampleRate = sps; - - if (dev == NULL) - dev = DEFAULT_DEVICE; - - /* Used to have O_NDELAY. */ - if ((dspFD = open(dev, O_RDONLY)) < 0) { - if (errno == EBUSY) - fprintf(stderr, "%s(%d): Audio device(%s) busy\n", - __FILE__, __LINE__, dev); - else - fprintf(stderr, - "%s(%d): Failed to open audio device(%s): %s\n", - __FILE__, __LINE__, dev, strerror(errno)); - return NULL; - } - - if (ioctl(dspFD, SNDCTL_DSP_SYNC, 0) < 0) { - fprintf(stderr, "Audio ioctl(SYNC) failed: %s\n", strerror(errno)); - close(dspFD); - return NULL; - } - - if (ioctl(dspFD, SNDCTL_DSP_RESET, 0) < 0) { - fprintf(stderr, "Audio ioctl(RESET) failed: %s\n", - strerror(errno)); - close(dspFD); - return NULL; - } - - if (ioctl(dspFD, SNDCTL_DSP_SETFMT, &audioFormat) < 0) { - fprintf(stderr, "Audio ioctl(SETFMT 0x%x) failed: %s\n", - audioFormat, strerror(errno)); - close(dspFD); - return NULL; - } - if (audioFormat != AUDIO_FORMAT) { - fprintf(stderr, - "Audio ioctl(SETFMT): 0x%x, expected: 0x%x\n", - audioFormat, AUDIO_FORMAT); - close(dspFD); - return NULL; - } - - if (ioctl(dspFD, SNDCTL_DSP_SPEED, &sampleRate) < 0) { - fprintf(stderr, "Audio ioctl(SPEED %d) failed %s\n", - sampleRate, strerror(errno)); - close(dspFD); - return NULL; - } - if (sampleRate != sps) { - if (abs(sampleRate - sps) <= (sampleRate * SAMPLERATE_TOLERANCE)) { - fprintf(stderr, - "Audio ioctl(SPEED) not perfect, but is acceptable. " - "(Wanted %d, but got %d)\n", sampleRate, sps); - } - else { - fprintf(stderr, - "Audio ioctl(SPEED): %d, expected: %d\n", - sampleRate, sps); - close(dspFD); - return NULL; - } - } - - if (ioctl(dspFD, SNDCTL_DSP_CHANNELS, &numberChannels) < 0) { - fprintf(stderr, "Audio ioctl(CHANNELS %d) failed %s\n", - numberChannels, strerror(errno)); - close(dspFD); - return NULL; - } - - if (ioctl(dspFD, SNDCTL_DSP_NONBLOCK, &nonBlocking) < 0) { - fprintf(stderr, "ioctl(NONBLOCK) failed: %s\n", strerror(errno)); - close(dspFD); - return NULL; - } - - if (ioctl(dspFD, SNDCTL_DSP_GETCAPS, &dspCaps) < 0) { - fprintf(stderr, "ioctl(GETCAPS) failed: %s\n", strerror(errno)); - close(dspFD); - return NULL; - } -#if 0 - printf("DSP Revision %d:\n", dspCaps & DSP_CAP_REVISION); - printf("DSP %s duplex capability.\n", - (dspCaps & DSP_CAP_DUPLEX) ? "has" : "does not have"); - printf("DSP %s real time capability.\n", - (dspCaps & DSP_CAP_REALTIME) ? "has" : "does not have"); - printf("DSP %s batch capability.\n", - (dspCaps & DSP_CAP_BATCH) ? "has" : "does not have"); - printf("DSP %s coprocessor capability.\n", - (dspCaps & DSP_CAP_COPROC) ? "has" : "does not have"); - printf("DSP %s trigger capability.\n", - (dspCaps & DSP_CAP_TRIGGER) ? "has" : "does not have"); - printf("DSP %s memory map capability.\n", - (dspCaps & DSP_CAP_MMAP) ? "has" : "does not have"); -#endif - - if ((dspCaps & DSP_CAP_DUPLEX) - && (ioctl(dspFD, SNDCTL_DSP_SETDUPLEX, 0) < 0)) - fprintf(stderr, "ioctl(SETDUPLEX) failed: %s\n", strerror(errno)); - - /* Patched by N. Roy (nickr@ri.cmu.edu), 99/7/23. - Previously, mixer was set through dspFD. This is incorrect. Should - be set through mixerFD, /dev/mixer. - Also, only the left channel volume was being set. - */ - - if ((mixerFD = open("/dev/mixer", O_RDONLY)) < 0) { - if (errno == EBUSY) { - fprintf(stderr, "%s %d: mixer device busy.\n", - __FILE__, __LINE__); - fprintf(stderr, "%s %d: Using current setting.\n", - __FILE__, __LINE__); - } - else { - fprintf(stderr, "%s %d: %s\n", __FILE__, __LINE__, - strerror(errno)); - exit(1); - } - } - - if (mixerFD >= 0) { - if (ioctl(mixerFD, SOUND_MIXER_WRITE_RECSRC, &sourceMic) < 0) { - if (errno == ENXIO) - fprintf(stderr, - "%s %d: can't set mic source for this device.\n", - __FILE__, __LINE__); - else { - fprintf(stderr, - "%s %d: mixer set to mic: %s\n", - __FILE__, __LINE__, strerror(errno)); - exit(1); - } - } - - /* Set the same gain for left and right channels. */ - inputGain = inputGain << 8 | inputGain; - - /* Some OSS devices have no input gain control, but do have a - recording level control. Find out if this is one of them and - adjust accordingly. */ - if (ioctl(mixerFD, SOUND_MIXER_READ_DEVMASK, &devMask) < 0) { - fprintf(stderr, - "%s %d: failed to read device mask: %s\n", - __FILE__, __LINE__, strerror(errno)); - exit(1); /* FIXME: not a well-behaved-library thing to do! */ - } - if (devMask & SOUND_MASK_IGAIN) { - if (ioctl(mixerFD, SOUND_MIXER_WRITE_IGAIN, &inputGain) < 0) { - fprintf(stderr, - "%s %d: mixer input gain to %d: %s\n", - __FILE__, __LINE__, inputGain, strerror(errno)); - exit(1); - } - } - else if (devMask & SOUND_MASK_RECLEV) { - if (ioctl(mixerFD, SOUND_MIXER_WRITE_RECLEV, &inputGain) < 0) { - fprintf(stderr, - "%s %d: mixer record level to %d: %s\n", - __FILE__, __LINE__, inputGain, strerror(errno)); - exit(1); - } - } - else { - fprintf(stderr, - "%s %d: can't set input gain/recording level for this device.\n", - __FILE__, __LINE__); - } - - close(mixerFD); - } - - if ((handle = (ad_rec_t *) calloc(1, sizeof(ad_rec_t))) == NULL) { - fprintf(stderr, "calloc(%ld) failed\n", sizeof(ad_rec_t)); - abort(); - } - - handle->dspFD = dspFD; - handle->recording = 0; - handle->sps = sps; - handle->bps = sizeof(int16); - - return (handle); -} - -ad_rec_t * -ad_open_sps(int32 sps) -{ - return ad_open_dev(DEFAULT_DEVICE, sps); -} - -ad_rec_t * -ad_open(void) -{ - return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); -} - -int32 -ad_close(ad_rec_t * handle) -{ - if (handle->dspFD < 0) - return AD_ERR_NOT_OPEN; - - if (handle->recording) { - if (ad_stop_rec(handle) < 0) - return AD_ERR_GEN; - } - - close(handle->dspFD); - free(handle); - - return (0); -} - -int32 -ad_start_rec(ad_rec_t * handle) -{ - if (handle->dspFD < 0) - return AD_ERR_NOT_OPEN; - - if (handle->recording) - return AD_ERR_GEN; - - /* Sample rate, format, input mix settings, &c. are configured - * with ioctl(2) calls under Linux. It makes more sense to handle - * these at device open time and consider the state of the device - * to be fixed until closed. - */ - - handle->recording = 1; - - /* rkm@cs: This doesn't actually do anything. How do we turn recording on/off? */ - - return (0); -} - -int32 -ad_stop_rec(ad_rec_t * handle) -{ - if (handle->dspFD < 0) - return AD_ERR_NOT_OPEN; - - if (!handle->recording) - return AD_ERR_GEN; - - if (ioctl(handle->dspFD, SNDCTL_DSP_SYNC, 0) < 0) { - fprintf(stderr, "Audio ioctl(SYNC) failed: %s\n", strerror(errno)); - return AD_ERR_GEN; - } - - handle->recording = 0; - - return (0); -} - -int32 -ad_read(ad_rec_t * handle, int16 * buf, int32 max) -{ - int32 length; - - length = max * handle->bps; /* #samples -> #bytes */ - - if ((length = read(handle->dspFD, buf, length)) > 0) { -#if 0 - if ((length % handle->bps) != 0) - fprintf(stderr, - "Audio read returned non-integral #sample bytes (%d)\n", - length); -#endif - length /= handle->bps; - } - - if (length < 0) { - if (errno != EAGAIN) { - fprintf(stderr, "Audio read error"); - return AD_ERR_GEN; - } - else { - length = 0; - } - } - - if ((length == 0) && (!handle->recording)) - return AD_EOF; - - return length; -} diff --git a/src/libsphinxad/ad_pulse.c b/src/libsphinxad/ad_pulse.c deleted file mode 100644 index 4be683fdd..000000000 --- a/src/libsphinxad/ad_pulse.c +++ /dev/null @@ -1,162 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 1999-2011 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ - -/* Input for Pulseaudio */ - -#include -#include -#include - -#include -#include - -#include "prim_type.h" -#include "ad.h" - -#define DEFAULT_DEVICE NULL - -struct ad_rec_s { - pa_simple* pa; - int32 recording; - int32 sps; - int32 bps; -}; - -ad_rec_t * -ad_open_dev(const char *dev, int32 samples_per_sec) -{ - ad_rec_t *handle; - pa_simple *pa; - pa_sample_spec ss; - int error; - - ss.format = PA_SAMPLE_S16LE; - ss.channels = 1; - ss.rate = samples_per_sec; - - pa = pa_simple_new(NULL, "ASR", PA_STREAM_RECORD, dev, "Speech", &ss, NULL, NULL, &error); - if (pa == NULL) { - fprintf(stderr, "Error opening audio device %s for capture: %s\n", dev, pa_strerror(error)); - return NULL; - } - - if ((handle = (ad_rec_t *) calloc(1, sizeof(ad_rec_t))) == NULL) { - fprintf(stderr, "Failed to allocate memory for ad device\n"); - return NULL; - } - - handle->pa = pa; - handle->recording = 0; - handle->sps = samples_per_sec; - handle->bps = sizeof(int16); - - return handle; -} - - -ad_rec_t * -ad_open_sps(int32 samples_per_sec) -{ - return ad_open_dev(DEFAULT_DEVICE, samples_per_sec); -} - -ad_rec_t * -ad_open(void) -{ - return ad_open_sps(DEFAULT_SAMPLES_PER_SEC); -} - - -int32 -ad_start_rec(ad_rec_t * r) -{ - if (r->recording) - return AD_ERR_GEN; - - r->recording = 1; - - return 0; -} - - -int32 -ad_stop_rec(ad_rec_t * r) -{ - if (!r->recording) - return AD_ERR_GEN; - - r->recording = 0; - - return 0; -} - - -int32 -ad_read(ad_rec_t * r, int16 * buf, int32 max) -{ - int error; - - if (!r->recording) - return AD_EOF; - - if (max > 2048) { - max = 2048; - } - - if (pa_simple_read(r->pa, (void*)buf, max * 2, &error) < 0) { - fprintf(stderr, "Failed to read speech: %s\n", pa_strerror(error)); - } - - return max; -} - - -int32 -ad_close(ad_rec_t * r) -{ - if (r->pa == NULL) - return AD_ERR_NOT_OPEN; - - if (r->recording) { - if (ad_stop_rec(r) < 0) - return AD_ERR_GEN; - } - pa_simple_free(r->pa); - free(r); - - return 0; -} diff --git a/src/libsphinxad/ad_win32.c b/src/libsphinxad/ad_win32.c deleted file mode 100644 index 42432608f..000000000 --- a/src/libsphinxad/ad_win32.c +++ /dev/null @@ -1,506 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 1999-2001 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ - -/* - * rec.c -- low level audio recording for Windows NT/95. - * - * HISTORY - * - * 19-Jan-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Added AD_ return codes. Added ad_open_sps_bufsize(), and - * ad_rec_t.n_buf. - * - * 07-Mar-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Added ad_open_sps(), and made ad_open() call it. - * - * 10-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Added ad_rec_t type to all calls. - * - * 03-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University - * Created. - */ - - -#include -#include -#include - -#include "sphinxbase/prim_type.h" -#include "sphinxbase/ad.h" - -#if defined (__CYGWIN__) -#include -#include -#elif (defined(_WIN32) && !defined(GNUWINCE)) || defined(_WIN32_WCE) -#include -#include -#endif - -typedef struct { - HGLOBAL h_whdr; - LPWAVEHDR p_whdr; - HGLOBAL h_buf; - LPSTR p_buf; -} ad_wbuf_t; - -/** - * Audio recording structure. - */ -struct ad_rec_s { - HWAVEIN h_wavein; /* "HANDLE" to the audio input device */ - ad_wbuf_t *wi_buf; /* Recording buffers provided to system */ - int32 n_buf; /* #Recording buffers provided to system */ - int32 opened; /* Flag; A/D opened for recording */ - int32 recording; - int32 curbuf; /* Current buffer with data for application */ - int32 curoff; /* Start of data for application in curbuf */ - int32 curlen; /* #samples of data from curoff in curbuf */ - int32 lastbuf; /* Last buffer containing data after recording stopped */ - int32 sps; /* Samples/sec */ - int32 bps; /* Bytes/sample */ -}; - -#define DEFAULT_N_WI_BUF 32 /* #Recording bufs */ -#define WI_BUFSIZE 2500 /* Samples/buf (Why this specific value?? - So that at reasonable sampling rates - data is returned frequently enough.) */ - -#ifdef _WIN32_WCE -#include "sphinxbase/ckd_alloc.h" -static void -wavein_error(char *src, int32 ret) -{ - TCHAR errbuf[512]; - wchar_t* werrbuf; - size_t len; - - waveOutGetErrorText(ret, errbuf, sizeof(errbuf)); - len = mbstowcs(NULL, errbuf, 0) + 1; - werrbuf = ckd_calloc(len, sizeof(*werrbuf)); - mbstowcs(werrbuf, errbuf, len); - - OutputDebugStringW(werrbuf); -} - -#else -static void -wavein_error(char *src, int32 ret) -{ - char errbuf[1024]; - - waveInGetErrorText(ret, errbuf, sizeof(errbuf)); - fprintf(stderr, "%s error %d: %s\n", src, ret, errbuf); -} -#endif - - -static void -wavein_free_buf(ad_wbuf_t * b) -{ - GlobalUnlock(b->h_whdr); - GlobalFree(b->h_whdr); - GlobalUnlock(b->h_buf); - GlobalFree(b->h_buf); -} - - -static int32 -wavein_alloc_buf(ad_wbuf_t * b, int32 samples_per_buf) -{ - HGLOBAL h_buf; /* handle to data buffer */ - LPSTR p_buf; /* pointer to data buffer */ - HGLOBAL h_whdr; /* handle to header */ - LPWAVEHDR p_whdr; /* pointer to header */ - - /* Allocate data buffer */ - h_buf = - GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, - samples_per_buf * sizeof(int16)); - if (!h_buf) { - fprintf(stderr, "GlobalAlloc failed\n"); - return -1; - } - if ((p_buf = GlobalLock(h_buf)) == NULL) { - GlobalFree(h_buf); - fprintf(stderr, "GlobalLock failed\n"); - return -1; - } - - /* Allocate WAVEHDR structure */ - h_whdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(WAVEHDR)); - if (h_whdr == NULL) { - GlobalUnlock(h_buf); - GlobalFree(h_buf); - - fprintf(stderr, "GlobalAlloc failed\n"); - return -1; - } - if ((p_whdr = GlobalLock(h_whdr)) == NULL) { - GlobalUnlock(h_buf); - GlobalFree(h_buf); - GlobalFree(h_whdr); - - fprintf(stderr, "GlobalLock failed\n"); - return -1; - } - - b->h_buf = h_buf; - b->p_buf = p_buf; - b->h_whdr = h_whdr; - b->p_whdr = p_whdr; - - p_whdr->lpData = p_buf; - p_whdr->dwBufferLength = samples_per_buf * sizeof(int16); - p_whdr->dwUser = 0L; - p_whdr->dwFlags = 0L; - p_whdr->dwLoops = 0L; - - return 0; -} - - -static int32 -wavein_enqueue_buf(HWAVEIN h, LPWAVEHDR whdr) -{ - int32 st; - - if ((st = waveInPrepareHeader(h, whdr, sizeof(WAVEHDR))) != 0) { - wavein_error("waveInPrepareHeader", st); - return -1; - } - if ((st = waveInAddBuffer(h, whdr, sizeof(WAVEHDR))) != 0) { - wavein_error("waveInAddBuffer", st); - return -1; - } - - return 0; -} - - -static HWAVEIN -wavein_open(int32 samples_per_sec, int32 bytes_per_sample, unsigned int device_id) -{ - WAVEFORMATEX wfmt; - int32 st; - HWAVEIN h; - - if (bytes_per_sample != sizeof(int16)) { - fprintf(stderr, "bytes/sample != %d\n", sizeof(int16)); - return NULL; - } - - wfmt.wFormatTag = WAVE_FORMAT_PCM; - wfmt.nChannels = 1; - wfmt.nSamplesPerSec = samples_per_sec; - wfmt.nAvgBytesPerSec = samples_per_sec * bytes_per_sample; - wfmt.nBlockAlign = bytes_per_sample; - wfmt.wBitsPerSample = 8 * bytes_per_sample; - - /* There should be a check here for a device of the desired type; later... */ - - st = waveInOpen((LPHWAVEIN) & h, device_id, - (LPWAVEFORMATEX) & wfmt, (DWORD) 0L, 0L, - (DWORD) CALLBACK_NULL); - if (st != 0) { - wavein_error("waveInOpen", st); - return NULL; - } - - return h; -} - - -static int32 -wavein_close(ad_rec_t * r) -{ - int32 i, st; - - /* Unprepare all buffers; multiple unprepares of the same buffer are benign */ - for (i = 0; i < r->n_buf; i++) { - /* Unpreparing an unprepared buffer, on the other hand, fails - on Win98/WinME, though this is not documented - dhuggins@cs, - 2004-07-14 */ - if (!(r->wi_buf[i].p_whdr->dwFlags & WHDR_PREPARED)) - continue; - st = waveInUnprepareHeader(r->h_wavein, - r->wi_buf[i].p_whdr, sizeof(WAVEHDR)); - if (st != 0) { - wavein_error("waveInUnprepareHeader", st); - return -1; - } - } - - /* Free buffers */ - for (i = 0; i < r->n_buf; i++) - wavein_free_buf(&(r->wi_buf[i])); - free(r->wi_buf); - - if ((st = waveInClose(r->h_wavein)) != 0) { - wavein_error("waveInClose", st); - return -1; - } - - free(r); - - return 0; -} - - -ad_rec_t * -ad_open_sps_bufsize(int32 sps, int32 bufsize_msec, unsigned int device_id) -{ - ad_rec_t *r; - int32 i, j; - HWAVEIN h; - - if ((h = wavein_open(sps, sizeof(int16), device_id)) == NULL) - return NULL; - - if ((r = (ad_rec_t *) malloc(sizeof(ad_rec_t))) == NULL) { - fprintf(stderr, "malloc(%d) failed\n", sizeof(ad_rec_t)); - waveInClose(h); - return NULL; - } - - r->n_buf = ((sps * bufsize_msec) / 1000) / WI_BUFSIZE; - if (r->n_buf < DEFAULT_N_WI_BUF) - r->n_buf = DEFAULT_N_WI_BUF; - - if ((r->wi_buf = - (ad_wbuf_t *) calloc(r->n_buf, sizeof(ad_wbuf_t))) == NULL) { - fprintf(stderr, "calloc(%d,%d) failed\n", r->n_buf, - sizeof(ad_wbuf_t)); - free(r); - waveInClose(h); - - return NULL; - } - for (i = 0; i < r->n_buf; i++) { - if (wavein_alloc_buf(&(r->wi_buf[i]), WI_BUFSIZE) < 0) { - for (j = 0; j < i; j++) - wavein_free_buf(&(r->wi_buf[j])); - free(r->wi_buf); - free(r); - waveInClose(h); - - return NULL; - } - } - - r->h_wavein = h; - r->opened = 1; - r->recording = 0; - r->curbuf = r->n_buf - 1; /* current buffer with data for application */ - r->curlen = 0; /* #samples in curbuf remaining to be consumed */ - r->lastbuf = r->curbuf; - r->sps = sps; - r->bps = sizeof(int16); /* HACK!! Hardwired value for bytes/sec */ - - return r; -} - -ad_rec_t * -ad_open_dev(const char *dev, int32 sps) -{ - unsigned int device_num = WAVE_MAPPER; - - /* Convert given deviceId parameter to int */ - if (dev != NULL && sscanf(dev, "%d", &device_num) != EOF) { - if (device_num >= waveInGetNumDevs()) { - device_num = WAVE_MAPPER; - } - } - - return (ad_open_sps_bufsize - (sps, WI_BUFSIZE * DEFAULT_N_WI_BUF * 1000 / sps, device_num)); -} - - -ad_rec_t * -ad_open_sps(int32 sps) -{ - return (ad_open_sps_bufsize - (sps, WI_BUFSIZE * DEFAULT_N_WI_BUF * 1000 / sps, WAVE_MAPPER)); -} - - -ad_rec_t * -ad_open(void) -{ - return (ad_open_sps(DEFAULT_SAMPLES_PER_SEC)); /* HACK!! Rename this constant */ -} - - -int32 -ad_close(ad_rec_t * r) -{ - if (!r->opened) - return AD_ERR_NOT_OPEN; - - if (r->recording) - if (ad_stop_rec(r) < 0) - return AD_ERR_WAVE; - - if (wavein_close(r) < 0) - return AD_ERR_WAVE; - - return 0; -} - - -int32 -ad_start_rec(ad_rec_t * r) -{ - int32 i; - - if ((!r->opened) || r->recording) - return -1; - - for (i = 0; i < r->n_buf; i++) - if (wavein_enqueue_buf(r->h_wavein, r->wi_buf[i].p_whdr) < 0) - return AD_ERR_WAVE; - r->curbuf = r->n_buf - 1; /* current buffer with data for application */ - r->curlen = 0; /* #samples in curbuf remaining to be consumed */ - - if (waveInStart(r->h_wavein) != 0) - return AD_ERR_WAVE; - - r->recording = 1; - - return 0; -} - - -int32 -ad_stop_rec(ad_rec_t * r) -{ - int32 i, st; - - if ((!r->opened) || (!r->recording)) - return -1; - - if (waveInStop(r->h_wavein) != 0) - return AD_ERR_WAVE; - - if ((st = waveInReset(r->h_wavein)) != 0) { - wavein_error("waveInReset", st); - return AD_ERR_WAVE; - } - - /* Wait until all buffers marked done */ - for (i = 0; i < r->n_buf; i++) - while (!(r->wi_buf[i].p_whdr->dwFlags & WHDR_DONE)); - - if ((r->lastbuf = r->curbuf - 1) < 0) - r->lastbuf = r->n_buf - 1; - - r->recording = 0; - - return 0; -} - - -int32 -ad_read(ad_rec_t * r, int16 * buf, int32 max) -{ - int32 t, st, len; - LPWAVEHDR whdr; - int16 *sysbufp; - - if (!r->opened) - return AD_ERR_NOT_OPEN; - - /* Check if all recorded data exhausted */ - if ((!r->recording) && (r->curbuf == r->lastbuf) - && (r->curlen == 0)) - return AD_EOF; - - len = 0; - while (max > 0) { - /* Look for next buffer with recording data */ - if (r->curlen == 0) { - /* No current buffer with data; get next buffer in sequence if available */ - t = r->curbuf + 1; - if (t >= r->n_buf) - t = 0; - - if (!(r->wi_buf[t].p_whdr->dwFlags & WHDR_DONE)) - return len; - - r->curbuf = t; - r->curlen = r->wi_buf[t].p_whdr->dwBytesRecorded >> 1; - r->curoff = 0; - } - - /* Copy data from curbuf to buf */ - whdr = r->wi_buf[r->curbuf].p_whdr; - t = (max < r->curlen) ? max : r->curlen; /* #Samples to copy */ - - if (t > 0) { - sysbufp = (int16 *) (whdr->lpData); - memcpy(buf, sysbufp + r->curoff, t * sizeof(int16)); - - buf += t; - max -= t; - r->curoff += t; - r->curlen -= t; - len += t; - } - - /* If curbuf empty recycle it to system if still recording */ - if (r->curlen == 0) { - if (r->recording) { - /* Return empty buffer to system */ - st = waveInUnprepareHeader(r->h_wavein, - whdr, sizeof(WAVEHDR)); - if (st != 0) { - wavein_error("waveInUnprepareHeader", st); - return AD_ERR_WAVE; - } - - if (wavein_enqueue_buf(r->h_wavein, whdr) < 0) - return AD_ERR_WAVE; - - } - else if (r->curbuf == r->lastbuf) { - return len; - } - } - } - - return len; -} From 8cbe9d82ee1aa27935e1b201ddfeec52420764b2 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 18:04:30 -0400 Subject: [PATCH 06/94] feat: begone, program that used the bad audio library --- src/programs/continuous.c | 344 -------------------------------------- 1 file changed, 344 deletions(-) delete mode 100644 src/programs/continuous.c diff --git a/src/programs/continuous.c b/src/programs/continuous.c deleted file mode 100644 index 1fd122382..000000000 --- a/src/programs/continuous.c +++ /dev/null @@ -1,344 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 1999-2010 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ -/* - * continuous.c - Simple pocketsphinx command-line application to test - * both continuous listening/silence filtering from microphone - * and continuous file transcription. - */ - -/* - * This is a simple example of pocketsphinx application that uses continuous listening - * with silence filtering to automatically segment a continuous stream of audio input - * into utterances that are then decoded. - * - * Remarks: - * - Each utterance is ended when a silence segment of at least 1 sec is recognized. - * - Single-threaded implementation for portability. - * - Uses audio library; can be replaced with an equivalent custom library. - */ - -#include -#include -#include - -#if defined(_WIN32) && !defined(__CYGWIN__) -#include -#else -#include -#endif - -#include -#include - -#include "pocketsphinx.h" - -static const arg_t cont_args_def[] = { - POCKETSPHINX_OPTIONS, - /* Argument file. */ - {"-argfile", - ARG_STRING, - NULL, - "Argument file giving extra arguments."}, - {"-adcdev", - ARG_STRING, - NULL, - "Name of audio device to use for input."}, - {"-infile", - ARG_STRING, - NULL, - "Audio file to transcribe."}, - {"-inmic", - ARG_BOOLEAN, - "no", - "Transcribe audio from microphone."}, - {"-time", - ARG_BOOLEAN, - "no", - "Print word times in file transcription."}, - CMDLN_EMPTY_OPTION -}; - -static ps_decoder_t *ps; -static cmd_ln_t *config; -static FILE *rawfd; - -static void -print_word_times() -{ - int frame_rate = cmd_ln_int32_r(config, "-frate"); - ps_seg_t *iter = ps_seg_iter(ps); - while (iter != NULL) { - int32 sf, ef, pprob; - float conf; - - ps_seg_frames(iter, &sf, &ef); - pprob = ps_seg_prob(iter, NULL, NULL, NULL); - conf = logmath_exp(ps_get_logmath(ps), pprob); - printf("%s %.3f %.3f %f\n", ps_seg_word(iter), ((float)sf / frame_rate), - ((float) ef / frame_rate), conf); - iter = ps_seg_next(iter); - } -} - -static int -check_wav_header(char *header, int expected_sr) -{ - int sr; - - if (header[34] != 0x10) { - E_ERROR("Input audio file has [%d] bits per sample instead of 16\n", header[34]); - return 0; - } - if (header[20] != 0x1) { - E_ERROR("Input audio file has compression [%d] and not required PCM\n", header[20]); - return 0; - } - if (header[22] != 0x1) { - E_ERROR("Input audio file has [%d] channels, expected single channel mono\n", header[22]); - return 0; - } - sr = ((header[24] & 0xFF) | ((header[25] & 0xFF) << 8) | ((header[26] & 0xFF) << 16) | ((header[27] & 0xFF) << 24)); - if (sr != expected_sr) { - E_ERROR("Input audio file has sample rate [%d], but decoder expects [%d]\n", sr, expected_sr); - return 0; - } - return 1; -} - -/* - * Continuous recognition from a file - */ -static void -recognize_from_file() -{ - int16 adbuf[2048]; - const char *fname; - const char *hyp; - int32 k; - uint8 utt_started, in_speech; - int32 print_times = cmd_ln_boolean_r(config, "-time"); - - fname = cmd_ln_str_r(config, "-infile"); - if ((rawfd = fopen(fname, "rb")) == NULL) { - E_FATAL_SYSTEM("Failed to open file '%s' for reading", - fname); - } - - if (strlen(fname) > 4 && strcmp(fname + strlen(fname) - 4, ".wav") == 0) { - char waveheader[44]; - fread(waveheader, 1, 44, rawfd); - if (!check_wav_header(waveheader, (int)cmd_ln_float32_r(config, "-samprate"))) - E_FATAL("Failed to process file '%s' due to format mismatch.\n", fname); - } - - if (strlen(fname) > 4 && strcmp(fname + strlen(fname) - 4, ".mp3") == 0) { - E_FATAL("Can not decode mp3 files, convert input file to WAV 16kHz 16-bit mono before decoding.\n"); - } - - ps_start_utt(ps); - utt_started = FALSE; - - while ((k = fread(adbuf, sizeof(int16), 2048, rawfd)) > 0) { - ps_process_raw(ps, adbuf, k, FALSE, FALSE); - in_speech = ps_get_in_speech(ps); - if (in_speech && !utt_started) { - utt_started = TRUE; - } - if (!in_speech && utt_started) { - ps_end_utt(ps); - hyp = ps_get_hyp(ps, NULL); - if (hyp != NULL) - printf("%s\n", hyp); - if (print_times) - print_word_times(); - fflush(stdout); - - ps_start_utt(ps); - utt_started = FALSE; - } - } - ps_end_utt(ps); - if (utt_started) { - hyp = ps_get_hyp(ps, NULL); - if (hyp != NULL) { - printf("%s\n", hyp); - if (print_times) { - print_word_times(); - } - } - } - - fclose(rawfd); -} - -/* Sleep for specified msec */ -static void -sleep_msec(int32 ms) -{ -#if (defined(_WIN32) && !defined(GNUWINCE)) || defined(_WIN32_WCE) - Sleep(ms); -#else - /* ------------------- Unix ------------------ */ - struct timeval tmo; - - tmo.tv_sec = 0; - tmo.tv_usec = ms * 1000; - - select(0, NULL, NULL, NULL, &tmo); -#endif -} - -/* - * Main utterance processing loop: - * for (;;) { - * start utterance and wait for speech to process - * decoding till end-of-utterance silence will be detected - * print utterance result; - * } - */ -static void -recognize_from_microphone() -{ - ad_rec_t *ad; - int16 adbuf[2048]; - uint8 utt_started, in_speech; - int32 k; - char const *hyp; - - if ((ad = ad_open_dev(cmd_ln_str_r(config, "-adcdev"), - (int) cmd_ln_float32_r(config, - "-samprate"))) == NULL) - E_FATAL("Failed to open audio device\n"); - if (ad_start_rec(ad) < 0) - E_FATAL("Failed to start recording\n"); - - if (ps_start_utt(ps) < 0) - E_FATAL("Failed to start utterance\n"); - utt_started = FALSE; - E_INFO("Ready....\n"); - - for (;;) { - if ((k = ad_read(ad, adbuf, 2048)) < 0) - E_FATAL("Failed to read audio\n"); - ps_process_raw(ps, adbuf, k, FALSE, FALSE); - in_speech = ps_get_in_speech(ps); - if (in_speech && !utt_started) { - utt_started = TRUE; - E_INFO("Listening...\n"); - } - if (!in_speech && utt_started) { - /* speech -> silence transition, time to start new utterance */ - ps_end_utt(ps); - hyp = ps_get_hyp(ps, NULL ); - if (hyp != NULL) { - printf("%s\n", hyp); - fflush(stdout); - } - - if (ps_start_utt(ps) < 0) - E_FATAL("Failed to start utterance\n"); - utt_started = FALSE; - E_INFO("Ready....\n"); - } - sleep_msec(100); - } - ad_close(ad); -} - -int -main(int argc, char *argv[]) -{ - char const *cfg; - - config = cmd_ln_parse_r(NULL, cont_args_def, argc, argv, TRUE); - - /* Handle argument file as -argfile. */ - if (config && (cfg = cmd_ln_str_r(config, "-argfile")) != NULL) { - config = cmd_ln_parse_file_r(config, cont_args_def, cfg, FALSE); - } - - if (config == NULL || (cmd_ln_str_r(config, "-infile") == NULL && cmd_ln_boolean_r(config, "-inmic") == FALSE)) { - E_INFO("Specify '-infile ' to recognize from file or '-inmic yes' to recognize from microphone.\n"); - cmd_ln_free_r(config); - return 1; - } - - ps_default_search_args(config); - ps = ps_init(config); - if (ps == NULL) { - cmd_ln_free_r(config); - return 1; - } - - E_INFO("%s COMPILED ON: %s, AT: %s\n\n", argv[0], __DATE__, __TIME__); - - if (cmd_ln_str_r(config, "-infile") != NULL) { - recognize_from_file(); - } else if (cmd_ln_boolean_r(config, "-inmic")) { - recognize_from_microphone(); - } - - ps_free(ps); - cmd_ln_free_r(config); - - return 0; -} - -#if defined(_WIN32_WCE) -#pragma comment(linker,"/entry:mainWCRTStartup") -#include -//Windows Mobile has the Unicode main only -int -wmain(int32 argc, wchar_t * wargv[]) -{ - char **argv; - size_t wlen; - size_t len; - int i; - - argv = malloc(argc * sizeof(char *)); - for (i = 0; i < argc; i++) { - wlen = lstrlenW(wargv[i]); - len = wcstombs(NULL, wargv[i], wlen); - argv[i] = malloc(len + 1); - wcstombs(argv[i], wargv[i], wlen); - } - - //assuming ASCII parameters - return main(argc, argv); -} -#endif From 1563a0553c0e5ea6817c636585cae91616fbb0ee Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 18:05:19 -0400 Subject: [PATCH 07/94] feat: begone, other program that used the bad audio library --- src/sphinx_adtools/cont_seg.c | 312 ---------------------------------- 1 file changed, 312 deletions(-) delete mode 100644 src/sphinx_adtools/cont_seg.c diff --git a/src/sphinx_adtools/cont_seg.c b/src/sphinx_adtools/cont_seg.c deleted file mode 100644 index 7589bad3b..000000000 --- a/src/sphinx_adtools/cont_seg.c +++ /dev/null @@ -1,312 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 2013 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ -/* - * cont_seg.c -- Continuously listen and segment input speech into utterances. - * - * HISTORY - * - * 05-Nov-13 Created from adseg and fileseg - * - */ - -#include -#include -#include -#include -#include - -#if defined(_WIN32) && !defined(__CYGWIN__) -#include -#else -#include -#endif - -#include -#include -#include -#include -#include -#include - -#define BLOCKSIZE 1024 - -static const arg_t cont_args_def[] = { - waveform_to_cepstral_command_line_macro(), - /* Argument file. */ - {"-argfile", - ARG_STRING, - NULL, - "Argument file giving extra arguments."}, - {"-adcdev", - ARG_STRING, - NULL, - "Name of audio device to use for input."}, - {"-inmic", - ARG_BOOLEAN, - "no", - "Transcribe audio from microphone."}, - {"-infile", - ARG_STRING, - NULL, - "Name of audio file to use for input."}, - {"-singlefile", - ARG_BOOLEAN, - FALSE, - "Write a single cleaned file."}, - {NULL, 0, NULL, NULL} -}; - -static fe_t *fe; -static cmd_ln_t *config; -static int (*read_audio) (int16 * buf, int len); -static ad_rec_t *ad; -static const char *infile_path; -static FILE *infile; -static int32 singlefile; - -/* Sleep for specified msec */ -static void -sleep_msec(int32 ms) -{ -#if (defined(_WIN32) && !defined(GNUWINCE)) || defined(_WIN32_WCE) - Sleep(ms); -#else - /* ------------------- Unix ------------------ */ - struct timeval tmo; - - tmo.tv_sec = 0; - tmo.tv_usec = ms * 1000; - - select(0, NULL, NULL, NULL, &tmo); -#endif -} - -static int -read_audio_file(int16 * buf, int len) -{ - if (!infile) { - E_FATAL("Failed to read audio from file\n"); - return -1; - } - return fread(buf, sizeof(int16), len, infile); -} - -static int -read_audio_adev(int16 * buf, int len) -{ - int k; - - if (!ad) { - E_FATAL("Failed to read audio from mic\n"); - return -1; - } - while ((k = ad_read(ad, buf, len)) == 0) - /* wait until something is read */ - sleep_msec(50); - - return k; -} - -void -segment_audio() -{ - FILE *file; - int16 pcm_buf[BLOCKSIZE]; - mfcc_t **cep_buf; - int16 *voiced_buf = NULL; - int32 voiced_nsamps, out_frameidx, uttstart = 0; - char file_name[1024]; - uint8 cur_vad_state, vad_state, writing; - int uttno, uttlen, sample_rate; - int32 nframes, nframes_tmp; - int16 frame_size, frame_shift, frame_rate; - size_t k; - - sample_rate = (int) cmd_ln_float32_r(config, "-samprate"); - frame_rate = cmd_ln_int32_r(config, "-frate"); - frame_size = - (int32) (cmd_ln_float32_r(config, "-wlen") * sample_rate + 0.5); - frame_shift = - (int32) (sample_rate / cmd_ln_int32_r(config, "-frate") + 0.5); - nframes = (BLOCKSIZE - frame_size) / frame_shift; - cep_buf = - (mfcc_t **) ckd_calloc_2d(nframes, fe_get_output_size(fe), - sizeof(mfcc_t)); - - uttno = 0; - uttlen = 0; - cur_vad_state = 0; - voiced_nsamps = 0; - writing = 0; - file = NULL; - fe_start_stream(fe); - fe_start_utt(fe); - while ((k = read_audio(pcm_buf, BLOCKSIZE)) > 0) { - int16 const *pcm_buf_tmp; - pcm_buf_tmp = &pcm_buf[0]; - while (k) { - nframes_tmp = nframes; - fe_process_frames_ext(fe, &pcm_buf_tmp, &k, cep_buf, - &nframes_tmp, voiced_buf, - &voiced_nsamps, &out_frameidx); - if (out_frameidx > 0) { - uttstart = out_frameidx; - } - vad_state = fe_get_vad_state(fe); - if (!cur_vad_state && vad_state) { - /* silence->speech transition, time to start new file */ - uttno++; - if (!singlefile) { - sprintf(file_name, "%s%04d.raw", infile_path, uttno); - if ((file = fopen(file_name, "wb")) == NULL) - E_FATAL_SYSTEM("Failed to open '%s' for writing", - file_name); - } else { - sprintf(file_name, "%s.raw", infile_path); - if ((file = fopen(file_name, "ab")) == NULL) - E_FATAL_SYSTEM("Failed to open '%s' for writing", - file_name); - } - writing = 1; - } - - if (writing && file && voiced_nsamps > 0) { - fwrite(voiced_buf, sizeof(int16), voiced_nsamps, file); - uttlen += voiced_nsamps; - } - - if (cur_vad_state && !vad_state) { - /* speech -> silence transition, time to finish file */ - fclose(file); - printf("Utterance %04d: file %s start %.1f sec length %d samples ( %.2f sec )\n", - uttno, - file_name, - ((double) uttstart) / frame_rate, - uttlen, - ((double) uttlen) / sample_rate); - fflush(stdout); - fe_end_utt(fe, cep_buf[0], &nframes_tmp); - writing = 0; - uttlen = 0; - voiced_nsamps = 0; - fe_start_utt(fe); - } - cur_vad_state = vad_state; - } - } - - if (writing) { - fclose(file); - printf("Utterance %04d: file %s start %.1f sec length %d samples ( %.2f sec )\n", - uttno, - file_name, - ((double) uttstart) / frame_rate, - uttlen, - ((double) uttlen) / sample_rate); - fflush(stdout); - } - fe_end_utt(fe, cep_buf[0], &nframes); - ckd_free_2d(cep_buf); -} - -int -main(int argc, char *argv[]) -{ - int i; - int16 buf[2048]; - - config = cmd_ln_parse_r(NULL, cont_args_def, argc, argv, TRUE); - - if (config && cmd_ln_str_r(config, "-argfile")) - config = cmd_ln_parse_file_r(config, cont_args_def, - cmd_ln_str_r(config, "-argfile"), FALSE); - - if (config == NULL || (cmd_ln_str_r(config, "-infile") == NULL && cmd_ln_boolean_r(config, "-inmic") == FALSE)) { - E_INFO("Specify '-infile ' to segment a file or '-inmic yes' to segment audio from microphone.\n"); - cmd_ln_free_r(config); - return 1; - } - - - singlefile = cmd_ln_boolean_r(config, "-singlefile"); - if ((infile_path = cmd_ln_str_r(config, "-infile")) != NULL) { - if ((infile = fopen(infile_path, "rb")) == NULL) { - E_FATAL_SYSTEM("Failed to read audio from '%s'", infile_path); - return 1; - } - read_audio = &read_audio_file; - /* skip wav header */ - read_audio(buf, 44); - } - else if cmd_ln_boolean_r(config, "-inmic") { - if ((ad = ad_open_dev(cmd_ln_str_r(config, "-adcdev"), - (int) cmd_ln_float32_r(config, - "-samprate"))) == - NULL) { - E_FATAL("Failed to open audio device\n"); - return 1; - } - read_audio = &read_audio_adev; - printf("Start recording ...\n"); - fflush(stdout); - if (ad_start_rec(ad) < 0) - E_FATAL("Failed to start recording\n"); - - /* TODO remove this thing */ - for (i = 0; i < 5; i++) { - sleep_msec(200); - read_audio(buf, 2048); - } - printf("You may speak now\n"); - fflush(stdout); - } - - fe = fe_init_auto_r(config); - if (fe == NULL) - return 1; - - segment_audio(); - - if (ad) - ad_close(ad); - if (infile) - fclose(infile); - - fe_free(fe); - cmd_ln_free_r(config); - return 0; -} From 6fa0b9442e3958695874d84cc0e12a1529d07be2 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 18:05:45 -0400 Subject: [PATCH 08/94] README will just be README.md --- README | 90 ------------------------------------------------------ README.md | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 90 insertions(+), 91 deletions(-) delete mode 100644 README mode change 120000 => 100644 README.md diff --git a/README b/README deleted file mode 100644 index 0038e6a11..000000000 --- a/README +++ /dev/null @@ -1,90 +0,0 @@ -PocketSphinx 5prealpha -=============================================================================== - -This is PocketSphinx, one of Carnegie Mellon University's open source large -vocabulary, speaker-independent continuous speech recognition engine. - -**THIS IS A RESEARCH SYSTEM**. This is also an early release of a research -system. We know the APIs and function names are likely to change, and that -several tools need to be made available to make this all complete. With your -help and contributions, this can progress in response to the needs and patches -provided. - -**Please see the LICENSE file for terms of use.** - -Prerequisites -------------------------------------------------------------------------------- - -You **must** have SphinxBase, which you can download from -http://cmusphinx.sourceforge.net. Download and unpack it to the same parent -directory as PocketSphinx, so that the configure script and project files can -find it. On Windows, you will need to rename 'sphinxbase-X.Y' (where X.Y is the -SphinxBase version number) to simply 'sphinxbase' for this to work. - -Linux/Unix installation ------------------------------------------------------------------------------- - -In a unix-like environment (such as linux, solaris etc): - - * Build and optionally install SphinxBase. If you want to use - fixed-point arithmetic, you **must** configure SphinxBase with the - `--enable-fixed` option. - - * If you downloaded directly from the CVS repository, you need to do - this at least once to generate the "configure" file: - - ``` - $ ./autogen.sh - ``` - * If you downloaded the release version, or ran `autogen.sh` at least - once, then compile and install: - - ``` - $ ./configure - $ make clean all - $ make check - $ sudo make install - ``` - -Xcode Installation (for iPhone) ------------------------------------------------------------------------------- - -Pocketsphinx uses the standard unix autogen system, you can build pocketsphinx -with automake given you already built sphinxbase You just need to pass correct -configure arguments, set compiler path, set sysroot and other options. After -you build the code you need to import dylib file into your project and you also -need to configure includes for your project to find sphinxbase headers. - -You also will have to create a recorder to capture audio with CoreAudio and -feed it into the recognizer. - -For details see http://github.com/cmusphinx/pocketsphinx-ios-demo - -If you want to quickly start with Pocketsphinx, try OpenEars toolkit which -includes Pocketsphinx http://www.politepix.com/openears/ - - -Android installation ------------------------------------------------------------------------------- - -See http://github.com/cmusphinx/pocketsphinx-android-demo. - - -MS Windows™ (MS Visual Studio 2012 (or newer - we test with VC++ 2012 Express) ------------------------------------------------------------------------------- - - * load sphinxbase.sln located in sphinxbase directory - - * compile all the projects in SphinxBase (from sphinxbase.sln) - - * load pocketsphinx.sln in pocketsphinx directory - - * compile all the projects in PocketSphinx - -MS Visual Studio will build the executables under .\bin\Release or -.\bin\Debug (depending on the version you choose on MS Visual Studio), -and the libraries under .\lib\Release or .\lib\Build. - -Test scripts are forthcoming for Windows. - -For up-to-date information, see http://cmusphinx.sourceforge.net. diff --git a/README.md b/README.md deleted file mode 120000 index 100b93820..000000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -README \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..0038e6a11 --- /dev/null +++ b/README.md @@ -0,0 +1,90 @@ +PocketSphinx 5prealpha +=============================================================================== + +This is PocketSphinx, one of Carnegie Mellon University's open source large +vocabulary, speaker-independent continuous speech recognition engine. + +**THIS IS A RESEARCH SYSTEM**. This is also an early release of a research +system. We know the APIs and function names are likely to change, and that +several tools need to be made available to make this all complete. With your +help and contributions, this can progress in response to the needs and patches +provided. + +**Please see the LICENSE file for terms of use.** + +Prerequisites +------------------------------------------------------------------------------- + +You **must** have SphinxBase, which you can download from +http://cmusphinx.sourceforge.net. Download and unpack it to the same parent +directory as PocketSphinx, so that the configure script and project files can +find it. On Windows, you will need to rename 'sphinxbase-X.Y' (where X.Y is the +SphinxBase version number) to simply 'sphinxbase' for this to work. + +Linux/Unix installation +------------------------------------------------------------------------------ + +In a unix-like environment (such as linux, solaris etc): + + * Build and optionally install SphinxBase. If you want to use + fixed-point arithmetic, you **must** configure SphinxBase with the + `--enable-fixed` option. + + * If you downloaded directly from the CVS repository, you need to do + this at least once to generate the "configure" file: + + ``` + $ ./autogen.sh + ``` + * If you downloaded the release version, or ran `autogen.sh` at least + once, then compile and install: + + ``` + $ ./configure + $ make clean all + $ make check + $ sudo make install + ``` + +Xcode Installation (for iPhone) +------------------------------------------------------------------------------ + +Pocketsphinx uses the standard unix autogen system, you can build pocketsphinx +with automake given you already built sphinxbase You just need to pass correct +configure arguments, set compiler path, set sysroot and other options. After +you build the code you need to import dylib file into your project and you also +need to configure includes for your project to find sphinxbase headers. + +You also will have to create a recorder to capture audio with CoreAudio and +feed it into the recognizer. + +For details see http://github.com/cmusphinx/pocketsphinx-ios-demo + +If you want to quickly start with Pocketsphinx, try OpenEars toolkit which +includes Pocketsphinx http://www.politepix.com/openears/ + + +Android installation +------------------------------------------------------------------------------ + +See http://github.com/cmusphinx/pocketsphinx-android-demo. + + +MS Windows™ (MS Visual Studio 2012 (or newer - we test with VC++ 2012 Express) +------------------------------------------------------------------------------ + + * load sphinxbase.sln located in sphinxbase directory + + * compile all the projects in SphinxBase (from sphinxbase.sln) + + * load pocketsphinx.sln in pocketsphinx directory + + * compile all the projects in PocketSphinx + +MS Visual Studio will build the executables under .\bin\Release or +.\bin\Debug (depending on the version you choose on MS Visual Studio), +and the libraries under .\lib\Release or .\lib\Build. + +Test scripts are forthcoming for Windows. + +For up-to-date information, see http://cmusphinx.sourceforge.net. From 87e23b78cd970b028f2fd7fd5d4ce4779cdd8ccb Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 20:21:51 -0400 Subject: [PATCH 09/94] build: mostly functional basic CMake config --- CMakeLists.txt | 68 ++++++++++++++++++++++++++++++++++++++ include/config.h.in | 61 ++++++++++++++++++++++++++++++++++ include/sphinx_config.h.in | 16 ++++----- 3 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 include/config.h.in diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..0803de945 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,68 @@ +cmake_minimum_required(VERSION 3.13) + +project(PocketSphinx VERSION 1.0.0 + DESCRIPTION "A small speech recognizer" + HOMEPAGE_URL "https://github.com/dhdaines/pocketsphinx") +include(CMakePrintHelpers) +set(PACKAGE_NAME ${PROJECT_NAME}) +string(TOLOWER ${PROJECT_NAME} PROJECT_SHORTNAME) +set(PACKAGE_VERSION ${PROJECT_VERSION}) +set(PACKAGE_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") +set(PACKAGE_TARNAME "${PROJECT_SHORTNAME}-${PROJECT_VERSION}") +set(PACKAGE_URL ${PROJECT_HOMEPAGE_URL}) +set(PACKAGE_BUGREPORT dhdaines@gmail.com) + +if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) + include(CTest) + enable_testing() +endif() + +include(CheckTypeSize) +include(CheckSymbolExists) +include(CheckLibraryExists) +include(TestBigEndian) + +CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H) +CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H) +CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H) +CHECK_SYMBOL_EXISTS(snprintf stdio.h HAVE_SNPRINTF) +CHECK_SYMBOL_EXISTS(popen stdio.h HAVE_POPEN) +CHECK_TYPE_SIZE(long LONG) +CHECK_TYPE_SIZE("long long" LONG_LONG) +# OMG CMake is so incredibly awful +set(SIZEOF_LONG ${LONG}) +set(SIZEOF_LONG_LONG ${LONG_LONG}) +cmake_print_variables(SIZEOF_LONG SIZEOF_LONG_LONG) +test_big_endian(WORDS_BIGENDIAN) +cmake_print_variables(WORDS_BIGENDIAN) + +if(CMAKE_BUILD_TYPE STREQUAL Debug) + set(SPHINX_DEBUG 1) +endif() + +if(MSVC) + add_compile_options(/W3) +else() + add_compile_options(-Wall) +endif() + +option(BUILD_SHARED_LIBS "Build using shared libraries" ON) +option(FIXED_POINT "Build using fixed-point math" OFF) +if(NOT DEFAULT_RADIX) + set(DEFAULT_RADIX 12) +endif() +cmake_print_variables(FIXED_POINT DEFAULT_RADIX) + +configure_file(include/config.h.in include/config.h) +configure_file(include/sphinx_config.h.in include/sphinx_config.h) +add_definitions(-DHAVE_CONFIG_H) + +#install(TARGETS pocketsphinx DESTINATION lib) + +# add_subdirectory(include) +# add_subdirectory(src) + +# add_subdirectory(test) +# add_subdirectory(doc) +# add_subdirectory(model) +# add_subdirectory(swig) diff --git a/include/config.h.in b/include/config.h.in new file mode 100644 index 000000000..ff3390c5c --- /dev/null +++ b/include/config.h.in @@ -0,0 +1,61 @@ +/* include/config.h.in. Generated from configure.ac by autoheader. */ + +/* Default radix point for fixed-point */ +#cmakedefine DEFAULT_RADIX @DEFAULT_RADIX@ + +/* Define to use fixed-point computation */ +#cmakedefine FIXED_POINT + +/* Define if the system has the type `long long'. */ +#cmakedefine HAVE_LONG_LONG + +/* Define if you have the `popen' function. */ +#cmakedefine HAVE_POPEN + +/* Define if you have the `snprintf' function. */ +#cmakedefine HAVE_SNPRINTF + +/* Define if you have the header file. */ +#cmakedefine HAVE_SYS_STAT_H + +/* Define if you have the header file. */ +#cmakedefine HAVE_SYS_TYPES_H + +/* Define if you have the header file. */ +#cmakedefine HAVE_UNISTD_H + +/* The size of `long', as computed by sizeof. */ +#cmakedefine SIZEOF_LONG @SIZEOF_LONG@ + +/* The size of `long long', as computed by sizeof. */ +#cmakedefine SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@ + +/* Define to enable matrix algebra with LAPACK */ +#cmakedefine WITH_LAPACK + +/* Define WORDS_BIGENDIAN if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN +#else +# cmakedefine WORDS_BIGENDIAN +#endif + +/* Define to the address where bug reports for this package should be sent. */ +#cmakedefine PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" + +/* Define to the full name of this package. */ +#cmakedefine PACKAGE_NAME "@PACKAGE_NAME@" + +/* Define to the full name and version of this package. */ +#cmakedefine PACKAGE_STRING "@PACKAGE_STRING@" + +/* Define to the one symbol short name of this package. */ +#cmakedefine PACKAGE_TARNAME "@PACKAGE_TARNAME@" + +/* Define to the home page for this package. */ +#cmakedefine PACKAGE_URL "@PACKAGE_URL@" + +/* Define to the version of this package. */ +#cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@" + diff --git a/include/sphinx_config.h.in b/include/sphinx_config.h.in index ea729844f..e4f4f7f86 100644 --- a/include/sphinx_config.h.in +++ b/include/sphinx_config.h.in @@ -1,19 +1,19 @@ /* sphinx_config.h: Externally visible configuration parameters */ -/* Use fixed-point computation */ -#undef FIXED_POINT +/* Define to use fixed-point computation */ +#cmakedefine FIXED_POINT /* Default radix point for fixed-point */ -#undef DEFAULT_RADIX +#cmakedefine DEFAULT_RADIX @DEFAULT_RADIX@ /* The size of `long', as computed by sizeof. */ -#undef SIZEOF_LONG +#cmakedefine SIZEOF_LONG @SIZEOF_LONG@ -/* Define to 1 if the system has the type `long long'. */ -#undef HAVE_LONG_LONG +/* Define if the system has the type `long long'. */ +#cmakedefine HAVE_LONG_LONG /* The size of `long long', as computed by sizeof. */ -#undef SIZEOF_LONG_LONG +#cmakedefine SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@ /* Enable debugging output */ -#undef SPHINX_DEBUG +#cmakedefine SPHINX_DEBUG From a87fa6c3eeb440ae87c0f2950f1a6af2f71674ab Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 20:53:05 -0400 Subject: [PATCH 10/94] refactor: move pocketsphinx headers to pocketsphinx/ --- include/{ => pocketsphinx}/cmdln_macro.h | 0 include/{ => pocketsphinx}/pocketsphinx_export.h | 0 include/{ => pocketsphinx}/ps_lattice.h | 0 include/{ => pocketsphinx}/ps_mllr.h | 0 include/{ => pocketsphinx}/ps_search.h | 0 include/{ => pocketsphinx}/sphinx_config.h.in | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename include/{ => pocketsphinx}/cmdln_macro.h (100%) rename include/{ => pocketsphinx}/pocketsphinx_export.h (100%) rename include/{ => pocketsphinx}/ps_lattice.h (100%) rename include/{ => pocketsphinx}/ps_mllr.h (100%) rename include/{ => pocketsphinx}/ps_search.h (100%) rename include/{ => pocketsphinx}/sphinx_config.h.in (100%) diff --git a/include/cmdln_macro.h b/include/pocketsphinx/cmdln_macro.h similarity index 100% rename from include/cmdln_macro.h rename to include/pocketsphinx/cmdln_macro.h diff --git a/include/pocketsphinx_export.h b/include/pocketsphinx/pocketsphinx_export.h similarity index 100% rename from include/pocketsphinx_export.h rename to include/pocketsphinx/pocketsphinx_export.h diff --git a/include/ps_lattice.h b/include/pocketsphinx/ps_lattice.h similarity index 100% rename from include/ps_lattice.h rename to include/pocketsphinx/ps_lattice.h diff --git a/include/ps_mllr.h b/include/pocketsphinx/ps_mllr.h similarity index 100% rename from include/ps_mllr.h rename to include/pocketsphinx/ps_mllr.h diff --git a/include/ps_search.h b/include/pocketsphinx/ps_search.h similarity index 100% rename from include/ps_search.h rename to include/pocketsphinx/ps_search.h diff --git a/include/sphinx_config.h.in b/include/pocketsphinx/sphinx_config.h.in similarity index 100% rename from include/sphinx_config.h.in rename to include/pocketsphinx/sphinx_config.h.in From 16b161c98ba30a9744d6548736adf29b9afb7c78 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 20:54:17 -0400 Subject: [PATCH 11/94] fix: oops, no, they dont go there --- include/config.h.in => config.h.in | 0 include/{pocketsphinx => }/cmdln_macro.h | 0 include/{pocketsphinx => }/pocketsphinx_export.h | 0 include/{pocketsphinx => }/ps_lattice.h | 0 include/{pocketsphinx => }/ps_mllr.h | 0 include/{pocketsphinx => }/ps_search.h | 0 include/pocketsphinx/sphinx_config.h.in => sphinx_config.h.in | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename include/config.h.in => config.h.in (100%) rename include/{pocketsphinx => }/cmdln_macro.h (100%) rename include/{pocketsphinx => }/pocketsphinx_export.h (100%) rename include/{pocketsphinx => }/ps_lattice.h (100%) rename include/{pocketsphinx => }/ps_mllr.h (100%) rename include/{pocketsphinx => }/ps_search.h (100%) rename include/pocketsphinx/sphinx_config.h.in => sphinx_config.h.in (100%) diff --git a/include/config.h.in b/config.h.in similarity index 100% rename from include/config.h.in rename to config.h.in diff --git a/include/pocketsphinx/cmdln_macro.h b/include/cmdln_macro.h similarity index 100% rename from include/pocketsphinx/cmdln_macro.h rename to include/cmdln_macro.h diff --git a/include/pocketsphinx/pocketsphinx_export.h b/include/pocketsphinx_export.h similarity index 100% rename from include/pocketsphinx/pocketsphinx_export.h rename to include/pocketsphinx_export.h diff --git a/include/pocketsphinx/ps_lattice.h b/include/ps_lattice.h similarity index 100% rename from include/pocketsphinx/ps_lattice.h rename to include/ps_lattice.h diff --git a/include/pocketsphinx/ps_mllr.h b/include/ps_mllr.h similarity index 100% rename from include/pocketsphinx/ps_mllr.h rename to include/ps_mllr.h diff --git a/include/pocketsphinx/ps_search.h b/include/ps_search.h similarity index 100% rename from include/pocketsphinx/ps_search.h rename to include/ps_search.h diff --git a/include/pocketsphinx/sphinx_config.h.in b/sphinx_config.h.in similarity index 100% rename from include/pocketsphinx/sphinx_config.h.in rename to sphinx_config.h.in From d8b096bf6e93f2e834fc1030fce0d5456c8ba56d Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 20:54:37 -0400 Subject: [PATCH 12/94] keep .in files out of directories --- CMakeLists.txt | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0803de945..029602c4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,16 +53,8 @@ if(NOT DEFAULT_RADIX) endif() cmake_print_variables(FIXED_POINT DEFAULT_RADIX) -configure_file(include/config.h.in include/config.h) -configure_file(include/sphinx_config.h.in include/sphinx_config.h) +configure_file(config.h.in config.h) +configure_file(sphinx_config.h.in include/pocketsphinx/sphinx_config.h) add_definitions(-DHAVE_CONFIG_H) -#install(TARGETS pocketsphinx DESTINATION lib) - -# add_subdirectory(include) -# add_subdirectory(src) - -# add_subdirectory(test) -# add_subdirectory(doc) -# add_subdirectory(model) -# add_subdirectory(swig) +add_subdirectory(src) From e0be37925b34126be3b87469f2395eabd1caffae Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 20:54:51 -0400 Subject: [PATCH 13/94] add library build --- src/CMakeLists.txt | 91 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/CMakeLists.txt diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 000000000..c5cd52775 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,91 @@ +add_library(pocketsphinx + libpocketsphinx/tmat.c + libpocketsphinx/fsg_history.c + libpocketsphinx/allphone_search.c + libpocketsphinx/s2_semi_mgau.c + libpocketsphinx/ps_alignment.c + libpocketsphinx/ms_gauden.c + libpocketsphinx/state_align_search.c + libpocketsphinx/mdef.c + libpocketsphinx/blkarray_list.c + libpocketsphinx/dict2pid.c + libpocketsphinx/vector.c + libpocketsphinx/ms_senone.c + libpocketsphinx/ptm_mgau.c + libpocketsphinx/ngram_search_fwdflat.c + libpocketsphinx/kws_detections.c + libpocketsphinx/hmm.c + libpocketsphinx/bin_mdef.c + libpocketsphinx/phone_loop_search.c + libpocketsphinx/ngram_search.c + libpocketsphinx/ngram_search_fwdtree.c + libpocketsphinx/ms_mgau.c + libpocketsphinx/fsg_search.c + libpocketsphinx/ps_lattice.c + libpocketsphinx/fsg_lextree.c + libpocketsphinx/ps_mllr.c + libpocketsphinx/pocketsphinx.c + libpocketsphinx/kws_search.c + libpocketsphinx/acmod.c + libpocketsphinx/dict.c + libsphinxbase/fe/fe_sigproc.c + libsphinxbase/fe/fixlog.c + libsphinxbase/fe/fe_prespch_buf.c + libsphinxbase/fe/fe_warp_inverse_linear.c + libsphinxbase/fe/fe_noise.c + libsphinxbase/fe/fe_warp.c + libsphinxbase/fe/fe_interface.c + libsphinxbase/fe/fe_warp_affine.c + libsphinxbase/fe/yin.c + libsphinxbase/fe/fe_warp_piecewise_linear.c + libsphinxbase/feat/cmn.c + libsphinxbase/feat/agc.c + libsphinxbase/feat/cmn_live.c + libsphinxbase/feat/feat.c + libsphinxbase/feat/lda.c + libsphinxbase/lm/lm_trie_quant.c + libsphinxbase/lm/ngram_model_trie.c + libsphinxbase/lm/fsg_model.c + libsphinxbase/lm/jsgf.c + libsphinxbase/lm/ngram_model_set.c + libsphinxbase/lm/ngrams_raw.c + libsphinxbase/lm/jsgf_scanner.c + libsphinxbase/lm/ngram_model.c + libsphinxbase/lm/lm_trie.c + libsphinxbase/lm/jsgf_parser.c + libsphinxbase/util/strfuncs.c + libsphinxbase/util/dtoa.c + libsphinxbase/util/case.c + libsphinxbase/util/filename.c + libsphinxbase/util/slamch.c + libsphinxbase/util/cmd_ln.c + libsphinxbase/util/blas_lite.c + libsphinxbase/util/mmio.c + libsphinxbase/util/hash_table.c + libsphinxbase/util/err.c + libsphinxbase/util/ckd_alloc.c + libsphinxbase/util/slapack_lite.c + libsphinxbase/util/matrix.c + libsphinxbase/util/sbthread.c + libsphinxbase/util/bio.c + libsphinxbase/util/heap.c + libsphinxbase/util/priority_queue.c + libsphinxbase/util/bitvec.c + libsphinxbase/util/profile.c + libsphinxbase/util/errno.c + libsphinxbase/util/logmath.c + libsphinxbase/util/glist.c + libsphinxbase/util/f2c_lite.c + libsphinxbase/util/listelem_alloc.c + libsphinxbase/util/bitarr.c + libsphinxbase/util/pio.c + libsphinxbase/util/genrand.c + ) +target_include_directories( + pocketsphinx PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/libpocketsphinx + pocketsphinx PRIVATE ${CMAKE_BINARY_DIR}/include + pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include) +find_library(MATH_LIBRARY m) +if(MATH_LIBRARY) + target_link_libraries(pocketsphinx PUBLIC ${MATH_LIBRARY}) +endif() From 25505d845dfcf85279feeeb7345b51906bb110ab Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 20:55:57 -0400 Subject: [PATCH 14/94] put config.h in top level --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c5cd52775..13e3890e2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -83,7 +83,7 @@ add_library(pocketsphinx ) target_include_directories( pocketsphinx PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/libpocketsphinx - pocketsphinx PRIVATE ${CMAKE_BINARY_DIR}/include + pocketsphinx PRIVATE ${CMAKE_BINARY_DIR} # config.h pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include) find_library(MATH_LIBRARY m) if(MATH_LIBRARY) From d3b5cbc52aa8229d377836506778d11b41e27c96 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 20:57:05 -0400 Subject: [PATCH 15/94] fix: re-fix library build --- CMakeLists.txt | 2 +- src/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 029602c4e..190a9cd08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,7 +54,7 @@ endif() cmake_print_variables(FIXED_POINT DEFAULT_RADIX) configure_file(config.h.in config.h) -configure_file(sphinx_config.h.in include/pocketsphinx/sphinx_config.h) +configure_file(sphinx_config.h.in include/sphinx_config.h) add_definitions(-DHAVE_CONFIG_H) add_subdirectory(src) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 13e3890e2..9addf3e4a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -84,6 +84,7 @@ add_library(pocketsphinx target_include_directories( pocketsphinx PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/libpocketsphinx pocketsphinx PRIVATE ${CMAKE_BINARY_DIR} # config.h + pocketsphinx PRIVATE ${CMAKE_BINARY_DIR}/include # sphinx_config.h pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include) find_library(MATH_LIBRARY m) if(MATH_LIBRARY) From 3ad6f89bf7f979222ff7697d3a9810844414464b Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:04:36 -0400 Subject: [PATCH 16/94] build: move header files around a bit more, slightly rationalizing them --- CMakeLists.txt | 2 +- include/CMakeLists.txt | 3 +++ include/pocketsphinx.h | 10 +++++----- .../{pocketsphinx_export.h => pocketsphinx/export.h} | 0 include/{ => pocketsphinx}/ps_lattice.h | 2 +- include/{ => pocketsphinx}/ps_mllr.h | 2 +- include/{ => pocketsphinx}/ps_search.h | 0 src/CMakeLists.txt | 7 +++++-- src/libpocketsphinx/bin_mdef.h | 2 +- src/libpocketsphinx/dict.h | 2 +- 10 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 include/CMakeLists.txt rename include/{pocketsphinx_export.h => pocketsphinx/export.h} (100%) rename include/{ => pocketsphinx}/ps_lattice.h (99%) rename include/{ => pocketsphinx}/ps_mllr.h (98%) rename include/{ => pocketsphinx}/ps_search.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 190a9cd08..fc91f8601 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,7 +54,7 @@ endif() cmake_print_variables(FIXED_POINT DEFAULT_RADIX) configure_file(config.h.in config.h) -configure_file(sphinx_config.h.in include/sphinx_config.h) +configure_file(sphinx_config.h.in include/sphinxbase/sphinx_config.h) add_definitions(-DHAVE_CONFIG_H) add_subdirectory(src) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt new file mode 100644 index 000000000..60dffb8ad --- /dev/null +++ b/include/CMakeLists.txt @@ -0,0 +1,3 @@ +install(FILES + + DESTINATION include) diff --git a/include/pocketsphinx.h b/include/pocketsphinx.h index 486172446..bc4cf214d 100644 --- a/include/pocketsphinx.h +++ b/include/pocketsphinx.h @@ -49,10 +49,10 @@ #include /* PocketSphinx headers (not many of them!) */ -#include -#include -#include -#include +#include +#include +#include +#include #ifdef __cplusplus extern "C" { @@ -66,7 +66,7 @@ extern "C" { */ typedef struct ps_decoder_s ps_decoder_t; -#include +#include /** * PocketSphinx N-best hypothesis iterator object. diff --git a/include/pocketsphinx_export.h b/include/pocketsphinx/export.h similarity index 100% rename from include/pocketsphinx_export.h rename to include/pocketsphinx/export.h diff --git a/include/ps_lattice.h b/include/pocketsphinx/ps_lattice.h similarity index 99% rename from include/ps_lattice.h rename to include/pocketsphinx/ps_lattice.h index 7d78c6a4f..39eaf9cd5 100644 --- a/include/ps_lattice.h +++ b/include/pocketsphinx/ps_lattice.h @@ -47,7 +47,7 @@ #include /* PocketSphinx headers. */ -#include +#include #ifdef __cplusplus extern "C" { diff --git a/include/ps_mllr.h b/include/pocketsphinx/ps_mllr.h similarity index 98% rename from include/ps_mllr.h rename to include/pocketsphinx/ps_mllr.h index dee3ec968..81d5a4677 100644 --- a/include/ps_mllr.h +++ b/include/pocketsphinx/ps_mllr.h @@ -47,7 +47,7 @@ #include /* PocketSphinx headers. */ -#include +#include #ifdef __cplusplus extern "C" { diff --git a/include/ps_search.h b/include/pocketsphinx/ps_search.h similarity index 100% rename from include/ps_search.h rename to include/pocketsphinx/ps_search.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9addf3e4a..21df94ba7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -84,8 +84,11 @@ add_library(pocketsphinx target_include_directories( pocketsphinx PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/libpocketsphinx pocketsphinx PRIVATE ${CMAKE_BINARY_DIR} # config.h - pocketsphinx PRIVATE ${CMAKE_BINARY_DIR}/include # sphinx_config.h - pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include) + pocketsphinx PRIVATE ${CMAKE_BINARY_DIR}/include/sphinxbase + pocketsphinx PRIVATE ${CMAKE_SOURCE_DIR}/include/pocketsphinx + pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include + pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include/sphinxbase + ) find_library(MATH_LIBRARY m) if(MATH_LIBRARY) target_link_libraries(pocketsphinx PUBLIC ${MATH_LIBRARY}) diff --git a/src/libpocketsphinx/bin_mdef.h b/src/libpocketsphinx/bin_mdef.h index f4e22ac01..5e90ec309 100644 --- a/src/libpocketsphinx/bin_mdef.h +++ b/src/libpocketsphinx/bin_mdef.h @@ -55,7 +55,7 @@ extern "C" { /* SphinxBase headers. */ #include #include -#include +#include #include "mdef.h" diff --git a/src/libpocketsphinx/dict.h b/src/libpocketsphinx/dict.h index d46e8e51a..5a98c46e6 100644 --- a/src/libpocketsphinx/dict.h +++ b/src/libpocketsphinx/dict.h @@ -48,7 +48,7 @@ /* Local headers. */ #include "s3types.h" #include "bin_mdef.h" -#include "pocketsphinx_export.h" +#include "pocketsphinx/export.h" #define S3DICT_INC_SZ 4096 From 553ea212c4239ab151c1d4d7f29f222604adf5fe Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:06:01 -0400 Subject: [PATCH 17/94] build: put cmdln_macro.h in a better place --- include/CMakeLists.txt | 43 +++++++++++++++++++++++- include/{ => pocketsphinx}/cmdln_macro.h | 0 2 files changed, 42 insertions(+), 1 deletion(-) rename include/{ => pocketsphinx}/cmdln_macro.h (100%) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index 60dffb8ad..de0d58011 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -1,3 +1,44 @@ install(FILES - + pocketsphinx/cmdln_macro.h + pocketsphinx/ps_search.h + pocketsphinx/export.h + pocketsphinx/ps_lattice.h + pocketsphinx/ps_mllr.h + pocketsphinx.h + sphinxbase/f2c.h + sphinxbase/hash_table.h + sphinxbase/profile.h + sphinxbase/byteorder.h + sphinxbase/filename.h + sphinxbase/logmath.h + sphinxbase/genrand.h + sphinxbase/sbthread.h + sphinxbase/listelem_alloc.h + sphinxbase/clapack_lite.h + sphinxbase/fixpoint.h + sphinxbase/sphinxbase_export.h + sphinxbase/bio.h + sphinxbase/bitvec.h + sphinxbase/priority_queue.h + sphinxbase/glist.h + sphinxbase/prim_type.h + sphinxbase/ad.h + sphinxbase/agc.h + sphinxbase/yin.h + sphinxbase/pio.h + sphinxbase/err.h + sphinxbase/cmd_ln.h + sphinxbase/fsg_model.h + sphinxbase/strfuncs.h + sphinxbase/feat.h + sphinxbase/ckd_alloc.h + sphinxbase/heap.h + sphinxbase/mmio.h + sphinxbase/fe.h + sphinxbase/cmn.h + sphinxbase/case.h + sphinxbase/jsgf.h + sphinxbase/bitarr.h + sphinxbase/matrix.h + sphinxbase/ngram_model.h DESTINATION include) diff --git a/include/cmdln_macro.h b/include/pocketsphinx/cmdln_macro.h similarity index 100% rename from include/cmdln_macro.h rename to include/pocketsphinx/cmdln_macro.h From d93924944354dfa6a137e46cd5bc331fa0f90e32 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:23:58 -0400 Subject: [PATCH 18/94] build: add an ignore file --- .gitignore | 15 +++++ autogen.sh | 112 ---------------------------------- configure.ac | 165 --------------------------------------------------- 3 files changed, 15 insertions(+), 277 deletions(-) create mode 100644 .gitignore delete mode 100755 autogen.sh delete mode 100644 configure.ac diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..2a70e1b52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +build/ +*~ +.vscode/settings.json +*.egg-info +_skbuild +dist +MANIFEST +__pycache__ +jsbuild +CMakeCache.txt +CMakeFiles +CTestTestfile.cmake +DartConfiguration.tcl +cmake_install.cmake + diff --git a/autogen.sh b/autogen.sh deleted file mode 100755 index e3fdfde6b..000000000 --- a/autogen.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/bin/sh -# Run this to generate all the initial makefiles, etc. - -srcdir=`dirname $0` -PKG_NAME="the package." - -DIE=0 - -# Check tools - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`autoconf' installed to." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(grep "^LT_INIT" $srcdir/configure.ac >/dev/null) && { - if libtoolize --version /dev/null 2>&1; then - LIBTOOLIZE=libtoolize - elif glibtoolize --version /dev/null 2>&1; then - LIBTOOLIZE=glibtoolize - else - echo - echo "**Error**: You must have \`libtool' installed." - echo "Get ftp://ftp.gnu.org/pub/gnu/libtool/libtool-2.2.6b.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - fi -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`automake' installed." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.11.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - NO_AUTOMAKE=yes -} - - -# if no automake, don't bother testing for aclocal -test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: Missing \`aclocal'. The version of \`automake'" - echo "installed doesn't appear recent enough." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.11.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "**Warning**: I am going to run \`configure' with no arguments." - echo "If you wish to pass any to it, please specify them on the" - echo \`$0\'" command line." - echo -fi - -case $CC in -xlc ) - am_opt=--include-deps;; -esac - -for coin in `find $srcdir -name configure.ac -print` -do - dr=`dirname $coin` - if test -f $dr/NO-AUTO-GEN; then - echo skipping $dr -- flagged as no auto-gen - else - echo processing $dr - macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin` - ( cd $dr - aclocalinclude="$ACLOCAL_FLAGS" - for k in $macrodirs; do - if test -d $k; then - aclocalinclude="$aclocalinclude -I $k" - ##else - ## echo "**Warning**: No such directory \`$k'. Ignored." - fi - done - if grep "^LT_INIT" configure.ac >/dev/null; then - echo "Running $LIBTOOLIZE..." - $LIBTOOLIZE --force --copy - fi - echo "Running aclocal $aclocalinclude ..." - aclocal -I m4 $aclocalinclude - if grep "^AC_CONFIG_HEADER" configure.ac >/dev/null; then - echo "Running autoheader..." - autoheader - fi - echo "Running automake --foreign --copy $am_opt ..." - automake --add-missing --foreign --copy $am_opt - echo "Running autoconf ..." - autoconf - ) - fi -done - -#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c - -if test x$NOCONFIGURE = x; then - echo Running $srcdir/configure $conf_flags "$@" ... - $srcdir/configure $conf_flags "$@" \ - && echo Now type \`make\' to compile $PKG_NAME -else - echo Skipping configure process. -fi diff --git a/configure.ac b/configure.ac deleted file mode 100644 index 4d69cc5c4..000000000 --- a/configure.ac +++ /dev/null @@ -1,165 +0,0 @@ -dnl Welcome to the Sphinx automated build system. -dnl try not to hurt yourself ;) - -AC_INIT(pocketsphinx, 5prealpha) -AC_CONFIG_HEADERS([include/config.h]) -AM_INIT_AUTOMAKE([no-define foreign]) -AC_CONFIG_MACRO_DIR([m4]) - -CFLAGS=${CFLAGS:--g -O2 -Wall} - -AC_CANONICAL_HOST -AC_PROG_CC -AC_CHECK_TYPES(long long) -AC_CHECK_SIZEOF(long long) - -LT_INIT - -dnl -dnl Check for pkgconfig -dnl -PKG_PROG_PKG_CONFIG - -dnl -dnl Check for Doxygen, and build dox if present -dnl -AC_CHECK_PROG(HAVE_DOXYGEN, doxygen, yes, no) -AM_CONDITIONAL(BUILD_DOXYGEN, test "x$HAVE_DOXYGEN" = "xyes") - -dnl Check for SWIG and Python -AC_ARG_WITH(python, - AS_HELP_STRING([--with-python], - [Enable Python extension, built with swig, enabled by default])) - -if test "x${with_python}" != "xno"; then - AM_PATH_PYTHON(3.0, [], [AC_MSG_ERROR([python not found])]) - AX_PYTHON_DEVEL() - AX_PKG_SWIG(2.0, [], [AC_MSG_ERROR([swig not found])]) -fi - -AC_SUBST([PYTHON_CPPFLAGS]) -AM_CONDITIONAL(BUILD_SWIG, test "x$SWIG" != "x") - -dnl swig python check - -dnl -dnl Now check for GStreamer, and build the plugin if it's available -dnl -GST_MAJORMINOR=1.0 -PKG_CHECK_MODULES(GStreamer, [gstreamer-$GST_MAJORMINOR >= 1.0 - gstreamer-base-$GST_MAJORMINOR >= 1.0 - gstreamer-plugins-base-$GST_MAJORMINOR >= 1.0], - HAVE_GST=yes, HAVE_GST=no) -dnl Don't build GStreamer when cross-compiling -AM_CONDITIONAL(BUILD_GST, test x$cross_compiling != xyes && test "x$HAVE_GST" = "xyes") -GST_CFLAGS="$GStreamer_CFLAGS $GStreamer_ERROR" -GST_LIBS="$GStreamer_LIBS" -AC_SUBST(GST_MAJORMINOR) -AC_SUBST(GST_CFLAGS) -AC_SUBST(GST_LIBS) - -dnl set the plugindir where plugins should be installed -if test "x${prefix}" = "x$HOME"; then - plugindir="$HOME/.gstreamer-$GST_MAJORMINOR/plugins" -else - plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" -fi -AC_SUBST(plugindir) - -dnl set proper LDFLAGS for plugins -GST_PLUGIN_LDFLAGS='-module -avoid-version -export-symbols-regex [_]*\(gst_\|Gst\|GST_\).*' -AC_SUBST(GST_PLUGIN_LDFLAGS) - -dnl -dnl Get SphinxBase from command line if given -dnl -AC_ARG_WITH(sphinxbase, - AS_HELP_STRING([--with-sphinxbase=DIRECTORY], - [Look for SphinxBase installation in DIRECTORY. If this is 'auto', - the system-wide installation will be used.]), - sphinxbase=$withval) - - -dnl -dnl Check for SphinxBase in parent directories -dnl -if test x$sphinxbase = x; then - dn=`dirname $0` - case "$dn" in - .) - sbdir="`pwd`/.." - ;; - [\\/]* | ?:[\\/]*) - sbdir="$dn/.." - ;; - *) - sbdir="`pwd`/$dn/.." - ;; - esac - # Look for sphinxbase in the parent directory - for sb in "$sbdir/sphinxbase" \ - "$sbdir/sphinxbase"*; do - AC_MSG_CHECKING([for sphinxbase in $sb]) - if test -f "$sb/src/libsphinxbase/libsphinxbase.la"; then - sphinxbase="$sb" - AC_MSG_RESULT(yes) - break - else - AC_MSG_RESULT(no) - fi - done -fi - -dnl -dnl Check for system SphinxBase if none was passed to us -dnl Also allow --with-sphinxbase=auto to use system one explicitly -dnl -if test x$sphinxbase = x || test x$sphinxbase = xauto; then - sphinxbase= - - if test "x$PKG_CONFIG" = "x"; then - SPHINXBASE_CFLAGS = "-I/usr/include/sphinxbase -I/usr/local/include/sphinxbase" - SPHINXBASE_LIBS = "-lsphinxbase" - SPHINXBASE_PREFIX="/usr/local" - else - PKG_CHECK_MODULES(SPHINXBASE, [sphinxbase],,[ - AC_MSG_FAILURE(dnl -[SphinxBase was not found on your system. -Make sure that you have installed it and that the -PKG_CONFIG_PATH environment variable is set correctly, if -it was installed in a non-standard prefix.])]) - SPHINXBASE_PREFIX=`$PKG_CONFIG --variable=prefix sphinxbase` - fi - - LIBS="$LIBS $SPHINXBASE_LIBS" - CPPFLAGS="$CPPFLAGS $SPHINXBASE_CFLAGS" - SPHINXBASE_SWIG="$SPHINXBASE_PREFIX/share/sphinxbase/swig" - AC_CHECK_HEADER(sphinx_config.h,,[AC_MSG_FAILURE([SphinxBase was not found on your system.])]) -else - LIBS="$LIBS -lsphinxbase" - LDFLAGS="$LDFLAGS -L$sphinxbase/lib -L$sphinxbase/src/libsphinxad -L$sphinxbase/src/libsphinxbase" - CPPFLAGS="$CPPFLAGS -I$sphinxbase/include -I$sphinxbase/include/sphinxbase" - SPHINXBASE_SWIG="$sphinxbase/swig" -fi - -AC_SUBST(SPHINXBASE_SWIG) - -AC_OUTPUT([ -pocketsphinx.pc -Makefile -include/Makefile -src/Makefile -swig/Makefile -swig/python/Makefile -swig/python/test/Makefile -src/libpocketsphinx/Makefile -src/programs/Makefile -src/gst-plugin/Makefile -doc/Makefile -doc/doxyfile -model/Makefile -test/Makefile -test/testfuncs.sh -test/unit/Makefile -test/regression/Makefile -]) From cb1388b0cebf50ac79c252b3aa9ee734db3a7756 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:24:25 -0400 Subject: [PATCH 19/94] build: get includes exporting and programs building --- CMakeLists.txt | 2 +- src/CMakeLists.txt | 7 +++++-- src/libpocketsphinx/acmod.h | 2 +- src/programs/CMakeLists.txt | 8 ++++++++ 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 src/programs/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index fc91f8601..190a9cd08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,7 +54,7 @@ endif() cmake_print_variables(FIXED_POINT DEFAULT_RADIX) configure_file(config.h.in config.h) -configure_file(sphinx_config.h.in include/sphinxbase/sphinx_config.h) +configure_file(sphinx_config.h.in include/sphinx_config.h) add_definitions(-DHAVE_CONFIG_H) add_subdirectory(src) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 21df94ba7..807402dfc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -84,12 +84,15 @@ add_library(pocketsphinx target_include_directories( pocketsphinx PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/libpocketsphinx pocketsphinx PRIVATE ${CMAKE_BINARY_DIR} # config.h - pocketsphinx PRIVATE ${CMAKE_BINARY_DIR}/include/sphinxbase pocketsphinx PRIVATE ${CMAKE_SOURCE_DIR}/include/pocketsphinx pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include - pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include/sphinxbase + pocketsphinx PUBLIC ${CMAKE_BINARY_DIR}/include + pocketsphinx INTERFACE ${CMAKE_SOURCE_DIR}/include ) find_library(MATH_LIBRARY m) if(MATH_LIBRARY) target_link_libraries(pocketsphinx PUBLIC ${MATH_LIBRARY}) endif() +find_package(Threads) +target_link_libraries(pocketsphinx PUBLIC Threads::Threads) +add_subdirectory(programs) diff --git a/src/libpocketsphinx/acmod.h b/src/libpocketsphinx/acmod.h index 2c06f5c00..0c47690e5 100644 --- a/src/libpocketsphinx/acmod.h +++ b/src/libpocketsphinx/acmod.h @@ -56,7 +56,7 @@ #include /* Local headers. */ -#include "ps_mllr.h" +#include #include "bin_mdef.h" #include "tmat.h" #include "hmm.h" diff --git a/src/programs/CMakeLists.txt b/src/programs/CMakeLists.txt new file mode 100644 index 000000000..9529985ae --- /dev/null +++ b/src/programs/CMakeLists.txt @@ -0,0 +1,8 @@ +add_executable(pocketsphinx_batch batch.c) +target_link_libraries(pocketsphinx_batch pocketsphinx) +target_include_directories( + pocketsphinx_batch PRIVATE ${CMAKE_SOURCE_DIR}/src/libpocketsphinx) +add_executable(pocketsphinx_mdef_convert mdef_convert.c) +target_link_libraries(pocketsphinx_mdef_convert pocketsphinx) +target_include_directories( + pocketsphinx_mdef_convert PRIVATE ${CMAKE_SOURCE_DIR}/src/libpocketsphinx) From 8756ea0f336806b9c4fa3b3e4d152931bf6cda01 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:25:24 -0400 Subject: [PATCH 20/94] build: remove at least the top-level Makefile.am so nobody's confused --- Makefile.am | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 Makefile.am diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 121e3fb63..000000000 --- a/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -SUBDIRS = src doc model include test swig - -EXTRA_DIST = \ - LICENSE \ - autogen.sh \ - m4/pkg.m4 \ - pocketsphinx.pc.in \ - pocketsphinx.sln \ - win32/pocketsphinx/pocketsphinx.vcxproj \ - win32/pocketsphinx/pocketsphinx.vcxproj.filters \ - win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj \ - win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj \ - win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = pocketsphinx.pc -CLEANFILES = pocketsphinx.pc - -ACLOCAL_AMFLAGS = -I m4 From 61f984ffdf4281a01a9e62377b9bd10c9914dd3f Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:27:08 -0400 Subject: [PATCH 21/94] include cmd_ln in sphinx_fe --- src/sphinx_fe/sphinx_fe.c | 168 +++++++++++++++++++++++++++++++++++++- 1 file changed, 167 insertions(+), 1 deletion(-) diff --git a/src/sphinx_fe/sphinx_fe.c b/src/sphinx_fe/sphinx_fe.c index e4229b4a1..5f8749593 100644 --- a/src/sphinx_fe/sphinx_fe.c +++ b/src/sphinx_fe/sphinx_fe.c @@ -55,7 +55,173 @@ #include #include "sphinx_wave2feat.h" -#include "cmd_ln_defn.h" + +const char helpstr[] = + "Description: \n\ +Extract acoustic features form from audio file.\n\ +\n\ +The main parameters that affect the final output, with typical values, are:\n\ +\n\ +samprate, typically 8000, 11025, or 16000\n\ +lowerf, 130, 200, 130, for the respective sampling rates above\n\ +upperf, 3700, 5200, 6800, for the respective sampling rates above\n\ +nfilt, 31, 37, 40, for the respective sampling rates above\n\ +nfft, 256 or 512\n\ +format, raw or nist or mswav\n\ +\""; + +const char examplestr[] = + "Example: \n\ +This example creates a cepstral file named \"output.mfc\" from an input audio file named \"input.raw\", which is a raw audio file (no header information), which was originally sampled at 16kHz. \n\ +\n\ +sphinx_fe -i input.raw \n\ + -o output.mfc \n\ + -input_endian little \n\ + -samprate 16000 \n\ + -lowerf 130 \n\ + -upperf 6800 \n\ + -nfilt 40 \n\ + -nfft 512"; + +static arg_t defn[] = { + { "-help", + ARG_BOOLEAN, + "no", + "Shows the usage of the tool"}, + + { "-example", + ARG_BOOLEAN, + "no", + "Shows example of how to use the tool"}, + + waveform_to_cepstral_command_line_macro(), + + { "-argfile", + ARG_STRING, + NULL, + "Argument file (e.g. feat.params from an acoustic model) to read parameters from. This will override anything set in other command line arguments." }, + + { "-i", + ARG_STRING, + NULL, + "Single audio input file" }, + + { "-o", + ARG_STRING, + NULL, + "Single cepstral output file" }, + + { "-c", + ARG_STRING, + NULL, + "Control file for batch processing" }, + + { "-nskip", + ARG_INT32, + "0", + "If a control file was specified, the number of utterances to skip at the head of the file" }, + + { "-runlen", + ARG_INT32, + "-1", + "If a control file was specified, the number of utterances to process, or -1 for all" }, + + { "-part", + ARG_INT32, + "0", + "Index of the part to run (supersedes -nskip and -runlen if non-zero)" }, + + { "-npart", + ARG_INT32, + "0", + "Number of parts to run in (supersedes -nskip and -runlen if non-zero)" }, + + { "-di", + ARG_STRING, + NULL, + "Input directory, input file names are relative to this, if defined" }, + + { "-ei", + ARG_STRING, + NULL, + "Input extension to be applied to all input files" }, + + { "-do", + ARG_STRING, + NULL, + "Output directory, output files are relative to this" }, + + { "-eo", + ARG_STRING, + NULL, + "Output extension to be applied to all output files" }, + + { "-build_outdirs", + ARG_BOOLEAN, + "yes", + "Create missing subdirectories in output directory" }, + + { "-sph2pipe", + ARG_BOOLEAN, + "no", + "Input is NIST sphere (possibly with Shorten), use sph2pipe to convert" }, + + { "-nist", + ARG_BOOLEAN, + "no", + "Defines input format as NIST sphere" }, + + { "-raw", + ARG_BOOLEAN, + "no", + "Defines input format as raw binary data" }, + + { "-mswav", + ARG_BOOLEAN, + "no", + "Defines input format as Microsoft Wav (RIFF)" }, + + { "-nchans", + ARG_INT32, + "1", + "Number of channels of data (interlaced samples assumed)" }, + + { "-whichchan", + ARG_INT32, + "0", + "Channel to process (numbered from 1), or 0 to mix all channels" }, + + { "-ofmt", + ARG_STRING, + "sphinx", + "Format of output files - one of sphinx, htk, text." }, + + { "-mach_endian", + ARG_STRING, +#ifdef WORDS_BIGENDIAN + "big", +#else + "little", +#endif + "Endianness of machine, big or little" }, + + { "-blocksize", + ARG_INT32, + "2048", + "Number of samples to read at a time." }, + + { "-spec2cep", + ARG_BOOLEAN, + "no", + "Input is log spectral files, output is cepstral files" }, + + { "-cep2spec", + ARG_BOOLEAN, + "no", + "Input is cepstral files, output is log spectral files" }, + + { NULL, 0, NULL, NULL } +}; typedef struct audio_type_s { char const *name; From d67d75f8713b0718e75ca9d7f79d0a87f97a66e1 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:30:56 -0400 Subject: [PATCH 22/94] build: move all programs to one directory --- src/programs/CMakeLists.txt | 6 + src/{sphinx_jsgf2fsg => programs}/fsg2dot.pl | 0 .../main.c => programs/jsgf2fsg.c} | 0 .../main_cepview.c | 0 src/{sphinx_fe => programs}/sphinx_fe.c | 0 .../sphinx_lm_convert.c | 0 .../sphinx_lm_eval.c | 0 .../sphinx_pitch.c | 0 .../sphinx_wave2feat.h | 0 src/sphinx_adtools/Makefile.am | 8 - src/sphinx_cepview/Makefile.am | 8 - src/sphinx_fe/Makefile.am | 14 -- src/sphinx_fe/cmd_ln_defn.h | 223 ------------------ src/sphinx_jsgf2fsg/Makefile.am | 10 - src/sphinx_lmtools/Makefile.am | 9 - 15 files changed, 6 insertions(+), 272 deletions(-) rename src/{sphinx_jsgf2fsg => programs}/fsg2dot.pl (100%) rename src/{sphinx_jsgf2fsg/main.c => programs/jsgf2fsg.c} (100%) rename src/{sphinx_cepview => programs}/main_cepview.c (100%) rename src/{sphinx_fe => programs}/sphinx_fe.c (100%) rename src/{sphinx_lmtools => programs}/sphinx_lm_convert.c (100%) rename src/{sphinx_lmtools => programs}/sphinx_lm_eval.c (100%) rename src/{sphinx_adtools => programs}/sphinx_pitch.c (100%) rename src/{sphinx_fe => programs}/sphinx_wave2feat.h (100%) delete mode 100644 src/sphinx_adtools/Makefile.am delete mode 100644 src/sphinx_cepview/Makefile.am delete mode 100644 src/sphinx_fe/Makefile.am delete mode 100644 src/sphinx_fe/cmd_ln_defn.h delete mode 100644 src/sphinx_jsgf2fsg/Makefile.am delete mode 100644 src/sphinx_lmtools/Makefile.am diff --git a/src/programs/CMakeLists.txt b/src/programs/CMakeLists.txt index 9529985ae..d11c9f000 100644 --- a/src/programs/CMakeLists.txt +++ b/src/programs/CMakeLists.txt @@ -1,3 +1,4 @@ +# PocketSphinx programs add_executable(pocketsphinx_batch batch.c) target_link_libraries(pocketsphinx_batch pocketsphinx) target_include_directories( @@ -6,3 +7,8 @@ add_executable(pocketsphinx_mdef_convert mdef_convert.c) target_link_libraries(pocketsphinx_mdef_convert pocketsphinx) target_include_directories( pocketsphinx_mdef_convert PRIVATE ${CMAKE_SOURCE_DIR}/src/libpocketsphinx) + +# SphinxBase programs +add_executable(sphinx_cepview main_cepview.c) +target_link_libraries(sphinx_cepview pocketsphinx) +target_include_directories(sphinx_cepview PRIVATE ${CMAKE_BINARY_DIR}) diff --git a/src/sphinx_jsgf2fsg/fsg2dot.pl b/src/programs/fsg2dot.pl similarity index 100% rename from src/sphinx_jsgf2fsg/fsg2dot.pl rename to src/programs/fsg2dot.pl diff --git a/src/sphinx_jsgf2fsg/main.c b/src/programs/jsgf2fsg.c similarity index 100% rename from src/sphinx_jsgf2fsg/main.c rename to src/programs/jsgf2fsg.c diff --git a/src/sphinx_cepview/main_cepview.c b/src/programs/main_cepview.c similarity index 100% rename from src/sphinx_cepview/main_cepview.c rename to src/programs/main_cepview.c diff --git a/src/sphinx_fe/sphinx_fe.c b/src/programs/sphinx_fe.c similarity index 100% rename from src/sphinx_fe/sphinx_fe.c rename to src/programs/sphinx_fe.c diff --git a/src/sphinx_lmtools/sphinx_lm_convert.c b/src/programs/sphinx_lm_convert.c similarity index 100% rename from src/sphinx_lmtools/sphinx_lm_convert.c rename to src/programs/sphinx_lm_convert.c diff --git a/src/sphinx_lmtools/sphinx_lm_eval.c b/src/programs/sphinx_lm_eval.c similarity index 100% rename from src/sphinx_lmtools/sphinx_lm_eval.c rename to src/programs/sphinx_lm_eval.c diff --git a/src/sphinx_adtools/sphinx_pitch.c b/src/programs/sphinx_pitch.c similarity index 100% rename from src/sphinx_adtools/sphinx_pitch.c rename to src/programs/sphinx_pitch.c diff --git a/src/sphinx_fe/sphinx_wave2feat.h b/src/programs/sphinx_wave2feat.h similarity index 100% rename from src/sphinx_fe/sphinx_wave2feat.h rename to src/programs/sphinx_wave2feat.h diff --git a/src/sphinx_adtools/Makefile.am b/src/sphinx_adtools/Makefile.am deleted file mode 100644 index 3b9193174..000000000 --- a/src/sphinx_adtools/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -bin_PROGRAMS = sphinx_pitch sphinx_cont_seg - -sphinx_cont_seg_SOURCES = cont_seg.c - -LDADD = $(top_builddir)/src/libsphinxbase/libsphinxbase.la \ - $(top_builddir)/src/libsphinxad/libsphinxad.la - -AM_CFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include diff --git a/src/sphinx_cepview/Makefile.am b/src/sphinx_cepview/Makefile.am deleted file mode 100644 index f0fdd8522..000000000 --- a/src/sphinx_cepview/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -bin_PROGRAMS = sphinx_cepview - -sphinx_cepview_SOURCES = main_cepview.c - -sphinx_cepview_LDADD = \ - $(top_builddir)/src/libsphinxbase/libsphinxbase.la - -AM_CFLAGS =-I$(top_srcdir)/include -I$(top_builddir)/include diff --git a/src/sphinx_fe/Makefile.am b/src/sphinx_fe/Makefile.am deleted file mode 100644 index c7e4b3b1a..000000000 --- a/src/sphinx_fe/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -bin_PROGRAMS = sphinx_fe - -sphinx_fe_SOURCES = sphinx_fe.c - -noinst_HEADERS = cmd_ln_defn.h \ - sphinx_wave2feat.h - -sphinx_fe_LDADD = \ - $(top_builddir)/src/libsphinxbase/libsphinxbase.la - -AM_CFLAGS =-I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -I$(top_srcdir)/src/libsphinxbase/fe - diff --git a/src/sphinx_fe/cmd_ln_defn.h b/src/sphinx_fe/cmd_ln_defn.h deleted file mode 100644 index 8924269d1..000000000 --- a/src/sphinx_fe/cmd_ln_defn.h +++ /dev/null @@ -1,223 +0,0 @@ -/* ==================================================================== - * Copyright (c) 1998-2000 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ -/********************************************************************* - * - * File: cmd_ln_defn.h - * - * Description: - * Command line argument definition - * - * Author: - * - *********************************************************************/ - -#ifndef CMD_LN_DEFN_H -#define CMD_LN_DEFN_H - -#include -#include - -const char helpstr[] = - "Description: \n\ -Extract acoustic features form from audio file.\n\ -\n\ -The main parameters that affect the final output, with typical values, are:\n\ -\n\ -samprate, typically 8000, 11025, or 16000\n\ -lowerf, 130, 200, 130, for the respective sampling rates above\n\ -upperf, 3700, 5200, 6800, for the respective sampling rates above\n\ -nfilt, 31, 37, 40, for the respective sampling rates above\n\ -nfft, 256 or 512\n\ -format, raw or nist or mswav\n\ -\""; - -const char examplestr[] = - "Example: \n\ -This example creates a cepstral file named \"output.mfc\" from an input audio file named \"input.raw\", which is a raw audio file (no header information), which was originally sampled at 16kHz. \n\ -\n\ -sphinx_fe -i input.raw \n\ - -o output.mfc \n\ - -input_endian little \n\ - -samprate 16000 \n\ - -lowerf 130 \n\ - -upperf 6800 \n\ - -nfilt 40 \n\ - -nfft 512"; - -static arg_t defn[] = { - { "-help", - ARG_BOOLEAN, - "no", - "Shows the usage of the tool"}, - - { "-example", - ARG_BOOLEAN, - "no", - "Shows example of how to use the tool"}, - - waveform_to_cepstral_command_line_macro(), - - { "-argfile", - ARG_STRING, - NULL, - "Argument file (e.g. feat.params from an acoustic model) to read parameters from. This will override anything set in other command line arguments." }, - - { "-i", - ARG_STRING, - NULL, - "Single audio input file" }, - - { "-o", - ARG_STRING, - NULL, - "Single cepstral output file" }, - - { "-c", - ARG_STRING, - NULL, - "Control file for batch processing" }, - - { "-nskip", - ARG_INT32, - "0", - "If a control file was specified, the number of utterances to skip at the head of the file" }, - - { "-runlen", - ARG_INT32, - "-1", - "If a control file was specified, the number of utterances to process, or -1 for all" }, - - { "-part", - ARG_INT32, - "0", - "Index of the part to run (supersedes -nskip and -runlen if non-zero)" }, - - { "-npart", - ARG_INT32, - "0", - "Number of parts to run in (supersedes -nskip and -runlen if non-zero)" }, - - { "-di", - ARG_STRING, - NULL, - "Input directory, input file names are relative to this, if defined" }, - - { "-ei", - ARG_STRING, - NULL, - "Input extension to be applied to all input files" }, - - { "-do", - ARG_STRING, - NULL, - "Output directory, output files are relative to this" }, - - { "-eo", - ARG_STRING, - NULL, - "Output extension to be applied to all output files" }, - - { "-build_outdirs", - ARG_BOOLEAN, - "yes", - "Create missing subdirectories in output directory" }, - - { "-sph2pipe", - ARG_BOOLEAN, - "no", - "Input is NIST sphere (possibly with Shorten), use sph2pipe to convert" }, - - { "-nist", - ARG_BOOLEAN, - "no", - "Defines input format as NIST sphere" }, - - { "-raw", - ARG_BOOLEAN, - "no", - "Defines input format as raw binary data" }, - - { "-mswav", - ARG_BOOLEAN, - "no", - "Defines input format as Microsoft Wav (RIFF)" }, - - { "-nchans", - ARG_INT32, - "1", - "Number of channels of data (interlaced samples assumed)" }, - - { "-whichchan", - ARG_INT32, - "0", - "Channel to process (numbered from 1), or 0 to mix all channels" }, - - { "-ofmt", - ARG_STRING, - "sphinx", - "Format of output files - one of sphinx, htk, text." }, - - { "-mach_endian", - ARG_STRING, -#ifdef WORDS_BIGENDIAN - "big", -#else - "little", -#endif - "Endianness of machine, big or little" }, - - { "-blocksize", - ARG_INT32, - "2048", - "Number of samples to read at a time." }, - - { "-spec2cep", - ARG_BOOLEAN, - "no", - "Input is log spectral files, output is cepstral files" }, - - { "-cep2spec", - ARG_BOOLEAN, - "no", - "Input is cepstral files, output is log spectral files" }, - - { NULL, 0, NULL, NULL } -}; - - -#define CMD_LN_DEFN_H - -#endif /* CMD_LN_DEFN_H */ diff --git a/src/sphinx_jsgf2fsg/Makefile.am b/src/sphinx_jsgf2fsg/Makefile.am deleted file mode 100644 index 5e2b54b9d..000000000 --- a/src/sphinx_jsgf2fsg/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -bin_PROGRAMS = sphinx_jsgf2fsg - -sphinx_jsgf2fsg_SOURCES = main.c - -sphinx_jsgf2fsg_LDADD = \ - $(top_builddir)/src/libsphinxbase/libsphinxbase.la - -AM_CFLAGS =-I$(top_srcdir)/include -I$(top_builddir)/include - -EXTRA_DIST = fsg2dot.pl diff --git a/src/sphinx_lmtools/Makefile.am b/src/sphinx_lmtools/Makefile.am deleted file mode 100644 index ea6bed25a..000000000 --- a/src/sphinx_lmtools/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -bin_PROGRAMS = sphinx_lm_eval sphinx_lm_convert - -LDADD = \ - $(top_builddir)/src/libsphinxbase/libsphinxbase.la \ - $(top_builddir)/src/libsphinxbase/lm/libsphinxlm.la - -AM_CFLAGS =-I$(top_srcdir)/include -I$(top_builddir)/include \ - -I$(top_srcdir)/src/libsphinxlm - From ed0131f940eac06ab13cc5d4a7b9aeeb9cce3f59 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:34:01 -0400 Subject: [PATCH 23/94] build: fix program sources and build all the things --- src/programs/CMakeLists.txt | 31 ++++++++++--------- .../{batch.c => pocketsphinx_batch.c} | 0 ..._convert.c => pocketsphinx_mdef_convert.c} | 0 .../{main_cepview.c => sphinx_cepview.c} | 0 .../{jsgf2fsg.c => sphinx_jsgf2fsg.c} | 0 5 files changed, 17 insertions(+), 14 deletions(-) rename src/programs/{batch.c => pocketsphinx_batch.c} (100%) rename src/programs/{mdef_convert.c => pocketsphinx_mdef_convert.c} (100%) rename src/programs/{main_cepview.c => sphinx_cepview.c} (100%) rename src/programs/{jsgf2fsg.c => sphinx_jsgf2fsg.c} (100%) diff --git a/src/programs/CMakeLists.txt b/src/programs/CMakeLists.txt index d11c9f000..93324976e 100644 --- a/src/programs/CMakeLists.txt +++ b/src/programs/CMakeLists.txt @@ -1,14 +1,17 @@ -# PocketSphinx programs -add_executable(pocketsphinx_batch batch.c) -target_link_libraries(pocketsphinx_batch pocketsphinx) -target_include_directories( - pocketsphinx_batch PRIVATE ${CMAKE_SOURCE_DIR}/src/libpocketsphinx) -add_executable(pocketsphinx_mdef_convert mdef_convert.c) -target_link_libraries(pocketsphinx_mdef_convert pocketsphinx) -target_include_directories( - pocketsphinx_mdef_convert PRIVATE ${CMAKE_SOURCE_DIR}/src/libpocketsphinx) - -# SphinxBase programs -add_executable(sphinx_cepview main_cepview.c) -target_link_libraries(sphinx_cepview pocketsphinx) -target_include_directories(sphinx_cepview PRIVATE ${CMAKE_BINARY_DIR}) +set(POCKETSPHINX_PROGRAMS + pocketsphinx_batch + pocketsphinx_mdef_convert + sphinx_cepview + sphinx_fe + sphinx_jsgf2fsg + sphinx_lm_convert + sphinx_lm_eval + sphinx_pitch + ) +foreach(PROGRAM ${POCKETSPHINX_PROGRAMS}) + add_executable(${PROGRAM} ${PROGRAM}.c) + target_link_libraries(${PROGRAM} pocketsphinx) + target_include_directories( + ${PROGRAM} PRIVATE ${CMAKE_SOURCE_DIR}/src/libpocketsphinx + ${PROGRAM} PRIVATE ${CMAKE_BINARY_DIR}) +endforeach() diff --git a/src/programs/batch.c b/src/programs/pocketsphinx_batch.c similarity index 100% rename from src/programs/batch.c rename to src/programs/pocketsphinx_batch.c diff --git a/src/programs/mdef_convert.c b/src/programs/pocketsphinx_mdef_convert.c similarity index 100% rename from src/programs/mdef_convert.c rename to src/programs/pocketsphinx_mdef_convert.c diff --git a/src/programs/main_cepview.c b/src/programs/sphinx_cepview.c similarity index 100% rename from src/programs/main_cepview.c rename to src/programs/sphinx_cepview.c diff --git a/src/programs/jsgf2fsg.c b/src/programs/sphinx_jsgf2fsg.c similarity index 100% rename from src/programs/jsgf2fsg.c rename to src/programs/sphinx_jsgf2fsg.c From 0c5c24f6e87ead7037e843606d851cac51cf6ee8 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:34:18 -0400 Subject: [PATCH 24/94] build: another Makefile.am gone --- src/programs/Makefile.am | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 src/programs/Makefile.am diff --git a/src/programs/Makefile.am b/src/programs/Makefile.am deleted file mode 100644 index eb882b50d..000000000 --- a/src/programs/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -bin_PROGRAMS = \ - pocketsphinx_batch \ - pocketsphinx_continuous \ - pocketsphinx_mdef_convert - -pocketsphinx_mdef_convert_SOURCES = mdef_convert.c -pocketsphinx_mdef_convert_LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la - -pocketsphinx_batch_SOURCES = batch.c -pocketsphinx_batch_LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la - -pocketsphinx_continuous_SOURCES = continuous.c -pocketsphinx_continuous_LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -lsphinxad - -AM_CFLAGS =-I$(top_srcdir)/include \ - -I$(top_srcdir)/src/libpocketsphinx \ - -I$(top_builddir)/include From bbcf08f8e2e6c9703708cfcb41bec9ab0914dbac Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:35:05 -0400 Subject: [PATCH 25/94] build: remove more Makefile.am --- src/Makefile.am | 3 -- src/libpocketsphinx/Makefile.am | 75 ------------------------------ src/libsphinxbase/Makefile.am | 12 ----- src/libsphinxbase/fe/Makefile.am | 29 ------------ src/libsphinxbase/feat/Makefile.am | 14 ------ src/libsphinxbase/lm/Makefile.am | 36 -------------- src/libsphinxbase/util/Makefile.am | 46 ------------------ 7 files changed, 215 deletions(-) delete mode 100644 src/Makefile.am delete mode 100644 src/libpocketsphinx/Makefile.am delete mode 100644 src/libsphinxbase/Makefile.am delete mode 100644 src/libsphinxbase/fe/Makefile.am delete mode 100644 src/libsphinxbase/feat/Makefile.am delete mode 100644 src/libsphinxbase/lm/Makefile.am delete mode 100644 src/libsphinxbase/util/Makefile.am diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index f82ea71cf..000000000 --- a/src/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -SUBDIRS = libpocketsphinx \ - programs \ - gst-plugin diff --git a/src/libpocketsphinx/Makefile.am b/src/libpocketsphinx/Makefile.am deleted file mode 100644 index 0c70ca2ec..000000000 --- a/src/libpocketsphinx/Makefile.am +++ /dev/null @@ -1,75 +0,0 @@ -ARCH = `uname -m | sed s/i.86/i386/`_`uname -s | tr A-Z a-z` - -lib_LTLIBRARIES = libpocketsphinx.la - -libpocketsphinx_la_LDFLAGS = -version-info 3:0:0 -lm - -libpocketsphinx_la_SOURCES = \ - acmod.c \ - bin_mdef.c \ - blkarray_list.c \ - dict.c \ - dict2pid.c \ - fsg_history.c \ - fsg_lextree.c \ - fsg_search.c \ - allphone_search.c \ - kws_search.c \ - kws_detections.c \ - hmm.c \ - mdef.c \ - ms_gauden.c \ - ms_mgau.c \ - ms_senone.c \ - ngram_search.c \ - ngram_search_fwdtree.c \ - ngram_search_fwdflat.c \ - phone_loop_search.c \ - ps_alignment.c \ - ps_lattice.c \ - ps_mllr.c \ - ptm_mgau.c \ - s2_semi_mgau.c \ - state_align_search.c \ - tmat.c \ - vector.c \ - pocketsphinx.c - -noinst_HEADERS = \ - pocketsphinx_internal.h \ - acmod.h \ - ngram_search.h \ - bin_mdef.h \ - blkarray_list.h \ - dict.h \ - dict2pid.h \ - fsg_history.h \ - fsg_lextree.h \ - fsg_search_internal.h \ - allphone_search.h \ - kws_search.h \ - kws_detections.h \ - hmm.h \ - mdef.h \ - ms_gauden.h \ - ms_mgau.h \ - ms_senone.h \ - ngram_search.h \ - ngram_search_fwdtree.h \ - ngram_search_fwdflat.h \ - phone_loop_search.h \ - ps_alignment.h \ - ps_lattice_internal.h \ - ptm_mgau.h \ - s2_semi_mgau.h \ - s3types.h \ - state_align_search.h \ - tied_mgau_common.h \ - tmat.h \ - vector.h - -AM_CFLAGS =\ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DMODELDIR=\"${prefix}/share/pocketsphinx/model\" - diff --git a/src/libsphinxbase/Makefile.am b/src/libsphinxbase/Makefile.am deleted file mode 100644 index dbdc8fd7a..000000000 --- a/src/libsphinxbase/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -SUBDIRS = util fe feat lm - -lib_LTLIBRARIES = libsphinxbase.la - -libsphinxbase_la_SOURCES = - -libsphinxbase_la_LDFLAGS = -version-info 3:0:0 -libsphinxbase_la_LIBADD = $(LTLIBICONV) \ - util/libsphinxutil.la \ - fe/libsphinxfe.la \ - feat/libsphinxfeat.la \ - lm/libsphinxlm.la diff --git a/src/libsphinxbase/fe/Makefile.am b/src/libsphinxbase/fe/Makefile.am deleted file mode 100644 index e21027141..000000000 --- a/src/libsphinxbase/fe/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -noinst_LTLIBRARIES = libsphinxfe.la - -libsphinxfe_la_SOURCES = \ - fe_interface.c \ - fe_noise.c \ - fe_prespch_buf.c \ - fe_sigproc.c \ - fe_warp_affine.c \ - fe_warp.c \ - fe_warp_inverse_linear.c \ - fe_warp_piecewise_linear.c \ - fixlog.c \ - yin.c - -noinst_HEADERS = \ - fe_internal.h \ - fe_noise.h \ - fe_prespch_buf.h \ - fe_type.h \ - fe_warp_affine.h \ - fe_warp.h \ - fe_warp_inverse_linear.h \ - fe_warp_piecewise_linear.h - -AM_CFLAGS =-I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include - -LIBOBJS = @LIBOBJS@ diff --git a/src/libsphinxbase/feat/Makefile.am b/src/libsphinxbase/feat/Makefile.am deleted file mode 100644 index 84341f289..000000000 --- a/src/libsphinxbase/feat/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -noinst_LTLIBRARIES = libsphinxfeat.la - -libsphinxfeat_la_SOURCES = \ - agc.c \ - cmn.c \ - cmn_live.c \ - lda.c \ - feat.c - -AM_CFLAGS =-I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include - -LIBOBJS = @LIBOBJS@ diff --git a/src/libsphinxbase/lm/Makefile.am b/src/libsphinxbase/lm/Makefile.am deleted file mode 100644 index c985deff1..000000000 --- a/src/libsphinxbase/lm/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -noinst_LTLIBRARIES = libsphinxlm.la - -AM_YFLAGS = -d -BUILT_SOURCES = jsgf_parser.h jsgf_parser.c - -libsphinxlm_la_SOURCES = \ - ngrams_raw.c \ - lm_trie.c \ - lm_trie_quant.c \ - ngram_model.c \ - ngram_model_set.c \ - ngram_model_trie.c \ - fsg_model.c \ - jsgf.c \ - jsgf_scanner.c \ - jsgf_parser.y - -libsphinxlm_la_LIBADD = $(LIBICONV) - -noinst_HEADERS = ngram_model_internal.h \ - ngram_model_set.h \ - ngram_model_trie.h \ - ngrams_raw.h \ - lm_trie.h \ - lm_trie_quant.h \ - jsgf_internal.h \ - jsgf_scanner.h \ - jsgf_parser.h - -AM_CFLAGS =-I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include - -# Warning: you need flex 2.6.1 at least, command line is -# flex --nounistd -o jsgf_scanner.c _jsgf_scanner.l -EXTRA_DIST = _jsgf_scanner.l diff --git a/src/libsphinxbase/util/Makefile.am b/src/libsphinxbase/util/Makefile.am deleted file mode 100644 index c7d191178..000000000 --- a/src/libsphinxbase/util/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -noinst_LTLIBRARIES = libsphinxutil.la - -if LAPACK_LITE -LAPACK_LITE_SRCS = \ - slamch.c \ - slapack_lite.c \ - blas_lite.c \ - f2c_lite.c -endif - -libsphinxutil_la_SOURCES = \ - bitarr.c \ - bitvec.c \ - bio.c \ - case.c \ - ckd_alloc.c \ - dtoa.c \ - listelem_alloc.c \ - cmd_ln.c \ - err.c \ - filename.c \ - genrand.c \ - glist.c \ - hash_table.c \ - heap.c \ - logmath.c \ - mmio.c \ - pio.c \ - matrix.c \ - priority_queue.c \ - profile.c \ - sbthread.c \ - strfuncs.c \ - $(LAPACK_LITE_SRCS) - -EXTRA_DIST = \ - slamch.c \ - slapack_lite.c \ - blas_lite.c \ - f2c_lite.c - -AM_CFLAGS =-I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include - -LIBOBJS = @LIBOBJS@ From 4c6d27d78505775d90bd222c5c9b09818d709ee6 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:41:15 -0400 Subject: [PATCH 26/94] set .so version properly --- src/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 807402dfc..6207a8def 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -95,4 +95,8 @@ if(MATH_LIBRARY) endif() find_package(Threads) target_link_libraries(pocketsphinx PUBLIC Threads::Threads) +set_target_properties(pocketsphinx PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}) + add_subdirectory(programs) From 2a81b03e67ff61b1bd15a2e32c73a6a750c64c78 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:48:03 -0400 Subject: [PATCH 27/94] build: use semantic versioning (last Ubuntu package used SONAME of 3) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 190a9cd08..4c2655959 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13) -project(PocketSphinx VERSION 1.0.0 +project(PocketSphinx VERSION 4.0.0 DESCRIPTION "A small speech recognizer" HOMEPAGE_URL "https://github.com/dhdaines/pocketsphinx") include(CMakePrintHelpers) From acde9fe11f2b2b0dcfb8ecd87d09e8b8d76ac2ba Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:55:32 -0400 Subject: [PATCH 28/94] build: just use a different .so version --- CMakeLists.txt | 2 +- src/CMakeLists.txt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c2655959..190a9cd08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13) -project(PocketSphinx VERSION 4.0.0 +project(PocketSphinx VERSION 1.0.0 DESCRIPTION "A small speech recognizer" HOMEPAGE_URL "https://github.com/dhdaines/pocketsphinx") include(CMakePrintHelpers) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6207a8def..e64e2ee8f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -95,8 +95,9 @@ if(MATH_LIBRARY) endif() find_package(Threads) target_link_libraries(pocketsphinx PUBLIC Threads::Threads) +# Shared library version != package version, unfortunately set_target_properties(pocketsphinx PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR}) + VERSION 4.0.0 + SOVERSION 4) add_subdirectory(programs) From 40230dee172627d39a7f317f79dc871c6a5b0085 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 21:59:46 -0400 Subject: [PATCH 29/94] build: finally put sphinx_config.h in where Debian wants it --- CMakeLists.txt | 2 +- include/CMakeLists.txt | 1 - include/sphinxbase/ad.h | 126 ----------------------------- include/sphinxbase/prim_type.h | 2 +- include/sphinxbase/sbthread.h | 3 +- src/libpocketsphinx/ptm_mgau.c | 2 +- src/libpocketsphinx/s2_semi_mgau.c | 2 +- 7 files changed, 5 insertions(+), 133 deletions(-) delete mode 100644 include/sphinxbase/ad.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 190a9cd08..fc91f8601 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,7 +54,7 @@ endif() cmake_print_variables(FIXED_POINT DEFAULT_RADIX) configure_file(config.h.in config.h) -configure_file(sphinx_config.h.in include/sphinx_config.h) +configure_file(sphinx_config.h.in include/sphinxbase/sphinx_config.h) add_definitions(-DHAVE_CONFIG_H) add_subdirectory(src) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index de0d58011..727d655be 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -22,7 +22,6 @@ install(FILES sphinxbase/priority_queue.h sphinxbase/glist.h sphinxbase/prim_type.h - sphinxbase/ad.h sphinxbase/agc.h sphinxbase/yin.h sphinxbase/pio.h diff --git a/include/sphinxbase/ad.h b/include/sphinxbase/ad.h deleted file mode 100644 index 5b9c25fe7..000000000 --- a/include/sphinxbase/ad.h +++ /dev/null @@ -1,126 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 1999-2014 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ -/** \file ad.h - * \brief generic live audio interface for recording and playback - */ - -#ifndef _AD_H_ -#define _AD_H_ - -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -#if 0 -/* Fool Emacs. */ -} -#endif - -#define DEFAULT_SAMPLES_PER_SEC 16000 - -/* Return codes */ -#define AD_OK 0 -#define AD_EOF -1 -#define AD_ERR_GEN -1 -#define AD_ERR_NOT_OPEN -2 -#define AD_ERR_WAVE -3 - -typedef struct ad_rec_s ad_rec_t; - -/** - * Open a specific audio device for recording. - * - * The device is opened in non-blocking mode and placed in idle state. - * - * @return pointer to read-only ad_rec_t structure if successful, NULL - * otherwise. The return value to be used as the first argument to - * other recording functions. - */ -SPHINXBASE_EXPORT -ad_rec_t *ad_open_dev ( - const char *dev, /**< Device name (platform-specific) */ - int32 samples_per_sec /**< Samples per second */ - ); - -/** - * Open the default audio device with a given sampling rate. - */ -SPHINXBASE_EXPORT -ad_rec_t *ad_open_sps ( - int32 samples_per_sec /**< Samples per second */ - ); - - -/** - * Open the default audio device. - */ -SPHINXBASE_EXPORT -ad_rec_t *ad_open ( void ); - - -/* Start audio recording. Return value: 0 if successful, <0 otherwise */ -SPHINXBASE_EXPORT -int32 ad_start_rec (ad_rec_t *); - - -/* Stop audio recording. Return value: 0 if successful, <0 otherwise */ -SPHINXBASE_EXPORT -int32 ad_stop_rec (ad_rec_t *); - - -/* Close the recording device. Return value: 0 if successful, <0 otherwise */ -SPHINXBASE_EXPORT -int32 ad_close (ad_rec_t *); - -/* - * Read next block of audio samples while recording; read upto max samples into buf. - * Return value: # samples actually read (could be 0 since non-blocking); -1 if not - * recording and no more samples remaining to be read from most recent recording. - */ -SPHINXBASE_EXPORT -int32 ad_read (ad_rec_t *, int16 *buf, int32 max); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/sphinxbase/prim_type.h b/include/sphinxbase/prim_type.h index 820fe968f..d4011f363 100644 --- a/include/sphinxbase/prim_type.h +++ b/include/sphinxbase/prim_type.h @@ -85,7 +85,7 @@ extern "C" { } /* Fool Emacs into not indenting things. */ #endif -#include +#include /* Define some things for VisualDSP++ */ #if defined(__ADSPBLACKFIN__) && !defined(__GNUC__) diff --git a/include/sphinxbase/sbthread.h b/include/sphinxbase/sbthread.h index 9154dfe2b..ef9ac957f 100644 --- a/include/sphinxbase/sbthread.h +++ b/include/sphinxbase/sbthread.h @@ -43,8 +43,7 @@ #ifndef __SBTHREAD_H__ #define __SBTHREAD_H__ -#include - +#include #include #include diff --git a/src/libpocketsphinx/ptm_mgau.c b/src/libpocketsphinx/ptm_mgau.c index 041ba18a6..bb27dd7ed 100644 --- a/src/libpocketsphinx/ptm_mgau.c +++ b/src/libpocketsphinx/ptm_mgau.c @@ -48,7 +48,7 @@ #endif /* SphinxBase headers */ -#include +#include #include #include #include diff --git a/src/libpocketsphinx/s2_semi_mgau.c b/src/libpocketsphinx/s2_semi_mgau.c index 568eb4cbe..2aeb8e7fa 100644 --- a/src/libpocketsphinx/s2_semi_mgau.c +++ b/src/libpocketsphinx/s2_semi_mgau.c @@ -48,7 +48,7 @@ #endif /* SphinxBase headers */ -#include +#include #include #include #include From abc8201e5d517ffae8ef465ae364929a2fa2681a Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 22:06:09 -0400 Subject: [PATCH 30/94] refactor: there is no sphinxbase anymore --- CMakeLists.txt | 1 + {src/programs => programs}/CMakeLists.txt | 2 +- {src/programs => programs}/fsg2dot.pl | 0 .../pocketsphinx_batch.c | 0 .../pocketsphinx_mdef_convert.c | 0 {src/programs => programs}/sphinx_cepview.c | 0 {src/programs => programs}/sphinx_fe.c | 0 {src/programs => programs}/sphinx_jsgf2fsg.c | 0 .../programs => programs}/sphinx_lm_convert.c | 0 {src/programs => programs}/sphinx_lm_eval.c | 0 {src/programs => programs}/sphinx_pitch.c | 0 {src/programs => programs}/sphinx_wave2feat.h | 0 src/CMakeLists.txt | 165 +++++++++--------- src/{libpocketsphinx => }/acmod.c | 0 src/{libpocketsphinx => }/acmod.h | 0 src/{libpocketsphinx => }/allphone_search.c | 0 src/{libpocketsphinx => }/allphone_search.h | 0 src/{libpocketsphinx => }/bin_mdef.c | 0 src/{libpocketsphinx => }/bin_mdef.h | 0 src/{libpocketsphinx => }/blkarray_list.c | 0 src/{libpocketsphinx => }/blkarray_list.h | 0 src/{libpocketsphinx => }/dict.c | 0 src/{libpocketsphinx => }/dict.h | 0 src/{libpocketsphinx => }/dict2pid.c | 0 src/{libpocketsphinx => }/dict2pid.h | 0 src/{libpocketsphinx => }/fast_ptm.txt | 0 src/{libsphinxbase => }/fe/fe_design.txt | 0 src/{libsphinxbase => }/fe/fe_interface.c | 0 src/{libsphinxbase => }/fe/fe_internal.h | 0 src/{libsphinxbase => }/fe/fe_noise.c | 0 src/{libsphinxbase => }/fe/fe_noise.h | 0 src/{libsphinxbase => }/fe/fe_prespch_buf.c | 0 src/{libsphinxbase => }/fe/fe_prespch_buf.h | 0 src/{libsphinxbase => }/fe/fe_sigproc.c | 0 src/{libsphinxbase => }/fe/fe_type.h | 0 src/{libsphinxbase => }/fe/fe_warp.c | 0 src/{libsphinxbase => }/fe/fe_warp.h | 0 src/{libsphinxbase => }/fe/fe_warp_affine.c | 0 src/{libsphinxbase => }/fe/fe_warp_affine.h | 0 .../fe/fe_warp_inverse_linear.c | 0 .../fe/fe_warp_inverse_linear.h | 0 .../fe/fe_warp_piecewise_linear.c | 0 .../fe/fe_warp_piecewise_linear.h | 0 src/{libsphinxbase => }/fe/fixlog.c | 0 .../fe/make_log_sub_table.py | 0 src/{libsphinxbase => }/fe/make_log_table.py | 0 src/{libsphinxbase => }/fe/yin.c | 0 src/{libsphinxbase => }/feat/agc.c | 0 src/{libsphinxbase => }/feat/cmn.c | 0 src/{libsphinxbase => }/feat/cmn_live.c | 0 src/{libsphinxbase => }/feat/feat.c | 0 src/{libsphinxbase => }/feat/lda.c | 0 src/{libpocketsphinx => }/fsg_history.c | 0 src/{libpocketsphinx => }/fsg_history.h | 0 src/{libpocketsphinx => }/fsg_lextree.c | 0 src/{libpocketsphinx => }/fsg_lextree.h | 0 src/{libpocketsphinx => }/fsg_search.c | 0 .../fsg_search_internal.h | 0 src/{libpocketsphinx => }/hmm.c | 0 src/{libpocketsphinx => }/hmm.h | 0 src/{libpocketsphinx => }/kws_detections.c | 0 src/{libpocketsphinx => }/kws_detections.h | 0 src/{libpocketsphinx => }/kws_search.c | 0 src/{libpocketsphinx => }/kws_search.h | 0 src/{libsphinxbase => }/lm/_jsgf_scanner.l | 0 src/{libsphinxbase => }/lm/fsg_model.c | 0 src/{libsphinxbase => }/lm/jsgf.c | 0 src/{libsphinxbase => }/lm/jsgf_internal.h | 0 src/{libsphinxbase => }/lm/jsgf_parser.c | 0 src/{libsphinxbase => }/lm/jsgf_parser.h | 0 src/{libsphinxbase => }/lm/jsgf_parser.y | 0 src/{libsphinxbase => }/lm/jsgf_scanner.c | 0 src/{libsphinxbase => }/lm/jsgf_scanner.h | 0 src/{libsphinxbase => }/lm/lm_trie.c | 0 src/{libsphinxbase => }/lm/lm_trie.h | 0 src/{libsphinxbase => }/lm/lm_trie_quant.c | 0 src/{libsphinxbase => }/lm/lm_trie_quant.h | 0 src/{libsphinxbase => }/lm/ngram_model.c | 0 .../lm/ngram_model_internal.h | 0 src/{libsphinxbase => }/lm/ngram_model_set.c | 0 src/{libsphinxbase => }/lm/ngram_model_set.h | 0 src/{libsphinxbase => }/lm/ngram_model_trie.c | 0 src/{libsphinxbase => }/lm/ngram_model_trie.h | 0 src/{libsphinxbase => }/lm/ngrams_raw.c | 0 src/{libsphinxbase => }/lm/ngrams_raw.h | 0 src/{libpocketsphinx => }/mdef.c | 0 src/{libpocketsphinx => }/mdef.h | 0 src/{libpocketsphinx => }/ms_gauden.c | 0 src/{libpocketsphinx => }/ms_gauden.h | 0 src/{libpocketsphinx => }/ms_mgau.c | 0 src/{libpocketsphinx => }/ms_mgau.h | 0 src/{libpocketsphinx => }/ms_senone.c | 0 src/{libpocketsphinx => }/ms_senone.h | 0 src/{libpocketsphinx => }/ngram_search.c | 0 src/{libpocketsphinx => }/ngram_search.h | 0 .../ngram_search_fwdflat.c | 0 .../ngram_search_fwdflat.h | 0 .../ngram_search_fwdtree.c | 0 .../ngram_search_fwdtree.h | 0 src/{libpocketsphinx => }/phone_loop_search.c | 0 src/{libpocketsphinx => }/phone_loop_search.h | 0 src/{libpocketsphinx => }/pocketsphinx.c | 0 .../pocketsphinx_internal.h | 0 src/{libpocketsphinx => }/ps_alignment.c | 0 src/{libpocketsphinx => }/ps_alignment.h | 0 src/{libpocketsphinx => }/ps_lattice.c | 0 .../ps_lattice_internal.h | 0 src/{libpocketsphinx => }/ps_mllr.c | 0 src/{libpocketsphinx => }/ptm_mgau.c | 0 src/{libpocketsphinx => }/ptm_mgau.h | 0 src/{libpocketsphinx => }/s2_semi_mgau.c | 0 src/{libpocketsphinx => }/s2_semi_mgau.h | 0 src/{libpocketsphinx => }/s3types.h | 0 .../state_align_search.c | 0 .../state_align_search.h | 0 src/{libpocketsphinx => }/tied_mgau_common.h | 0 src/{libpocketsphinx => }/tmat.c | 0 src/{libpocketsphinx => }/tmat.h | 0 src/{libsphinxbase => }/util/README.python | 0 src/{libsphinxbase => }/util/bio.c | 0 src/{libsphinxbase => }/util/bitarr.c | 0 src/{libsphinxbase => }/util/bitvec.c | 0 src/{libsphinxbase => }/util/blas_lite.c | 0 src/{libsphinxbase => }/util/case.c | 0 src/{libsphinxbase => }/util/ckd_alloc.c | 0 src/{libsphinxbase => }/util/clapack_scrub.py | 0 src/{libsphinxbase => }/util/cmd_ln.c | 0 src/{libsphinxbase => }/util/dtoa.c | 0 src/{libsphinxbase => }/util/err.c | 0 src/{libsphinxbase => }/util/errno.c | 0 src/{libsphinxbase => }/util/f2c_lite.c | 0 src/{libsphinxbase => }/util/filename.c | 0 src/{libsphinxbase => }/util/fortran.py | 0 src/{libsphinxbase => }/util/genrand.c | 0 src/{libsphinxbase => }/util/glist.c | 0 src/{libsphinxbase => }/util/hash_table.c | 0 src/{libsphinxbase => }/util/heap.c | 0 src/{libsphinxbase => }/util/listelem_alloc.c | 0 src/{libsphinxbase => }/util/logmath.c | 0 src/{libsphinxbase => }/util/make_lite.py | 0 src/{libsphinxbase => }/util/matrix.c | 0 src/{libsphinxbase => }/util/mmio.c | 0 src/{libsphinxbase => }/util/pio.c | 0 src/{libsphinxbase => }/util/priority_queue.c | 0 src/{libsphinxbase => }/util/profile.c | 0 src/{libsphinxbase => }/util/sbthread.c | 0 src/{libsphinxbase => }/util/slamch.c | 0 src/{libsphinxbase => }/util/slapack_lite.c | 0 src/{libsphinxbase => }/util/strfuncs.c | 0 src/{libsphinxbase => }/util/wrapped_routines | 0 src/{libpocketsphinx => }/vector.c | 0 src/{libpocketsphinx => }/vector.h | 0 152 files changed, 83 insertions(+), 85 deletions(-) rename {src/programs => programs}/CMakeLists.txt (86%) rename {src/programs => programs}/fsg2dot.pl (100%) rename {src/programs => programs}/pocketsphinx_batch.c (100%) rename {src/programs => programs}/pocketsphinx_mdef_convert.c (100%) rename {src/programs => programs}/sphinx_cepview.c (100%) rename {src/programs => programs}/sphinx_fe.c (100%) rename {src/programs => programs}/sphinx_jsgf2fsg.c (100%) rename {src/programs => programs}/sphinx_lm_convert.c (100%) rename {src/programs => programs}/sphinx_lm_eval.c (100%) rename {src/programs => programs}/sphinx_pitch.c (100%) rename {src/programs => programs}/sphinx_wave2feat.h (100%) rename src/{libpocketsphinx => }/acmod.c (100%) rename src/{libpocketsphinx => }/acmod.h (100%) rename src/{libpocketsphinx => }/allphone_search.c (100%) rename src/{libpocketsphinx => }/allphone_search.h (100%) rename src/{libpocketsphinx => }/bin_mdef.c (100%) rename src/{libpocketsphinx => }/bin_mdef.h (100%) rename src/{libpocketsphinx => }/blkarray_list.c (100%) rename src/{libpocketsphinx => }/blkarray_list.h (100%) rename src/{libpocketsphinx => }/dict.c (100%) rename src/{libpocketsphinx => }/dict.h (100%) rename src/{libpocketsphinx => }/dict2pid.c (100%) rename src/{libpocketsphinx => }/dict2pid.h (100%) rename src/{libpocketsphinx => }/fast_ptm.txt (100%) rename src/{libsphinxbase => }/fe/fe_design.txt (100%) rename src/{libsphinxbase => }/fe/fe_interface.c (100%) rename src/{libsphinxbase => }/fe/fe_internal.h (100%) rename src/{libsphinxbase => }/fe/fe_noise.c (100%) rename src/{libsphinxbase => }/fe/fe_noise.h (100%) rename src/{libsphinxbase => }/fe/fe_prespch_buf.c (100%) rename src/{libsphinxbase => }/fe/fe_prespch_buf.h (100%) rename src/{libsphinxbase => }/fe/fe_sigproc.c (100%) rename src/{libsphinxbase => }/fe/fe_type.h (100%) rename src/{libsphinxbase => }/fe/fe_warp.c (100%) rename src/{libsphinxbase => }/fe/fe_warp.h (100%) rename src/{libsphinxbase => }/fe/fe_warp_affine.c (100%) rename src/{libsphinxbase => }/fe/fe_warp_affine.h (100%) rename src/{libsphinxbase => }/fe/fe_warp_inverse_linear.c (100%) rename src/{libsphinxbase => }/fe/fe_warp_inverse_linear.h (100%) rename src/{libsphinxbase => }/fe/fe_warp_piecewise_linear.c (100%) rename src/{libsphinxbase => }/fe/fe_warp_piecewise_linear.h (100%) rename src/{libsphinxbase => }/fe/fixlog.c (100%) rename src/{libsphinxbase => }/fe/make_log_sub_table.py (100%) rename src/{libsphinxbase => }/fe/make_log_table.py (100%) rename src/{libsphinxbase => }/fe/yin.c (100%) rename src/{libsphinxbase => }/feat/agc.c (100%) rename src/{libsphinxbase => }/feat/cmn.c (100%) rename src/{libsphinxbase => }/feat/cmn_live.c (100%) rename src/{libsphinxbase => }/feat/feat.c (100%) rename src/{libsphinxbase => }/feat/lda.c (100%) rename src/{libpocketsphinx => }/fsg_history.c (100%) rename src/{libpocketsphinx => }/fsg_history.h (100%) rename src/{libpocketsphinx => }/fsg_lextree.c (100%) rename src/{libpocketsphinx => }/fsg_lextree.h (100%) rename src/{libpocketsphinx => }/fsg_search.c (100%) rename src/{libpocketsphinx => }/fsg_search_internal.h (100%) rename src/{libpocketsphinx => }/hmm.c (100%) rename src/{libpocketsphinx => }/hmm.h (100%) rename src/{libpocketsphinx => }/kws_detections.c (100%) rename src/{libpocketsphinx => }/kws_detections.h (100%) rename src/{libpocketsphinx => }/kws_search.c (100%) rename src/{libpocketsphinx => }/kws_search.h (100%) rename src/{libsphinxbase => }/lm/_jsgf_scanner.l (100%) rename src/{libsphinxbase => }/lm/fsg_model.c (100%) rename src/{libsphinxbase => }/lm/jsgf.c (100%) rename src/{libsphinxbase => }/lm/jsgf_internal.h (100%) rename src/{libsphinxbase => }/lm/jsgf_parser.c (100%) rename src/{libsphinxbase => }/lm/jsgf_parser.h (100%) rename src/{libsphinxbase => }/lm/jsgf_parser.y (100%) rename src/{libsphinxbase => }/lm/jsgf_scanner.c (100%) rename src/{libsphinxbase => }/lm/jsgf_scanner.h (100%) rename src/{libsphinxbase => }/lm/lm_trie.c (100%) rename src/{libsphinxbase => }/lm/lm_trie.h (100%) rename src/{libsphinxbase => }/lm/lm_trie_quant.c (100%) rename src/{libsphinxbase => }/lm/lm_trie_quant.h (100%) rename src/{libsphinxbase => }/lm/ngram_model.c (100%) rename src/{libsphinxbase => }/lm/ngram_model_internal.h (100%) rename src/{libsphinxbase => }/lm/ngram_model_set.c (100%) rename src/{libsphinxbase => }/lm/ngram_model_set.h (100%) rename src/{libsphinxbase => }/lm/ngram_model_trie.c (100%) rename src/{libsphinxbase => }/lm/ngram_model_trie.h (100%) rename src/{libsphinxbase => }/lm/ngrams_raw.c (100%) rename src/{libsphinxbase => }/lm/ngrams_raw.h (100%) rename src/{libpocketsphinx => }/mdef.c (100%) rename src/{libpocketsphinx => }/mdef.h (100%) rename src/{libpocketsphinx => }/ms_gauden.c (100%) rename src/{libpocketsphinx => }/ms_gauden.h (100%) rename src/{libpocketsphinx => }/ms_mgau.c (100%) rename src/{libpocketsphinx => }/ms_mgau.h (100%) rename src/{libpocketsphinx => }/ms_senone.c (100%) rename src/{libpocketsphinx => }/ms_senone.h (100%) rename src/{libpocketsphinx => }/ngram_search.c (100%) rename src/{libpocketsphinx => }/ngram_search.h (100%) rename src/{libpocketsphinx => }/ngram_search_fwdflat.c (100%) rename src/{libpocketsphinx => }/ngram_search_fwdflat.h (100%) rename src/{libpocketsphinx => }/ngram_search_fwdtree.c (100%) rename src/{libpocketsphinx => }/ngram_search_fwdtree.h (100%) rename src/{libpocketsphinx => }/phone_loop_search.c (100%) rename src/{libpocketsphinx => }/phone_loop_search.h (100%) rename src/{libpocketsphinx => }/pocketsphinx.c (100%) rename src/{libpocketsphinx => }/pocketsphinx_internal.h (100%) rename src/{libpocketsphinx => }/ps_alignment.c (100%) rename src/{libpocketsphinx => }/ps_alignment.h (100%) rename src/{libpocketsphinx => }/ps_lattice.c (100%) rename src/{libpocketsphinx => }/ps_lattice_internal.h (100%) rename src/{libpocketsphinx => }/ps_mllr.c (100%) rename src/{libpocketsphinx => }/ptm_mgau.c (100%) rename src/{libpocketsphinx => }/ptm_mgau.h (100%) rename src/{libpocketsphinx => }/s2_semi_mgau.c (100%) rename src/{libpocketsphinx => }/s2_semi_mgau.h (100%) rename src/{libpocketsphinx => }/s3types.h (100%) rename src/{libpocketsphinx => }/state_align_search.c (100%) rename src/{libpocketsphinx => }/state_align_search.h (100%) rename src/{libpocketsphinx => }/tied_mgau_common.h (100%) rename src/{libpocketsphinx => }/tmat.c (100%) rename src/{libpocketsphinx => }/tmat.h (100%) rename src/{libsphinxbase => }/util/README.python (100%) rename src/{libsphinxbase => }/util/bio.c (100%) rename src/{libsphinxbase => }/util/bitarr.c (100%) rename src/{libsphinxbase => }/util/bitvec.c (100%) rename src/{libsphinxbase => }/util/blas_lite.c (100%) rename src/{libsphinxbase => }/util/case.c (100%) rename src/{libsphinxbase => }/util/ckd_alloc.c (100%) rename src/{libsphinxbase => }/util/clapack_scrub.py (100%) rename src/{libsphinxbase => }/util/cmd_ln.c (100%) rename src/{libsphinxbase => }/util/dtoa.c (100%) rename src/{libsphinxbase => }/util/err.c (100%) rename src/{libsphinxbase => }/util/errno.c (100%) rename src/{libsphinxbase => }/util/f2c_lite.c (100%) rename src/{libsphinxbase => }/util/filename.c (100%) rename src/{libsphinxbase => }/util/fortran.py (100%) rename src/{libsphinxbase => }/util/genrand.c (100%) rename src/{libsphinxbase => }/util/glist.c (100%) rename src/{libsphinxbase => }/util/hash_table.c (100%) rename src/{libsphinxbase => }/util/heap.c (100%) rename src/{libsphinxbase => }/util/listelem_alloc.c (100%) rename src/{libsphinxbase => }/util/logmath.c (100%) rename src/{libsphinxbase => }/util/make_lite.py (100%) rename src/{libsphinxbase => }/util/matrix.c (100%) rename src/{libsphinxbase => }/util/mmio.c (100%) rename src/{libsphinxbase => }/util/pio.c (100%) rename src/{libsphinxbase => }/util/priority_queue.c (100%) rename src/{libsphinxbase => }/util/profile.c (100%) rename src/{libsphinxbase => }/util/sbthread.c (100%) rename src/{libsphinxbase => }/util/slamch.c (100%) rename src/{libsphinxbase => }/util/slapack_lite.c (100%) rename src/{libsphinxbase => }/util/strfuncs.c (100%) rename src/{libsphinxbase => }/util/wrapped_routines (100%) rename src/{libpocketsphinx => }/vector.c (100%) rename src/{libpocketsphinx => }/vector.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index fc91f8601..39f7f5599 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,3 +58,4 @@ configure_file(sphinx_config.h.in include/sphinxbase/sphinx_config.h) add_definitions(-DHAVE_CONFIG_H) add_subdirectory(src) +add_subdirectory(programs) diff --git a/src/programs/CMakeLists.txt b/programs/CMakeLists.txt similarity index 86% rename from src/programs/CMakeLists.txt rename to programs/CMakeLists.txt index 93324976e..730515c6e 100644 --- a/src/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -12,6 +12,6 @@ foreach(PROGRAM ${POCKETSPHINX_PROGRAMS}) add_executable(${PROGRAM} ${PROGRAM}.c) target_link_libraries(${PROGRAM} pocketsphinx) target_include_directories( - ${PROGRAM} PRIVATE ${CMAKE_SOURCE_DIR}/src/libpocketsphinx + ${PROGRAM} PRIVATE ${CMAKE_SOURCE_DIR}/src ${PROGRAM} PRIVATE ${CMAKE_BINARY_DIR}) endforeach() diff --git a/src/programs/fsg2dot.pl b/programs/fsg2dot.pl similarity index 100% rename from src/programs/fsg2dot.pl rename to programs/fsg2dot.pl diff --git a/src/programs/pocketsphinx_batch.c b/programs/pocketsphinx_batch.c similarity index 100% rename from src/programs/pocketsphinx_batch.c rename to programs/pocketsphinx_batch.c diff --git a/src/programs/pocketsphinx_mdef_convert.c b/programs/pocketsphinx_mdef_convert.c similarity index 100% rename from src/programs/pocketsphinx_mdef_convert.c rename to programs/pocketsphinx_mdef_convert.c diff --git a/src/programs/sphinx_cepview.c b/programs/sphinx_cepview.c similarity index 100% rename from src/programs/sphinx_cepview.c rename to programs/sphinx_cepview.c diff --git a/src/programs/sphinx_fe.c b/programs/sphinx_fe.c similarity index 100% rename from src/programs/sphinx_fe.c rename to programs/sphinx_fe.c diff --git a/src/programs/sphinx_jsgf2fsg.c b/programs/sphinx_jsgf2fsg.c similarity index 100% rename from src/programs/sphinx_jsgf2fsg.c rename to programs/sphinx_jsgf2fsg.c diff --git a/src/programs/sphinx_lm_convert.c b/programs/sphinx_lm_convert.c similarity index 100% rename from src/programs/sphinx_lm_convert.c rename to programs/sphinx_lm_convert.c diff --git a/src/programs/sphinx_lm_eval.c b/programs/sphinx_lm_eval.c similarity index 100% rename from src/programs/sphinx_lm_eval.c rename to programs/sphinx_lm_eval.c diff --git a/src/programs/sphinx_pitch.c b/programs/sphinx_pitch.c similarity index 100% rename from src/programs/sphinx_pitch.c rename to programs/sphinx_pitch.c diff --git a/src/programs/sphinx_wave2feat.h b/programs/sphinx_wave2feat.h similarity index 100% rename from src/programs/sphinx_wave2feat.h rename to programs/sphinx_wave2feat.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e64e2ee8f..927345b2d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,88 +1,87 @@ add_library(pocketsphinx - libpocketsphinx/tmat.c - libpocketsphinx/fsg_history.c - libpocketsphinx/allphone_search.c - libpocketsphinx/s2_semi_mgau.c - libpocketsphinx/ps_alignment.c - libpocketsphinx/ms_gauden.c - libpocketsphinx/state_align_search.c - libpocketsphinx/mdef.c - libpocketsphinx/blkarray_list.c - libpocketsphinx/dict2pid.c - libpocketsphinx/vector.c - libpocketsphinx/ms_senone.c - libpocketsphinx/ptm_mgau.c - libpocketsphinx/ngram_search_fwdflat.c - libpocketsphinx/kws_detections.c - libpocketsphinx/hmm.c - libpocketsphinx/bin_mdef.c - libpocketsphinx/phone_loop_search.c - libpocketsphinx/ngram_search.c - libpocketsphinx/ngram_search_fwdtree.c - libpocketsphinx/ms_mgau.c - libpocketsphinx/fsg_search.c - libpocketsphinx/ps_lattice.c - libpocketsphinx/fsg_lextree.c - libpocketsphinx/ps_mllr.c - libpocketsphinx/pocketsphinx.c - libpocketsphinx/kws_search.c - libpocketsphinx/acmod.c - libpocketsphinx/dict.c - libsphinxbase/fe/fe_sigproc.c - libsphinxbase/fe/fixlog.c - libsphinxbase/fe/fe_prespch_buf.c - libsphinxbase/fe/fe_warp_inverse_linear.c - libsphinxbase/fe/fe_noise.c - libsphinxbase/fe/fe_warp.c - libsphinxbase/fe/fe_interface.c - libsphinxbase/fe/fe_warp_affine.c - libsphinxbase/fe/yin.c - libsphinxbase/fe/fe_warp_piecewise_linear.c - libsphinxbase/feat/cmn.c - libsphinxbase/feat/agc.c - libsphinxbase/feat/cmn_live.c - libsphinxbase/feat/feat.c - libsphinxbase/feat/lda.c - libsphinxbase/lm/lm_trie_quant.c - libsphinxbase/lm/ngram_model_trie.c - libsphinxbase/lm/fsg_model.c - libsphinxbase/lm/jsgf.c - libsphinxbase/lm/ngram_model_set.c - libsphinxbase/lm/ngrams_raw.c - libsphinxbase/lm/jsgf_scanner.c - libsphinxbase/lm/ngram_model.c - libsphinxbase/lm/lm_trie.c - libsphinxbase/lm/jsgf_parser.c - libsphinxbase/util/strfuncs.c - libsphinxbase/util/dtoa.c - libsphinxbase/util/case.c - libsphinxbase/util/filename.c - libsphinxbase/util/slamch.c - libsphinxbase/util/cmd_ln.c - libsphinxbase/util/blas_lite.c - libsphinxbase/util/mmio.c - libsphinxbase/util/hash_table.c - libsphinxbase/util/err.c - libsphinxbase/util/ckd_alloc.c - libsphinxbase/util/slapack_lite.c - libsphinxbase/util/matrix.c - libsphinxbase/util/sbthread.c - libsphinxbase/util/bio.c - libsphinxbase/util/heap.c - libsphinxbase/util/priority_queue.c - libsphinxbase/util/bitvec.c - libsphinxbase/util/profile.c - libsphinxbase/util/errno.c - libsphinxbase/util/logmath.c - libsphinxbase/util/glist.c - libsphinxbase/util/f2c_lite.c - libsphinxbase/util/listelem_alloc.c - libsphinxbase/util/bitarr.c - libsphinxbase/util/pio.c - libsphinxbase/util/genrand.c + tmat.c + fsg_history.c + allphone_search.c + s2_semi_mgau.c + ps_alignment.c + ms_gauden.c + state_align_search.c + mdef.c + blkarray_list.c + dict2pid.c + vector.c + ms_senone.c + ptm_mgau.c + ngram_search_fwdflat.c + kws_detections.c + hmm.c + bin_mdef.c + phone_loop_search.c + ngram_search.c + ngram_search_fwdtree.c + ms_mgau.c + fsg_search.c + ps_lattice.c + fsg_lextree.c + ps_mllr.c + pocketsphinx.c + kws_search.c + acmod.c + dict.c + fe/fe_sigproc.c + fe/fixlog.c + fe/fe_prespch_buf.c + fe/fe_warp_inverse_linear.c + fe/fe_noise.c + fe/fe_warp.c + fe/fe_interface.c + fe/fe_warp_affine.c + fe/yin.c + fe/fe_warp_piecewise_linear.c + feat/cmn.c + feat/agc.c + feat/cmn_live.c + feat/feat.c + feat/lda.c + lm/lm_trie_quant.c + lm/ngram_model_trie.c + lm/fsg_model.c + lm/jsgf.c + lm/ngram_model_set.c + lm/ngrams_raw.c + lm/jsgf_scanner.c + lm/ngram_model.c + lm/lm_trie.c + lm/jsgf_parser.c + util/strfuncs.c + util/dtoa.c + util/case.c + util/filename.c + util/slamch.c + util/cmd_ln.c + util/blas_lite.c + util/mmio.c + util/hash_table.c + util/err.c + util/ckd_alloc.c + util/slapack_lite.c + util/matrix.c + util/sbthread.c + util/bio.c + util/heap.c + util/priority_queue.c + util/bitvec.c + util/profile.c + util/errno.c + util/logmath.c + util/glist.c + util/f2c_lite.c + util/listelem_alloc.c + util/bitarr.c + util/pio.c + util/genrand.c ) target_include_directories( - pocketsphinx PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/libpocketsphinx pocketsphinx PRIVATE ${CMAKE_BINARY_DIR} # config.h pocketsphinx PRIVATE ${CMAKE_SOURCE_DIR}/include/pocketsphinx pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include @@ -99,5 +98,3 @@ target_link_libraries(pocketsphinx PUBLIC Threads::Threads) set_target_properties(pocketsphinx PROPERTIES VERSION 4.0.0 SOVERSION 4) - -add_subdirectory(programs) diff --git a/src/libpocketsphinx/acmod.c b/src/acmod.c similarity index 100% rename from src/libpocketsphinx/acmod.c rename to src/acmod.c diff --git a/src/libpocketsphinx/acmod.h b/src/acmod.h similarity index 100% rename from src/libpocketsphinx/acmod.h rename to src/acmod.h diff --git a/src/libpocketsphinx/allphone_search.c b/src/allphone_search.c similarity index 100% rename from src/libpocketsphinx/allphone_search.c rename to src/allphone_search.c diff --git a/src/libpocketsphinx/allphone_search.h b/src/allphone_search.h similarity index 100% rename from src/libpocketsphinx/allphone_search.h rename to src/allphone_search.h diff --git a/src/libpocketsphinx/bin_mdef.c b/src/bin_mdef.c similarity index 100% rename from src/libpocketsphinx/bin_mdef.c rename to src/bin_mdef.c diff --git a/src/libpocketsphinx/bin_mdef.h b/src/bin_mdef.h similarity index 100% rename from src/libpocketsphinx/bin_mdef.h rename to src/bin_mdef.h diff --git a/src/libpocketsphinx/blkarray_list.c b/src/blkarray_list.c similarity index 100% rename from src/libpocketsphinx/blkarray_list.c rename to src/blkarray_list.c diff --git a/src/libpocketsphinx/blkarray_list.h b/src/blkarray_list.h similarity index 100% rename from src/libpocketsphinx/blkarray_list.h rename to src/blkarray_list.h diff --git a/src/libpocketsphinx/dict.c b/src/dict.c similarity index 100% rename from src/libpocketsphinx/dict.c rename to src/dict.c diff --git a/src/libpocketsphinx/dict.h b/src/dict.h similarity index 100% rename from src/libpocketsphinx/dict.h rename to src/dict.h diff --git a/src/libpocketsphinx/dict2pid.c b/src/dict2pid.c similarity index 100% rename from src/libpocketsphinx/dict2pid.c rename to src/dict2pid.c diff --git a/src/libpocketsphinx/dict2pid.h b/src/dict2pid.h similarity index 100% rename from src/libpocketsphinx/dict2pid.h rename to src/dict2pid.h diff --git a/src/libpocketsphinx/fast_ptm.txt b/src/fast_ptm.txt similarity index 100% rename from src/libpocketsphinx/fast_ptm.txt rename to src/fast_ptm.txt diff --git a/src/libsphinxbase/fe/fe_design.txt b/src/fe/fe_design.txt similarity index 100% rename from src/libsphinxbase/fe/fe_design.txt rename to src/fe/fe_design.txt diff --git a/src/libsphinxbase/fe/fe_interface.c b/src/fe/fe_interface.c similarity index 100% rename from src/libsphinxbase/fe/fe_interface.c rename to src/fe/fe_interface.c diff --git a/src/libsphinxbase/fe/fe_internal.h b/src/fe/fe_internal.h similarity index 100% rename from src/libsphinxbase/fe/fe_internal.h rename to src/fe/fe_internal.h diff --git a/src/libsphinxbase/fe/fe_noise.c b/src/fe/fe_noise.c similarity index 100% rename from src/libsphinxbase/fe/fe_noise.c rename to src/fe/fe_noise.c diff --git a/src/libsphinxbase/fe/fe_noise.h b/src/fe/fe_noise.h similarity index 100% rename from src/libsphinxbase/fe/fe_noise.h rename to src/fe/fe_noise.h diff --git a/src/libsphinxbase/fe/fe_prespch_buf.c b/src/fe/fe_prespch_buf.c similarity index 100% rename from src/libsphinxbase/fe/fe_prespch_buf.c rename to src/fe/fe_prespch_buf.c diff --git a/src/libsphinxbase/fe/fe_prespch_buf.h b/src/fe/fe_prespch_buf.h similarity index 100% rename from src/libsphinxbase/fe/fe_prespch_buf.h rename to src/fe/fe_prespch_buf.h diff --git a/src/libsphinxbase/fe/fe_sigproc.c b/src/fe/fe_sigproc.c similarity index 100% rename from src/libsphinxbase/fe/fe_sigproc.c rename to src/fe/fe_sigproc.c diff --git a/src/libsphinxbase/fe/fe_type.h b/src/fe/fe_type.h similarity index 100% rename from src/libsphinxbase/fe/fe_type.h rename to src/fe/fe_type.h diff --git a/src/libsphinxbase/fe/fe_warp.c b/src/fe/fe_warp.c similarity index 100% rename from src/libsphinxbase/fe/fe_warp.c rename to src/fe/fe_warp.c diff --git a/src/libsphinxbase/fe/fe_warp.h b/src/fe/fe_warp.h similarity index 100% rename from src/libsphinxbase/fe/fe_warp.h rename to src/fe/fe_warp.h diff --git a/src/libsphinxbase/fe/fe_warp_affine.c b/src/fe/fe_warp_affine.c similarity index 100% rename from src/libsphinxbase/fe/fe_warp_affine.c rename to src/fe/fe_warp_affine.c diff --git a/src/libsphinxbase/fe/fe_warp_affine.h b/src/fe/fe_warp_affine.h similarity index 100% rename from src/libsphinxbase/fe/fe_warp_affine.h rename to src/fe/fe_warp_affine.h diff --git a/src/libsphinxbase/fe/fe_warp_inverse_linear.c b/src/fe/fe_warp_inverse_linear.c similarity index 100% rename from src/libsphinxbase/fe/fe_warp_inverse_linear.c rename to src/fe/fe_warp_inverse_linear.c diff --git a/src/libsphinxbase/fe/fe_warp_inverse_linear.h b/src/fe/fe_warp_inverse_linear.h similarity index 100% rename from src/libsphinxbase/fe/fe_warp_inverse_linear.h rename to src/fe/fe_warp_inverse_linear.h diff --git a/src/libsphinxbase/fe/fe_warp_piecewise_linear.c b/src/fe/fe_warp_piecewise_linear.c similarity index 100% rename from src/libsphinxbase/fe/fe_warp_piecewise_linear.c rename to src/fe/fe_warp_piecewise_linear.c diff --git a/src/libsphinxbase/fe/fe_warp_piecewise_linear.h b/src/fe/fe_warp_piecewise_linear.h similarity index 100% rename from src/libsphinxbase/fe/fe_warp_piecewise_linear.h rename to src/fe/fe_warp_piecewise_linear.h diff --git a/src/libsphinxbase/fe/fixlog.c b/src/fe/fixlog.c similarity index 100% rename from src/libsphinxbase/fe/fixlog.c rename to src/fe/fixlog.c diff --git a/src/libsphinxbase/fe/make_log_sub_table.py b/src/fe/make_log_sub_table.py similarity index 100% rename from src/libsphinxbase/fe/make_log_sub_table.py rename to src/fe/make_log_sub_table.py diff --git a/src/libsphinxbase/fe/make_log_table.py b/src/fe/make_log_table.py similarity index 100% rename from src/libsphinxbase/fe/make_log_table.py rename to src/fe/make_log_table.py diff --git a/src/libsphinxbase/fe/yin.c b/src/fe/yin.c similarity index 100% rename from src/libsphinxbase/fe/yin.c rename to src/fe/yin.c diff --git a/src/libsphinxbase/feat/agc.c b/src/feat/agc.c similarity index 100% rename from src/libsphinxbase/feat/agc.c rename to src/feat/agc.c diff --git a/src/libsphinxbase/feat/cmn.c b/src/feat/cmn.c similarity index 100% rename from src/libsphinxbase/feat/cmn.c rename to src/feat/cmn.c diff --git a/src/libsphinxbase/feat/cmn_live.c b/src/feat/cmn_live.c similarity index 100% rename from src/libsphinxbase/feat/cmn_live.c rename to src/feat/cmn_live.c diff --git a/src/libsphinxbase/feat/feat.c b/src/feat/feat.c similarity index 100% rename from src/libsphinxbase/feat/feat.c rename to src/feat/feat.c diff --git a/src/libsphinxbase/feat/lda.c b/src/feat/lda.c similarity index 100% rename from src/libsphinxbase/feat/lda.c rename to src/feat/lda.c diff --git a/src/libpocketsphinx/fsg_history.c b/src/fsg_history.c similarity index 100% rename from src/libpocketsphinx/fsg_history.c rename to src/fsg_history.c diff --git a/src/libpocketsphinx/fsg_history.h b/src/fsg_history.h similarity index 100% rename from src/libpocketsphinx/fsg_history.h rename to src/fsg_history.h diff --git a/src/libpocketsphinx/fsg_lextree.c b/src/fsg_lextree.c similarity index 100% rename from src/libpocketsphinx/fsg_lextree.c rename to src/fsg_lextree.c diff --git a/src/libpocketsphinx/fsg_lextree.h b/src/fsg_lextree.h similarity index 100% rename from src/libpocketsphinx/fsg_lextree.h rename to src/fsg_lextree.h diff --git a/src/libpocketsphinx/fsg_search.c b/src/fsg_search.c similarity index 100% rename from src/libpocketsphinx/fsg_search.c rename to src/fsg_search.c diff --git a/src/libpocketsphinx/fsg_search_internal.h b/src/fsg_search_internal.h similarity index 100% rename from src/libpocketsphinx/fsg_search_internal.h rename to src/fsg_search_internal.h diff --git a/src/libpocketsphinx/hmm.c b/src/hmm.c similarity index 100% rename from src/libpocketsphinx/hmm.c rename to src/hmm.c diff --git a/src/libpocketsphinx/hmm.h b/src/hmm.h similarity index 100% rename from src/libpocketsphinx/hmm.h rename to src/hmm.h diff --git a/src/libpocketsphinx/kws_detections.c b/src/kws_detections.c similarity index 100% rename from src/libpocketsphinx/kws_detections.c rename to src/kws_detections.c diff --git a/src/libpocketsphinx/kws_detections.h b/src/kws_detections.h similarity index 100% rename from src/libpocketsphinx/kws_detections.h rename to src/kws_detections.h diff --git a/src/libpocketsphinx/kws_search.c b/src/kws_search.c similarity index 100% rename from src/libpocketsphinx/kws_search.c rename to src/kws_search.c diff --git a/src/libpocketsphinx/kws_search.h b/src/kws_search.h similarity index 100% rename from src/libpocketsphinx/kws_search.h rename to src/kws_search.h diff --git a/src/libsphinxbase/lm/_jsgf_scanner.l b/src/lm/_jsgf_scanner.l similarity index 100% rename from src/libsphinxbase/lm/_jsgf_scanner.l rename to src/lm/_jsgf_scanner.l diff --git a/src/libsphinxbase/lm/fsg_model.c b/src/lm/fsg_model.c similarity index 100% rename from src/libsphinxbase/lm/fsg_model.c rename to src/lm/fsg_model.c diff --git a/src/libsphinxbase/lm/jsgf.c b/src/lm/jsgf.c similarity index 100% rename from src/libsphinxbase/lm/jsgf.c rename to src/lm/jsgf.c diff --git a/src/libsphinxbase/lm/jsgf_internal.h b/src/lm/jsgf_internal.h similarity index 100% rename from src/libsphinxbase/lm/jsgf_internal.h rename to src/lm/jsgf_internal.h diff --git a/src/libsphinxbase/lm/jsgf_parser.c b/src/lm/jsgf_parser.c similarity index 100% rename from src/libsphinxbase/lm/jsgf_parser.c rename to src/lm/jsgf_parser.c diff --git a/src/libsphinxbase/lm/jsgf_parser.h b/src/lm/jsgf_parser.h similarity index 100% rename from src/libsphinxbase/lm/jsgf_parser.h rename to src/lm/jsgf_parser.h diff --git a/src/libsphinxbase/lm/jsgf_parser.y b/src/lm/jsgf_parser.y similarity index 100% rename from src/libsphinxbase/lm/jsgf_parser.y rename to src/lm/jsgf_parser.y diff --git a/src/libsphinxbase/lm/jsgf_scanner.c b/src/lm/jsgf_scanner.c similarity index 100% rename from src/libsphinxbase/lm/jsgf_scanner.c rename to src/lm/jsgf_scanner.c diff --git a/src/libsphinxbase/lm/jsgf_scanner.h b/src/lm/jsgf_scanner.h similarity index 100% rename from src/libsphinxbase/lm/jsgf_scanner.h rename to src/lm/jsgf_scanner.h diff --git a/src/libsphinxbase/lm/lm_trie.c b/src/lm/lm_trie.c similarity index 100% rename from src/libsphinxbase/lm/lm_trie.c rename to src/lm/lm_trie.c diff --git a/src/libsphinxbase/lm/lm_trie.h b/src/lm/lm_trie.h similarity index 100% rename from src/libsphinxbase/lm/lm_trie.h rename to src/lm/lm_trie.h diff --git a/src/libsphinxbase/lm/lm_trie_quant.c b/src/lm/lm_trie_quant.c similarity index 100% rename from src/libsphinxbase/lm/lm_trie_quant.c rename to src/lm/lm_trie_quant.c diff --git a/src/libsphinxbase/lm/lm_trie_quant.h b/src/lm/lm_trie_quant.h similarity index 100% rename from src/libsphinxbase/lm/lm_trie_quant.h rename to src/lm/lm_trie_quant.h diff --git a/src/libsphinxbase/lm/ngram_model.c b/src/lm/ngram_model.c similarity index 100% rename from src/libsphinxbase/lm/ngram_model.c rename to src/lm/ngram_model.c diff --git a/src/libsphinxbase/lm/ngram_model_internal.h b/src/lm/ngram_model_internal.h similarity index 100% rename from src/libsphinxbase/lm/ngram_model_internal.h rename to src/lm/ngram_model_internal.h diff --git a/src/libsphinxbase/lm/ngram_model_set.c b/src/lm/ngram_model_set.c similarity index 100% rename from src/libsphinxbase/lm/ngram_model_set.c rename to src/lm/ngram_model_set.c diff --git a/src/libsphinxbase/lm/ngram_model_set.h b/src/lm/ngram_model_set.h similarity index 100% rename from src/libsphinxbase/lm/ngram_model_set.h rename to src/lm/ngram_model_set.h diff --git a/src/libsphinxbase/lm/ngram_model_trie.c b/src/lm/ngram_model_trie.c similarity index 100% rename from src/libsphinxbase/lm/ngram_model_trie.c rename to src/lm/ngram_model_trie.c diff --git a/src/libsphinxbase/lm/ngram_model_trie.h b/src/lm/ngram_model_trie.h similarity index 100% rename from src/libsphinxbase/lm/ngram_model_trie.h rename to src/lm/ngram_model_trie.h diff --git a/src/libsphinxbase/lm/ngrams_raw.c b/src/lm/ngrams_raw.c similarity index 100% rename from src/libsphinxbase/lm/ngrams_raw.c rename to src/lm/ngrams_raw.c diff --git a/src/libsphinxbase/lm/ngrams_raw.h b/src/lm/ngrams_raw.h similarity index 100% rename from src/libsphinxbase/lm/ngrams_raw.h rename to src/lm/ngrams_raw.h diff --git a/src/libpocketsphinx/mdef.c b/src/mdef.c similarity index 100% rename from src/libpocketsphinx/mdef.c rename to src/mdef.c diff --git a/src/libpocketsphinx/mdef.h b/src/mdef.h similarity index 100% rename from src/libpocketsphinx/mdef.h rename to src/mdef.h diff --git a/src/libpocketsphinx/ms_gauden.c b/src/ms_gauden.c similarity index 100% rename from src/libpocketsphinx/ms_gauden.c rename to src/ms_gauden.c diff --git a/src/libpocketsphinx/ms_gauden.h b/src/ms_gauden.h similarity index 100% rename from src/libpocketsphinx/ms_gauden.h rename to src/ms_gauden.h diff --git a/src/libpocketsphinx/ms_mgau.c b/src/ms_mgau.c similarity index 100% rename from src/libpocketsphinx/ms_mgau.c rename to src/ms_mgau.c diff --git a/src/libpocketsphinx/ms_mgau.h b/src/ms_mgau.h similarity index 100% rename from src/libpocketsphinx/ms_mgau.h rename to src/ms_mgau.h diff --git a/src/libpocketsphinx/ms_senone.c b/src/ms_senone.c similarity index 100% rename from src/libpocketsphinx/ms_senone.c rename to src/ms_senone.c diff --git a/src/libpocketsphinx/ms_senone.h b/src/ms_senone.h similarity index 100% rename from src/libpocketsphinx/ms_senone.h rename to src/ms_senone.h diff --git a/src/libpocketsphinx/ngram_search.c b/src/ngram_search.c similarity index 100% rename from src/libpocketsphinx/ngram_search.c rename to src/ngram_search.c diff --git a/src/libpocketsphinx/ngram_search.h b/src/ngram_search.h similarity index 100% rename from src/libpocketsphinx/ngram_search.h rename to src/ngram_search.h diff --git a/src/libpocketsphinx/ngram_search_fwdflat.c b/src/ngram_search_fwdflat.c similarity index 100% rename from src/libpocketsphinx/ngram_search_fwdflat.c rename to src/ngram_search_fwdflat.c diff --git a/src/libpocketsphinx/ngram_search_fwdflat.h b/src/ngram_search_fwdflat.h similarity index 100% rename from src/libpocketsphinx/ngram_search_fwdflat.h rename to src/ngram_search_fwdflat.h diff --git a/src/libpocketsphinx/ngram_search_fwdtree.c b/src/ngram_search_fwdtree.c similarity index 100% rename from src/libpocketsphinx/ngram_search_fwdtree.c rename to src/ngram_search_fwdtree.c diff --git a/src/libpocketsphinx/ngram_search_fwdtree.h b/src/ngram_search_fwdtree.h similarity index 100% rename from src/libpocketsphinx/ngram_search_fwdtree.h rename to src/ngram_search_fwdtree.h diff --git a/src/libpocketsphinx/phone_loop_search.c b/src/phone_loop_search.c similarity index 100% rename from src/libpocketsphinx/phone_loop_search.c rename to src/phone_loop_search.c diff --git a/src/libpocketsphinx/phone_loop_search.h b/src/phone_loop_search.h similarity index 100% rename from src/libpocketsphinx/phone_loop_search.h rename to src/phone_loop_search.h diff --git a/src/libpocketsphinx/pocketsphinx.c b/src/pocketsphinx.c similarity index 100% rename from src/libpocketsphinx/pocketsphinx.c rename to src/pocketsphinx.c diff --git a/src/libpocketsphinx/pocketsphinx_internal.h b/src/pocketsphinx_internal.h similarity index 100% rename from src/libpocketsphinx/pocketsphinx_internal.h rename to src/pocketsphinx_internal.h diff --git a/src/libpocketsphinx/ps_alignment.c b/src/ps_alignment.c similarity index 100% rename from src/libpocketsphinx/ps_alignment.c rename to src/ps_alignment.c diff --git a/src/libpocketsphinx/ps_alignment.h b/src/ps_alignment.h similarity index 100% rename from src/libpocketsphinx/ps_alignment.h rename to src/ps_alignment.h diff --git a/src/libpocketsphinx/ps_lattice.c b/src/ps_lattice.c similarity index 100% rename from src/libpocketsphinx/ps_lattice.c rename to src/ps_lattice.c diff --git a/src/libpocketsphinx/ps_lattice_internal.h b/src/ps_lattice_internal.h similarity index 100% rename from src/libpocketsphinx/ps_lattice_internal.h rename to src/ps_lattice_internal.h diff --git a/src/libpocketsphinx/ps_mllr.c b/src/ps_mllr.c similarity index 100% rename from src/libpocketsphinx/ps_mllr.c rename to src/ps_mllr.c diff --git a/src/libpocketsphinx/ptm_mgau.c b/src/ptm_mgau.c similarity index 100% rename from src/libpocketsphinx/ptm_mgau.c rename to src/ptm_mgau.c diff --git a/src/libpocketsphinx/ptm_mgau.h b/src/ptm_mgau.h similarity index 100% rename from src/libpocketsphinx/ptm_mgau.h rename to src/ptm_mgau.h diff --git a/src/libpocketsphinx/s2_semi_mgau.c b/src/s2_semi_mgau.c similarity index 100% rename from src/libpocketsphinx/s2_semi_mgau.c rename to src/s2_semi_mgau.c diff --git a/src/libpocketsphinx/s2_semi_mgau.h b/src/s2_semi_mgau.h similarity index 100% rename from src/libpocketsphinx/s2_semi_mgau.h rename to src/s2_semi_mgau.h diff --git a/src/libpocketsphinx/s3types.h b/src/s3types.h similarity index 100% rename from src/libpocketsphinx/s3types.h rename to src/s3types.h diff --git a/src/libpocketsphinx/state_align_search.c b/src/state_align_search.c similarity index 100% rename from src/libpocketsphinx/state_align_search.c rename to src/state_align_search.c diff --git a/src/libpocketsphinx/state_align_search.h b/src/state_align_search.h similarity index 100% rename from src/libpocketsphinx/state_align_search.h rename to src/state_align_search.h diff --git a/src/libpocketsphinx/tied_mgau_common.h b/src/tied_mgau_common.h similarity index 100% rename from src/libpocketsphinx/tied_mgau_common.h rename to src/tied_mgau_common.h diff --git a/src/libpocketsphinx/tmat.c b/src/tmat.c similarity index 100% rename from src/libpocketsphinx/tmat.c rename to src/tmat.c diff --git a/src/libpocketsphinx/tmat.h b/src/tmat.h similarity index 100% rename from src/libpocketsphinx/tmat.h rename to src/tmat.h diff --git a/src/libsphinxbase/util/README.python b/src/util/README.python similarity index 100% rename from src/libsphinxbase/util/README.python rename to src/util/README.python diff --git a/src/libsphinxbase/util/bio.c b/src/util/bio.c similarity index 100% rename from src/libsphinxbase/util/bio.c rename to src/util/bio.c diff --git a/src/libsphinxbase/util/bitarr.c b/src/util/bitarr.c similarity index 100% rename from src/libsphinxbase/util/bitarr.c rename to src/util/bitarr.c diff --git a/src/libsphinxbase/util/bitvec.c b/src/util/bitvec.c similarity index 100% rename from src/libsphinxbase/util/bitvec.c rename to src/util/bitvec.c diff --git a/src/libsphinxbase/util/blas_lite.c b/src/util/blas_lite.c similarity index 100% rename from src/libsphinxbase/util/blas_lite.c rename to src/util/blas_lite.c diff --git a/src/libsphinxbase/util/case.c b/src/util/case.c similarity index 100% rename from src/libsphinxbase/util/case.c rename to src/util/case.c diff --git a/src/libsphinxbase/util/ckd_alloc.c b/src/util/ckd_alloc.c similarity index 100% rename from src/libsphinxbase/util/ckd_alloc.c rename to src/util/ckd_alloc.c diff --git a/src/libsphinxbase/util/clapack_scrub.py b/src/util/clapack_scrub.py similarity index 100% rename from src/libsphinxbase/util/clapack_scrub.py rename to src/util/clapack_scrub.py diff --git a/src/libsphinxbase/util/cmd_ln.c b/src/util/cmd_ln.c similarity index 100% rename from src/libsphinxbase/util/cmd_ln.c rename to src/util/cmd_ln.c diff --git a/src/libsphinxbase/util/dtoa.c b/src/util/dtoa.c similarity index 100% rename from src/libsphinxbase/util/dtoa.c rename to src/util/dtoa.c diff --git a/src/libsphinxbase/util/err.c b/src/util/err.c similarity index 100% rename from src/libsphinxbase/util/err.c rename to src/util/err.c diff --git a/src/libsphinxbase/util/errno.c b/src/util/errno.c similarity index 100% rename from src/libsphinxbase/util/errno.c rename to src/util/errno.c diff --git a/src/libsphinxbase/util/f2c_lite.c b/src/util/f2c_lite.c similarity index 100% rename from src/libsphinxbase/util/f2c_lite.c rename to src/util/f2c_lite.c diff --git a/src/libsphinxbase/util/filename.c b/src/util/filename.c similarity index 100% rename from src/libsphinxbase/util/filename.c rename to src/util/filename.c diff --git a/src/libsphinxbase/util/fortran.py b/src/util/fortran.py similarity index 100% rename from src/libsphinxbase/util/fortran.py rename to src/util/fortran.py diff --git a/src/libsphinxbase/util/genrand.c b/src/util/genrand.c similarity index 100% rename from src/libsphinxbase/util/genrand.c rename to src/util/genrand.c diff --git a/src/libsphinxbase/util/glist.c b/src/util/glist.c similarity index 100% rename from src/libsphinxbase/util/glist.c rename to src/util/glist.c diff --git a/src/libsphinxbase/util/hash_table.c b/src/util/hash_table.c similarity index 100% rename from src/libsphinxbase/util/hash_table.c rename to src/util/hash_table.c diff --git a/src/libsphinxbase/util/heap.c b/src/util/heap.c similarity index 100% rename from src/libsphinxbase/util/heap.c rename to src/util/heap.c diff --git a/src/libsphinxbase/util/listelem_alloc.c b/src/util/listelem_alloc.c similarity index 100% rename from src/libsphinxbase/util/listelem_alloc.c rename to src/util/listelem_alloc.c diff --git a/src/libsphinxbase/util/logmath.c b/src/util/logmath.c similarity index 100% rename from src/libsphinxbase/util/logmath.c rename to src/util/logmath.c diff --git a/src/libsphinxbase/util/make_lite.py b/src/util/make_lite.py similarity index 100% rename from src/libsphinxbase/util/make_lite.py rename to src/util/make_lite.py diff --git a/src/libsphinxbase/util/matrix.c b/src/util/matrix.c similarity index 100% rename from src/libsphinxbase/util/matrix.c rename to src/util/matrix.c diff --git a/src/libsphinxbase/util/mmio.c b/src/util/mmio.c similarity index 100% rename from src/libsphinxbase/util/mmio.c rename to src/util/mmio.c diff --git a/src/libsphinxbase/util/pio.c b/src/util/pio.c similarity index 100% rename from src/libsphinxbase/util/pio.c rename to src/util/pio.c diff --git a/src/libsphinxbase/util/priority_queue.c b/src/util/priority_queue.c similarity index 100% rename from src/libsphinxbase/util/priority_queue.c rename to src/util/priority_queue.c diff --git a/src/libsphinxbase/util/profile.c b/src/util/profile.c similarity index 100% rename from src/libsphinxbase/util/profile.c rename to src/util/profile.c diff --git a/src/libsphinxbase/util/sbthread.c b/src/util/sbthread.c similarity index 100% rename from src/libsphinxbase/util/sbthread.c rename to src/util/sbthread.c diff --git a/src/libsphinxbase/util/slamch.c b/src/util/slamch.c similarity index 100% rename from src/libsphinxbase/util/slamch.c rename to src/util/slamch.c diff --git a/src/libsphinxbase/util/slapack_lite.c b/src/util/slapack_lite.c similarity index 100% rename from src/libsphinxbase/util/slapack_lite.c rename to src/util/slapack_lite.c diff --git a/src/libsphinxbase/util/strfuncs.c b/src/util/strfuncs.c similarity index 100% rename from src/libsphinxbase/util/strfuncs.c rename to src/util/strfuncs.c diff --git a/src/libsphinxbase/util/wrapped_routines b/src/util/wrapped_routines similarity index 100% rename from src/libsphinxbase/util/wrapped_routines rename to src/util/wrapped_routines diff --git a/src/libpocketsphinx/vector.c b/src/vector.c similarity index 100% rename from src/libpocketsphinx/vector.c rename to src/vector.c diff --git a/src/libpocketsphinx/vector.h b/src/vector.h similarity index 100% rename from src/libpocketsphinx/vector.h rename to src/vector.h From ca581ff0e8509bfde9cb43b58fe8f7c93320ea30 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 22:12:06 -0400 Subject: [PATCH 31/94] Update the README --- README.md | 97 ++++++++++++------------------------------------------- 1 file changed, 20 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index 0038e6a11..56fe8c6f0 100644 --- a/README.md +++ b/README.md @@ -1,90 +1,33 @@ -PocketSphinx 5prealpha +PocketSphinx 1.0.0 =============================================================================== This is PocketSphinx, one of Carnegie Mellon University's open source large -vocabulary, speaker-independent continuous speech recognition engine. +vocabulary, speaker-independent continuous speech recognition engines. -**THIS IS A RESEARCH SYSTEM**. This is also an early release of a research -system. We know the APIs and function names are likely to change, and that -several tools need to be made available to make this all complete. With your -help and contributions, this can progress in response to the needs and patches -provided. +Although this was at one point a research system, active development +has largely ceased and it has become very, very far from the state of the art. **Please see the LICENSE file for terms of use.** -Prerequisites -------------------------------------------------------------------------------- - -You **must** have SphinxBase, which you can download from -http://cmusphinx.sourceforge.net. Download and unpack it to the same parent -directory as PocketSphinx, so that the configure script and project files can -find it. On Windows, you will need to rename 'sphinxbase-X.Y' (where X.Y is the -SphinxBase version number) to simply 'sphinxbase' for this to work. - -Linux/Unix installation ------------------------------------------------------------------------------- - -In a unix-like environment (such as linux, solaris etc): - - * Build and optionally install SphinxBase. If you want to use - fixed-point arithmetic, you **must** configure SphinxBase with the - `--enable-fixed` option. - - * If you downloaded directly from the CVS repository, you need to do - this at least once to generate the "configure" file: - - ``` - $ ./autogen.sh - ``` - * If you downloaded the release version, or ran `autogen.sh` at least - once, then compile and install: - - ``` - $ ./configure - $ make clean all - $ make check - $ sudo make install - ``` - -Xcode Installation (for iPhone) ------------------------------------------------------------------------------- - -Pocketsphinx uses the standard unix autogen system, you can build pocketsphinx -with automake given you already built sphinxbase You just need to pass correct -configure arguments, set compiler path, set sysroot and other options. After -you build the code you need to import dylib file into your project and you also -need to configure includes for your project to find sphinxbase headers. - -You also will have to create a recorder to capture audio with CoreAudio and -feed it into the recognizer. - -For details see http://github.com/cmusphinx/pocketsphinx-ios-demo - -If you want to quickly start with Pocketsphinx, try OpenEars toolkit which -includes Pocketsphinx http://www.politepix.com/openears/ - - -Android installation +Installation ------------------------------------------------------------------------------ -See http://github.com/cmusphinx/pocketsphinx-android-demo. - - -MS Windows™ (MS Visual Studio 2012 (or newer - we test with VC++ 2012 Express) ------------------------------------------------------------------------------- - - * load sphinxbase.sln located in sphinxbase directory - - * compile all the projects in SphinxBase (from sphinxbase.sln) - - * load pocketsphinx.sln in pocketsphinx directory +We now use CMake for building, which should give reasonable results +across Linux, MacOS and Windows. In addition, the audio library, +which never really built or worked correctly on any platform at all, +has simply been removed. - * compile all the projects in PocketSphinx +There is no longer any dependency on SphinxBase, because there is no +reason for SphinxBase to exist. You can just link against the +PocketSphinx library, which now includes all of its functionality. -MS Visual Studio will build the executables under .\bin\Release or -.\bin\Debug (depending on the version you choose on MS Visual Studio), -and the libraries under .\lib\Release or .\lib\Build. +So you can do something like this: -Test scripts are forthcoming for Windows. +``` +mkdir build +cd build +cmake .. +make +make install +``` -For up-to-date information, see http://cmusphinx.sourceforge.net. From 96fd7b85f0373e4ac79068907c14e0ab5c2adb3b Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 22:13:50 -0400 Subject: [PATCH 32/94] Update the README with a rationale for releasing --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 56fe8c6f0..d2bdb4832 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,10 @@ This is PocketSphinx, one of Carnegie Mellon University's open source large vocabulary, speaker-independent continuous speech recognition engines. Although this was at one point a research system, active development -has largely ceased and it has become very, very far from the state of the art. +has largely ceased and it has become very, very far from the state of +the art. We are making a release, because people are nonetheless +using it, and there are a number of historical errors in the build +system and API which needed to be corrected. **Please see the LICENSE file for terms of use.** From b8dd5677a057b79a54764b37d2628d8789688386 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 22:34:49 -0400 Subject: [PATCH 33/94] note that Mac OS X building probably doesn't work --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d2bdb4832..46ee1cf64 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ vocabulary, speaker-independent continuous speech recognition engines. Although this was at one point a research system, active development has largely ceased and it has become very, very far from the state of -the art. We are making a release, because people are nonetheless -using it, and there are a number of historical errors in the build -system and API which needed to be corrected. +the art. I am making a release, because people are nonetheless using +it, and there are a number of historical errors in the build system +and API which needed to be corrected. **Please see the LICENSE file for terms of use.** @@ -16,9 +16,10 @@ Installation ------------------------------------------------------------------------------ We now use CMake for building, which should give reasonable results -across Linux, MacOS and Windows. In addition, the audio library, -which never really built or worked correctly on any platform at all, -has simply been removed. +across Linux and Windows. Not certain about Mac OS X because I don't +have one of those. In addition, the audio library, which never really +built or worked correctly on any platform at all, has simply been +removed. There is no longer any dependency on SphinxBase, because there is no reason for SphinxBase to exist. You can just link against the From 6f89813dc694734ce6dca73f6814e73a2fe3d5a2 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 22:34:56 -0400 Subject: [PATCH 34/94] install headers and programs --- CMakeLists.txt | 1 + include/CMakeLists.txt | 46 +++-------------------------------------- programs/CMakeLists.txt | 1 + src/CMakeLists.txt | 2 ++ 4 files changed, 7 insertions(+), 43 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 39f7f5599..bd00225b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,4 +58,5 @@ configure_file(sphinx_config.h.in include/sphinxbase/sphinx_config.h) add_definitions(-DHAVE_CONFIG_H) add_subdirectory(src) +add_subdirectory(include) add_subdirectory(programs) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index 727d655be..3fdb2e73a 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -1,43 +1,3 @@ -install(FILES - pocketsphinx/cmdln_macro.h - pocketsphinx/ps_search.h - pocketsphinx/export.h - pocketsphinx/ps_lattice.h - pocketsphinx/ps_mllr.h - pocketsphinx.h - sphinxbase/f2c.h - sphinxbase/hash_table.h - sphinxbase/profile.h - sphinxbase/byteorder.h - sphinxbase/filename.h - sphinxbase/logmath.h - sphinxbase/genrand.h - sphinxbase/sbthread.h - sphinxbase/listelem_alloc.h - sphinxbase/clapack_lite.h - sphinxbase/fixpoint.h - sphinxbase/sphinxbase_export.h - sphinxbase/bio.h - sphinxbase/bitvec.h - sphinxbase/priority_queue.h - sphinxbase/glist.h - sphinxbase/prim_type.h - sphinxbase/agc.h - sphinxbase/yin.h - sphinxbase/pio.h - sphinxbase/err.h - sphinxbase/cmd_ln.h - sphinxbase/fsg_model.h - sphinxbase/strfuncs.h - sphinxbase/feat.h - sphinxbase/ckd_alloc.h - sphinxbase/heap.h - sphinxbase/mmio.h - sphinxbase/fe.h - sphinxbase/cmn.h - sphinxbase/case.h - sphinxbase/jsgf.h - sphinxbase/bitarr.h - sphinxbase/matrix.h - sphinxbase/ngram_model.h - DESTINATION include) +install(FILES pocketsphinx.h TYPE INCLUDE) +install(DIRECTORY pocketsphinx TYPE INCLUDE) +install(DIRECTORY sphinxbase TYPE INCLUDE) diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index 730515c6e..07e8272e6 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -15,3 +15,4 @@ foreach(PROGRAM ${POCKETSPHINX_PROGRAMS}) ${PROGRAM} PRIVATE ${CMAKE_SOURCE_DIR}/src ${PROGRAM} PRIVATE ${CMAKE_BINARY_DIR}) endforeach() +install(TARGETS ${POCKETSPHINX_PROGRAMS} RUNTIME) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 927345b2d..7b07d4241 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -98,3 +98,5 @@ target_link_libraries(pocketsphinx PUBLIC Threads::Threads) set_target_properties(pocketsphinx PROPERTIES VERSION 4.0.0 SOVERSION 4) + +install(TARGETS pocketsphinx LIBRARY) From 020afe05f3bc9ff3ca4659c2e1dd9802a4e90552 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 22:39:01 -0400 Subject: [PATCH 35/94] build: install man pages --- CMakeLists.txt | 2 ++ doc/CMakeLists.txt | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 doc/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index bd00225b9..b0bbdfcbc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,7 @@ include(CheckTypeSize) include(CheckSymbolExists) include(CheckLibraryExists) include(TestBigEndian) +include(GNUInstallDirs) CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H) CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H) @@ -60,3 +61,4 @@ add_definitions(-DHAVE_CONFIG_H) add_subdirectory(src) add_subdirectory(include) add_subdirectory(programs) +add_subdirectory(doc) diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 000000000..d7ced426f --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,12 @@ +install(FILES + pocketsphinx_batch.1 + pocketsphinx_continuous.1 + pocketsphinx_mdef_convert.1 + sphinx_cepview.1 + sphinx_cont_seg.1 + sphinx_fe.1 + sphinx_lm_convert.1 + sphinx_lm_eval.1 + sphinx_lm_sort.1 + sphinx_pitch.1 + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) From ed3420fd9413a507b4dcdc83ed9d74cbda06e789 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 22:52:23 -0400 Subject: [PATCH 36/94] build: use doxygen through cmake (make docs) --- doc/CMakeLists.txt | 39 ++ doc/Makefile.am | 52 -- doc/doxyfile.in | 1257 -------------------------------------------- 3 files changed, 39 insertions(+), 1309 deletions(-) delete mode 100644 doc/Makefile.am delete mode 100644 doc/doxyfile.in diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index d7ced426f..772f03273 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -1,3 +1,42 @@ +find_package(Doxygen) +doxygen_add_docs(docs + ${CMAKE_SOURCE_DIR}/include/pocketsphinx.h + ${CMAKE_SOURCE_DIR}/include/pocketsphinx/ps_lattice.h + ${CMAKE_SOURCE_DIR}/include/pocketsphinx/ps_mllr.h + ${CMAKE_SOURCE_DIR}/include/pocketsphinx/ps_search.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/agc.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/bio.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/bitvec.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/byteorder.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/case.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/ckd_alloc.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/clapack_lite.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/cmd_ln.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/cmn.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/err.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/f2c.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/fe.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/feat.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/filename.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/fixpoint.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/fsg_model.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/genrand.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/glist.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/hash_table.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/heap.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/jsgf.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/listelem_alloc.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/logmath.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/matrix.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/mmio.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/ngram_model.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/pio.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/prim_type.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/profile.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/sphinxbase_export.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/strfuncs.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/yin.h + ) install(FILES pocketsphinx_batch.1 pocketsphinx_continuous.1 diff --git a/doc/Makefile.am b/doc/Makefile.am deleted file mode 100644 index 86908fa29..000000000 --- a/doc/Makefile.am +++ /dev/null @@ -1,52 +0,0 @@ -man_MANS = \ - pocketsphinx_batch.1 \ - pocketsphinx_continuous.1 \ - pocketsphinx_mdef_convert.1 - -EXTRA_DIST = \ - args2man.pl \ - doxy2swig.py \ - pocketsphinx_batch.1.in \ - pocketsphinx_continuous.1.in \ - pocketsphinx_batch.1 \ - pocketsphinx_continuous.1 \ - pocketsphinx_mdef_convert.1 - -# pocketsphinx_batch.1: pocketsphinx_batch.1.in -# $(srcdir)/args2man.pl $(top_builddir)/src/programs/pocketsphinx_batch \ -# < $< > $@ - -# pocketsphinx_continuous.1: pocketsphinx_continuous.1.in -# $(srcdir)/args2man.pl $(top_builddir)/src/programs/pocketsphinx_continuous \ -# < $< > $@ - -if BUILD_SWIG -SWIG_DOC = pydoc.i - -pydoc.i: html/index.html - $(PYTHON) $(srcdir)/doxy2swig.py -n xml/index.xml pydoc.i -endif - -if BUILD_DOXYGEN -all-local: html/index.html $(SWIG_DOC) -endif - -headers = \ - $(top_srcdir)/include/pocketsphinx.h \ - $(top_srcdir)/include/ps_lattice.h \ - $(top_srcdir)/include/ps_mllr.h \ - $(top_srcdir)/include/ps_search.h - -latex/refman.pdf: doxyfile $(headers) - doxygen - $(MAKE) -C latex refman.pdf - -html/index.html: doxyfile $(headers) - doxygen - -clean-local: - -rm -rf html xml latex doxytags $(SWIG_DOC) - -# Totally CMU-specific rule for uploading documentation -upload: html/index.html - rsync -av html/ file:/usr12/apache2/htdocs/sphinx/doc/doxygen/pocketsphinx/ diff --git a/doc/doxyfile.in b/doc/doxyfile.in deleted file mode 100644 index 299a97ef4..000000000 --- a/doc/doxyfile.in +++ /dev/null @@ -1,1257 +0,0 @@ -# Doxyfile 1.5.2 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file that -# follow. The default is UTF-8 which is also the encoding used for all text before -# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into -# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of -# possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = PocketSphinx - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = @VERSION@ - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = @builddir@ - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, -# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, -# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, -# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = @top_srcdir@ - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. - -JAVADOC_AUTOBRIEF = YES - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to -# include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = @top_srcdir@/include @top_srcdir@/src @top_srcdir@/src/libpocketsphinx - -# This tag can be used to specify the character encoding of the source files that -# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default -# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. -# See http://www.gnu.org/software/libiconv for the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = */.svn/* */.deps/* */.libs/* *.py */cmu6_lts_rules.* - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the output. -# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, -# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = YES - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = YES - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = letter - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = YES - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = @builddir@/doxytags - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to -# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to -# specify the directory where the mscgen tool resides. If left empty the tool is assumed to -# be found in the default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a caller dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen will always -# show the root nodes and its direct children regardless of this setting. - -DOT_GRAPH_MAX_NODES = 50 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO From 1099e7793520a2d3dbde32415b0db57987b9bd39 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 22:53:06 -0400 Subject: [PATCH 37/94] remove more Makefile.am --- include/Makefile.am | 12 ----------- include/sphinxbase/Makefile.am | 38 ---------------------------------- 2 files changed, 50 deletions(-) delete mode 100644 include/Makefile.am delete mode 100644 include/sphinxbase/Makefile.am diff --git a/include/Makefile.am b/include/Makefile.am deleted file mode 100644 index c0f1bfd21..000000000 --- a/include/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -pkginclude_HEADERS = \ - cmdln_macro.h \ - ps_lattice.h \ - ps_mllr.h \ - ps_search.h \ - pocketsphinx_export.h \ - pocketsphinx.h - - - - - diff --git a/include/sphinxbase/Makefile.am b/include/sphinxbase/Makefile.am deleted file mode 100644 index fa42a51ca..000000000 --- a/include/sphinxbase/Makefile.am +++ /dev/null @@ -1,38 +0,0 @@ -pkginclude_HEADERS = \ - ad.h \ - agc.h \ - bio.h \ - bitarr.h \ - bitvec.h \ - byteorder.h \ - case.h \ - ckd_alloc.h \ - clapack_lite.h \ - cmd_ln.h \ - cmn.h \ - err.h \ - f2c.h \ - feat.h \ - fe.h \ - filename.h \ - fixpoint.h \ - fsg_model.h \ - genrand.h \ - glist.h \ - hash_table.h \ - heap.h \ - jsgf.h \ - listelem_alloc.h \ - logmath.h \ - matrix.h \ - mmio.h \ - ngram_model.h \ - pio.h \ - yin.h \ - prim_type.h \ - priority_queue.h \ - profile.h \ - sbthread.h \ - sphinxbase_export.h \ - strfuncs.h - From 58ac89a0db94327997962e780ffaba49222de89b Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 22:58:01 -0400 Subject: [PATCH 38/94] build: install model --- CMakeLists.txt | 1 + model/CMakeLists.txt | 3 +++ model/Makefile.am | 16 ---------------- 3 files changed, 4 insertions(+), 16 deletions(-) create mode 100644 model/CMakeLists.txt delete mode 100644 model/Makefile.am diff --git a/CMakeLists.txt b/CMakeLists.txt index b0bbdfcbc..146ad4825 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,5 +60,6 @@ add_definitions(-DHAVE_CONFIG_H) add_subdirectory(src) add_subdirectory(include) +add_subdirectory(model) add_subdirectory(programs) add_subdirectory(doc) diff --git a/model/CMakeLists.txt b/model/CMakeLists.txt new file mode 100644 index 000000000..0793d2cb3 --- /dev/null +++ b/model/CMakeLists.txt @@ -0,0 +1,3 @@ +install(DIRECTORY + en-us + DESTINATION ${CMAKE_INSTALL_DATADIR}/pocketsphinx/model) diff --git a/model/Makefile.am b/model/Makefile.am deleted file mode 100644 index f1e929dfb..000000000 --- a/model/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -enusdir = $(datadir)/@PACKAGE@/model/en-us/en-us -dist_enus_DATA = \ - en-us/en-us/feat.params \ - en-us/en-us/variances \ - en-us/en-us/transition_matrices \ - en-us/en-us/README \ - en-us/en-us/noisedict \ - en-us/en-us/sendump \ - en-us/en-us/mdef \ - en-us/en-us/means - -enuslmdir = $(datadir)/@PACKAGE@/model/en-us -dist_enuslm_DATA = \ - en-us/cmudict-en-us.dict \ - en-us/en-us-phone.lm.bin \ - en-us/en-us.lm.bin From b5a4db7604da329d4d81fc87d5f87570e136a761 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 23:04:28 -0400 Subject: [PATCH 39/94] fix: update my email address --- README.md | 5 ++--- doc/args2man.pl | 2 +- doc/pocketsphinx_batch.1 | 2 +- doc/pocketsphinx_batch.1.in | 2 +- doc/pocketsphinx_continuous.1 | 2 +- doc/pocketsphinx_continuous.1.in | 2 +- doc/pocketsphinx_mdef_convert.1 | 2 +- doc/sphinx_cepview.1 | 2 +- doc/sphinx_cepview.1.in | 2 +- doc/sphinx_cont_seg.1 | 2 +- doc/sphinx_cont_seg.1.in | 2 +- doc/sphinx_fe.1 | 2 +- doc/sphinx_fe.1.in | 2 +- doc/sphinx_lm_convert.1 | 2 +- doc/sphinx_lm_convert.1.in | 2 +- doc/sphinx_lm_eval.1 | 2 +- doc/sphinx_lm_eval.1.in | 2 +- doc/sphinx_lm_sort.1 | 2 +- doc/sphinx_pitch.1 | 2 +- doc/sphinx_pitch.1.in | 2 +- include/pocketsphinx.h | 2 +- include/sphinxbase/fixpoint.h | 2 +- include/sphinxbase/mmio.h | 2 +- include/sphinxbase/ngram_model.h | 2 +- include/sphinxbase/sbthread.h | 2 +- include/sphinxbase/yin.h | 2 +- programs/pocketsphinx_mdef_convert.c | 2 +- src/acmod.c | 2 +- src/acmod.h | 2 +- src/bin_mdef.c | 2 +- src/bin_mdef.h | 2 +- src/fe/fixlog.c | 2 +- src/fe/yin.c | 2 +- src/feat/lda.c | 2 +- src/gst-plugin/gstpocketsphinx.c | 2 +- src/gst-plugin/gstpocketsphinx.h | 2 +- src/lm/ngram_model_internal.h | 2 +- src/lm/ngram_model_set.c | 2 +- src/lm/ngram_model_set.h | 2 +- src/pocketsphinx_internal.h | 2 +- src/ptm_mgau.h | 2 +- src/util/README.python | 2 +- src/util/mmio.c | 2 +- src/util/sbthread.c | 2 +- test/unit/test_hash/test_hash_iter.c | 2 +- test/unit/test_util/test_bit_encode.c | 2 +- test/unit/test_util/test_build_directory.c | 2 +- test/unit/test_util/test_filename.c | 2 +- test/unit/test_util/test_fopen.c | 2 +- test/unit/test_util/test_heap.c | 2 +- test/unit/test_util/test_readfile.c | 2 +- test/word_align.pl | 2 +- 52 files changed, 53 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 46ee1cf64..33a0d37cc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ PocketSphinx 1.0.0 -=============================================================================== +================== This is PocketSphinx, one of Carnegie Mellon University's open source large vocabulary, speaker-independent continuous speech recognition engines. @@ -13,7 +13,7 @@ and API which needed to be corrected. **Please see the LICENSE file for terms of use.** Installation ------------------------------------------------------------------------------- +------------ We now use CMake for building, which should give reasonable results across Linux and Windows. Not certain about Mac OS X because I don't @@ -34,4 +34,3 @@ cmake .. make make install ``` - diff --git a/doc/args2man.pl b/doc/args2man.pl index 3fa2b3f75..aa318ef43 100755 --- a/doc/args2man.pl +++ b/doc/args2man.pl @@ -65,7 +65,7 @@ =head1 DESCRIPTION =head1 AUTHOR -David Huggins-Daines +David Huggins-Daines =head1 COPYRIGHT diff --git a/doc/pocketsphinx_batch.1 b/doc/pocketsphinx_batch.1 index fc982bff5..d411672e1 100644 --- a/doc/pocketsphinx_batch.1 +++ b/doc/pocketsphinx_batch.1 @@ -461,7 +461,7 @@ of a file, using the following format: .RE .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. diff --git a/doc/pocketsphinx_batch.1.in b/doc/pocketsphinx_batch.1.in index 0501f2f2f..be41c7ee7 100644 --- a/doc/pocketsphinx_batch.1.in +++ b/doc/pocketsphinx_batch.1.in @@ -36,7 +36,7 @@ of a file, using the following format: .RE .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. diff --git a/doc/pocketsphinx_continuous.1 b/doc/pocketsphinx_continuous.1 index 3f0ac8c7d..8866436a3 100644 --- a/doc/pocketsphinx_continuous.1 +++ b/doc/pocketsphinx_continuous.1 @@ -388,7 +388,7 @@ Word insertion penalty Hamming window length .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. diff --git a/doc/pocketsphinx_continuous.1.in b/doc/pocketsphinx_continuous.1.in index febd60594..44d5d5d16 100644 --- a/doc/pocketsphinx_continuous.1.in +++ b/doc/pocketsphinx_continuous.1.in @@ -32,7 +32,7 @@ model or a finite-state grammar or look for a keyphase. .\" ### ARGUMENTS ### .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. diff --git a/doc/pocketsphinx_mdef_convert.1 b/doc/pocketsphinx_mdef_convert.1 index 3cc7e7ce8..cf49e9944 100644 --- a/doc/pocketsphinx_mdef_convert.1 +++ b/doc/pocketsphinx_mdef_convert.1 @@ -17,7 +17,7 @@ The input is in text format, and is to be converted to binary. .B -bin The input is in binary format, and is to be converted to text. .SH AUTHOR -Written by David Huggins-Daines . +Written by David Huggins-Daines . .SH COPYRIGHT Copyright \(co 2016 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_cepview.1 b/doc/sphinx_cepview.1 index 5318859e4..05cc0165f 100644 --- a/doc/sphinx_cepview.1 +++ b/doc/sphinx_cepview.1 @@ -34,7 +34,7 @@ Number of coefficients in the feature vector. file (default stdout/stderr) .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2007 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_cepview.1.in b/doc/sphinx_cepview.1.in index 8169c18be..82899b6e0 100644 --- a/doc/sphinx_cepview.1.in +++ b/doc/sphinx_cepview.1.in @@ -11,7 +11,7 @@ displays their contents as text for inspection. .\" ### ARGUMENTS ### .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2007 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_cont_seg.1 b/doc/sphinx_cont_seg.1 index 2b889c47e..7b61e94d9 100644 --- a/doc/sphinx_cont_seg.1 +++ b/doc/sphinx_cont_seg.1 @@ -110,7 +110,7 @@ Warping function type (or shape) Hamming window length .SH AUTHOR Written by M. K. Ravishankar . This (rather lousy) manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1999-2001 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_cont_seg.1.in b/doc/sphinx_cont_seg.1.in index f7e8a64c7..d10f4ab48 100644 --- a/doc/sphinx_cont_seg.1.in +++ b/doc/sphinx_cont_seg.1.in @@ -12,7 +12,7 @@ microphone. Use following arguments: .\" ### ARGUMENTS ### .SH AUTHOR Written by M. K. Ravishankar . This (rather lousy) manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1999-2001 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_fe.1 b/doc/sphinx_fe.1 index 80d0c28d1..53b4c4add 100644 --- a/doc/sphinx_fe.1 +++ b/doc/sphinx_fe.1 @@ -186,7 +186,7 @@ extract features for recognition and those used to extract features for training will cause recognition to fail. .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2007 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_fe.1.in b/doc/sphinx_fe.1.in index 2470b42a3..f07ca9551 100644 --- a/doc/sphinx_fe.1.in +++ b/doc/sphinx_fe.1.in @@ -22,7 +22,7 @@ extract features for recognition and those used to extract features for training will cause recognition to fail. .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2007 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_lm_convert.1 b/doc/sphinx_lm_convert.1 index 29b559b38..48c1f8182 100644 --- a/doc/sphinx_lm_convert.1 +++ b/doc/sphinx_lm_convert.1 @@ -38,7 +38,7 @@ language model file (required) .B \-ofmt language model file (will guess if not specified) .SH AUTHOR -David Huggins-Daines +David Huggins-Daines .SH COPYRIGHT Copyright \(co 2010 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_lm_convert.1.in b/doc/sphinx_lm_convert.1.in index e5be115a7..923530f06 100644 --- a/doc/sphinx_lm_convert.1.in +++ b/doc/sphinx_lm_convert.1.in @@ -12,7 +12,7 @@ of the text in a language model file and to force word strings to upper or lower case. .\" ### ARGUMENTS ### .SH AUTHOR -David Huggins-Daines +David Huggins-Daines .SH COPYRIGHT Copyright \(co 2010 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_lm_eval.1 b/doc/sphinx_lm_eval.1 index a806e00b5..40c7af0ff 100644 --- a/doc/sphinx_lm_eval.1 +++ b/doc/sphinx_lm_eval.1 @@ -49,7 +49,7 @@ Print details of perplexity calculation .B \-wip Word insertion probability .SH AUTHOR -David Huggins-Daines +David Huggins-Daines .SH COPYRIGHT Copyright \(co 2007-2008 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_lm_eval.1.in b/doc/sphinx_lm_eval.1.in index 64f10df4c..a702333f8 100644 --- a/doc/sphinx_lm_eval.1.in +++ b/doc/sphinx_lm_eval.1.in @@ -11,7 +11,7 @@ given language model. The text file is assumed to be in transcript format, i.e. one utterance per line, delimited by and . .\" ### ARGUMENTS ### .SH AUTHOR -David Huggins-Daines +David Huggins-Daines .SH COPYRIGHT Copyright \(co 2007-2008 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_lm_sort.1 b/doc/sphinx_lm_sort.1 index bd5346ebc..8d5dabfdf 100644 --- a/doc/sphinx_lm_sort.1 +++ b/doc/sphinx_lm_sort.1 @@ -14,7 +14,7 @@ be acceptable to Sphinx. This is necessary if you created the language model with SRILM or any other tool which is not as strict about ordering N-Grams in its output. .SH AUTHOR -David Huggins-Daines +David Huggins-Daines .SH COPYRIGHT Copyright \(co 2008 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_pitch.1 b/doc/sphinx_pitch.1 index 79b19c25b..cc1b4e3a5 100644 --- a/doc/sphinx_pitch.1 +++ b/doc/sphinx_pitch.1 @@ -65,7 +65,7 @@ Number of frames on either side of the current frame to use for smoothing. .B \-voice_thresh Threshold of normalized difference under which to search for the fundamental period. .SH AUTHOR -David Huggins-Daines +David Huggins-Daines .SH COPYRIGHT Copyright \(co 2007-2008 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doc/sphinx_pitch.1.in b/doc/sphinx_pitch.1.in index fa44ff0b8..3b21726d8 100644 --- a/doc/sphinx_pitch.1.in +++ b/doc/sphinx_pitch.1.in @@ -9,7 +9,7 @@ sphinx_pitch \- Extract pitch from audio files This program reads audio files and analyzes them for pitch and voicing. .\" ### ARGUMENTS ### .SH AUTHOR -David Huggins-Daines +David Huggins-Daines .SH COPYRIGHT Copyright \(co 2007-2008 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/include/pocketsphinx.h b/include/pocketsphinx.h index bc4cf214d..9ce47edb5 100644 --- a/include/pocketsphinx.h +++ b/include/pocketsphinx.h @@ -621,7 +621,7 @@ void ps_get_rawdata(ps_decoder_t *ps, int16 **buffer, int32 *size); /** * @mainpage PocketSphinx API Documentation - * @author David Huggins-Daines + * @author David Huggins-Daines * @author Alpha Cephei Inc. * @version 5prealpha * @date July, 2015 diff --git a/include/sphinxbase/fixpoint.h b/include/sphinxbase/fixpoint.h index 30b5cb202..8f8f0ad62 100644 --- a/include/sphinxbase/fixpoint.h +++ b/include/sphinxbase/fixpoint.h @@ -35,7 +35,7 @@ /* Fixed-point arithmetic macros. * - * Author: David Huggins-Daines + * Author: David Huggins-Daines */ #ifndef _FIXPOINT_H_ diff --git a/include/sphinxbase/mmio.h b/include/sphinxbase/mmio.h index 76127339c..fcae74d83 100644 --- a/include/sphinxbase/mmio.h +++ b/include/sphinxbase/mmio.h @@ -37,7 +37,7 @@ /** * @file mmio.h * @brief Memory-mapped I/O wrappers for files. - * @author David Huggins-Daines + * @author David Huggins-Daines **/ #ifndef __MMIO_H__ diff --git a/include/sphinxbase/ngram_model.h b/include/sphinxbase/ngram_model.h index 10cca072f..5be6d5ecf 100644 --- a/include/sphinxbase/ngram_model.h +++ b/include/sphinxbase/ngram_model.h @@ -37,7 +37,7 @@ /** * @file ngram_model.h * @brief N-Gram language models - * @author David Huggins-Daines + * @author David Huggins-Daines */ #ifndef __NGRAM_MODEL_H__ diff --git a/include/sphinxbase/sbthread.h b/include/sphinxbase/sbthread.h index ef9ac957f..f5a3b6680 100644 --- a/include/sphinxbase/sbthread.h +++ b/include/sphinxbase/sbthread.h @@ -37,7 +37,7 @@ /** * @file sbthread.h * @brief Simple portable thread functions. - * @author David Huggins-Daines + * @author David Huggins-Daines **/ #ifndef __SBTHREAD_H__ diff --git a/include/sphinxbase/yin.h b/include/sphinxbase/yin.h index d93b94559..b1e5639d0 100644 --- a/include/sphinxbase/yin.h +++ b/include/sphinxbase/yin.h @@ -30,7 +30,7 @@ /** * @file yin.h * @brief Implementation of pitch estimation - * @author David Huggins-Daines + * @author David Huggins-Daines * * This implements part of the YIN algorithm: * diff --git a/programs/pocketsphinx_mdef_convert.c b/programs/pocketsphinx_mdef_convert.c index 096e02183..c92857df8 100644 --- a/programs/pocketsphinx_mdef_convert.c +++ b/programs/pocketsphinx_mdef_convert.c @@ -37,7 +37,7 @@ /** * mdef_convert.c - convert text to binary model definition files (and vice versa) * - * Author: David Huggins-Daines + * Author: David Huggins-Daines **/ #include diff --git a/src/acmod.c b/src/acmod.c index 7d8ff0cfa..5fb2dada4 100644 --- a/src/acmod.c +++ b/src/acmod.c @@ -38,7 +38,7 @@ /** * @file acmod.c Acoustic model structures for PocketSphinx. - * @author David Huggins-Daines + * @author David Huggins-Daines */ /* System headers. */ diff --git a/src/acmod.h b/src/acmod.h index 0c47690e5..eed710110 100644 --- a/src/acmod.h +++ b/src/acmod.h @@ -37,7 +37,7 @@ /** * @file acmod.h Acoustic model structures for PocketSphinx. - * @author David Huggins-Daines + * @author David Huggins-Daines */ #ifndef __ACMOD_H__ diff --git a/src/bin_mdef.c b/src/bin_mdef.c index 98db1cebc..65c70c6e2 100644 --- a/src/bin_mdef.c +++ b/src/bin_mdef.c @@ -43,7 +43,7 @@ * heterogeneous topologies and variable-size N-phones * * Author: - * David Huggins-Daines + * David Huggins-Daines *********************************************************************/ /* System headers. */ diff --git a/src/bin_mdef.h b/src/bin_mdef.h index 5e90ec309..7ebdf287e 100644 --- a/src/bin_mdef.h +++ b/src/bin_mdef.h @@ -40,7 +40,7 @@ * Binary format model definition files, with support for * heterogeneous topologies and variable-size N-phones * - * @author David Huggins-Daines + * @author David Huggins-Daines */ #ifndef __BIN_MDEF_H__ #define __BIN_MDEF_H__ diff --git a/src/fe/fixlog.c b/src/fe/fixlog.c index 459c9ffd6..f00c71f4d 100644 --- a/src/fe/fixlog.c +++ b/src/fe/fixlog.c @@ -37,7 +37,7 @@ * * Description: Fast approximate fixed-point logarithms * - * Author: David Huggins-Daines + * Author: David Huggins-Daines * */ diff --git a/src/fe/yin.c b/src/fe/yin.c index ec0e2e0d7..ed2231857 100644 --- a/src/fe/yin.c +++ b/src/fe/yin.c @@ -29,7 +29,7 @@ /** * @file yin.c Implementation of pitch extraction. - * @author David Huggins-Daines + * @author David Huggins-Daines */ /* This implements part of the YIN algorithm: diff --git a/src/feat/lda.c b/src/feat/lda.c index 182b029de..1236c50d1 100644 --- a/src/feat/lda.c +++ b/src/feat/lda.c @@ -37,7 +37,7 @@ /* * lda.c -- Read and apply LDA matrices to features. * - * Author: David Huggins-Daines + * Author: David Huggins-Daines */ #include diff --git a/src/gst-plugin/gstpocketsphinx.c b/src/gst-plugin/gstpocketsphinx.c index c90c8d397..c4bb3fa8a 100644 --- a/src/gst-plugin/gstpocketsphinx.c +++ b/src/gst-plugin/gstpocketsphinx.c @@ -34,7 +34,7 @@ * * ==================================================================== * - * Author: David Huggins-Daines + * Author: David Huggins-Daines */ /** diff --git a/src/gst-plugin/gstpocketsphinx.h b/src/gst-plugin/gstpocketsphinx.h index 31b9555e8..0822de04d 100644 --- a/src/gst-plugin/gstpocketsphinx.h +++ b/src/gst-plugin/gstpocketsphinx.h @@ -33,7 +33,7 @@ * * ==================================================================== * - * Author: David Huggins-Daines + * Author: David Huggins-Daines */ #ifndef __GST_POCKETSPHINX_H__ diff --git a/src/lm/ngram_model_internal.h b/src/lm/ngram_model_internal.h index 2e50bcb8a..45616782f 100644 --- a/src/lm/ngram_model_internal.h +++ b/src/lm/ngram_model_internal.h @@ -37,7 +37,7 @@ /* * \file ngram_model_internal.h Internal structures for N-Gram models * - * Author: David Huggins-Daines + * Author: David Huggins-Daines */ #ifndef __NGRAM_MODEL_INTERNAL_H__ diff --git a/src/lm/ngram_model_set.c b/src/lm/ngram_model_set.c index 4623693b7..f61c371f5 100644 --- a/src/lm/ngram_model_set.c +++ b/src/lm/ngram_model_set.c @@ -36,7 +36,7 @@ */ /** * @file ngram_model_set.c Set of language models. - * @author David Huggins-Daines + * @author David Huggins-Daines */ #include diff --git a/src/lm/ngram_model_set.h b/src/lm/ngram_model_set.h index fc628f9c8..09fbdabda 100644 --- a/src/lm/ngram_model_set.h +++ b/src/lm/ngram_model_set.h @@ -36,7 +36,7 @@ */ /** * @file ngram_model_set.h Set of language models. - * @author David Huggins-Daines + * @author David Huggins-Daines */ #ifndef __NGRAM_MODEL_SET_H__ diff --git a/src/pocketsphinx_internal.h b/src/pocketsphinx_internal.h index 96b0869fa..7fc0e007f 100644 --- a/src/pocketsphinx_internal.h +++ b/src/pocketsphinx_internal.h @@ -38,7 +38,7 @@ /** * @file pocketsphinx_internal.h Internal implementation of * PocketSphinx decoder. - * @author David Huggins-Daines + * @author David Huggins-Daines */ #ifndef __POCKETSPHINX_INTERNAL_H__ diff --git a/src/ptm_mgau.h b/src/ptm_mgau.h index 85e49ebdd..b60f25b99 100644 --- a/src/ptm_mgau.h +++ b/src/ptm_mgau.h @@ -36,7 +36,7 @@ */ /** * @file ptm_mgau.h Fast phonetically-tied mixture evaluation. - * @author David Huggins-Daines + * @author David Huggins-Daines */ #ifndef __PTM_MGAU_H__ diff --git a/src/util/README.python b/src/util/README.python index 6f89bc5f4..cfcca6bec 100644 --- a/src/util/README.python +++ b/src/util/README.python @@ -2,7 +2,7 @@ Regenerating lapack_lite source =============================== :Author: David M. Cooke -:Modified by David Huggins-Daines for Sphinx +:Modified by David Huggins-Daines for Sphinx ``blas_lite.c``, ``slapack_lite.c``, are ``f2c``'d versions of the LAPACK routines required by the ``LinearAlgebra`` module, and wrapped diff --git a/src/util/mmio.c b/src/util/mmio.c index 0b2315b71..dde0d7f19 100644 --- a/src/util/mmio.c +++ b/src/util/mmio.c @@ -40,7 +40,7 @@ * * Description: mmap() wrappers for Unix/Windows * - * Author: David Huggins-Daines + * Author: David Huggins-Daines * *********************************************************************/ diff --git a/src/util/sbthread.c b/src/util/sbthread.c index 238cfa423..7c3bfec19 100644 --- a/src/util/sbthread.c +++ b/src/util/sbthread.c @@ -38,7 +38,7 @@ /** * @file sbthread.c * @brief Simple portable thread functions - * @author David Huggins-Daines + * @author David Huggins-Daines */ #include diff --git a/test/unit/test_hash/test_hash_iter.c b/test/unit/test_hash/test_hash_iter.c index 1bc9cd663..94a93e0b3 100644 --- a/test/unit/test_hash/test_hash_iter.c +++ b/test/unit/test_hash/test_hash_iter.c @@ -1,6 +1,6 @@ /** * @file test_hash_iter.c Test hash table iterators - * @author David Huggins-Daines + * @author David Huggins-Daines */ #include "hash_table.h" diff --git a/test/unit/test_util/test_bit_encode.c b/test/unit/test_util/test_bit_encode.c index 5ead3f170..df8178eda 100644 --- a/test/unit/test_util/test_bit_encode.c +++ b/test/unit/test_util/test_bit_encode.c @@ -1,6 +1,6 @@ /** * @file test_bit_encode.c Test bitstream encoding - * @author David Huggins-Daines + * @author David Huggins-Daines */ #include "pio.h" diff --git a/test/unit/test_util/test_build_directory.c b/test/unit/test_util/test_build_directory.c index 5e7842799..80099fc4d 100644 --- a/test/unit/test_util/test_build_directory.c +++ b/test/unit/test_util/test_build_directory.c @@ -1,7 +1,7 @@ /* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /** * @file test_build_directory.c Test recursive directory creation - * @author David Huggins-Daines + * @author David Huggins-Daines */ #include "pio.h" diff --git a/test/unit/test_util/test_filename.c b/test/unit/test_util/test_filename.c index 15ab025ad..8efc6fc17 100644 --- a/test/unit/test_util/test_filename.c +++ b/test/unit/test_util/test_filename.c @@ -1,7 +1,7 @@ /* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /** * @file test_filename.c Test file name operations - * @author David Huggins-Daines + * @author David Huggins-Daines */ #include "filename.h" diff --git a/test/unit/test_util/test_fopen.c b/test/unit/test_util/test_fopen.c index 34c170fa0..55ba2c018 100644 --- a/test/unit/test_util/test_fopen.c +++ b/test/unit/test_util/test_fopen.c @@ -1,6 +1,6 @@ /** * @file test_fopen.c Test file opening - * @author David Huggins-Daines + * @author David Huggins-Daines */ #include "pio.h" diff --git a/test/unit/test_util/test_heap.c b/test/unit/test_util/test_heap.c index d3b0f8047..44f45c1c1 100644 --- a/test/unit/test_util/test_heap.c +++ b/test/unit/test_util/test_heap.c @@ -1,6 +1,6 @@ /** * @file test_heap.c Test heaps - * @author David Huggins-Daines + * @author David Huggins-Daines */ #include "heap.h" diff --git a/test/unit/test_util/test_readfile.c b/test/unit/test_util/test_readfile.c index 9b31c7ecd..3d710f143 100644 --- a/test/unit/test_util/test_readfile.c +++ b/test/unit/test_util/test_readfile.c @@ -1,7 +1,7 @@ /* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /** * @file test_readfile.c: Test for the methods to read the file - * @author David Huggins-Daines + * @author David Huggins-Daines */ #include "ckd_alloc.h" diff --git a/test/word_align.pl b/test/word_align.pl index 400da6d93..e87ff90b3 100755 --- a/test/word_align.pl +++ b/test/word_align.pl @@ -3,7 +3,7 @@ # word_align.pl - Calculate word error and accuracy for a recognition # hypothesis file vs. a reference transcription # -# Written by David Huggins-Daines for Speech +# Written by David Huggins-Daines for Speech # Recognition and Understanding 11-751, Carnegie Mellon University, # October 2004. From 1cab3ac7552591dccfa725279fcfb66fe0ca640d Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Tue, 7 Jun 2022 23:15:26 -0400 Subject: [PATCH 40/94] build: install pkg-config file --- CMakeLists.txt | 3 +++ pocketsphinx.pc.in | 21 ++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 146ad4825..8afd4e619 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,3 +63,6 @@ add_subdirectory(include) add_subdirectory(model) add_subdirectory(programs) add_subdirectory(doc) + +configure_file(pocketsphinx.pc.in pocketsphinx.pc @ONLY) +install(FILES ${CMAKE_BINARY_DIR}/pocketsphinx.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) diff --git a/pocketsphinx.pc.in b/pocketsphinx.pc.in index 3eb8948af..fc6bed055 100644 --- a/pocketsphinx.pc.in +++ b/pocketsphinx.pc.in @@ -1,16 +1,15 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ -libs=@LIBS@ -datadir=@datarootdir@/@PACKAGE@ -modeldir=@datarootdir@/@PACKAGE@/model +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@CMAKE_INSTALL_LIBDIR@ +includedir=@CMAKE_INSTALL_INCLUDEDIR@ +libs= +datadir=@CMAKE_INSTALL_DATAROOTDIR@/@PROJECT_SHORTNAME@ +modeldir=@CMAKE_INSTALL_DATAROOTDIR@/@PROJECT_SHORTNAME@/model Name: PocketSphinx Description: Lightweight speech recognition system -Version: @VERSION@ -URL: http://cmusphinx.sourceforge.net/ -Requires: sphinxbase >= @VERSION@ +Version: @PROJECT_VERSION@ +URL: @PACKAGE_URL@ Libs: -L${libdir} -lpocketsphinx -Libs.private: ${libs} -lm +Libs.private: ${libs} -lm -lpthread Cflags: -I${includedir} -I${includedir}/sphinxbase -I${includedir}/pocketsphinx From a9d8ab6122ee207260131ff036e5c0c466f0d8cc Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 06:32:30 -0400 Subject: [PATCH 41/94] build: enable the minimal set of unit tests --- CMakeLists.txt | 8 +++-- test/CMakeLists.txt | 4 +++ test/regression/CMakeLists.txt | 0 test/testfuncs.sh.in | 7 ++-- test/unit/CMakeLists.txt | 36 +++++++++++++++++++ test/unit/{ => test_fsg}/test_fsg.c | 0 test/unit/{test_macros.h => test_macros.h.in} | 2 ++ 7 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 test/CMakeLists.txt create mode 100644 test/regression/CMakeLists.txt create mode 100644 test/unit/CMakeLists.txt rename test/unit/{ => test_fsg}/test_fsg.c (100%) rename test/unit/{test_macros.h => test_macros.h.in} (79%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8afd4e619..95bc46203 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,9 +37,10 @@ cmake_print_variables(SIZEOF_LONG SIZEOF_LONG_LONG) test_big_endian(WORDS_BIGENDIAN) cmake_print_variables(WORDS_BIGENDIAN) -if(CMAKE_BUILD_TYPE STREQUAL Debug) - set(SPHINX_DEBUG 1) -endif() +# Don't do this +#if(CMAKE_BUILD_TYPE STREQUAL Debug) +# set(SPHINX_DEBUG 1) +#endif() if(MSVC) add_compile_options(/W3) @@ -63,6 +64,7 @@ add_subdirectory(include) add_subdirectory(model) add_subdirectory(programs) add_subdirectory(doc) +add_subdirectory(test) configure_file(pocketsphinx.pc.in pocketsphinx.pc @ONLY) install(FILES ${CMAKE_BINARY_DIR}/pocketsphinx.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 000000000..0086d1320 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,4 @@ +configure_file(testfuncs.sh.in testfuncs.sh @ONLY) + +add_subdirectory(regression) +add_subdirectory(unit) diff --git a/test/regression/CMakeLists.txt b/test/regression/CMakeLists.txt new file mode 100644 index 000000000..e69de29bb diff --git a/test/testfuncs.sh.in b/test/testfuncs.sh.in index beec392c9..03909a6cf 100644 --- a/test/testfuncs.sh.in +++ b/test/testfuncs.sh.in @@ -1,13 +1,12 @@ # Utility functions and parameters for regression tests # Predefined directories you may need -# Stupid broken CMU Facilities autoconf doesn't do @abs_top_srcdir@ -builddir=../"@top_builddir@" -sourcedir=../"@top_srcdir@" +builddir="@CMAKE_BINARY_DIR@" +sourcedir="@CMAKE_SOURCE_DIR@" tests=$sourcedir/test data=$sourcedir/test/data model=$sourcedir/model -programs="$builddir/src/programs" +programs="$builddir/programs" # Automatically report failures on exit failures="" diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt new file mode 100644 index 000000000..eca8f7213 --- /dev/null +++ b/test/unit/CMakeLists.txt @@ -0,0 +1,36 @@ +configure_file(test_macros.h.in test_macros.h @ONLY) +set(TESTS + test_acmod + test_acmod_grow + test_alignment + test_allphone + test_dict2pid + test_dict + test_fwdflat + test_fwdtree_bestpath + test_fwdtree + test_init + test_jsgf + test_keyphrase + test_lattice + test_lm_read + test_mllr + test_nbest + test_posterior + test_ptm_mgau + test_reinit + test_senfh + test_set_search + test_simple + test_state_align + ) +foreach(TEST_EXECUTABLE ${TESTS}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}) +endforeach() diff --git a/test/unit/test_fsg.c b/test/unit/test_fsg/test_fsg.c similarity index 100% rename from test/unit/test_fsg.c rename to test/unit/test_fsg/test_fsg.c diff --git a/test/unit/test_macros.h b/test/unit/test_macros.h.in similarity index 79% rename from test/unit/test_macros.h rename to test/unit/test_macros.h.in index 9a7d1f839..9267ac913 100644 --- a/test/unit/test_macros.h +++ b/test/unit/test_macros.h.in @@ -8,3 +8,5 @@ #define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) #define LOG_EPSILON 200 #define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) +#define MODELDIR "@CMAKE_SOURCE_DIR@/model" +#define DATADIR "@CMAKE_SOURCE_DIR@/test/data" From 996a76ecc951bd027cd6b694cbaecb3f338064c4 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 06:32:45 -0400 Subject: [PATCH 42/94] build: add action to run tests --- .github/workflows/tests.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 000000000..90f329886 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,16 @@ +name: Run Tests +on: + - push + - pull_request +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Build + run: | + mkdir build + (cd build && cmake -DCMAKE_BUILD_TYPE=DEBUG .. && make) + + - name: Run tests + run: | + make test From aec2bf6ddfb7a52025aa65f902f1b04ddde5baba Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 06:34:40 -0400 Subject: [PATCH 43/94] fix: get CMAKE_BUILD_TYPE right (#@@#) --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 90f329886..443677030 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,7 +9,7 @@ jobs: - name: Build run: | mkdir build - (cd build && cmake -DCMAKE_BUILD_TYPE=DEBUG .. && make) + (cd build && cmake -DCMAKE_BUILD_TYPE=Debug .. && make) - name: Run tests run: | From d59ee93debd6658e3fe68830b0417f3fa349cf4c Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 06:37:59 -0400 Subject: [PATCH 44/94] build: still messing with github actions --- .github/workflows/tests.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 443677030..1df45cb1d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,9 +8,11 @@ jobs: steps: - name: Build run: | + pwd mkdir build - (cd build && cmake -DCMAKE_BUILD_TYPE=Debug .. && make) + (cd build && pwd && ls) + (cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=install ..) + (cd build && make) - name: Run tests - run: | - make test + run: make test From 8d621ab9cd4592dd646c9da92c71e03797f6a956 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 06:40:16 -0400 Subject: [PATCH 45/94] build: forgot to clone the source, oh... --- .github/workflows/tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1df45cb1d..6e91c601b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,12 +6,12 @@ jobs: test: runs-on: ubuntu-latest steps: + - name: Checkout + uses: actions/checkout@v3 - name: Build run: | - pwd mkdir build - (cd build && pwd && ls) - (cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=install ..) + (cd build && cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=install ..) (cd build && make) - name: Run tests From a1bb9d3926ef49145a378598b53e8a034e3f1eef Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 06:41:39 -0400 Subject: [PATCH 46/94] build: depends on doxygen (need to list deps somewhere) --- .github/workflows/tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6e91c601b..ea6cbcab5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,6 +6,8 @@ jobs: test: runs-on: ubuntu-latest steps: + - name: Install Build Dependencies + run: sudo apt-get -y install doxygen - name: Checkout uses: actions/checkout@v3 - name: Build From eaa2b52471f6731fb38b6d07be29df467ef4c399 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 07:09:27 -0400 Subject: [PATCH 47/94] build: support expected to fail and script tests --- test/unit/CMakeLists.txt | 2 ++ test/unit/test_alloc/CMakeLists.txt | 23 ++++++++++++++++++++ test/unit/test_alloc/Makefile.am | 15 ------------- test/unit/test_alloc/test_ckd_alloc.c | 2 +- test/unit/test_alloc/test_ckd_alloc_abort.c | 2 +- test/unit/test_alloc/test_ckd_alloc_abort.sh | 2 +- test/unit/test_alloc/test_ckd_alloc_catch.c | 2 +- test/unit/test_alloc/test_ckd_alloc_fail.c | 2 +- test/unit/test_alloc/test_ckd_alloc_fail.sh | 11 ---------- test/unit/test_alloc/test_listelem_alloc.c | 2 +- test/unit/test_alloc/test_macros.h | 11 ---------- test/unit/test_macros.h.in | 1 + 12 files changed, 32 insertions(+), 43 deletions(-) create mode 100644 test/unit/test_alloc/CMakeLists.txt delete mode 100644 test/unit/test_alloc/Makefile.am delete mode 100755 test/unit/test_alloc/test_ckd_alloc_fail.sh delete mode 100644 test/unit/test_alloc/test_macros.h diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index eca8f7213..13519c764 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -34,3 +34,5 @@ foreach(TEST_EXECUTABLE ${TESTS}) ) add_test(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}) endforeach() + +add_subdirectory(test_alloc) diff --git a/test/unit/test_alloc/CMakeLists.txt b/test/unit/test_alloc/CMakeLists.txt new file mode 100644 index 000000000..5acef2a86 --- /dev/null +++ b/test/unit/test_alloc/CMakeLists.txt @@ -0,0 +1,23 @@ +set(TESTS + test_ckd_alloc + test_ckd_alloc_catch + test_ckd_alloc_fail + test_ckd_alloc_abort + test_listelem_alloc + ) +foreach(TEST_EXECUTABLE ${TESTS}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) +endforeach() +add_test(NAME test_ckd_alloc COMMAND test_ckd_alloc) +add_test(NAME test_listelem_alloc COMMAND test_listelem_alloc) +add_test(NAME test_ckd_alloc_catch COMMAND test_ckd_alloc_catch) +add_test(NAME test_ckd_alloc_fail COMMAND test_ckd_alloc_fail) +set_property(TEST test_ckd_alloc_fail PROPERTY WILL_FAIL TRUE) +add_test(NAME test_ckd_alloc_abort COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/test_ckd_alloc_abort.sh) diff --git a/test/unit/test_alloc/Makefile.am b/test/unit/test_alloc/Makefile.am deleted file mode 100644 index a9d50c1a7..000000000 --- a/test/unit/test_alloc/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -check_PROGRAMS = test_ckd_alloc test_ckd_alloc_catch test_ckd_alloc_fail test_ckd_alloc_abort \ - test_listelem_alloc - -TESTS = test_ckd_alloc test_ckd_alloc_catch test_ckd_alloc_fail.sh test_ckd_alloc_abort.sh \ - test_listelem_alloc -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DTESTDATADIR=\"$(top_srcdir)/test/regression\" - -noinst_HEADERS = test_macros.h -EXTRA_DIST = test_ckd_alloc_fail.sh test_ckd_alloc_abort.sh - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la diff --git a/test/unit/test_alloc/test_ckd_alloc.c b/test/unit/test_alloc/test_ckd_alloc.c index 5d6925d2f..0f08eaebb 100644 --- a/test/unit/test_alloc/test_ckd_alloc.c +++ b/test/unit/test_alloc/test_ckd_alloc.c @@ -1,6 +1,6 @@ #include -#include +#include #include "test_macros.h" diff --git a/test/unit/test_alloc/test_ckd_alloc_abort.c b/test/unit/test_alloc/test_ckd_alloc_abort.c index db9dc7d1d..8b56367b3 100644 --- a/test/unit/test_alloc/test_ckd_alloc_abort.c +++ b/test/unit/test_alloc/test_ckd_alloc_abort.c @@ -1,6 +1,6 @@ #include -#include +#include #include "test_macros.h" diff --git a/test/unit/test_alloc/test_ckd_alloc_abort.sh b/test/unit/test_alloc/test_ckd_alloc_abort.sh index 6f1123e8e..9766b8119 100755 --- a/test/unit/test_alloc/test_ckd_alloc_abort.sh +++ b/test/unit/test_alloc/test_ckd_alloc_abort.sh @@ -1,6 +1,6 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh ulimit -c 0 if ./test_ckd_alloc_abort; then diff --git a/test/unit/test_alloc/test_ckd_alloc_catch.c b/test/unit/test_alloc/test_ckd_alloc_catch.c index 35ec9e2c3..178f7c54b 100644 --- a/test/unit/test_alloc/test_ckd_alloc_catch.c +++ b/test/unit/test_alloc/test_ckd_alloc_catch.c @@ -1,6 +1,6 @@ #include -#include +#include #include "test_macros.h" diff --git a/test/unit/test_alloc/test_ckd_alloc_fail.c b/test/unit/test_alloc/test_ckd_alloc_fail.c index 845d87a3e..f1c98c5ae 100644 --- a/test/unit/test_alloc/test_ckd_alloc_fail.c +++ b/test/unit/test_alloc/test_ckd_alloc_fail.c @@ -1,6 +1,6 @@ #include -#include +#include #include "test_macros.h" diff --git a/test/unit/test_alloc/test_ckd_alloc_fail.sh b/test/unit/test_alloc/test_ckd_alloc_fail.sh deleted file mode 100755 index 7758811ab..000000000 --- a/test/unit/test_alloc/test_ckd_alloc_fail.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -. ../testfuncs.sh - -./test_ckd_alloc_fail -if [ $? = 255 ]; then - pass expected_failure -else - fail expected_failure -fi - diff --git a/test/unit/test_alloc/test_listelem_alloc.c b/test/unit/test_alloc/test_listelem_alloc.c index e2fd4589f..5e0892b4b 100644 --- a/test/unit/test_alloc/test_listelem_alloc.c +++ b/test/unit/test_alloc/test_listelem_alloc.c @@ -1,7 +1,7 @@ #include #include -#include +#include #include "test_macros.h" diff --git a/test/unit/test_alloc/test_macros.h b/test/unit/test_alloc/test_macros.h deleted file mode 100644 index 12cd03f50..000000000 --- a/test/unit/test_alloc/test_macros.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -#include "logmath.h" - -#define EPSILON 0.01 -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define LOG_EPSILON 20 -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_macros.h.in b/test/unit/test_macros.h.in index 9267ac913..7772f0601 100644 --- a/test/unit/test_macros.h.in +++ b/test/unit/test_macros.h.in @@ -3,6 +3,7 @@ #include +#define EPSILON 0.01 #define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } #define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) #define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) From faa6c79e30e3b3d34406e10cf7b5febfa6ef394b Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 07:15:30 -0400 Subject: [PATCH 48/94] build: move bitvec up, add test_case --- test/unit/CMakeLists.txt | 2 ++ test/unit/test_alloc/CMakeLists.txt | 4 ++-- test/unit/{test_bitvec => }/test_bitvec.c | 2 +- test/unit/test_bitvec/Makefile.am | 12 ---------- test/unit/test_bitvec/test_macros.h | 11 --------- test/unit/test_case/CMakeLists.txt | 27 +++++++++++++++++++++++ test/unit/test_case/chgCase.c | 4 ++-- 7 files changed, 34 insertions(+), 28 deletions(-) rename test/unit/{test_bitvec => }/test_bitvec.c (97%) delete mode 100644 test/unit/test_bitvec/Makefile.am delete mode 100644 test/unit/test_bitvec/test_macros.h create mode 100644 test/unit/test_case/CMakeLists.txt diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 13519c764..1395aab09 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -4,6 +4,7 @@ set(TESTS test_acmod_grow test_alignment test_allphone + test_bitvec test_dict2pid test_dict test_fwdflat @@ -36,3 +37,4 @@ foreach(TEST_EXECUTABLE ${TESTS}) endforeach() add_subdirectory(test_alloc) +add_subdirectory(test_case) diff --git a/test/unit/test_alloc/CMakeLists.txt b/test/unit/test_alloc/CMakeLists.txt index 5acef2a86..13d78d015 100644 --- a/test/unit/test_alloc/CMakeLists.txt +++ b/test/unit/test_alloc/CMakeLists.txt @@ -1,11 +1,11 @@ -set(TESTS +set(TEST_EXECUTABLES test_ckd_alloc test_ckd_alloc_catch test_ckd_alloc_fail test_ckd_alloc_abort test_listelem_alloc ) -foreach(TEST_EXECUTABLE ${TESTS}) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) target_include_directories( diff --git a/test/unit/test_bitvec/test_bitvec.c b/test/unit/test_bitvec.c similarity index 97% rename from test/unit/test_bitvec/test_bitvec.c rename to test/unit/test_bitvec.c index 36f676035..0924ba6f6 100644 --- a/test/unit/test_bitvec/test_bitvec.c +++ b/test/unit/test_bitvec.c @@ -1,7 +1,7 @@ #include #include -#include "bitvec.h" +#include #include "test_macros.h" int diff --git a/test/unit/test_bitvec/Makefile.am b/test/unit/test_bitvec/Makefile.am deleted file mode 100644 index 01d3c8c04..000000000 --- a/test/unit/test_bitvec/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -check_PROGRAMS = test_bitvec - -TESTS = test_bitvec -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DTESTDATADIR=\"$(top_srcdir)/test/regression\" - -noinst_HEADERS = test_macros.h - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la diff --git a/test/unit/test_bitvec/test_macros.h b/test/unit/test_bitvec/test_macros.h deleted file mode 100644 index 12cd03f50..000000000 --- a/test/unit/test_bitvec/test_macros.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -#include "logmath.h" - -#define EPSILON 0.01 -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define LOG_EPSILON 20 -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_case/CMakeLists.txt b/test/unit/test_case/CMakeLists.txt new file mode 100644 index 000000000..9b55f5860 --- /dev/null +++ b/test/unit/test_case/CMakeLists.txt @@ -0,0 +1,27 @@ +set(TEST_EXECUTABLES + chgCase + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) +endforeach() +set(TESTS + _lcase1.test + _lcase2.test + _lcase3.test + _strcmp1.test + _strcmp2.test + _strcmp3.test + _ucase1.test + _ucase2.test + _ucase3.test +) +foreach(TEST ${TESTS}) + add_test(NAME ${TEST} COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/${TEST}) +endforeach() diff --git a/test/unit/test_case/chgCase.c b/test/unit/test_case/chgCase.c index ed4f3e0ff..0bc7a93d7 100644 --- a/test/unit/test_case/chgCase.c +++ b/test/unit/test_case/chgCase.c @@ -2,8 +2,8 @@ #include #include #include -#include -#include +#include +#include #define MAX_STR_LEN 64 #define NUM_STRS 6 From 01847bbe91d88b482a2b109bad99e2d61407f432 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 07:16:03 -0400 Subject: [PATCH 49/94] build: begone Makefile.am --- test/unit/test_case/Makefile.am | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 test/unit/test_case/Makefile.am diff --git a/test/unit/test_case/Makefile.am b/test/unit/test_case/Makefile.am deleted file mode 100644 index 1cafbaf50..000000000 --- a/test/unit/test_case/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -check_PROGRAMS = chgCase - - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la -lm - -TESTS = _lcase1.test \ - _lcase2.test \ - _lcase3.test \ - _strcmp1.test \ - _strcmp2.test \ - _strcmp3.test \ - _ucase1.test \ - _ucase2.test \ - _ucase3.test - -EXTRA_DIST = $(TESTS) From 2f5d179e7c20d123690157af0f16e235865fb941 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 07:21:22 -0400 Subject: [PATCH 50/94] fix: cmake and its annoying cache --- test/unit/test_alloc/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unit/test_alloc/CMakeLists.txt b/test/unit/test_alloc/CMakeLists.txt index 13d78d015..216a1632a 100644 --- a/test/unit/test_alloc/CMakeLists.txt +++ b/test/unit/test_alloc/CMakeLists.txt @@ -21,3 +21,4 @@ add_test(NAME test_ckd_alloc_catch COMMAND test_ckd_alloc_catch) add_test(NAME test_ckd_alloc_fail COMMAND test_ckd_alloc_fail) set_property(TEST test_ckd_alloc_fail PROPERTY WILL_FAIL TRUE) add_test(NAME test_ckd_alloc_abort COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/test_ckd_alloc_abort.sh) +set_property(TEST test_ckd_alloc_abort PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) From 3e058432d702cfc3cb1920d54311052e749d6d08 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 07:21:41 -0400 Subject: [PATCH 51/94] add test_cmdln --- test/unit/CMakeLists.txt | 1 + test/unit/test_cmdln/CMakeLists.txt | 26 +++++++++++++++++++ test/unit/test_cmdln/Makefile.am | 24 ----------------- test/unit/test_cmdln/_test_parse_badargs.test | 2 +- .../unit/test_cmdln/_test_parse_defaults.test | 2 +- .../test_cmdln/_test_parse_defaults_r.test | 2 +- .../unit/test_cmdln/_test_parse_goodargs.test | 2 +- .../unit/test_cmdln/_test_parse_multiple.test | 2 +- test/unit/test_cmdln/cmdln_parse.c | 4 +-- test/unit/test_cmdln/cmdln_parse_multiple.c | 4 +-- test/unit/test_cmdln/cmdln_parse_r.c | 4 +-- 11 files changed, 38 insertions(+), 35 deletions(-) create mode 100644 test/unit/test_cmdln/CMakeLists.txt delete mode 100644 test/unit/test_cmdln/Makefile.am diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 1395aab09..3804ad37e 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -38,3 +38,4 @@ endforeach() add_subdirectory(test_alloc) add_subdirectory(test_case) +add_subdirectory(test_cmdln) diff --git a/test/unit/test_cmdln/CMakeLists.txt b/test/unit/test_cmdln/CMakeLists.txt new file mode 100644 index 000000000..d7c7f8291 --- /dev/null +++ b/test/unit/test_cmdln/CMakeLists.txt @@ -0,0 +1,26 @@ +set(TEST_EXECUTABLES + cmdln_parse + cmdln_parse_multiple + cmdln_parse_r + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) +endforeach() +set(TESTS + _test_parse_badargs.test + _test_parse_defaults_r.test + _test_parse_defaults.test + _test_parse_goodargs.test + _test_parse_multiple.test +) +foreach(TEST ${TESTS}) + add_test(NAME ${TEST} COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/${TEST}) + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/unit/test_cmdln/Makefile.am b/test/unit/test_cmdln/Makefile.am deleted file mode 100644 index 8795033ca..000000000 --- a/test/unit/test_cmdln/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -check_PROGRAMS = cmdln_parse cmdln_parse_multiple cmdln_parse_r - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la -lm - -CLEANFILES = _test*.err _test*.out - -TESTS = _test_parse_badargs.test \ - _test_parse_defaults_r.test \ - _test_parse_defaults.test \ - _test_parse_goodargs.test \ - _test_parse_multiple.test - - -EXTRA_DIST = $(TESTS) \ - _test_parse_badargs.res \ - _test_parse_defaults.res \ - _test_parse_defaults_r.res \ - _test_parse_goodargs.res \ - _test_parse_multiple.res diff --git a/test/unit/test_cmdln/_test_parse_badargs.test b/test/unit/test_cmdln/_test_parse_badargs.test index 429615483..b294f2c70 100755 --- a/test/unit/test_cmdln/_test_parse_badargs.test +++ b/test/unit/test_cmdln/_test_parse_badargs.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e testname=`basename $0 .test` diff --git a/test/unit/test_cmdln/_test_parse_defaults.test b/test/unit/test_cmdln/_test_parse_defaults.test index 867895dd3..58b7a6cf5 100755 --- a/test/unit/test_cmdln/_test_parse_defaults.test +++ b/test/unit/test_cmdln/_test_parse_defaults.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e testname=`basename $0 .test` diff --git a/test/unit/test_cmdln/_test_parse_defaults_r.test b/test/unit/test_cmdln/_test_parse_defaults_r.test index a494ec678..069e39b18 100755 --- a/test/unit/test_cmdln/_test_parse_defaults_r.test +++ b/test/unit/test_cmdln/_test_parse_defaults_r.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e testname=`basename $0 .test` diff --git a/test/unit/test_cmdln/_test_parse_goodargs.test b/test/unit/test_cmdln/_test_parse_goodargs.test index eebb0da70..725bb422f 100755 --- a/test/unit/test_cmdln/_test_parse_goodargs.test +++ b/test/unit/test_cmdln/_test_parse_goodargs.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e testname=`basename $0 .test` diff --git a/test/unit/test_cmdln/_test_parse_multiple.test b/test/unit/test_cmdln/_test_parse_multiple.test index 5ac96f04e..ef43e39ee 100755 --- a/test/unit/test_cmdln/_test_parse_multiple.test +++ b/test/unit/test_cmdln/_test_parse_multiple.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e testname=`basename $0 .test` diff --git a/test/unit/test_cmdln/cmdln_parse.c b/test/unit/test_cmdln/cmdln_parse.c index b4cf436d2..15be020ae 100644 --- a/test/unit/test_cmdln/cmdln_parse.c +++ b/test/unit/test_cmdln/cmdln_parse.c @@ -3,8 +3,8 @@ #include #include -#include "cmd_ln.h" -#include "ckd_alloc.h" +#include +#include const arg_t defs[] = { { "-a", ARG_INT32, "42", "This is the first argument." }, diff --git a/test/unit/test_cmdln/cmdln_parse_multiple.c b/test/unit/test_cmdln/cmdln_parse_multiple.c index b6e0a14d1..73ab1d1c2 100644 --- a/test/unit/test_cmdln/cmdln_parse_multiple.c +++ b/test/unit/test_cmdln/cmdln_parse_multiple.c @@ -3,8 +3,8 @@ #include #include -#include "cmd_ln.h" -#include "ckd_alloc.h" +#include +#include const arg_t defs[] = { { "-a", ARG_INT32, "42", "This is the first argument." }, diff --git a/test/unit/test_cmdln/cmdln_parse_r.c b/test/unit/test_cmdln/cmdln_parse_r.c index bc4d2249f..e33c08f6d 100644 --- a/test/unit/test_cmdln/cmdln_parse_r.c +++ b/test/unit/test_cmdln/cmdln_parse_r.c @@ -3,8 +3,8 @@ #include #include -#include "cmd_ln.h" -#include "ckd_alloc.h" +#include +#include const arg_t defs[] = { { "-a", ARG_INT32, "42", "This is the first argument." }, From 4b5bbefdfb9039b1c0834c2567627d7174a9b8f2 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 07:25:53 -0400 Subject: [PATCH 52/94] build: move test_fe and test_pitch and fix them --- test/unit/CMakeLists.txt | 2 ++ test/unit/Makefile.am | 49 ---------------------------- test/unit/{test_fe => }/test_fe.c | 6 ++-- test/unit/test_fe/Makefile.am | 12 ------- test/unit/test_fe/test_macros.h | 12 ------- test/unit/test_macros.h.in | 1 + test/unit/{test_fe => }/test_pitch.c | 4 +-- 7 files changed, 8 insertions(+), 78 deletions(-) delete mode 100644 test/unit/Makefile.am rename test/unit/{test_fe => }/test_fe.c (98%) delete mode 100644 test/unit/test_fe/Makefile.am delete mode 100644 test/unit/test_fe/test_macros.h rename test/unit/{test_fe => }/test_pitch.c (94%) diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 3804ad37e..788681dd3 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -7,6 +7,7 @@ set(TESTS test_bitvec test_dict2pid test_dict + test_fe test_fwdflat test_fwdtree_bestpath test_fwdtree @@ -17,6 +18,7 @@ set(TESTS test_lm_read test_mllr test_nbest + test_pitch test_posterior test_ptm_mgau test_reinit diff --git a/test/unit/Makefile.am b/test/unit/Makefile.am deleted file mode 100644 index 578c0d5e5..000000000 --- a/test/unit/Makefile.am +++ /dev/null @@ -1,49 +0,0 @@ -check_PROGRAMS = \ - test_acmod \ - test_acmod_grow \ - test_alignment \ - test_allphone \ - test_dict2pid \ - test_dict \ - test_fsg \ - test_fwdflat \ - test_fwdtree_bestpath \ - test_fwdtree \ - test_init \ - test_jsgf \ - test_keyphrase \ - test_lattice \ - test_lm_read \ - test_mllr \ - test_nbest \ - test_posterior \ - test_ptm_mgau \ - test_reinit \ - test_senfh \ - test_set_search \ - test_simple \ - test_state_align - -TESTS = $(check_PROGRAMS) - -EXTRA_DIST = test_ps.c - -noinst_HEADERS = test_macros.h - -AM_CFLAGS =-I$(top_srcdir)/include \ - -I$(top_srcdir)/src/libpocketsphinx \ - -I$(top_builddir)/include \ - -I$(srcdir) \ - -DMODELDIR=\"${top_srcdir}/model\" \ - -DDATADIR=\"${top_srcdir}/test/data\" - -LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ - -lsphinxbase - -CLEANFILES = *.log *.out *.lat *.mfc *.raw *.dic *.sen - -valgrind-check: - for testf in .libs/lt-*; do valgrind --leak-check=full --show-reachable=yes \ - $$testf; done >& valgrind.log - diff --git a/test/unit/test_fe/test_fe.c b/test/unit/test_fe.c similarity index 98% rename from test/unit/test_fe/test_fe.c rename to test/unit/test_fe.c index c4f6123ce..2f22bc4ec 100644 --- a/test/unit/test_fe/test_fe.c +++ b/test/unit/test_fe.c @@ -1,9 +1,9 @@ #include #include -#include "fe.h" -#include "cmd_ln.h" -#include "ckd_alloc.h" +#include +#include +#include #include "test_macros.h" diff --git a/test/unit/test_fe/Makefile.am b/test/unit/test_fe/Makefile.am deleted file mode 100644 index 6184d96f9..000000000 --- a/test/unit/test_fe/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -check_PROGRAMS = test_fe test_pitch - -TESTS = test_fe test_pitch -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DTESTDATADIR=\"$(top_srcdir)/test/regression\" - -noinst_HEADERS = test_macros.h - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la diff --git a/test/unit/test_fe/test_macros.h b/test/unit/test_fe/test_macros.h deleted file mode 100644 index a88d229e8..000000000 --- a/test/unit/test_fe/test_macros.h +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include - -#include "logmath.h" - -#define EPSILON 0.01 -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define LOG_EPSILON 20 -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_macros.h.in b/test/unit/test_macros.h.in index 7772f0601..0abb03bfc 100644 --- a/test/unit/test_macros.h.in +++ b/test/unit/test_macros.h.in @@ -11,3 +11,4 @@ #define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) #define MODELDIR "@CMAKE_SOURCE_DIR@/model" #define DATADIR "@CMAKE_SOURCE_DIR@/test/data" +#define TESTDATADIR "@CMAKE_SOURCE_DIR@/test/regression" diff --git a/test/unit/test_fe/test_pitch.c b/test/unit/test_pitch.c similarity index 94% rename from test/unit/test_fe/test_pitch.c rename to test/unit/test_pitch.c index 02c9de73f..c805d415f 100644 --- a/test/unit/test_fe/test_pitch.c +++ b/test/unit/test_pitch.c @@ -1,7 +1,7 @@ #include -#include "yin.h" -#include "ckd_alloc.h" +#include +#include #include "test_macros.h" From 2b63bfd26d1caa6ff0120111cbfaeb415b377f4e Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 07:53:36 -0400 Subject: [PATCH 53/94] build: add test_fsg --- test/unit/CMakeLists.txt | 1 + test/unit/test_fsg/CMakeLists.txt | 18 ++++++++++++++++++ test/unit/test_fsg/Makefile.am | 18 ------------------ test/unit/test_fsg/test_fsg_jsgf.c | 4 ++-- test/unit/test_fsg/test_fsg_read.c | 2 +- test/unit/test_fsg/test_fsg_write_fsm.c | 4 ++-- test/unit/test_fsg/test_macros.h | 11 ----------- test/unit/test_macros.h.in | 1 + 8 files changed, 25 insertions(+), 34 deletions(-) create mode 100644 test/unit/test_fsg/CMakeLists.txt delete mode 100644 test/unit/test_fsg/Makefile.am delete mode 100644 test/unit/test_fsg/test_macros.h diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 788681dd3..c9f620399 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -41,3 +41,4 @@ endforeach() add_subdirectory(test_alloc) add_subdirectory(test_case) add_subdirectory(test_cmdln) +add_subdirectory(test_fsg) diff --git a/test/unit/test_fsg/CMakeLists.txt b/test/unit/test_fsg/CMakeLists.txt new file mode 100644 index 000000000..eafe7fa84 --- /dev/null +++ b/test/unit/test_fsg/CMakeLists.txt @@ -0,0 +1,18 @@ +set(TEST_EXECUTABLES + test_fsg_read + test_fsg_jsgf + test_fsg_write_fsm + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) + set_property(TARGET ${TEST_EXECUTABLE} + PROPERTY COMPILE_DEFINITIONS LMDIR="${CMAKE_CURRENT_SOURCE_DIR}") +endforeach() diff --git a/test/unit/test_fsg/Makefile.am b/test/unit/test_fsg/Makefile.am deleted file mode 100644 index 9838ed9e3..000000000 --- a/test/unit/test_fsg/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ -check_PROGRAMS = \ - test_fsg_read \ - test_fsg_jsgf \ - test_fsg_write_fsm - -TESTS = $(check_PROGRAMS) - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DLMDIR=\"${srcdir}\" - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la - -noinst_HEADERS = test_macros.h - -EXTRA_DIST = goforward.fsg polite.gram public.gram diff --git a/test/unit/test_fsg/test_fsg_jsgf.c b/test/unit/test_fsg/test_fsg_jsgf.c index aa6c1d346..b520ccecf 100644 --- a/test/unit/test_fsg/test_fsg_jsgf.c +++ b/test/unit/test_fsg/test_fsg_jsgf.c @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include #include "test_macros.h" diff --git a/test/unit/test_fsg/test_fsg_read.c b/test/unit/test_fsg/test_fsg_read.c index 60fd63591..ea0d2873e 100644 --- a/test/unit/test_fsg/test_fsg_read.c +++ b/test/unit/test_fsg/test_fsg_read.c @@ -1,4 +1,4 @@ -#include +#include #include "test_macros.h" diff --git a/test/unit/test_fsg/test_fsg_write_fsm.c b/test/unit/test_fsg/test_fsg_write_fsm.c index fd7fecfda..47a265a51 100644 --- a/test/unit/test_fsg/test_fsg_write_fsm.c +++ b/test/unit/test_fsg/test_fsg_write_fsm.c @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include "test_macros.h" diff --git a/test/unit/test_fsg/test_macros.h b/test/unit/test_fsg/test_macros.h deleted file mode 100644 index 8ade6918a..000000000 --- a/test/unit/test_fsg/test_macros.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -#include "logmath.h" - -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define TEST_EQUAL_STRING(a,b) TEST_ASSERT(0 == strcmp((a), (b))) -#define LOG_EPSILON 20 -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_macros.h.in b/test/unit/test_macros.h.in index 0abb03bfc..4e69cd5b1 100644 --- a/test/unit/test_macros.h.in +++ b/test/unit/test_macros.h.in @@ -7,6 +7,7 @@ #define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } #define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) #define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#define TEST_EQUAL_STRING(a,b) TEST_ASSERT(0 == strcmp((a), (b))) #define LOG_EPSILON 200 #define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) #define MODELDIR "@CMAKE_SOURCE_DIR@/model" From 3146dc0b446a6536855b5109b2233e545893e638 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:01:03 -0400 Subject: [PATCH 54/94] build: add test_feat --- test/unit/CMakeLists.txt | 1 + test/unit/test_feat/CMakeLists.txt | 30 ++++++++++++++++++++++++++++ test/unit/test_feat/_test_feat.test | 2 +- test/unit/test_feat/test_feat.c | 4 ++-- test/unit/test_feat/test_feat_fe.c | 8 ++++---- test/unit/test_feat/test_feat_live.c | 5 +++-- test/unit/test_feat/test_macros.h | 11 ---------- test/unit/test_feat/test_subvq.c | 5 +++-- 8 files changed, 44 insertions(+), 22 deletions(-) create mode 100644 test/unit/test_feat/CMakeLists.txt delete mode 100644 test/unit/test_feat/test_macros.h diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index c9f620399..dec11b7a1 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -41,4 +41,5 @@ endforeach() add_subdirectory(test_alloc) add_subdirectory(test_case) add_subdirectory(test_cmdln) +add_subdirectory(test_feat) add_subdirectory(test_fsg) diff --git a/test/unit/test_feat/CMakeLists.txt b/test/unit/test_feat/CMakeLists.txt new file mode 100644 index 000000000..ef27b99d0 --- /dev/null +++ b/test/unit/test_feat/CMakeLists.txt @@ -0,0 +1,30 @@ +set(TEST_EXECUTABLES + test_feat + test_feat_live + test_feat_fe + test_subvq + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) +endforeach() +set(TESTS + _test_feat.test + test_feat_live + test_feat_fe + test_subvq +) +foreach(TEST ${TESTS}) + if(${TEST} MATCHES "\.(test|sh)$") + add_test(NAME ${TEST} COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/${TEST}) + else() + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/unit/test_feat/_test_feat.test b/test/unit/test_feat/_test_feat.test index 0c6144b9c..6719ebc5a 100755 --- a/test/unit/test_feat/_test_feat.test +++ b/test/unit/test_feat/_test_feat.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e ./test_feat > _test_feat.out diff --git a/test/unit/test_feat/test_feat.c b/test/unit/test_feat/test_feat.c index e937c6dd5..77d3d422b 100644 --- a/test/unit/test_feat/test_feat.c +++ b/test/unit/test_feat/test_feat.c @@ -6,8 +6,8 @@ #include #include -#include "feat.h" -#include "ckd_alloc.h" +#include +#include const mfcc_t data[6][13] = { { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), diff --git a/test/unit/test_feat/test_feat_fe.c b/test/unit/test_feat/test_feat_fe.c index 0ad42b29b..2a9cb7e08 100644 --- a/test/unit/test_feat/test_feat_fe.c +++ b/test/unit/test_feat/test_feat_fe.c @@ -1,10 +1,10 @@ #include #include -#include "fe.h" -#include "feat.h" -#include "cmd_ln.h" -#include "ckd_alloc.h" +#include +#include +#include +#include #include "test_macros.h" diff --git a/test/unit/test_feat/test_feat_live.c b/test/unit/test_feat/test_feat_live.c index ac1c2d6bf..030d9779a 100644 --- a/test/unit/test_feat/test_feat_live.c +++ b/test/unit/test_feat/test_feat_live.c @@ -6,8 +6,9 @@ #include #include -#include "feat.h" -#include "ckd_alloc.h" +#include +#include + #include "test_macros.h" const mfcc_t data[6][13] = { diff --git a/test/unit/test_feat/test_macros.h b/test/unit/test_feat/test_macros.h deleted file mode 100644 index 12cd03f50..000000000 --- a/test/unit/test_feat/test_macros.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -#include "logmath.h" - -#define EPSILON 0.01 -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define LOG_EPSILON 20 -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_feat/test_subvq.c b/test/unit/test_feat/test_subvq.c index 2f0fb343d..12e38ced0 100644 --- a/test/unit/test_feat/test_subvq.c +++ b/test/unit/test_feat/test_subvq.c @@ -6,9 +6,10 @@ #include #include -#include "feat.h" +#include +#include + #include "test_macros.h" -#include "ckd_alloc.h" const mfcc_t data[6][13] = { { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), From 76bd01bbcbf81d3fa2cf5abf30baa551ee1412ae Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:01:26 -0400 Subject: [PATCH 55/94] build: begone --- test/unit/test_feat/Makefile.am | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 test/unit/test_feat/Makefile.am diff --git a/test/unit/test_feat/Makefile.am b/test/unit/test_feat/Makefile.am deleted file mode 100644 index d7353121e..000000000 --- a/test/unit/test_feat/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -check_PROGRAMS = test_feat test_feat_live test_feat_fe test_subvq -noinst_HEADERS = test_macros.h - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DTESTDATADIR=\"$(top_srcdir)/test/regression\" - - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la - -TESTS = _test_feat.test test_feat_live test_feat_fe test_subvq -EXTRA_DIST = _test_feat.res _test_feat.test -CLEANFILES = *.out From 42aaf07ab9892ad15486b64e5fa3b06045ee0642 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:05:37 -0400 Subject: [PATCH 56/94] build: add test_hash --- test/unit/CMakeLists.txt | 1 + test/unit/test_hash/CMakeLists.txt | 31 ++++++++++++++++++++++++++ test/unit/test_hash/Makefile.am | 31 -------------------------- test/unit/test_hash/_hash_delete1.test | 2 +- test/unit/test_hash/_hash_delete2.test | 2 +- test/unit/test_hash/_hash_delete3.test | 2 +- test/unit/test_hash/_hash_delete4.test | 2 +- test/unit/test_hash/_hash_delete5.test | 2 +- test/unit/test_hash/deletehash.c | 5 +++-- test/unit/test_hash/displayhash.c | 5 +++-- test/unit/test_hash/test_hash_iter.c | 5 +++-- test/unit/test_hash/test_macros.h | 7 ------ 12 files changed, 46 insertions(+), 49 deletions(-) create mode 100644 test/unit/test_hash/CMakeLists.txt delete mode 100644 test/unit/test_hash/Makefile.am delete mode 100644 test/unit/test_hash/test_macros.h diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index dec11b7a1..629bc96b4 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -43,3 +43,4 @@ add_subdirectory(test_case) add_subdirectory(test_cmdln) add_subdirectory(test_feat) add_subdirectory(test_fsg) +add_subdirectory(test_hash) diff --git a/test/unit/test_hash/CMakeLists.txt b/test/unit/test_hash/CMakeLists.txt new file mode 100644 index 000000000..008f84dff --- /dev/null +++ b/test/unit/test_hash/CMakeLists.txt @@ -0,0 +1,31 @@ +set(TEST_EXECUTABLES + displayhash + deletehash + test_hash_iter + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) +endforeach() +set(TESTS + test_hash_iter + _hash_delete1.test + _hash_delete2.test + _hash_delete3.test + _hash_delete4.test + _hash_delete5.test +) +foreach(TEST ${TESTS}) + if(${TEST} MATCHES "\.(test|sh)$") + add_test(NAME ${TEST} COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/${TEST}) + else() + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/unit/test_hash/Makefile.am b/test/unit/test_hash/Makefile.am deleted file mode 100644 index b9b3f7f33..000000000 --- a/test/unit/test_hash/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -check_PROGRAMS = displayhash deletehash test_hash_iter - -noinst_HEADERS = test_macros.h - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la - -TESTS = test_hash_iter \ - _hash_delete1.test \ - _hash_delete2.test \ - _hash_delete3.test \ - _hash_delete4.test \ - _hash_delete5.test - -EXTRA_DIST = display.res \ - _hash_delete1.res \ - _hash_delete1.test \ - _hash_delete2.res \ - _hash_delete2.test \ - _hash_delete3.res \ - _hash_delete3.test \ - _hash_delete4.res \ - _hash_delete4.test \ - _hash_delete5.res \ - _hash_delete5.test - -CLEANFILES = *.out \ No newline at end of file diff --git a/test/unit/test_hash/_hash_delete1.test b/test/unit/test_hash/_hash_delete1.test index 814d39635..273228fa5 100755 --- a/test/unit/test_hash/_hash_delete1.test +++ b/test/unit/test_hash/_hash_delete1.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e ./deletehash -lm > _hash_delete1.out 2>&1 diff --git a/test/unit/test_hash/_hash_delete2.test b/test/unit/test_hash/_hash_delete2.test index 7b14909a1..014fae59e 100755 --- a/test/unit/test_hash/_hash_delete2.test +++ b/test/unit/test_hash/_hash_delete2.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e ./deletehash -subvq > _hash_delete2.out 2>&1 diff --git a/test/unit/test_hash/_hash_delete3.test b/test/unit/test_hash/_hash_delete3.test index 7179a9584..368f9ec16 100755 --- a/test/unit/test_hash/_hash_delete3.test +++ b/test/unit/test_hash/_hash_delete3.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e ./deletehash -svq4svq > _hash_delete3.out 2>&1 diff --git a/test/unit/test_hash/_hash_delete4.test b/test/unit/test_hash/_hash_delete4.test index 24858f00e..1234565b2 100755 --- a/test/unit/test_hash/_hash_delete4.test +++ b/test/unit/test_hash/_hash_delete4.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e ./deletehash -hmmdump > _hash_delete4.out 2>&1 diff --git a/test/unit/test_hash/_hash_delete5.test b/test/unit/test_hash/_hash_delete5.test index d309e3d2d..6e8763381 100755 --- a/test/unit/test_hash/_hash_delete5.test +++ b/test/unit/test_hash/_hash_delete5.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e ./deletehash -foo > _hash_delete5.out 2>&1 diff --git a/test/unit/test_hash/deletehash.c b/test/unit/test_hash/deletehash.c index 811abb262..b84316ff8 100644 --- a/test/unit/test_hash/deletehash.c +++ b/test/unit/test_hash/deletehash.c @@ -2,8 +2,9 @@ #include #include #include -#include -#include + +#include +#include /* Explore a more complicated case for deletion */ int diff --git a/test/unit/test_hash/displayhash.c b/test/unit/test_hash/displayhash.c index 3d8ab04ed..b2a984e27 100644 --- a/test/unit/test_hash/displayhash.c +++ b/test/unit/test_hash/displayhash.c @@ -2,8 +2,9 @@ #include #include #include -#include -#include + +#include +#include /* Insert -hmmdump, -lm, -svq4svq, -beam, -lminmemory into a hash and display it. */ int diff --git a/test/unit/test_hash/test_hash_iter.c b/test/unit/test_hash/test_hash_iter.c index 94a93e0b3..30e7687db 100644 --- a/test/unit/test_hash/test_hash_iter.c +++ b/test/unit/test_hash/test_hash_iter.c @@ -3,8 +3,9 @@ * @author David Huggins-Daines */ -#include "hash_table.h" -#include "ckd_alloc.h" +#include +#include + #include "test_macros.h" #include diff --git a/test/unit/test_hash/test_macros.h b/test/unit/test_hash/test_macros.h deleted file mode 100644 index c315ced37..000000000 --- a/test/unit/test_hash/test_macros.h +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define EPSILON 0.001 -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) From 365ab631aab13d764b93409772665dc1df5d32b2 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:07:48 -0400 Subject: [PATCH 57/94] build: add test_lineiter --- test/unit/CMakeLists.txt | 1 + test/unit/test_lineiter/CMakeLists.txt | 16 ++++++++++++++++ test/unit/test_lineiter/Makefile.am | 16 ---------------- test/unit/test_lineiter/test_lineiter.c | 2 +- test/unit/test_lineiter/test_macros.h | 11 ----------- test/unit/test_macros.h.in | 1 + 6 files changed, 19 insertions(+), 28 deletions(-) create mode 100644 test/unit/test_lineiter/CMakeLists.txt delete mode 100644 test/unit/test_lineiter/Makefile.am delete mode 100644 test/unit/test_lineiter/test_macros.h diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 629bc96b4..9566f10f2 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -44,3 +44,4 @@ add_subdirectory(test_cmdln) add_subdirectory(test_feat) add_subdirectory(test_fsg) add_subdirectory(test_hash) +add_subdirectory(test_lineiter) diff --git a/test/unit/test_lineiter/CMakeLists.txt b/test/unit/test_lineiter/CMakeLists.txt new file mode 100644 index 000000000..786c26c72 --- /dev/null +++ b/test/unit/test_lineiter/CMakeLists.txt @@ -0,0 +1,16 @@ +set(TEST_EXECUTABLES + test_lineiter + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) + set_property(TARGET ${TEST_EXECUTABLE} + PROPERTY COMPILE_DEFINITIONS FILEDIR="${CMAKE_CURRENT_SOURCE_DIR}") +endforeach() diff --git a/test/unit/test_lineiter/Makefile.am b/test/unit/test_lineiter/Makefile.am deleted file mode 100644 index 820d08c4e..000000000 --- a/test/unit/test_lineiter/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -check_PROGRAMS = test_lineiter -TESTS = test_lineiter - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DFILEDIR=\"$(srcdir)\" - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la -lm - -noinst_HEADERS = test_macros.h - -EXTRA_DIST = test.txt - -CLEANFILES = *.out tmp.* diff --git a/test/unit/test_lineiter/test_lineiter.c b/test/unit/test_lineiter/test_lineiter.c index c041ea3ad..331e37d7a 100644 --- a/test/unit/test_lineiter/test_lineiter.c +++ b/test/unit/test_lineiter/test_lineiter.c @@ -1,4 +1,4 @@ -#include +#include #include #include "test_macros.h" diff --git a/test/unit/test_lineiter/test_macros.h b/test/unit/test_lineiter/test_macros.h deleted file mode 100644 index 47a0893f1..000000000 --- a/test/unit/test_lineiter/test_macros.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define EPSILON 0.01 -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) -#define TEST_EQUAL_STRING(a,b) TEST_ASSERT(strcmp((a), (b)) == 0) - diff --git a/test/unit/test_macros.h.in b/test/unit/test_macros.h.in index 4e69cd5b1..56b685107 100644 --- a/test/unit/test_macros.h.in +++ b/test/unit/test_macros.h.in @@ -1,4 +1,5 @@ #include +#include #include #include From 8a25c1fb4e3ab3c1f4627ce36666e680e877d0ea Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:11:48 -0400 Subject: [PATCH 58/94] build: move logmath tests up and add them --- test/unit/CMakeLists.txt | 3 +++ test/unit/{test_logmath => }/test_log_int16.c | 3 ++- test/unit/{test_logmath => }/test_log_int8.c | 3 ++- test/unit/{test_logmath => }/test_log_shifted.c | 3 ++- test/unit/test_logmath/Makefile.am | 13 ------------- test/unit/test_logmath/test_macros.h | 9 --------- test/unit/test_macros.h.in | 1 + 7 files changed, 10 insertions(+), 25 deletions(-) rename test/unit/{test_logmath => }/test_log_int16.c (98%) rename test/unit/{test_logmath => }/test_log_int8.c (96%) rename test/unit/{test_logmath => }/test_log_shifted.c (98%) delete mode 100644 test/unit/test_logmath/Makefile.am delete mode 100644 test/unit/test_logmath/test_macros.h diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 9566f10f2..979f0c8c3 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -16,6 +16,9 @@ set(TESTS test_keyphrase test_lattice test_lm_read + test_log_shifted + test_log_int8 + test_log_int16 test_mllr test_nbest test_pitch diff --git a/test/unit/test_logmath/test_log_int16.c b/test/unit/test_log_int16.c similarity index 98% rename from test/unit/test_logmath/test_log_int16.c rename to test/unit/test_log_int16.c index 754517299..910aa5f32 100644 --- a/test/unit/test_logmath/test_log_int16.c +++ b/test/unit/test_log_int16.c @@ -1,7 +1,8 @@ -#include +#include #include "test_macros.h" +#undef LOG_EPSILON #define LOG_EPSILON 1500 int diff --git a/test/unit/test_logmath/test_log_int8.c b/test/unit/test_log_int8.c similarity index 96% rename from test/unit/test_logmath/test_log_int8.c rename to test/unit/test_log_int8.c index a1f3838df..0f1574c97 100644 --- a/test/unit/test_logmath/test_log_int8.c +++ b/test/unit/test_log_int8.c @@ -1,7 +1,8 @@ -#include +#include #include "test_macros.h" +#undef LOG_EPSILON #define LOG_EPSILON 1500 int diff --git a/test/unit/test_logmath/test_log_shifted.c b/test/unit/test_log_shifted.c similarity index 98% rename from test/unit/test_logmath/test_log_shifted.c rename to test/unit/test_log_shifted.c index 006adf17b..f0245c782 100644 --- a/test/unit/test_logmath/test_log_shifted.c +++ b/test/unit/test_log_shifted.c @@ -1,7 +1,8 @@ -#include +#include #include "test_macros.h" +#undef LOG_EPSILON #define LOG_EPSILON 1500 int diff --git a/test/unit/test_logmath/Makefile.am b/test/unit/test_logmath/Makefile.am deleted file mode 100644 index 0e895c753..000000000 --- a/test/unit/test_logmath/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -check_PROGRAMS = test_log_int16 test_log_int8 test_log_shifted -TESTS = test_log_int16 test_log_int8 test_log_shifted - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la -lm - -noinst_HEADERS = test_macros.h - -CLEANFILES = *.out tmp.* diff --git a/test/unit/test_logmath/test_macros.h b/test/unit/test_logmath/test_macros.h deleted file mode 100644 index 3dac99fb5..000000000 --- a/test/unit/test_logmath/test_macros.h +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include - -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define EPSILON 0.01 -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_macros.h.in b/test/unit/test_macros.h.in index 56b685107..2ab5ee575 100644 --- a/test/unit/test_macros.h.in +++ b/test/unit/test_macros.h.in @@ -1,5 +1,6 @@ #include #include +#include #include #include From 0ecbed655f3d29927a9022f7d7cae1af8ff10b5b Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:16:14 -0400 Subject: [PATCH 59/94] build: always use internal lapack and enable test_matrix --- config.h.in | 3 -- src/util/matrix.c | 37 -------------------- test/unit/CMakeLists.txt | 1 + test/unit/test_matrix/CMakeLists.txt | 28 +++++++++++++++ test/unit/test_matrix/Makefile.am | 27 -------------- test/unit/test_matrix/_test_determinant.test | 2 +- test/unit/test_matrix/_test_invert.test | 2 +- test/unit/test_matrix/_test_solve.test | 2 +- test/unit/test_matrix/test_determinant.c | 4 +-- test/unit/test_matrix/test_invert.c | 4 +-- test/unit/test_matrix/test_solve.c | 4 +-- 11 files changed, 38 insertions(+), 76 deletions(-) create mode 100644 test/unit/test_matrix/CMakeLists.txt delete mode 100644 test/unit/test_matrix/Makefile.am diff --git a/config.h.in b/config.h.in index ff3390c5c..539fca168 100644 --- a/config.h.in +++ b/config.h.in @@ -30,9 +30,6 @@ /* The size of `long long', as computed by sizeof. */ #cmakedefine SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@ -/* Define to enable matrix algebra with LAPACK */ -#cmakedefine WITH_LAPACK - /* Define WORDS_BIGENDIAN if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined __BIG_ENDIAN__ diff --git a/src/util/matrix.c b/src/util/matrix.c index 7369ef76a..120152b81 100644 --- a/src/util/matrix.c +++ b/src/util/matrix.c @@ -142,41 +142,6 @@ band_nz_1d(float32 *v, } } -#ifndef WITH_LAPACK -float64 -determinant(float32 **a, int32 n) -{ - E_FATAL("No LAPACK library available, cannot compute determinant (FIXME)\n"); - return 0.0; -} -int32 -invert(float32 **ainv, float32 **a, int32 n) -{ - E_FATAL("No LAPACK library available, cannot compute matrix inverse (FIXME)\n"); - return 0; -} -int32 -solve(float32 **a, float32 *b, float32 *out_x, int32 n) -{ - E_FATAL("No LAPACK library available, cannot solve linear equations (FIXME)\n"); - return 0; -} - -void -matrixmultiply(float32 ** c, float32 ** a, float32 ** b, int32 n) -{ - int32 i, j, k; - - memset(c[0], 0, n*n*sizeof(float32)); - for (i = 0; i < n; ++i) { - for (j = 0; j < n; ++j) { - for (k = 0; k < n; ++k) { - c[i][k] += a[i][j] * b[j][k]; - } - } - } -} -#else /* WITH_LAPACK */ /* Find determinant through LU decomposition. */ float64 determinant(float32 ** a, int32 n) @@ -275,8 +240,6 @@ matrixmultiply(float32 ** c, float32 ** a, float32 ** b, int32 n) ssymm_(&side, &uplo, &n, &n, &alpha, a[0], &n, b[0], &n, &alpha, c[0], &n); } -#endif /* WITH_LAPACK */ - void outerproduct(float32 ** a, float32 * x, float32 * y, int32 len) { diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 979f0c8c3..259705f87 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -48,3 +48,4 @@ add_subdirectory(test_feat) add_subdirectory(test_fsg) add_subdirectory(test_hash) add_subdirectory(test_lineiter) +add_subdirectory(test_matrix) diff --git a/test/unit/test_matrix/CMakeLists.txt b/test/unit/test_matrix/CMakeLists.txt new file mode 100644 index 000000000..7e61b7b3d --- /dev/null +++ b/test/unit/test_matrix/CMakeLists.txt @@ -0,0 +1,28 @@ +set(TEST_EXECUTABLES + test_solve + test_invert + test_determinant + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) +endforeach() +set(TESTS + _test_determinant.test + _test_invert.test + _test_solve.test +) +foreach(TEST ${TESTS}) + if(${TEST} MATCHES "\.(test|sh)$") + add_test(NAME ${TEST} COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/${TEST}) + else() + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/unit/test_matrix/Makefile.am b/test/unit/test_matrix/Makefile.am deleted file mode 100644 index dabc4c1a1..000000000 --- a/test/unit/test_matrix/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ - -check_PROGRAMS = test_solve test_invert test_determinant - -test_solve_SRCS = test_solve.c -test_invert_SRCS = test_invert.c -test_determinant_SRCS = test_determinant.c - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la -lm - - -TESTS = _test_determinant.test \ - _test_invert.test \ - _test_solve.test - -EXTRA_DIST = _test_determinant.res \ - _test_determinant.test \ - _test_invert.res \ - _test_invert.test \ - _test_solve.res \ - _test_solve.test - -CLEANFILES = *.out diff --git a/test/unit/test_matrix/_test_determinant.test b/test/unit/test_matrix/_test_determinant.test index bd63a19b6..540962432 100755 --- a/test/unit/test_matrix/_test_determinant.test +++ b/test/unit/test_matrix/_test_determinant.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e ./test_determinant | sed -e 's,-0\.0,0.0,g' > _test_determinant.out diff --git a/test/unit/test_matrix/_test_invert.test b/test/unit/test_matrix/_test_invert.test index 33bef0536..195ff08c5 100755 --- a/test/unit/test_matrix/_test_invert.test +++ b/test/unit/test_matrix/_test_invert.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e ./test_invert | sed -e 's,-0\.0,0.0,g' > _test_invert.out diff --git a/test/unit/test_matrix/_test_solve.test b/test/unit/test_matrix/_test_solve.test index c17168417..cc7b29b24 100755 --- a/test/unit/test_matrix/_test_solve.test +++ b/test/unit/test_matrix/_test_solve.test @@ -1,5 +1,5 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh set -e ./test_solve > _test_solve.out diff --git a/test/unit/test_matrix/test_determinant.c b/test/unit/test_matrix/test_determinant.c index e7ca81c2b..10b213ac0 100644 --- a/test/unit/test_matrix/test_determinant.c +++ b/test/unit/test_matrix/test_determinant.c @@ -1,8 +1,8 @@ #include #include -#include "matrix.h" -#include "ckd_alloc.h" +#include +#include const float32 foo[3][3] = { {2, 0.42, 1}, diff --git a/test/unit/test_matrix/test_invert.c b/test/unit/test_matrix/test_invert.c index e650797a0..7dc99110d 100644 --- a/test/unit/test_matrix/test_invert.c +++ b/test/unit/test_matrix/test_invert.c @@ -1,8 +1,8 @@ #include #include -#include "matrix.h" -#include "ckd_alloc.h" +#include +#include const float32 foo[3][3] = { {2, 1, 1}, diff --git a/test/unit/test_matrix/test_solve.c b/test/unit/test_matrix/test_solve.c index ad237bee9..329e3ab0b 100644 --- a/test/unit/test_matrix/test_solve.c +++ b/test/unit/test_matrix/test_solve.c @@ -1,8 +1,8 @@ #include #include -#include "matrix.h" -#include "ckd_alloc.h" +#include +#include const float32 foo[3][3] = { {2, 1, 1}, From 1c1c5eff9725fa95b472d05d7c5ea409f5c82b37 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:27:43 -0400 Subject: [PATCH 60/94] build: add test_ngram and fix target conflitc --- test/unit/CMakeLists.txt | 3 +- test/unit/test_ngram/CMakeLists.txt | 22 ++++++++++ test/unit/test_ngram/Makefile.am | 40 ------------------- test/unit/test_ngram/test_lm_add.c | 6 +-- test/unit/test_ngram/test_lm_casefold.c | 6 +-- test/unit/test_ngram/test_lm_class.c | 6 +-- test/unit/test_ngram/test_lm_read.c | 6 +-- test/unit/test_ngram/test_lm_score.c | 6 +-- test/unit/test_ngram/test_lm_set.c | 6 +-- test/unit/test_ngram/test_lm_write.c | 8 ++-- test/unit/test_ngram/test_macros.h | 11 ----- ...test_lm_read.c => test_ngram_model_read.c} | 0 12 files changed, 46 insertions(+), 74 deletions(-) create mode 100644 test/unit/test_ngram/CMakeLists.txt delete mode 100644 test/unit/test_ngram/Makefile.am delete mode 100644 test/unit/test_ngram/test_macros.h rename test/unit/{test_lm_read.c => test_ngram_model_read.c} (100%) diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 259705f87..a13e04bad 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -15,7 +15,7 @@ set(TESTS test_jsgf test_keyphrase test_lattice - test_lm_read + test_ngram_model_read test_log_shifted test_log_int8 test_log_int16 @@ -49,3 +49,4 @@ add_subdirectory(test_fsg) add_subdirectory(test_hash) add_subdirectory(test_lineiter) add_subdirectory(test_matrix) +add_subdirectory(test_ngram) diff --git a/test/unit/test_ngram/CMakeLists.txt b/test/unit/test_ngram/CMakeLists.txt new file mode 100644 index 000000000..8118eb443 --- /dev/null +++ b/test/unit/test_ngram/CMakeLists.txt @@ -0,0 +1,22 @@ +set(TEST_EXECUTABLES + test_lm_read + test_lm_score + test_lm_add + test_lm_casefold + test_lm_class + test_lm_set + test_lm_write + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) + set_property(TARGET ${TEST_EXECUTABLE} + PROPERTY COMPILE_DEFINITIONS LMDIR="${CMAKE_CURRENT_SOURCE_DIR}") +endforeach() diff --git a/test/unit/test_ngram/Makefile.am b/test/unit/test_ngram/Makefile.am deleted file mode 100644 index cf21f5eb2..000000000 --- a/test/unit/test_ngram/Makefile.am +++ /dev/null @@ -1,40 +0,0 @@ -check_PROGRAMS = \ - test_lm_read \ - test_lm_score \ - test_lm_add \ - test_lm_casefold \ - test_lm_class \ - test_lm_set \ - test_lm_write - -TESTS = $(check_PROGRAMS) - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DLMDIR=\"${srcdir}\" - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la - -noinst_HEADERS = test_macros.h - -EXTRA_DIST = \ - 100.lm.gz \ - 100.lm.bz2 \ - 100.lm.dmp \ - 100.lm.bin \ - 100.probdef \ - 100.lmctl \ - 102.lm.gz \ - 102.lm.dmp \ - 104.lm.gz \ - 105.lm.gz \ - 106.lm.gz \ - 107.lm.gz \ - turtle.lm \ - turtle.lm.dmp \ - turtle.ug.lm \ - turtle.ug.lm.dmp - -CLEANFILES = 100.tmp.lm.bin 100.tmp.lm turtle.ug.tmp.lm.bin diff --git a/test/unit/test_ngram/test_lm_add.c b/test/unit/test_ngram/test_lm_add.c index 98ff97d85..20023f21b 100644 --- a/test/unit/test_ngram/test_lm_add.c +++ b/test/unit/test_ngram/test_lm_add.c @@ -1,6 +1,6 @@ -#include -#include -#include +#include +#include +#include #include "test_macros.h" diff --git a/test/unit/test_ngram/test_lm_casefold.c b/test/unit/test_ngram/test_lm_casefold.c index 8480b925b..f16a32d5f 100755 --- a/test/unit/test_ngram/test_lm_casefold.c +++ b/test/unit/test_ngram/test_lm_casefold.c @@ -1,6 +1,6 @@ -#include -#include -#include +#include +#include +#include #include "test_macros.h" diff --git a/test/unit/test_ngram/test_lm_class.c b/test/unit/test_ngram/test_lm_class.c index 633ed5159..d9a6ed555 100644 --- a/test/unit/test_ngram/test_lm_class.c +++ b/test/unit/test_ngram/test_lm_class.c @@ -1,6 +1,6 @@ -#include -#include -#include +#include +#include +#include #include "test_macros.h" diff --git a/test/unit/test_ngram/test_lm_read.c b/test/unit/test_ngram/test_lm_read.c index e8de5120d..75b205c12 100644 --- a/test/unit/test_ngram/test_lm_read.c +++ b/test/unit/test_ngram/test_lm_read.c @@ -1,6 +1,6 @@ -#include -#include -#include +#include +#include +#include #include "test_macros.h" diff --git a/test/unit/test_ngram/test_lm_score.c b/test/unit/test_ngram/test_lm_score.c index ae70c2629..582ca1c0f 100644 --- a/test/unit/test_ngram/test_lm_score.c +++ b/test/unit/test_ngram/test_lm_score.c @@ -1,6 +1,6 @@ -#include -#include -#include +#include +#include +#include #include "test_macros.h" diff --git a/test/unit/test_ngram/test_lm_set.c b/test/unit/test_ngram/test_lm_set.c index 4a8999808..dc29a60c0 100644 --- a/test/unit/test_ngram/test_lm_set.c +++ b/test/unit/test_ngram/test_lm_set.c @@ -1,6 +1,6 @@ -#include -#include -#include +#include +#include +#include #include "test_macros.h" diff --git a/test/unit/test_ngram/test_lm_write.c b/test/unit/test_ngram/test_lm_write.c index 0afe5ff6f..600f7b70f 100644 --- a/test/unit/test_ngram/test_lm_write.c +++ b/test/unit/test_ngram/test_lm_write.c @@ -1,7 +1,7 @@ -#include -#include -#include -#include +#include +#include +#include +#include #include "test_macros.h" diff --git a/test/unit/test_ngram/test_macros.h b/test/unit/test_ngram/test_macros.h deleted file mode 100644 index 67b177bb2..000000000 --- a/test/unit/test_ngram/test_macros.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -#include "logmath.h" - -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define LOG_EPSILON 20 -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_lm_read.c b/test/unit/test_ngram_model_read.c similarity index 100% rename from test/unit/test_lm_read.c rename to test/unit/test_ngram_model_read.c From a980ef776b089228ecee2868ccf3fc2e2b2e8835 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:33:16 -0400 Subject: [PATCH 61/94] build: add test_string --- test/unit/CMakeLists.txt | 1 + test/unit/test_string/CMakeLists.txt | 32 ++++++++++++++++++++++++++++ test/unit/test_string/Makefile.am | 23 -------------------- test/unit/test_string/strtest.c | 10 ++++----- test/unit/test_string/test_atof.c | 2 +- 5 files changed, 39 insertions(+), 29 deletions(-) create mode 100644 test/unit/test_string/CMakeLists.txt delete mode 100644 test/unit/test_string/Makefile.am diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index a13e04bad..b3c4d7d8d 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -50,3 +50,4 @@ add_subdirectory(test_hash) add_subdirectory(test_lineiter) add_subdirectory(test_matrix) add_subdirectory(test_ngram) +add_subdirectory(test_string) diff --git a/test/unit/test_string/CMakeLists.txt b/test/unit/test_string/CMakeLists.txt new file mode 100644 index 000000000..e650b8523 --- /dev/null +++ b/test/unit/test_string/CMakeLists.txt @@ -0,0 +1,32 @@ +set(TEST_EXECUTABLES + strtest + test_atof + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + set_property(TARGET ${TEST_EXECUTABLE} + PROPERTY COMPILE_DEFINITIONS FILEDIR="${CMAKE_CURRENT_SOURCE_DIR}") +endforeach() +set(TESTS + _fread_line.test + _nextword.test + _str2words.test + _string_join.test + _string_trim.test + test_atof +) +foreach(TEST ${TESTS}) + if(${TEST} MATCHES "\.(test|sh)$") + add_test(NAME ${TEST} COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/${TEST}) + else() + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/unit/test_string/Makefile.am b/test/unit/test_string/Makefile.am deleted file mode 100644 index ae3f3c6bd..000000000 --- a/test/unit/test_string/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -check_PROGRAMS = strtest test_atof - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DTESTDATADIR=\"$(srcdir)\" - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la - -TESTS = _fread_line.test \ - _nextword.test \ - _str2words.test \ - _string_join.test \ - _string_trim.test \ - test_atof - -EXTRA_DIST = _fread_line.txt \ - _fread_line.test \ - _nextword.test \ - _str2words.test \ - _string_join.test \ - _string_trim.test diff --git a/test/unit/test_string/strtest.c b/test/unit/test_string/strtest.c index bf71d6a43..d4b9883c1 100644 --- a/test/unit/test_string/strtest.c +++ b/test/unit/test_string/strtest.c @@ -3,9 +3,9 @@ #include #include -#include "strfuncs.h" -#include "pio.h" -#include "ckd_alloc.h" +#include +#include +#include int main(int argc, char *argv[]) @@ -27,12 +27,12 @@ main(int argc, char *argv[]) return 0; } else if (!strcmp(argv[1], "fread_line")) { - FILE *fp = fopen(TESTDATADIR "/_fread_line.txt", "r"); + FILE *fp = fopen(FILEDIR "/_fread_line.txt", "r"); char *line; size_t len; if (fp == NULL) { - perror("Failed to open " TESTDATADIR "/_fread_line.txt"); + perror("Failed to open " FILEDIR "/_fread_line.txt"); return 1; } line = fread_line(fp, &len); diff --git a/test/unit/test_string/test_atof.c b/test/unit/test_string/test_atof.c index 1cf110d2a..bc7faaa9b 100644 --- a/test/unit/test_string/test_atof.c +++ b/test/unit/test_string/test_atof.c @@ -4,7 +4,7 @@ #include #include -#include "strfuncs.h" +#include int main(int argc, char *argv[]) From b795970f6b252f21233ed2201b984da53b7f1b55 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:36:01 -0400 Subject: [PATCH 62/94] build: add test_thread --- test/unit/CMakeLists.txt | 1 + test/unit/test_thread/CMakeLists.txt | 16 ++++++++++++++++ test/unit/test_thread/Makefile.am | 18 ------------------ test/unit/test_thread/test_event.c | 4 ++-- test/unit/test_thread/test_macros.h | 10 ---------- test/unit/test_thread/test_msgq.c | 4 ++-- test/unit/test_thread/test_thread.c | 10 ++++++---- 7 files changed, 27 insertions(+), 36 deletions(-) create mode 100644 test/unit/test_thread/CMakeLists.txt delete mode 100644 test/unit/test_thread/Makefile.am delete mode 100644 test/unit/test_thread/test_macros.h diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index b3c4d7d8d..08a7eca9b 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -51,3 +51,4 @@ add_subdirectory(test_lineiter) add_subdirectory(test_matrix) add_subdirectory(test_ngram) add_subdirectory(test_string) +add_subdirectory(test_thread) diff --git a/test/unit/test_thread/CMakeLists.txt b/test/unit/test_thread/CMakeLists.txt new file mode 100644 index 000000000..36c5a8cc9 --- /dev/null +++ b/test/unit/test_thread/CMakeLists.txt @@ -0,0 +1,16 @@ +set(TEST_EXECUTABLES + test_thread + test_event + test_msgq + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) +endforeach() diff --git a/test/unit/test_thread/Makefile.am b/test/unit/test_thread/Makefile.am deleted file mode 100644 index 657e8387c..000000000 --- a/test/unit/test_thread/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ -check_PROGRAMS = \ - test_thread \ - test_event \ - test_msgq - -TESTS = $(check_PROGRAMS) - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DTESTDATADIR=\"$(top_srcdir)/test/regression\" - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la - -noinst_HEADERS = test_macros.h - -CLEANFILES = *.log diff --git a/test/unit/test_thread/test_event.c b/test/unit/test_thread/test_event.c index a497d613a..72aedfde3 100644 --- a/test/unit/test_thread/test_event.c +++ b/test/unit/test_thread/test_event.c @@ -1,6 +1,6 @@ #include -#include -#include +#include +#include int worker_main(sbthread_t *th) diff --git a/test/unit/test_thread/test_macros.h b/test/unit/test_thread/test_macros.h deleted file mode 100644 index 675d2e11a..000000000 --- a/test/unit/test_thread/test_macros.h +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -#include "logmath.h" - -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define LOG_EPSILON 20 -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_thread/test_msgq.c b/test/unit/test_thread/test_msgq.c index c9f11eecd..e83a8fb37 100644 --- a/test/unit/test_thread/test_msgq.c +++ b/test/unit/test_thread/test_msgq.c @@ -1,6 +1,6 @@ #include -#include -#include +#include +#include int worker_main(sbthread_t *th) diff --git a/test/unit/test_thread/test_thread.c b/test/unit/test_thread/test_thread.c index 956d554b2..a857e69b6 100644 --- a/test/unit/test_thread/test_thread.c +++ b/test/unit/test_thread/test_thread.c @@ -1,8 +1,10 @@ #include -#include -#include -#include -#include +#include +#include +#include +#include + +#include "test_macros.h" static const arg_t fe_args[] = { waveform_to_cepstral_command_line_macro(), From 6f20f1324df10a88d91ba6756d71cc742288b673 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:38:39 -0400 Subject: [PATCH 63/94] build: add test_util... all unit tests done! --- test/unit/CMakeLists.txt | 1 + test/unit/test_util/CMakeLists.txt | 22 ++++++++++++++++++++++ test/unit/test_util/test_bit_encode.c | 2 +- test/unit/test_util/test_bitarr.c | 2 +- test/unit/test_util/test_build_directory.c | 2 +- test/unit/test_util/test_filename.c | 2 +- test/unit/test_util/test_fopen.c | 2 +- test/unit/test_util/test_heap.c | 2 +- test/unit/test_util/test_macros.h | 10 ---------- test/unit/test_util/test_readfile.c | 4 ++-- 10 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 test/unit/test_util/CMakeLists.txt delete mode 100644 test/unit/test_util/test_macros.h diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 08a7eca9b..f71381f17 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -52,3 +52,4 @@ add_subdirectory(test_matrix) add_subdirectory(test_ngram) add_subdirectory(test_string) add_subdirectory(test_thread) +add_subdirectory(test_util) diff --git a/test/unit/test_util/CMakeLists.txt b/test/unit/test_util/CMakeLists.txt new file mode 100644 index 000000000..a503aebec --- /dev/null +++ b/test/unit/test_util/CMakeLists.txt @@ -0,0 +1,22 @@ +set(TEST_EXECUTABLES + test_fopen + test_bitarr + test_bit_encode + test_build_directory + test_heap + test_filename + test_readfile + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) + set_property(TARGET ${TEST_EXECUTABLE} + PROPERTY COMPILE_DEFINITIONS LMDIR="${CMAKE_SOURCE_DIR}/test/unit/test_ngram") +endforeach() diff --git a/test/unit/test_util/test_bit_encode.c b/test/unit/test_util/test_bit_encode.c index df8178eda..31e290ee3 100644 --- a/test/unit/test_util/test_bit_encode.c +++ b/test/unit/test_util/test_bit_encode.c @@ -3,7 +3,7 @@ * @author David Huggins-Daines */ -#include "pio.h" +#include #include "test_macros.h" #include diff --git a/test/unit/test_util/test_bitarr.c b/test/unit/test_util/test_bitarr.c index cfbf05e38..a425a89b3 100644 --- a/test/unit/test_util/test_bitarr.c +++ b/test/unit/test_util/test_bitarr.c @@ -2,7 +2,7 @@ * @file test_bitarr.c Test bit array io */ -#include "bitarr.h" +#include #include "test_macros.h" #include diff --git a/test/unit/test_util/test_build_directory.c b/test/unit/test_util/test_build_directory.c index 80099fc4d..d1e827b02 100644 --- a/test/unit/test_util/test_build_directory.c +++ b/test/unit/test_util/test_build_directory.c @@ -4,7 +4,7 @@ * @author David Huggins-Daines */ -#include "pio.h" +#include #include "test_macros.h" #include diff --git a/test/unit/test_util/test_filename.c b/test/unit/test_util/test_filename.c index 8efc6fc17..07ab4ae88 100644 --- a/test/unit/test_util/test_filename.c +++ b/test/unit/test_util/test_filename.c @@ -4,7 +4,7 @@ * @author David Huggins-Daines */ -#include "filename.h" +#include #include "test_macros.h" #include diff --git a/test/unit/test_util/test_fopen.c b/test/unit/test_util/test_fopen.c index 55ba2c018..92beb8cce 100644 --- a/test/unit/test_util/test_fopen.c +++ b/test/unit/test_util/test_fopen.c @@ -3,7 +3,7 @@ * @author David Huggins-Daines */ -#include "pio.h" +#include #include "test_macros.h" #include diff --git a/test/unit/test_util/test_heap.c b/test/unit/test_util/test_heap.c index 44f45c1c1..73efad652 100644 --- a/test/unit/test_util/test_heap.c +++ b/test/unit/test_util/test_heap.c @@ -3,7 +3,7 @@ * @author David Huggins-Daines */ -#include "heap.h" +#include #include "test_macros.h" #include diff --git a/test/unit/test_util/test_macros.h b/test/unit/test_util/test_macros.h deleted file mode 100644 index 675d2e11a..000000000 --- a/test/unit/test_util/test_macros.h +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -#include "logmath.h" - -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define LOG_EPSILON 20 -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_util/test_readfile.c b/test/unit/test_util/test_readfile.c index 3d710f143..4e8c9ae04 100644 --- a/test/unit/test_util/test_readfile.c +++ b/test/unit/test_util/test_readfile.c @@ -4,8 +4,8 @@ * @author David Huggins-Daines */ -#include "ckd_alloc.h" -#include "bio.h" +#include +#include #include "test_macros.h" #include From 2a6def5b5bd92983e4d47b9f2b4040ce00e93802 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:44:33 -0400 Subject: [PATCH 64/94] build: enable regression tests --- test/regression/CMakeLists.txt | 15 +++++++++++++++ test/regression/test-align.sh | 2 +- test/regression/test-cards.sh | 2 +- test/regression/test-cepview.sh | 2 +- test/regression/test-lm.sh | 2 +- test/regression/test-sphinx_fe-ctl.sh | 2 +- test/regression/test-sphinx_fe-dct.sh | 2 +- test/regression/test-sphinx_fe-dither-seed.sh | 2 +- test/regression/test-sphinx_fe-logspec.sh | 2 +- test/regression/test-sphinx_fe-logspec2cep.sh | 2 +- test/regression/test-sphinx_fe-smoothspec.sh | 2 +- test/regression/test-sphinx_fe.sh | 2 +- test/regression/test-sphinx_jsgf2fsg.sh | 2 +- test/regression/test-sphinx_pitch.sh | 2 +- test/regression/test-tidigits-fsg.sh | 2 +- test/regression/test-tidigits-simple.sh | 2 +- test/testfuncs.sh.in | 7 ++++--- test/word_align.pl | 2 +- 18 files changed, 35 insertions(+), 19 deletions(-) diff --git a/test/regression/CMakeLists.txt b/test/regression/CMakeLists.txt index e69de29bb..d571ddd69 100644 --- a/test/regression/CMakeLists.txt +++ b/test/regression/CMakeLists.txt @@ -0,0 +1,15 @@ +set(TESTS + test-cards.sh + test-lm.sh + test-align.sh + test-tidigits-fsg.sh + test-tidigits-simple.sh +) +foreach(TEST ${TESTS}) + if(${TEST} MATCHES "\.(test|sh)$") + add_test(NAME ${TEST} COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/${TEST}) + else() + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/regression/test-align.sh b/test/regression/test-align.sh index ecceaac61..8281676cf 100755 --- a/test/regression/test-align.sh +++ b/test/regression/test-align.sh @@ -1,6 +1,6 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh bn=`basename $0 .sh` diff --git a/test/regression/test-cards.sh b/test/regression/test-cards.sh index 83f26fed7..b76316a2d 100755 --- a/test/regression/test-cards.sh +++ b/test/regression/test-cards.sh @@ -1,6 +1,6 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh bn=`basename $0 .sh` diff --git a/test/regression/test-cepview.sh b/test/regression/test-cepview.sh index 62d9a2b1e..078f81b1a 100755 --- a/test/regression/test-cepview.sh +++ b/test/regression/test-cepview.sh @@ -1,5 +1,5 @@ #!/bin/sh -. ./testfuncs.sh +.${CMAKE_BINARY_DIR}/test/testfuncs.sh echo "CEPVIEW TEST" tmpout="test-cepview.out" diff --git a/test/regression/test-lm.sh b/test/regression/test-lm.sh index d8d562cb2..2f43adcb0 100755 --- a/test/regression/test-lm.sh +++ b/test/regression/test-lm.sh @@ -1,6 +1,6 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh bn=`basename $0 .sh` diff --git a/test/regression/test-sphinx_fe-ctl.sh b/test/regression/test-sphinx_fe-ctl.sh index b289438c0..068a10603 100755 --- a/test/regression/test-sphinx_fe-ctl.sh +++ b/test/regression/test-sphinx_fe-ctl.sh @@ -1,5 +1,5 @@ #!/bin/sh -. ./testfuncs.sh +.${CMAKE_BINARY_DIR}/test/testfuncs.sh tmpout="test-sphinx_fe-ctl.out" diff --git a/test/regression/test-sphinx_fe-dct.sh b/test/regression/test-sphinx_fe-dct.sh index 5923805d0..63855fbf0 100755 --- a/test/regression/test-sphinx_fe-dct.sh +++ b/test/regression/test-sphinx_fe-dct.sh @@ -1,5 +1,5 @@ #!/bin/sh -. ./testfuncs.sh +.${CMAKE_BINARY_DIR}/test/testfuncs.sh tmpout="test-sphinx_fe-dct.out" diff --git a/test/regression/test-sphinx_fe-dither-seed.sh b/test/regression/test-sphinx_fe-dither-seed.sh index b00dc303d..f45131346 100755 --- a/test/regression/test-sphinx_fe-dither-seed.sh +++ b/test/regression/test-sphinx_fe-dither-seed.sh @@ -1,5 +1,5 @@ #!/bin/sh -. ./testfuncs.sh +.${CMAKE_BINARY_DIR}/test/testfuncs.sh tmpout="test-sphinx_fe-dither-seed.out" diff --git a/test/regression/test-sphinx_fe-logspec.sh b/test/regression/test-sphinx_fe-logspec.sh index 933ff2e4d..14272bbe6 100755 --- a/test/regression/test-sphinx_fe-logspec.sh +++ b/test/regression/test-sphinx_fe-logspec.sh @@ -1,5 +1,5 @@ #!/bin/sh -. ./testfuncs.sh +.${CMAKE_BINARY_DIR}/test/testfuncs.sh tmpout="test-sphinx_fe-logspec.out" diff --git a/test/regression/test-sphinx_fe-logspec2cep.sh b/test/regression/test-sphinx_fe-logspec2cep.sh index e9730e344..defff3692 100755 --- a/test/regression/test-sphinx_fe-logspec2cep.sh +++ b/test/regression/test-sphinx_fe-logspec2cep.sh @@ -1,5 +1,5 @@ #!/bin/sh -. ./testfuncs.sh +.${CMAKE_BINARY_DIR}/test/testfuncs.sh tmpout="test-sphinx_fe-logspec2cep.out" diff --git a/test/regression/test-sphinx_fe-smoothspec.sh b/test/regression/test-sphinx_fe-smoothspec.sh index 42ed5338a..b56012168 100755 --- a/test/regression/test-sphinx_fe-smoothspec.sh +++ b/test/regression/test-sphinx_fe-smoothspec.sh @@ -1,5 +1,5 @@ #!/bin/sh -. ./testfuncs.sh +.${CMAKE_BINARY_DIR}/test/testfuncs.sh tmpout="test-sphinx_fe-smoothspec.out" diff --git a/test/regression/test-sphinx_fe.sh b/test/regression/test-sphinx_fe.sh index 10409daa9..a19586dbd 100755 --- a/test/regression/test-sphinx_fe.sh +++ b/test/regression/test-sphinx_fe.sh @@ -1,5 +1,5 @@ #!/bin/sh -. ./testfuncs.sh +.${CMAKE_BINARY_DIR}/test/testfuncs.sh tmpout="test-sphinx_fe.out" diff --git a/test/regression/test-sphinx_jsgf2fsg.sh b/test/regression/test-sphinx_jsgf2fsg.sh index 10e94a881..c1512dc3e 100755 --- a/test/regression/test-sphinx_jsgf2fsg.sh +++ b/test/regression/test-sphinx_jsgf2fsg.sh @@ -1,5 +1,5 @@ #!/bin/sh -. ./testfuncs.sh +.${CMAKE_BINARY_DIR}/test/testfuncs.sh echo "JSGF2FSG TEST" rules="test.rightRecursion test.nestedRightRecursion test.kleene test.nulltest test.command" diff --git a/test/regression/test-sphinx_pitch.sh b/test/regression/test-sphinx_pitch.sh index 02f6e9671..27b4e0dda 100755 --- a/test/regression/test-sphinx_pitch.sh +++ b/test/regression/test-sphinx_pitch.sh @@ -1,5 +1,5 @@ #!/bin/sh -. ./testfuncs.sh +.${CMAKE_BINARY_DIR}/test/testfuncs.sh tmpout="test-sphinx_pitch.out" diff --git a/test/regression/test-tidigits-fsg.sh b/test/regression/test-tidigits-fsg.sh index 4e7af80bc..5116ac170 100755 --- a/test/regression/test-tidigits-fsg.sh +++ b/test/regression/test-tidigits-fsg.sh @@ -1,6 +1,6 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh bn=`basename $0 .sh` diff --git a/test/regression/test-tidigits-simple.sh b/test/regression/test-tidigits-simple.sh index 17d3231fc..282335d94 100755 --- a/test/regression/test-tidigits-simple.sh +++ b/test/regression/test-tidigits-simple.sh @@ -1,6 +1,6 @@ #!/bin/sh -. ../testfuncs.sh +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh bn=`basename $0 .sh` diff --git a/test/testfuncs.sh.in b/test/testfuncs.sh.in index 03909a6cf..b342a603c 100644 --- a/test/testfuncs.sh.in +++ b/test/testfuncs.sh.in @@ -1,4 +1,5 @@ # Utility functions and parameters for regression tests +# No longer very useful with CMake but whatever # Predefined directories you may need builddir="@CMAKE_BINARY_DIR@" @@ -15,19 +16,19 @@ trap "report_failures" 0 run_program() { program="$1" shift - $builddir/libtool --mode=execute "$programs/$program" $@ + "$programs/$program" $@ } debug_program() { program="$1" shift - $builddir/libtool --mode=execute gdb --args "$programs/$program" $@ + gdb --args "$programs/$program" $@ } memcheck_program() { program="$1" shift - $builddir/libtool --mode=execute valgrind --leak-check=full "$programs/$program" $@ + valgrind --leak-check=full "$programs/$program" $@ } pass() { diff --git a/test/word_align.pl b/test/word_align.pl index e87ff90b3..d6f6d8036 100755 --- a/test/word_align.pl +++ b/test/word_align.pl @@ -11,7 +11,7 @@ use Getopt::Long; use Pod::Usage; use vars qw($Verbose $CER $IgnoreUttID); -use encoding 'utf8'; +use utf8; my ($help,%hyphash); GetOptions( From 4b22abea7f5fa2fb3282955fa9d12092b40dd965 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:45:13 -0400 Subject: [PATCH 65/94] fix: actually run the tests --- .github/workflows/tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ea6cbcab5..538d988f0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,4 +17,5 @@ jobs: (cd build && make) - name: Run tests - run: make test + run: | + (cd build && make test) From 50c5eaf617fadb90cb9f1f51b84bb5afa65446f3 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:58:34 -0400 Subject: [PATCH 66/94] build: remove more Makefile.am --- test/Makefile.am | 95 --------------------------------- test/regression/Makefile.am | 12 ----- test/unit/test_util/Makefile.am | 23 -------- 3 files changed, 130 deletions(-) delete mode 100644 test/Makefile.am delete mode 100644 test/regression/Makefile.am delete mode 100644 test/unit/test_util/Makefile.am diff --git a/test/Makefile.am b/test/Makefile.am deleted file mode 100644 index addd2a825..000000000 --- a/test/Makefile.am +++ /dev/null @@ -1,95 +0,0 @@ -SUBDIRS = unit regression - -EXTRA_DIST = \ - compare_table.pl \ - testfuncs_cygwin.sh \ - word_align.pl \ - data/an4_ci_cont/feat.params \ - data/an4_ci_cont/mdef \ - data/an4_ci_cont/means \ - data/an4_ci_cont/mixture_weights \ - data/an4_ci_cont/noisedict \ - data/an4_ci_cont/transition_matrices \ - data/an4_ci_cont/variances \ - data/cards/001.wav \ - data/cards/002.wav \ - data/cards/003.wav \ - data/cards/004.wav \ - data/cards/005.wav \ - data/cards/cards.fileids \ - data/cards/cards.gram \ - data/cards/cards.hyp \ - data/cards/cards.transcription \ - data/defective.gram \ - data/defective.dic \ - data/goforward.fsg \ - data/goforward.gram \ - data/goforward.raw \ - data/goforward.kws \ - data/goforward.mfc \ - data/mllr_matrices \ - data/numbers.raw \ - data/something.raw \ - data/test.lmctl \ - data/tidigits/dhd.2934z.raw \ - data/tidigits/man.ah.111a.mfc \ - data/tidigits/man.ah.1b.mfc \ - data/tidigits/man.ah.2934za.mfc \ - data/tidigits/man.ah.35oa.mfc \ - data/tidigits/man.ah.3oa.mfc \ - data/tidigits/man.ah.4625a.mfc \ - data/tidigits/man.ah.588zza.mfc \ - data/tidigits/man.ah.63a.mfc \ - data/tidigits/man.ah.6o838a.mfc \ - data/tidigits/man.ah.75913a.mfc \ - data/tidigits/man.ah.844o1a.mfc \ - data/tidigits/man.ah.8b.mfc \ - data/tidigits/man.ah.9b.mfc \ - data/tidigits/man.ah.o789a.mfc \ - data/tidigits/man.ah.z4548a.mfc \ - data/tidigits/man.ah.zb.mfc \ - data/tidigits/test-tidigits-fsg.match \ - data/tidigits/test-tidigits-simple.match \ - data/tidigits/tidigits.ctl \ - data/tidigits/tidigits.lsn \ - data/tidigits/woman.ak.1b.mfc \ - data/tidigits/woman.ak.276317oa.mfc \ - data/tidigits/woman.ak.334a.mfc \ - data/tidigits/woman.ak.3z3z9a.mfc \ - data/tidigits/woman.ak.48z66zza.mfc \ - data/tidigits/woman.ak.532a.mfc \ - data/tidigits/woman.ak.5z874a.mfc \ - data/tidigits/woman.ak.6728za.mfc \ - data/tidigits/woman.ak.75a.mfc \ - data/tidigits/woman.ak.84983a.mfc \ - data/tidigits/woman.ak.8a.mfc \ - data/tidigits/woman.ak.99731a.mfc \ - data/tidigits/woman.ak.o69a.mfc \ - data/tidigits/woman.ak.ooa.mfc \ - data/tidigits/woman.ak.za.mfc \ - data/tidigits/hmm/feat.params \ - data/tidigits/hmm/variances \ - data/tidigits/hmm/transition_matrices \ - data/tidigits/hmm/sendump \ - data/tidigits/hmm/mdef \ - data/tidigits/hmm/means \ - data/tidigits/lm/tidigits.dic \ - data/tidigits/lm/tidigits.lm.bin \ - data/tidigits/lm/tidigits.fsg \ - data/turtle.dic \ - data/turtle.lm.bin \ - data/unreachable.lat \ - data/librivox/fileids \ - data/librivox/sense_and_sensibility_01_austen_64kb-0870.txt \ - data/librivox/sense_and_sensibility_01_austen_64kb-0870.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0880.txt \ - data/librivox/sense_and_sensibility_01_austen_64kb-0880.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0890.txt \ - data/librivox/sense_and_sensibility_01_austen_64kb-0890.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0920.txt \ - data/librivox/sense_and_sensibility_01_austen_64kb-0920.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0930.txt \ - data/librivox/sense_and_sensibility_01_austen_64kb-0930.wav \ - data/librivox/test-align.matchseg \ - data/librivox/test-lm.match \ - data/librivox/transcription diff --git a/test/regression/Makefile.am b/test/regression/Makefile.am deleted file mode 100644 index 99c3d5421..000000000 --- a/test/regression/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -TESTS = \ - test-cards.sh \ - test-lm.sh \ - test-align.sh \ - test-tidigits-fsg.sh \ - test-tidigits-simple.sh - -TESTDATA = - -EXTRA_DIST = $(TESTS) $(TESTDATA) - -CLEANFILES = *.match *.log diff --git a/test/unit/test_util/Makefile.am b/test/unit/test_util/Makefile.am deleted file mode 100644 index 56442e47c..000000000 --- a/test/unit/test_util/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -check_PROGRAMS = \ - test_fopen \ - test_bitarr \ - test_bit_encode \ - test_build_directory \ - test_heap \ - test_filename \ - test_readfile - -TESTS = $(check_PROGRAMS) - -AM_CFLAGS =\ - -I$(top_srcdir)/include/sphinxbase \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DTESTDATADIR=\"$(top_srcdir)/test/regression\" \ - -DLMDIR=\"${top_srcdir}/test/unit/test_ngram\" - -LDADD = ${top_builddir}/src/libsphinxbase/libsphinxbase.la - -noinst_HEADERS = test_macros.h - -CLEANFILES = *.log *.out From 7bbb901011d820580a804ab83b6b4eab45133770 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 08:59:14 -0400 Subject: [PATCH 67/94] build: remove gst-plugin for now, too many changes from 0.8, cannot be validated --- src/gst-plugin/Makefile.am | 29 -- src/gst-plugin/gstpocketsphinx.c | 808 ------------------------------- src/gst-plugin/gstpocketsphinx.h | 98 ---- src/gst-plugin/livedemo.c | 108 ----- src/gst-plugin/livedemo.py | 103 ---- 5 files changed, 1146 deletions(-) delete mode 100644 src/gst-plugin/Makefile.am delete mode 100644 src/gst-plugin/gstpocketsphinx.c delete mode 100644 src/gst-plugin/gstpocketsphinx.h delete mode 100644 src/gst-plugin/livedemo.c delete mode 100644 src/gst-plugin/livedemo.py diff --git a/src/gst-plugin/Makefile.am b/src/gst-plugin/Makefile.am deleted file mode 100644 index d3f70bf01..000000000 --- a/src/gst-plugin/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -my_plugins = -my_headers = -my_files = -if BUILD_GST -my_plugins += libgstpocketsphinx.la -endif - -plugin_LTLIBRARIES = $(my_plugins) - -libgstpocketsphinx_la_SOURCES = gstpocketsphinx.c - -libgstpocketsphinx_la_LIBADD = \ - $(GST_LIBS) \ - -lgstaudio-$(GST_MAJORMINOR) \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ - -lsphinxbase - -libgstpocketsphinx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) - -noinst_HEADERS = gstpocketsphinx.h - -AM_CFLAGS = \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - $(GST_CFLAGS) \ - -DMODELDIR=\"$(pkgdatadir)/model\" - -EXTRA_DIST = livedemo.py livedemo.c - diff --git a/src/gst-plugin/gstpocketsphinx.c b/src/gst-plugin/gstpocketsphinx.c deleted file mode 100644 index c4bb3fa8a..000000000 --- a/src/gst-plugin/gstpocketsphinx.c +++ /dev/null @@ -1,808 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 2014 Alpha Cephei Inc. - * Copyright (c) 2007 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - * Author: David Huggins-Daines - */ - -/** - * SECTION:element-pocketsphix - * - * The element runs the speech recognition on incoming audio buffers and - * generates an element messages named "pocketsphinx" - * for each hypothesis and one for the final result. The message's structure - * contains these fields: - * - * - * - * - * #GstClockTime - * "timestamp": - * the timestamp of the buffer that triggered the message. - * - * - * - * - * #gboolean - * "final": - * %FALSE for intermediate messages. - * - * - * - * - * #gin32 - * "confidence": - * posterior probability (confidence) of the result in log domain - * - * - * - * - * #gchar - * "hypothesis": - * the recognized text - * - * - * - * - * - * Example pipeline - * |[ - * gst-launch-1.0 -m autoaudiosrc ! audioconvert ! audioresample ! pocketsphinx ! fakesink - * ]| - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include -#include - -#include "gstpocketsphinx.h" - -GST_DEBUG_CATEGORY_STATIC(pocketsphinx_debug); -#define GST_CAT_DEFAULT pocketsphinx_debug - - -static void -gst_pocketsphinx_set_property(GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); - -static void -gst_pocketsphinx_get_property(GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); - -static GstStateChangeReturn -gst_pocketsphinx_change_state(GstElement *element, GstStateChange transition); - -static GstFlowReturn -gst_pocketsphinx_chain(GstPad * pad, GstObject *parent, GstBuffer * buffer); - -static gboolean -gst_pocketsphinx_event(GstPad *pad, GstObject *parent, GstEvent *event); - -static void -gst_pocketsphinx_finalize_utt(GstPocketSphinx *ps); - -static void -gst_pocketsphinx_finalize(GObject * gobject); - -enum -{ - PROP_0, - PROP_HMM_DIR, - PROP_LM_FILE, - PROP_LMCTL_FILE, - PROP_DICT_FILE, - PROP_MLLR_FILE, - PROP_FSG_FILE, - PROP_ALLPHONE_FILE, - PROP_KWS_FILE, - PROP_JSGF_FILE, - PROP_FWDFLAT, - PROP_BESTPATH, - PROP_MAXHMMPF, - PROP_MAXWPF, - PROP_BEAM, - PROP_WBEAM, - PROP_PBEAM, - PROP_DSRATIO, - - PROP_LATDIR, - PROP_LM_NAME, - PROP_DECODER -}; - -/* - * Static data. - */ - -/* Default command line. (will go away soon and be constructed using properties) */ -static char *default_argv[] = { - "gst-pocketsphinx", -}; -static const int default_argc = sizeof(default_argv)/sizeof(default_argv[0]); - -static GstStaticPadTemplate sink_factory = - GST_STATIC_PAD_TEMPLATE("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS("audio/x-raw, " - "format = (string) { S16LE }, " - "channels = (int) 1, " - "rate = (int) 16000") - ); - -static GstStaticPadTemplate src_factory = - GST_STATIC_PAD_TEMPLATE("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS("text/plain") - ); - -/* - * Boxing of ps_decoder_t. - */ -GType -ps_decoder_get_type(void) -{ - static GType ps_decoder_type = 0; - - if (G_UNLIKELY(ps_decoder_type == 0)) { - ps_decoder_type = g_boxed_type_register_static - ("PSDecoder", - /* Conveniently, these should just work. */ - (GBoxedCopyFunc) ps_retain, - (GBoxedFreeFunc) ps_free); - } - - return ps_decoder_type; -} - - -G_DEFINE_TYPE(GstPocketSphinx, gst_pocketsphinx, GST_TYPE_ELEMENT); - -static void -gst_pocketsphinx_class_init(GstPocketSphinxClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *element_class;; - - gobject_class =(GObjectClass *) klass; - element_class = (GstElementClass *)klass; - - gobject_class->set_property = gst_pocketsphinx_set_property; - gobject_class->get_property = gst_pocketsphinx_get_property; - gobject_class->finalize = gst_pocketsphinx_finalize; - - /* TODO: We will bridge cmd_ln.h properties to GObject - * properties here somehow eventually. */ - g_object_class_install_property - (gobject_class, PROP_HMM_DIR, - g_param_spec_string("hmm", "HMM Directory", - "Directory containing acoustic model parameters", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_LM_FILE, - g_param_spec_string("lm", "LM File", - "Language model file", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_LMCTL_FILE, - g_param_spec_string("lmctl", "LM Control File", - "Language model control file (for class LMs)", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_FSG_FILE, - g_param_spec_string("fsg", "FSG File", - "Finite state grammar file", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_ALLPHONE_FILE, - g_param_spec_string("allphone", "Allphone File", - "Phonetic language model file", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_KWS_FILE, - g_param_spec_string("kws", "Keyphrases File", - "List of keyphrases for spotting", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_JSGF_FILE, - g_param_spec_string("jsgf", "Grammer file", - "File with grammer in Java Speech Grammar Format (JSGF)", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_DICT_FILE, - g_param_spec_string("dict", "Dictionary File", - "Dictionary File", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_MLLR_FILE, - g_param_spec_string("mllr", "MLLR transformation file", - "Transformation to apply to means and variances", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_FWDFLAT, - g_param_spec_boolean("fwdflat", "Flat Lexicon Search", - "Enable Flat Lexicon Search", - FALSE, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_BESTPATH, - g_param_spec_boolean("bestpath", "Graph Search", - "Enable Graph Search", - FALSE, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_MAXHMMPF, - g_param_spec_int("maxhmmpf", "Maximum HMMs per frame", - "Maximum number of HMMs searched per frame", - 1, 100000, 1000, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_MAXWPF, - g_param_spec_int("maxwpf", "Maximum words per frame", - "Maximum number of words searched per frame", - 1, 100000, 10, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_BEAM, - g_param_spec_double("beam", "Beam width applied to every frame in Viterbi search", - "Beam width applied to every frame in Viterbi search", - -1, 1, 1e-48, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_PBEAM, - g_param_spec_double("pbeam", "Beam width applied to phone transitions", - "Beam width applied to phone transitions", - -1, 1, 1e-48, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_WBEAM, - g_param_spec_double("wbeam", "Beam width applied to word exits", - "Beam width applied to phone transitions", - -1, 1, 7e-29, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_DSRATIO, - g_param_spec_int("dsratio", "Frame downsampling ratio", - "Evaluate acoustic model every N frames", - 1, 10, 1, - G_PARAM_READWRITE)); - - /* Could be changed on runtime when ps is already initialized */ - g_object_class_install_property - (gobject_class, PROP_LM_NAME, - g_param_spec_string("lmname", "LM Name", - "Language model name (to select LMs from lmctl)", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_LATDIR, - g_param_spec_string("latdir", "Lattice Directory", - "Output Directory for Lattices", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property - (gobject_class, PROP_DECODER, - g_param_spec_boxed("decoder", "Decoder object", - "The underlying decoder", - PS_DECODER_TYPE, - G_PARAM_READABLE)); - - - GST_DEBUG_CATEGORY_INIT(pocketsphinx_debug, "pocketsphinx", 0, - "Automatic Speech Recognition"); - - - element_class->change_state = gst_pocketsphinx_change_state; - - gst_element_class_add_pad_template(element_class, - gst_static_pad_template_get(&sink_factory)); - gst_element_class_add_pad_template(element_class, - gst_static_pad_template_get(&src_factory)); - - gst_element_class_set_static_metadata(element_class, "PocketSphinx", "Filter/Audio", "Convert speech to text", "CMUSphinx-devel "); - -} - -static void -gst_pocketsphinx_set_string(GstPocketSphinx *ps, - const gchar *key, const GValue *value) -{ - if (value != NULL) { - cmd_ln_set_str_r(ps->config, key, g_value_get_string(value)); - } else { - cmd_ln_set_str_r(ps->config, key, NULL); - } -} - -static void -gst_pocketsphinx_set_int(GstPocketSphinx *ps, - const gchar *key, const GValue *value) -{ - cmd_ln_set_int32_r(ps->config, key, g_value_get_int(value)); -} - -static void -gst_pocketsphinx_set_boolean(GstPocketSphinx *ps, - const gchar *key, const GValue *value) -{ - cmd_ln_set_boolean_r(ps->config, key, g_value_get_boolean(value)); -} - -static void -gst_pocketsphinx_set_double(GstPocketSphinx *ps, - const gchar *key, const GValue *value) -{ - cmd_ln_set_float_r(ps->config, key, g_value_get_double(value)); -} - -static void -gst_pocketsphinx_set_property(GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstPocketSphinx *ps = GST_POCKETSPHINX(object); - - switch (prop_id) { - - case PROP_HMM_DIR: - gst_pocketsphinx_set_string(ps, "-hmm", value); - break; - case PROP_LM_FILE: - /* FSG and LM are mutually exclusive. */ - gst_pocketsphinx_set_string(ps, "-lm", value); - gst_pocketsphinx_set_string(ps, "-lmctl", NULL); - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-kws", NULL); - gst_pocketsphinx_set_string(ps, "-jsgf", NULL); - break; - case PROP_LMCTL_FILE: - /* FSG and LM are mutually exclusive. */ - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-lmctl", value); - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-kws", NULL); - gst_pocketsphinx_set_string(ps, "-jsgf", NULL); - break; - case PROP_DICT_FILE: - gst_pocketsphinx_set_string(ps, "-dict", value); - break; - case PROP_MLLR_FILE: - gst_pocketsphinx_set_string(ps, "-mllr", value); - break; - case PROP_FSG_FILE: - /* FSG and LM are mutually exclusive */ - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-lmctl", NULL); - gst_pocketsphinx_set_string(ps, "-fsg", value); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-kws", NULL); - gst_pocketsphinx_set_string(ps, "-jsgf", NULL); - break; - case PROP_ALLPHONE_FILE: - /* FSG and LM are mutually exclusive. */ - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-lmctl", NULL); - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", value); - gst_pocketsphinx_set_string(ps, "-kws", NULL); - gst_pocketsphinx_set_string(ps, "-jsgf", NULL); - break; - case PROP_KWS_FILE: - /* FSG and LM are mutually exclusive. */ - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-lmctl", NULL); - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-jsgf", NULL); - gst_pocketsphinx_set_string(ps, "-kws", value); - break; - case PROP_JSGF_FILE: - /* FSG and LM are mutually exclusive. */ - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-lmctl", NULL); - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-kws", NULL); - gst_pocketsphinx_set_string(ps, "-jsgf", value); - break; - case PROP_FWDFLAT: - gst_pocketsphinx_set_boolean(ps, "-fwdflat", value); - break; - case PROP_BESTPATH: - gst_pocketsphinx_set_boolean(ps, "-bestpath", value); - break; - case PROP_MAXHMMPF: - gst_pocketsphinx_set_int(ps, "-maxhmmpf", value); - break; - case PROP_MAXWPF: - gst_pocketsphinx_set_int(ps, "-maxwpf", value); - break; - case PROP_BEAM: - gst_pocketsphinx_set_double(ps, "-beam", value); - break; - case PROP_PBEAM: - gst_pocketsphinx_set_double(ps, "-pbeam", value); - break; - case PROP_WBEAM: - gst_pocketsphinx_set_double(ps, "-wbeam", value); - break; - case PROP_DSRATIO: - gst_pocketsphinx_set_int(ps, "-ds", value); - break; - - - case PROP_LATDIR: - if (ps->latdir) - g_free(ps->latdir); - ps->latdir = g_strdup(g_value_get_string(value)); - break; - case PROP_LM_NAME: - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-kws", NULL); - gst_pocketsphinx_set_string(ps, "-jsgf", NULL); - gst_pocketsphinx_set_string(ps, "-lmname", value); - - /** - * Chances are that lmctl is already loaded and all - * corresponding searches are configured, so we simply - * try to set the search - */ - - if (value != NULL && ps->ps) { - ps_set_search(ps->ps, g_value_get_string(value)); - } - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); - return; - } - - /* If decoder was already initialized, reinit */ - if (ps->ps && prop_id != PROP_LATDIR && prop_id != PROP_LM_NAME) - ps_reinit(ps->ps, ps->config); -} - -static void -gst_pocketsphinx_get_property(GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstPocketSphinx *ps = GST_POCKETSPHINX(object); - - switch (prop_id) { - case PROP_DECODER: - g_value_set_boxed(value, ps->ps); - break; - case PROP_HMM_DIR: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-hmm")); - break; - case PROP_LM_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-lm")); - break; - case PROP_LMCTL_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-lmctl")); - break; - case PROP_LM_NAME: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-lmname")); - break; - case PROP_DICT_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-dict")); - break; - case PROP_MLLR_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-mllr")); - break; - case PROP_FSG_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-fsg")); - break; - case PROP_ALLPHONE_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-allphone")); - break; - case PROP_KWS_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-kws")); - break; - case PROP_JSGF_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-jsgf")); - break; - case PROP_FWDFLAT: - g_value_set_boolean(value, cmd_ln_boolean_r(ps->config, "-fwdflat")); - break; - case PROP_BESTPATH: - g_value_set_boolean(value, cmd_ln_boolean_r(ps->config, "-bestpath")); - break; - case PROP_LATDIR: - g_value_set_string(value, ps->latdir); - break; - case PROP_MAXHMMPF: - g_value_set_int(value, cmd_ln_int32_r(ps->config, "-maxhmmpf")); - break; - case PROP_MAXWPF: - g_value_set_int(value, cmd_ln_int32_r(ps->config, "-maxwpf")); - break; - case PROP_BEAM: - g_value_set_double(value, cmd_ln_float_r(ps->config, "-beam")); - break; - case PROP_PBEAM: - g_value_set_double(value, cmd_ln_float_r(ps->config, "-pbeam")); - break; - case PROP_WBEAM: - g_value_set_double(value, cmd_ln_float_r(ps->config, "-wbeam")); - break; - case PROP_DSRATIO: - g_value_set_int(value, cmd_ln_int32_r(ps->config, "-ds")); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); - break; - } -} - -static void -gst_pocketsphinx_finalize(GObject * gobject) -{ - GstPocketSphinx *ps = GST_POCKETSPHINX(gobject); - - ps_free(ps->ps); - cmd_ln_free_r(ps->config); - g_free(ps->last_result); - g_free(ps->latdir); - - G_OBJECT_CLASS(gst_pocketsphinx_parent_class)->finalize(gobject); -} - -static void -gst_pocketsphinx_init(GstPocketSphinx * ps) -{ - ps->sinkpad = - gst_pad_new_from_static_template(&sink_factory, "sink"); - ps->srcpad = - gst_pad_new_from_static_template(&src_factory, "src"); - - /* Parse default command-line options. */ - ps->config = cmd_ln_parse_r(NULL, ps_args(), default_argc, default_argv, FALSE); - ps_default_search_args(ps->config); - - /* Set up pads. */ - gst_element_add_pad(GST_ELEMENT(ps), ps->sinkpad); - gst_pad_set_chain_function(ps->sinkpad, gst_pocketsphinx_chain); - gst_pad_set_event_function(ps->sinkpad, gst_pocketsphinx_event); - gst_pad_use_fixed_caps(ps->sinkpad); - - gst_element_add_pad(GST_ELEMENT(ps), ps->srcpad); - gst_pad_use_fixed_caps(ps->srcpad); - - /* Initialize time. */ - ps->last_result_time = 0; - ps->last_result = NULL; -} - -static GstStateChangeReturn -gst_pocketsphinx_change_state(GstElement *element, GstStateChange transition) -{ - GstPocketSphinx *ps = GST_POCKETSPHINX(element); - - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - ps->ps = ps_init(ps->config); - if (ps->ps == NULL) { - GST_ELEMENT_ERROR(GST_ELEMENT(ps), LIBRARY, INIT, - ("Failed to initialize PocketSphinx"), - ("Failed to initialize PocketSphinx")); - return GST_STATE_CHANGE_FAILURE; - } - break; - case GST_STATE_CHANGE_READY_TO_NULL: - ps_free(ps->ps); - ps->ps = NULL; - default: - break; - } - - return GST_ELEMENT_CLASS(gst_pocketsphinx_parent_class)->change_state(element, transition); -} - -static void -gst_pocketsphinx_post_message(GstPocketSphinx *ps, gboolean final, - GstClockTime timestamp, gint32 prob, const gchar *hyp) -{ - GstStructure *s = gst_structure_new ("pocketsphinx", - "timestamp", G_TYPE_UINT64, timestamp, - "final", G_TYPE_BOOLEAN, final, - "confidence", G_TYPE_LONG, prob, - "hypothesis", G_TYPE_STRING, hyp, NULL); - - gst_element_post_message (GST_ELEMENT (ps), gst_message_new_element (GST_OBJECT (ps), s)); -} - -static GstFlowReturn -gst_pocketsphinx_chain(GstPad * pad, GstObject *parent, GstBuffer * buffer) -{ - GstPocketSphinx *ps; - GstMapInfo info; - gboolean in_speech; - - ps = GST_POCKETSPHINX(parent); - - /* Start an utterance for the first buffer we get */ - if (!ps->listening_started) { - ps->listening_started = TRUE; - ps->speech_started = FALSE; - ps_start_utt(ps->ps); - } - - gst_buffer_map (buffer, &info, GST_MAP_READ); - ps_process_raw(ps->ps, - (short*) info.data, - info.size / sizeof(short), - FALSE, FALSE); - gst_buffer_unmap (buffer, &info); - - in_speech = ps_get_in_speech(ps->ps); - if (in_speech && !ps->speech_started) { - ps->speech_started = TRUE; - } - if (!in_speech && ps->speech_started) { - gst_pocketsphinx_finalize_utt(ps); - } else if (ps->last_result_time == 0 - /* Get a partial result every now and then, see if it is different. */ - /* Check every 100 milliseconds. */ - || (GST_BUFFER_TIMESTAMP(buffer) - ps->last_result_time) > 100*10*1000) { - int32 score; - char const *hyp; - - hyp = ps_get_hyp(ps->ps, &score); - ps->last_result_time = GST_BUFFER_TIMESTAMP(buffer); - if (hyp && strlen(hyp) > 0) { - if (ps->last_result == NULL || 0 != strcmp(ps->last_result, hyp)) { - g_free(ps->last_result); - ps->last_result = g_strdup(hyp); - gst_pocketsphinx_post_message(ps, FALSE, ps->last_result_time, - ps_get_prob(ps->ps), hyp); - } - } - } - - gst_buffer_unref(buffer); - return GST_FLOW_OK; -} - - -static void -gst_pocketsphinx_finalize_utt(GstPocketSphinx *ps) -{ - GstBuffer *buffer; - char const *hyp; - int32 score; - - hyp = NULL; - if (!ps->listening_started) - return; - - ps_end_utt(ps->ps); - ps->listening_started = FALSE; - hyp = ps_get_hyp(ps->ps, &score); - - if (hyp) { - gst_pocketsphinx_post_message(ps, TRUE, GST_CLOCK_TIME_NONE, - ps_get_prob(ps->ps), hyp); - buffer = gst_buffer_new_and_alloc(strlen(hyp) + 1); - gst_buffer_fill(buffer, 0, hyp, strlen(hyp)); - gst_buffer_fill(buffer, strlen(hyp), "\n", 1); - gst_pad_push(ps->srcpad, buffer); - } - - if (ps->latdir) { - char *latfile; - char uttid[16]; - - sprintf(uttid, "%09u", ps->uttno); - ps->uttno++; - latfile = string_join(ps->latdir, "/", uttid, ".lat", NULL); - ps_lattice_t *dag; - if ((dag = ps_get_lattice(ps->ps))) - ps_lattice_write(dag, latfile); - ckd_free(latfile); - } -} - -static gboolean -gst_pocketsphinx_event(GstPad *pad, GstObject *parent, GstEvent *event) -{ - GstPocketSphinx *ps; - - ps = GST_POCKETSPHINX(parent); - - switch (event->type) { - case GST_EVENT_EOS: - { - gst_pocketsphinx_finalize_utt(ps); - return gst_pad_event_default(pad, parent, event); - } - default: - return gst_pad_event_default(pad, parent, event); - } -} - -static void -gst_pocketsphinx_log(void *user_data, err_lvl_t lvl, const char *fmt, ...) -{ - static const int gst_level[ERR_MAX] = {GST_LEVEL_DEBUG, GST_LEVEL_INFO, - GST_LEVEL_INFO, GST_LEVEL_WARNING, GST_LEVEL_ERROR, GST_LEVEL_ERROR}; - - va_list ap; - va_start(ap, fmt); - gst_debug_log_valist(pocketsphinx_debug, gst_level[lvl], "", "", 0, NULL, fmt, ap); - va_end(ap); -} - - -static gboolean -plugin_init(GstPlugin * plugin) -{ - - err_set_callback(gst_pocketsphinx_log, NULL); - - if (!gst_element_register(plugin, "pocketsphinx", - GST_RANK_NONE, GST_TYPE_POCKETSPHINX)) - return FALSE; - return TRUE; -} - -#define PACKAGE PACKAGE_NAME -GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, - GST_VERSION_MINOR, - pocketsphinx, - "PocketSphinx plugin", - plugin_init, PACKAGE_VERSION, - "BSD", - "PocketSphinx", "http://cmusphinx.sourceforge.net/") diff --git a/src/gst-plugin/gstpocketsphinx.h b/src/gst-plugin/gstpocketsphinx.h deleted file mode 100644 index 0822de04d..000000000 --- a/src/gst-plugin/gstpocketsphinx.h +++ /dev/null @@ -1,98 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 2007 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - * Author: David Huggins-Daines - */ - -#ifndef __GST_POCKETSPHINX_H__ -#define __GST_POCKETSPHINX_H__ - -#include -#include - -G_BEGIN_DECLS - -#define GST_TYPE_POCKETSPHINX \ - (gst_pocketsphinx_get_type()) -#define GST_POCKETSPHINX(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_POCKETSPHINX,GstPocketSphinx)) -#define GST_POCKETSPHINX_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_POCKETSPHINX,GstPocketSphinxClass)) -#define GST_IS_POCKETSPHINX(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_POCKETSPHINX)) -#define GST_IS_POCKETSPHINX_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_POCKETSPHINX)) - -typedef struct _GstPocketSphinx GstPocketSphinx; -typedef struct _GstPocketSphinxClass GstPocketSphinxClass; - -struct _GstPocketSphinx -{ - GstElement element; - - GstPad *sinkpad, *srcpad; - - ps_decoder_t *ps; - cmd_ln_t *config; - - gchar *latdir; /**< Output directory for word lattices. */ - - gboolean speech_started; - gboolean listening_started; - gint uttno; - - GstClockTime last_result_time; /**< Timestamp of last partial result. */ - char *last_result; /**< String of last partial result. */ -}; - -struct _GstPocketSphinxClass -{ - GstElementClass parent_class; - - void (*partial_result) (GstElement *element, const gchar *hyp_str); - void (*result) (GstElement *element, const gchar *hyp_str); -}; - -GType gst_pocketsphinx_get_type(void); - -/* - * Boxing of decoder. - */ -#define PS_DECODER_TYPE (ps_decoder_get_type()) -GType ps_decoder_get_type(void); - -G_END_DECLS - -#endif /* __GST_POCKETSPHINX_H__ */ diff --git a/src/gst-plugin/livedemo.c b/src/gst-plugin/livedemo.c deleted file mode 100644 index 44290f19d..000000000 --- a/src/gst-plugin/livedemo.c +++ /dev/null @@ -1,108 +0,0 @@ -#include -#include - -static gboolean -bus_call(GstBus * bus, GstMessage * msg, gpointer data) -{ - GMainLoop *loop = (GMainLoop *) data; - - switch (GST_MESSAGE_TYPE(msg)) { - - case GST_MESSAGE_EOS: - g_print("End of stream\n"); - g_main_loop_quit(loop); - break; - - case GST_MESSAGE_ERROR:{ - gchar *debug; - GError *error; - - gst_message_parse_error(msg, &error, &debug); - g_free(debug); - - g_printerr("Error: %s\n", error->message); - g_error_free(error); - - g_main_loop_quit(loop); - break; - } - default: - break; - } - - const GstStructure *st = gst_message_get_structure(msg); - if (st && strcmp(gst_structure_get_name(st), "pocketsphinx") == 0) { - if (g_value_get_boolean(gst_structure_get_value(st, "final"))) - g_print("Got result %s\n", g_value_get_string(gst_structure_get_value(st, "hypothesis"))); - } - - return TRUE; -} - - -int -main(int argc, char *argv[]) -{ - GMainLoop *loop; - - GstElement *pipeline, *source, *decoder, *sink; - GstBus *bus; - guint bus_watch_id; - - /* Initialisation */ - gst_init(&argc, &argv); - - loop = g_main_loop_new(NULL, FALSE); - - /* Check input arguments */ - if (argc != 2) { - g_printerr("Usage: %s \n", argv[0]); - return -1; - } - - /* Create gstreamer elements */ - pipeline = gst_pipeline_new("pipeline"); - source = gst_element_factory_make("filesrc", "file-source"); - decoder = gst_element_factory_make("pocketsphinx", "asr"); - sink = gst_element_factory_make("fakesink", "output"); - - if (!pipeline || !source || !decoder || !sink) { - g_printerr("One element could not be created. Exiting.\n"); - return -1; - } - - /* Set up the pipeline */ - /* we set the input filename to the source element */ - g_object_set(G_OBJECT(source), "location", argv[1], NULL); - - g_object_set(G_OBJECT(decoder), "lmctl", "test.lmctl", NULL); - g_object_set(G_OBJECT(decoder), "lmname", "tidigits", NULL); - - /* we add a message handler */ - bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); - bus_watch_id = gst_bus_add_watch(bus, bus_call, loop); - gst_object_unref(bus); - - /* we add all elements into the pipeline */ - gst_bin_add_many(GST_BIN(pipeline), source, decoder, sink, NULL); - - /* we link the elements together */ - gst_element_link_many(source, decoder, sink, NULL); - - gst_element_set_state(pipeline, GST_STATE_PLAYING); - - /* Iterate */ - g_print("Running...\n"); - g_main_loop_run(loop); - - /* Out of the main loop, clean up nicely */ - g_print("Returned, stopping playback\n"); - gst_element_set_state(pipeline, GST_STATE_NULL); - - g_print("Deleting pipeline\n"); - gst_object_unref(GST_OBJECT(pipeline)); - g_source_remove(bus_watch_id); - g_main_loop_unref(loop); - - return 0; -} diff --git a/src/gst-plugin/livedemo.py b/src/gst-plugin/livedemo.py deleted file mode 100644 index e73cf8be8..000000000 --- a/src/gst-plugin/livedemo.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2008 Carnegie Mellon University. -# -# You may modify and redistribute this file under the same terms as -# the CMU Sphinx system. See LICENSE for more information. - - -from gi import pygtkcompat -import gi - -gi.require_version('Gst', '1.0') -from gi.repository import GObject, Gst -GObject.threads_init() -Gst.init(None) - -gst = Gst - -print("Using pygtkcompat and Gst from gi") - -pygtkcompat.enable() -pygtkcompat.enable_gtk(version='3.0') - -import gtk - -class DemoApp(object): - """GStreamer/PocketSphinx Demo Application""" - def __init__(self): - """Initialize a DemoApp object""" - self.init_gui() - self.init_gst() - - def init_gui(self): - """Initialize the GUI components""" - self.window = gtk.Window() - self.window.connect("delete-event", gtk.main_quit) - self.window.set_default_size(400,200) - self.window.set_border_width(10) - vbox = gtk.VBox() - self.textbuf = gtk.TextBuffer() - self.text = gtk.TextView(buffer=self.textbuf) - self.text.set_wrap_mode(gtk.WRAP_WORD) - vbox.pack_start(self.text) - self.button = gtk.ToggleButton("Speak") - self.button.connect('clicked', self.button_clicked) - vbox.pack_start(self.button, False, False, 5) - self.window.add(vbox) - self.window.show_all() - - def init_gst(self): - """Initialize the speech components""" - self.pipeline = gst.parse_launch('autoaudiosrc ! audioconvert ! audioresample ' - + '! pocketsphinx ! fakesink') - bus = self.pipeline.get_bus() - bus.add_signal_watch() - bus.connect('message::element', self.element_message) - - self.pipeline.set_state(gst.State.PAUSED) - - def element_message(self, bus, msg): - """Receive element messages from the bus.""" - msgtype = msg.get_structure().get_name() - if msgtype != 'pocketsphinx': - return - - if msg.get_structure().get_value('final'): - self.final_result(msg.get_structure().get_value('hypothesis'), msg.get_structure().get_value('confidence')) - self.pipeline.set_state(gst.State.PAUSED) - self.button.set_active(False) - elif msg.get_structure().get_value('hypothesis'): - self.partial_result(msg.get_structure().get_value('hypothesis')) - - def partial_result(self, hyp): - """Delete any previous selection, insert text and select it.""" - # All this stuff appears as one single action - self.textbuf.begin_user_action() - self.textbuf.delete_selection(True, self.text.get_editable()) - self.textbuf.insert_at_cursor(hyp) - ins = self.textbuf.get_insert() - iter = self.textbuf.get_iter_at_mark(ins) - iter.backward_chars(len(hyp)) - self.textbuf.move_mark(ins, iter) - self.textbuf.end_user_action() - - def final_result(self, hyp, confidence): - """Insert the final result.""" - # All this stuff appears as one single action - self.textbuf.begin_user_action() - self.textbuf.delete_selection(True, self.text.get_editable()) - self.textbuf.insert_at_cursor(hyp) - self.textbuf.end_user_action() - - def button_clicked(self, button): - """Handle button presses.""" - if button.get_active(): - button.set_label("Stop") - self.pipeline.set_state(gst.State.PLAYING) - else: - button.set_label("Speak") - self.pipeline.set_state(gst.State.PAUSED) - -app = DemoApp() -gtk.main() From 2ec8b3015342ee6fade20000f7c5002689377add Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 09:33:01 -0400 Subject: [PATCH 68/94] fix: it's not a release yet ...even if CMake doesn't support proper semantic versioning --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 33a0d37cc..ce5f412a4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -PocketSphinx 1.0.0 -================== +PocketSphinx 1.0.0 prerelease +============================= This is PocketSphinx, one of Carnegie Mellon University's open source large vocabulary, speaker-independent continuous speech recognition engines. From 352b5905866f0f2f57cc95689db5b7312f5f9c9c Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:09:45 -0400 Subject: [PATCH 69/94] feat: add working log levels --- include/sphinxbase/err.h | 42 ++++++++++++++++----- src/util/err.c | 79 ++++++++++++++++++++++++++-------------- 2 files changed, 83 insertions(+), 38 deletions(-) diff --git a/include/sphinxbase/err.h b/include/sphinxbase/err.h index a41893892..9fd0efc43 100644 --- a/include/sphinxbase/err.h +++ b/include/sphinxbase/err.h @@ -116,7 +116,7 @@ extern "C" { /** * Continue printing the information to standard error stream */ -#define E_INFOCONT(...) err_msg(ERR_INFOCONT, NULL, 0, __VA_ARGS__) +#define E_INFOCONT(...) err_msg(ERR_INFO, NULL, 0, __VA_ARGS__) /** * Print logging information without filename. @@ -135,7 +135,6 @@ extern "C" { typedef enum err_e { ERR_DEBUG, ERR_INFO, - ERR_INFOCONT, ERR_WARN, ERR_ERROR, ERR_FATAL, @@ -153,6 +152,29 @@ err_logfp_cb(void * user_data, err_lvl_t level, const char *fmt, ...); typedef void (*err_cb_f)(void* user_data, err_lvl_t, const char *, ...); +/** + * Set minimum logging level. + * + * @param lvl Level below which messages will not be logged (note + * ERR_DEBUG messages are not logged unless compiled in debugging + * mode) + * @return previous log level. + */ +SPHINXBASE_EXPORT +int err_set_loglevel(err_lvl_t lvl); + +/** + * Set minimum logging levelfrom a string + * + * @param lvl Level below which messages will not be logged (note + * ERR_DEBUG messages are not logged unless compiled in debugging + * mode). A string corresponding to the names in enum err_e, but + * without the leading "ERR_" prefix. + * @return previous log level string, or NULL for invalid argument. + */ +SPHINXBASE_EXPORT +const char *err_set_loglevel_str(const char *lvl); + /** * Sets function to output error messages. Use it to redirect the logging * to your application. By default the handler which dumps messages to @@ -161,16 +183,16 @@ typedef void (*err_cb_f)(void* user_data, err_lvl_t, const char *, ...); * @param callback callback to pass messages too * @param user_data data to pass to callback */ -SPHINXBASE_EXPORT void -err_set_callback(err_cb_f callback, void *user_data); +SPHINXBASE_EXPORT +void err_set_callback(err_cb_f callback, void *user_data); /** * Direct all logging to a given filehandle if default logfp callback is set. * * @param stream Filehandle to send log messages to, or NULL to disable logging. */ -SPHINXBASE_EXPORT void -err_set_logfp(FILE *stream); +SPHINXBASE_EXPORT +void err_set_logfp(FILE *stream); /** * Get the current logging filehandle. @@ -178,8 +200,8 @@ err_set_logfp(FILE *stream); * @return Current logging filehandle, NULL if logging is disabled. Initially * it returns stderr */ -SPHINXBASE_EXPORT FILE * -err_get_logfp(void); +SPHINXBASE_EXPORT +FILE *err_get_logfp(void); /** * Append all log messages to a given file. @@ -189,8 +211,8 @@ err_get_logfp(void); * @param path File path to send log messages to * @return 0 for success, <0 for failure (e.g. if file does not exist) */ -SPHINXBASE_EXPORT int -err_set_logfile(const char *path); +SPHINXBASE_EXPORT +int err_set_logfile(const char *path); #ifdef __cplusplus } diff --git a/src/util/err.c b/src/util/err.c index 19c25e8e8..8eb2c2b05 100644 --- a/src/util/err.c +++ b/src/util/err.c @@ -76,19 +76,50 @@ static err_cb_f err_cb = err_wince_cb; static err_cb_f err_cb = err_logfp_cb; #endif static void* err_user_data; +static err_lvl_t min_loglevel = ERR_WARN; +static const char *err_level[ERR_MAX] = + { + "DEBUG", "INFO", "WARN", "ERROR", "FATAL" + }; + +int +err_set_loglevel(err_lvl_t lvl) +{ + int rv = min_loglevel; + min_loglevel = lvl; + return rv; +} + +const char * +err_set_loglevel_str(char const *lvl) +{ + const char *rv = err_level[min_loglevel]; + int i; + + if (lvl == NULL) + return NULL; + if (!strncmp(lvl, "ERR_", 4)) + lvl += 4; + for (i = 0; i < ERR_MAX; ++i) { + if (!strcmp(lvl, err_level[i])) { + min_loglevel = i; + return rv; + } + } + return NULL; +} void err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) { - static const char *err_prefix[ERR_MAX] = { - "DEBUG", "INFO", "INFOCONT", "WARN", "ERROR", "FATAL" - }; char msg[1024]; va_list ap; if (!err_cb) return; + if (lvl < min_loglevel) + return; va_start(ap, fmt); vsnprintf(msg, sizeof(msg), fmt, ap); @@ -96,12 +127,10 @@ err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) if (path) { const char *fname = path2basename(path); - if (lvl == ERR_INFOCONT) - err_cb(err_user_data, lvl, "%s(%ld): %s", fname, ln, msg); - else if (lvl == ERR_INFO) - err_cb(err_user_data, lvl, "%s: %s(%ld): %s", err_prefix[lvl], fname, ln, msg); + if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s", err_level[lvl], fname, ln, msg); else - err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s", err_prefix[lvl], fname, ln, msg); + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s", err_level[lvl], fname, ln, msg); } else { err_cb(err_user_data, lvl, "%s", msg); } @@ -111,10 +140,6 @@ err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) void err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) { - static const char *err_prefix[ERR_MAX] = { - "DEBUG", "INFO", "INFOCONT", "WARN", "ERROR", "FATAL" - }; - va_list ap; LPVOID error_wstring; DWORD error; @@ -123,6 +148,8 @@ err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) if (!err_cb) return; + if (lvl < min_loglevel) + return; error = GetLastError(); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | @@ -143,9 +170,7 @@ err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) if (path) { const char *fname = path2basename(path); - if (lvl == ERR_INFOCONT) - err_cb(err_user_data, lvl, "%s(%ld): %s: %s\n", fname, ln, msg, error_string); - else if (lvl == ERR_INFO) + if (lvl == ERR_INFO) err_cb(err_user_data, lvl, "%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string); else err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string); @@ -159,15 +184,13 @@ err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) { int local_errno = errno; - static const char *err_prefix[ERR_MAX] = { - "DEBUG", "INFO", "INFOCONT", "WARN", "ERROR", "FATAL" - }; - char msg[1024]; va_list ap; if (!err_cb) return; + if (lvl < min_loglevel) + return; va_start(ap, fmt); vsnprintf(msg, sizeof(msg), fmt, ap); @@ -175,12 +198,10 @@ err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) if (path) { const char *fname = path2basename(path); - if (lvl == ERR_INFOCONT) - err_cb(err_user_data, lvl, "%s(%ld): %s: %s\n", fname, ln, msg, strerror(local_errno)); - else if (lvl == ERR_INFO) - err_cb(err_user_data, lvl, "%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, strerror(local_errno)); + if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s: %s\n", err_level[lvl], fname, ln, msg, strerror(local_errno)); else - err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, strerror(local_errno)); + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s: %s\n", err_level[lvl], fname, ln, msg, strerror(local_errno)); } else { err_cb(err_user_data, lvl, "%s: %s\n", msg, strerror(local_errno)); } @@ -226,6 +247,9 @@ err_logfp_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) va_list ap; FILE *fp = err_get_logfp(); + (void)user_data; + (void)lvl; /* FIXME?!?! */ + if (!fp) return; @@ -239,20 +263,19 @@ err_logfp_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) int err_set_logfile(const char *path) { - FILE *newfp, *oldfp; + FILE *newfp; if ((newfp = fopen(path, "a")) == NULL) return -1; - oldfp = err_get_logfp(); err_set_logfp(newfp); - if (oldfp != NULL && oldfp != stdout && oldfp != stderr) - fclose(oldfp); return 0; } void err_set_logfp(FILE *stream) { + if (logfp != NULL && logfp != stdout && logfp != stderr) + fclose(logfp); if (stream == NULL) { logfp_disabled = TRUE; logfp = NULL; From 49dc6ff8cf259fdb5dc5e509adc6e3ce2d93e2d8 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:21:19 -0400 Subject: [PATCH 70/94] feat: ps_reinit_fe(), documentation fixes --- include/pocketsphinx.h | 69 ++++++++++++++++++++++++-------------- src/pocketsphinx.c | 75 +++++++++++++++++++++++++++++++++++------- 2 files changed, 108 insertions(+), 36 deletions(-) diff --git a/include/pocketsphinx.h b/include/pocketsphinx.h index 9ce47edb5..3dd67c9b5 100644 --- a/include/pocketsphinx.h +++ b/include/pocketsphinx.h @@ -106,8 +106,7 @@ ps_decoder_t *ps_init(cmd_ln_t *config); * object. * * @note The decoder retains ownership of the pointer - * config, so you must not attempt to free it manually. - * If you wish to reuse it elsewhere, call cmd_ln_retain() on it. + * config, so you should free it when no longer used. * * @param ps Decoder. * @param config An optional new configuration to use. If this is @@ -118,6 +117,28 @@ ps_decoder_t *ps_init(cmd_ln_t *config); POCKETSPHINX_EXPORT int ps_reinit(ps_decoder_t *ps, cmd_ln_t *config); +/** + * Reinitialize only the feature extractor with updated configuration. + * + * This function allows you to switch the feature extraction + * parameters without otherwise affecting the decoder configuration. + * For example, if you change the sample rate or the frame rate and do + * not need to reconfigure the rest of the decoder. + * + * @note The decoder retains ownership of the pointer + * config, so you should free it when no longer used. + * + * @param ps Decoder. + * @param config An optional new configuration to use. If this is + * NULL, the previous configuration will be reloaded, + * with any changes to feature extraction applied. + * @return pointer to new feature extractor. The decoder owns this + * pointer, so you should not attempt to free it manually. + * Use fe_retain() if you wish to reuse it elsewhere. + */ +POCKETSPHINX_EXPORT +fe_t * ps_reinit_fe(ps_decoder_t *ps, cmd_ln_t *config); + /** * Returns the argument definitions used in ps_init(). * @@ -143,9 +164,7 @@ ps_decoder_t *ps_retain(ps_decoder_t *ps); /** * Finalize the decoder. * - * This releases all resources associated with the decoder, including - * any language models or grammars which have been added to it, and - * the initial configuration object passed to ps_init(). + * This releases all resources associated with the decoder. * * @param ps Decoder to be freed. * @return New reference count (0 if freed). @@ -157,9 +176,9 @@ int ps_free(ps_decoder_t *ps); * Get the configuration object for this decoder. * * @return The configuration object for this decoder. The decoder - * retains ownership of this pointer, so you should not - * attempt to free it manually. Use cmd_ln_retain() if you - * wish to reuse it elsewhere. + * owns this pointer, so you should not attempt to free it + * manually. Use cmd_ln_retain() if you wish to reuse it + * elsewhere. */ POCKETSPHINX_EXPORT cmd_ln_t *ps_get_config(ps_decoder_t *ps); @@ -167,10 +186,10 @@ cmd_ln_t *ps_get_config(ps_decoder_t *ps); /** * Get the log-math computation object for this decoder. * - * @return The log-math object for this decoder. The decoder retains - * ownership of this pointer, so you should not attempt to - * free it manually. Use logmath_retain() if you wish to - * reuse it elsewhere. + * @return The log-math object for this decoder. The decoder owns + * this pointer, so you should not attempt to free it + * manually. Use logmath_retain() if you wish to reuse it + * elsewhere. */ POCKETSPHINX_EXPORT logmath_t *ps_get_logmath(ps_decoder_t *ps); @@ -179,9 +198,9 @@ logmath_t *ps_get_logmath(ps_decoder_t *ps); * Get the feature extraction object for this decoder. * * @return The feature extraction object for this decoder. The - * decoder retains ownership of this pointer, so you should - * not attempt to free it manually. Use fe_retain() if you - * wish to reuse it elsewhere. + * decoder owns this pointer, so you should not attempt to + * free it manually. Use fe_retain() if you wish to reuse it + * elsewhere. */ POCKETSPHINX_EXPORT fe_t *ps_get_fe(ps_decoder_t *ps); @@ -189,10 +208,10 @@ fe_t *ps_get_fe(ps_decoder_t *ps); /** * Get the dynamic feature computation object for this decoder. * - * @return The dynamic feature computation object for this decoder. The - * decoder retains ownership of this pointer, so you should - * not attempt to free it manually. Use feat_retain() if you - * wish to reuse it elsewhere. + * @return The dynamic feature computation object for this decoder. + * The decoder owns this pointer, so you should not attempt to + * free it manually. Use feat_retain() if you wish to reuse + * it elsewhere. */ POCKETSPHINX_EXPORT feat_t *ps_get_feat(ps_decoder_t *ps); @@ -200,11 +219,10 @@ feat_t *ps_get_feat(ps_decoder_t *ps); /** * Adapt current acoustic model using a linear transform. * - * @param mllr The new transform to use, or NULL to update the existing - * transform. The decoder retains ownership of this pointer, - * so you should not attempt to free it manually. Use - * ps_mllr_retain() if you wish to reuse it - * elsewhere. + * @param mllr The new transform to use, or NULL to update the + * existing transform. The decoder retains ownership of + * this pointer, so you may free it if you no longer need + * it. * @return The updated transform object for this decoder, or * NULL on failure. */ @@ -403,7 +421,8 @@ int ps_end_utt(ps_decoder_t *ps); * @param ps Decoder. * @param out_best_score Output: path score corresponding to returned string. * @return String containing best hypothesis at this point in - * decoding. NULL if no hypothesis is available. + * decoding. NULL if no hypothesis is available. This string is owned + * by the decoder, so you should copy it if you need to hold onto it. */ POCKETSPHINX_EXPORT char const *ps_get_hyp(ps_decoder_t *ps, int32 *out_best_score); diff --git a/src/pocketsphinx.c b/src/pocketsphinx.c index eb1c0bdd8..811b273ed 100644 --- a/src/pocketsphinx.c +++ b/src/pocketsphinx.c @@ -152,11 +152,6 @@ ps_expand_model_config(ps_decoder_t *ps) E_INFO("Parsed model-specific feature parameters from %s\n", featparams); } - - /* Print here because acmod_init might load feat.params file */ - if (err_get_logfp() != NULL) { - cmd_ln_print_values_r(ps->config, err_get_logfp(), ps_args()); - } } static void @@ -216,6 +211,26 @@ ps_default_search_args(cmd_ln_t *config) #endif } +fe_t * +ps_reinit_fe(ps_decoder_t *ps, cmd_ln_t *config) +{ + fe_t *new_fe; + + if (config && config != ps->config) { + cmd_ln_free_r(ps->config); + ps->config = cmd_ln_retain(config); + } + if ((new_fe = fe_init_auto_r(ps->config)) == NULL) + return NULL; + if (acmod_fe_mismatch(ps->acmod, new_fe)) { + fe_free(new_fe); + return NULL; + } + fe_free(ps->acmod->fe); + ps->acmod->fe = new_fe; + return new_fe; +} + int ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) { @@ -230,10 +245,21 @@ ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) /* Set up logging. We need to do this earlier because we want to dump * the information to the configured log, not to the stderr. */ - if (config && cmd_ln_str_r(ps->config, "-logfn")) { - if (err_set_logfile(cmd_ln_str_r(ps->config, "-logfn")) < 0) { - E_ERROR("Cannot redirect log output\n"); - return -1; + if (config) { + const char *logfn, *loglevel; + logfn = cmd_ln_str_r(ps->config, "-logfn"); + if (logfn) { + if (err_set_logfile(logfn) < 0) { + E_ERROR("Cannot redirect log output\n"); + return -1; + } + } + loglevel = cmd_ln_str_r(ps->config, "-loglevel"); + if (loglevel) { + if (err_set_loglevel_str(loglevel) == NULL) { + E_ERROR("Invalid log level: %s\n", loglevel); + return -1; + } } } @@ -244,6 +270,9 @@ ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) /* Fill in some default arguments. */ ps_expand_model_config(ps); + /* Print out the config for logging. */ + cmd_ln_log_values_r(ps->config, ps_args()); + /* Free old searches (do this before other reinit) */ ps_free_searches(ps); ps->searches = hash_table_new(3, HASH_CASE_YES); @@ -267,8 +296,7 @@ ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) if (ps->lmath) logmath_free(ps->lmath); ps->lmath = logmath_init - ((float64)cmd_ln_float32_r(ps->config, "-logbase"), 0, - cmd_ln_boolean_r(ps->config, "-bestpath")); + ((float64)cmd_ln_float32_r(ps->config, "-logbase"), 0, TRUE); } /* Acoustic model (this is basically everything that @@ -1051,6 +1079,11 @@ ps_search_forward(ps_decoder_t *ps) { int nfr; + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return -1; + } nfr = 0; while (ps->acmod->n_feat_frame > 0) { int k; @@ -1161,6 +1194,11 @@ ps_end_utt(ps_decoder_t *ps) { int rv, i; + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return -1; + } if (ps->acmod->state == ACMOD_ENDED || ps->acmod->state == ACMOD_IDLE) { E_ERROR("Utterance is not started\n"); return -1; @@ -1227,6 +1265,11 @@ ps_get_hyp(ps_decoder_t *ps, int32 *out_best_score) { char const *hyp; + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return NULL; + } ptmr_start(&ps->perf); hyp = ps_search_hyp(ps->search, out_best_score); ptmr_stop(&ps->perf); @@ -1238,6 +1281,11 @@ ps_get_prob(ps_decoder_t *ps) { int32 prob; + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return -1; + } ptmr_start(&ps->perf); prob = ps_search_prob(ps->search); ptmr_stop(&ps->perf); @@ -1249,6 +1297,11 @@ ps_seg_iter(ps_decoder_t *ps) { ps_seg_t *itor; + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return NULL; + } ptmr_start(&ps->perf); itor = ps_search_seg_iter(ps->search); ptmr_stop(&ps->perf); From fdb122d9b63a34caa249f1a1131b075b194245e8 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:21:56 -0400 Subject: [PATCH 71/94] feat: add -loglevel, remove deprecated argument types --- include/pocketsphinx/cmdln_macro.h | 84 ++++++++++++++++-------------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/include/pocketsphinx/cmdln_macro.h b/include/pocketsphinx/cmdln_macro.h index f9592113a..ee94ef2b8 100644 --- a/include/pocketsphinx/cmdln_macro.h +++ b/include/pocketsphinx/cmdln_macro.h @@ -63,6 +63,10 @@ ARG_STRING, \ NULL, \ "File to write log messages in" }, \ + { "-loglevel", \ + ARG_STRING, \ + "WARN", \ + "Minimum level of log messages (DEBUG, INFO, WARN, ERROR)" },\ { "-mfclogdir", \ ARG_STRING, \ NULL, \ @@ -81,51 +85,51 @@ /** Options defining beam width parameters for tuning the search. */ #define POCKETSPHINX_BEAM_OPTIONS \ { "-beam", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "1e-48", \ "Beam width applied to every frame in Viterbi search (smaller values mean wider beam)" }, \ { "-wbeam", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "7e-29", \ "Beam width applied to word exits" }, \ { "-pbeam", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "1e-48", \ "Beam width applied to phone transitions" }, \ { "-lpbeam", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "1e-40", \ "Beam width applied to last phone in words" }, \ { "-lponlybeam", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "7e-29", \ "Beam width applied to last phone in single-phone words" }, \ { "-fwdflatbeam", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "1e-64", \ "Beam width applied to every frame in second-pass flat search" }, \ { "-fwdflatwbeam", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "7e-29", \ "Beam width applied to word exits in second-pass flat search" }, \ { "-pl_window", \ - ARG_INT32, \ + ARG_INTEGER, \ "5", \ "Phoneme lookahead window size, in frames" }, \ { "-pl_beam", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "1e-10", \ "Beam width applied to phone loop search for lookahead" }, \ { "-pl_pbeam", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "1e-10", \ "Beam width applied to phone loop transitions for lookahead" }, \ { "-pl_pip", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "1.0", \ "Phone insertion penalty for phone loop" }, \ { "-pl_weight", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "3.0", \ "Weight for phoneme lookahead penalties" } \ @@ -152,27 +156,27 @@ "no", \ "Print results and backtraces to log." }, \ { "-latsize", \ - ARG_INT32, \ + ARG_INTEGER, \ "5000", \ "Initial backpointer table size" }, \ { "-maxwpf", \ - ARG_INT32, \ + ARG_INTEGER, \ "-1", \ "Maximum number of distinct word exits at each frame (or -1 for no pruning)" }, \ { "-maxhmmpf", \ - ARG_INT32, \ + ARG_INTEGER, \ "30000", \ "Maximum number of active HMMs to maintain at each frame (or -1 for no pruning)" }, \ { "-min_endfr", \ - ARG_INT32, \ + ARG_INTEGER, \ "0", \ "Nodes ignored in lattice construction if they persist for fewer than N frames" }, \ { "-fwdflatefwid", \ - ARG_INT32, \ + ARG_INTEGER, \ "4", \ "Minimum number of end frames for a word to be searched in fwdflat search" }, \ { "-fwdflatsfwin", \ - ARG_INT32, \ + ARG_INTEGER, \ "25", \ "Window of frames in lattice to search for successor words in fwdflat search " } @@ -187,15 +191,15 @@ NULL, \ "A file with keyphrases to spot, one per line"}, \ { "-kws_plp", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "1e-1", \ "Phone loop probability for keyphrase spotting" }, \ { "-kws_delay", \ - ARG_INT32, \ + ARG_INTEGER, \ "10", \ "Delay to wait for best detection score" }, \ { "-kws_threshold", \ - ARG_FLOAT64, \ + ARG_FLOATING, \ "1e-30", \ "Threshold for p(hyp)/p(alternatives) ratio" } @@ -245,50 +249,50 @@ NULL, \ "Which language model in -lmctl to use by default"}, \ { "-lw", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "6.5", \ "Language model probability weight" }, \ { "-fwdflatlw", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "8.5", \ "Language model probability weight for flat lexicon (2nd pass) decoding" }, \ { "-bestpathlw", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "9.5", \ "Language model probability weight for bestpath search" }, \ { "-ascale", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "20.0", \ "Inverse of acoustic model scale for confidence score calculation" }, \ { "-wip", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "0.65", \ "Word insertion penalty" }, \ { "-nwpen", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "1.0", \ "New word transition penalty" }, \ { "-pip", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "1.0", \ "Phone insertion penalty" }, \ { "-uw", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "1.0", \ "Unigram weight" }, \ { "-silprob", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "0.005", \ "Silence word transition probability" }, \ { "-fillprob", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "1e-8", \ "Filler word transition probability" } \ /** Command-line options for dictionaries. */ #define POCKETSPHINX_DICT_OPTIONS \ { "-dict", \ - REQARG_STRING, \ + ARG_STRING, \ NULL, \ "Main pronunciation dictionary (lexicon) input file" }, \ { "-fdict", \ @@ -303,7 +307,7 @@ /** Command-line options for acoustic modeling */ #define POCKETSPHINX_ACMOD_OPTIONS \ { "-hmm", \ - ARG_STRING, \ + REQARG_STRING, \ NULL, \ "Directory containing acoustic model files."}, \ { "-featparams", \ @@ -323,7 +327,7 @@ NULL, \ "HMM state transition matrix input file" }, \ { "-tmatfloor", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "0.0001", \ "HMM state transition probability floor (applied to -tmat file)" }, \ { "-mean", \ @@ -335,7 +339,7 @@ NULL, \ "Mixture gaussian variances input file" }, \ { "-varfloor", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "0.0001", \ "Mixture gaussian variance floor (applied to data from -var file)" }, \ { "-mixw", \ @@ -343,11 +347,11 @@ NULL, \ "Senone mixture weights input file (uncompressed)" }, \ { "-mixwfloor", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "0.0000001", \ "Senone mixture weights floor (applied to data from -mixw file)" }, \ { "-aw", \ - ARG_INT32, \ + ARG_INTEGER, \ "1", \ "Inverse weight applied to acoustic scores." }, \ { "-sendump", \ @@ -363,11 +367,11 @@ "yes", \ "Use memory-mapped I/O (if possible) for model files" }, \ { "-ds", \ - ARG_INT32, \ + ARG_INTEGER, \ "1", \ "Frame GMM computation downsampling ratio" }, \ { "-topn", \ - ARG_INT32, \ + ARG_INTEGER, \ "4", \ "Maximum number of top Gaussians to use in scoring." }, \ { "-topn_beam", \ @@ -375,7 +379,7 @@ "0", \ "Beam width used to determine top-N Gaussians (or a list, per-feature)" },\ { "-logbase", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "1.0001", \ "Base in which all log-likelihoods calculated" } From c19d7ef312ed8fd123d9b0b6b66623895eaa2828 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:22:33 -0400 Subject: [PATCH 72/94] fix: remove deprecated APIs --- include/sphinxbase/cmd_ln.h | 262 +++------------- src/util/cmd_ln.c | 291 ++++++------------ test/unit/test_cmdln/_test_parse_badargs.res | 3 - test/unit/test_cmdln/_test_parse_defaults.res | 7 +- .../unit/test_cmdln/_test_parse_defaults.test | 6 +- .../test_cmdln/_test_parse_defaults_r.res | 14 +- .../test_cmdln/_test_parse_defaults_r.test | 4 +- .../unit/test_cmdln/_test_parse_goodargs.test | 2 +- .../unit/test_cmdln/_test_parse_multiple.test | 2 +- test/unit/test_cmdln/cmdln_parse.c | 18 +- test/unit/test_cmdln/cmdln_parse_multiple.c | 20 +- test/unit/test_cmdln/cmdln_parse_r.c | 4 +- 12 files changed, 176 insertions(+), 457 deletions(-) diff --git a/include/sphinxbase/cmd_ln.h b/include/sphinxbase/cmd_ln.h index 67bd03e39..cb371c55e 100644 --- a/include/sphinxbase/cmd_ln.h +++ b/include/sphinxbase/cmd_ln.h @@ -64,6 +64,7 @@ /* Win32/WinCE DLL gunk */ #include #include +#include /** * @file cmd_ln.h @@ -92,6 +93,16 @@ typedef struct arg_s { char const *doc; /**< Documentation/description string */ } arg_t; +/** + * @struct cmd_ln_val_t + * Configuration parameter structure. + */ +typedef struct cmd_ln_val_s { + anytype_t val; + int type; + char *name; +} cmd_ln_val_t; + /** * @name Values for arg_t::type */ @@ -117,7 +128,7 @@ typedef struct arg_s { */ #define ARG_BOOLEAN (1<<4) /** - * Boolean (true/false) argument (optional). + * String array argument (optional). */ #define ARG_STRING_LIST (1<<5) @@ -138,30 +149,6 @@ typedef struct arg_s { */ #define REQARG_BOOLEAN (ARG_BOOLEAN | ARG_REQUIRED) -/** - * @deprecated Use ARG_INTEGER instead. - */ -#define ARG_INT32 ARG_INTEGER -/** - * @deprecated Use ARG_FLOATING instead. - */ -#define ARG_FLOAT32 ARG_FLOATING -/** - * @deprecated Use ARG_FLOATING instead. - */ -#define ARG_FLOAT64 ARG_FLOATING -/** - * @deprecated Use REQARG_INTEGER instead. - */ -#define REQARG_INT32 (ARG_INT32 | ARG_REQUIRED) -/** - * @deprecated Use REQARG_FLOATING instead. - */ -#define REQARG_FLOAT32 (ARG_FLOAT32 | ARG_REQUIRED) -/** - * @deprecated Use REQARG_FLOATING instead. - */ -#define REQARG_FLOAT64 (ARG_FLOAT64 | ARG_REQUIRED) /* @} */ @@ -174,9 +161,15 @@ typedef struct arg_s { /** * @struct cmd_ln_t - * Opaque structure used to hold the results of command-line parsing. + * Structure (no longer opaque) used to hold the results of command-line parsing. */ -typedef struct cmd_ln_s cmd_ln_t; +typedef struct cmd_ln_s { + int refcount; + hash_table_t *ht; + char **f_argv; + uint32 f_argc; + arg_t const *defn; +} cmd_ln_t; /** * Create a cmd_ln_t from NULL-terminated list of arguments. @@ -261,10 +254,36 @@ cmd_ln_t *cmd_ln_parse_file_r(cmd_ln_t *inout_cmdln, /**< In/Out: Previous comma ); /** - * Access the generic type union for a command line argument. + * Access the value and metadata for a configuration parameter. + * + * This structure is owned by the cmd_ln_t, assume that you must copy + * anything inside it, including strings, if you wish to retain it, + * and should never free it manually. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the value and metadata associated with name, or + * NULL if name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately NULL and where the corresponding flag + * is unknown. */ SPHINXBASE_EXPORT -anytype_t *cmd_ln_access_r(cmd_ln_t *cmdln, char const *name); +cmd_ln_val_t *cmd_ln_access_r(cmd_ln_t *cmdln, char const *name); + +/** + * Access the type of a configuration parameter. + * + * This function is provided as a convenience for dynamically typed + * language bindings. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the type of the parameter (as a combination of the ARG_* + * bits), or 0 if no such parameter exists. + */ +SPHINXBASE_EXPORT +int cmd_ln_type_r(cmd_ln_t *cmdln, char const *name); /** * Retrieve a string from a command-line object. @@ -406,200 +425,19 @@ int cmd_ln_exists_r(cmd_ln_t *cmdln, char const *name); * attributes as given in defn. * * @param cmdln command-line object - * @param fp output stream * @param defn array of argument name definitions. */ SPHINXBASE_EXPORT -void cmd_ln_print_help_r (cmd_ln_t *cmdln, FILE *fp, const arg_t *defn); +void cmd_ln_log_help_r (cmd_ln_t *cmdln, const arg_t *defn); /** * Print current configuration values and defaults. * * @param cmdln command-line object - * @param fp output stream * @param defn array of argument name definitions. */ SPHINXBASE_EXPORT -void cmd_ln_print_values_r (cmd_ln_t *cmdln, FILE *fp, const arg_t *defn); - -/** - * Non-reentrant version of cmd_ln_parse(). - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_parse_r(). - * @return 0 if successful, <0 if error. - */ -SPHINXBASE_EXPORT -int32 cmd_ln_parse(const arg_t *defn, /**< In: Array of argument name definitions */ - int32 argc, /**< In: Number of actual arguments */ - char *argv[], /**< In: Actual arguments */ - int32 strict /**< In: Fail on duplicate or unknown - arguments, or no arguments? */ - ); - -/** - * Parse an arguments file by deliminating on " \r\t\n" and putting each tokens - * into an argv[] for cmd_ln_parse(). - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_parse_file_r(). - * - * @return 0 if successful, <0 on error. - */ -SPHINXBASE_EXPORT -int32 cmd_ln_parse_file(const arg_t *defn, /**< In: Array of argument name definitions*/ - char const *filename,/**< In: A file that contains all the arguments */ - int32 strict /**< In: Fail on duplicate or unknown - arguments, or no arguments? */ - ); - -/** - * Old application initialization routine for Sphinx3 code. - * - * @deprecated This is deprecated in favor of the re-entrant API. - */ -SPHINXBASE_EXPORT -void cmd_ln_appl_enter(int argc, /**< In: Number of actual arguments */ - char *argv[], /**< In: Number of actual arguments */ - char const* default_argfn, /**< In: default argument file name*/ - const arg_t *defn /**< Command-line argument definition */ - ); - - -/** - * Finalization routine corresponding to cmd_ln_appl_enter(). - * - * @deprecated This is deprecated in favor of the re-entrant API. - */ - -SPHINXBASE_EXPORT -void cmd_ln_appl_exit(void); - -/** - * Retrieve the global cmd_ln_t object used by non-re-entrant functions. - * - * @deprecated This is deprecated in favor of the re-entrant API. - * @return global cmd_ln_t object. - */ -SPHINXBASE_EXPORT -cmd_ln_t *cmd_ln_get(void); - -/** - * Test the existence of a command-line argument in the global set of - * definitions. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_exists_r(). - * - * @return True if the command line argument exists (i.e. it - * was one of the arguments defined in the call to cmd_ln_parse(). - */ -#define cmd_ln_exists(name) cmd_ln_exists_r(cmd_ln_get(), name) - -/** - * Return a pointer to the previously parsed value for the given argument name. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_access_r(). - */ -#define cmd_ln_access(name) cmd_ln_access_r(cmd_ln_get(), name) - -/** - * Retrieve a string from the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_str_r(). - */ -#define cmd_ln_str(name) cmd_ln_str_r(cmd_ln_get(), name) - -/** - * Retrieve an array of strings in the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_str_list_r(). - */ -#define cmd_ln_str_list(name) cmd_ln_str_list_r(cmd_ln_get(), name) - -/** - * Retrieve a 32-bit integer from the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_int_r(). - */ -#define cmd_ln_int32(name) (int32)cmd_ln_int_r(cmd_ln_get(), name) -/** - * Retrieve a 32-bit float from the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_float_r(). - */ -#define cmd_ln_float32(name) (float32)cmd_ln_float_r(cmd_ln_get(), name) -/** - * Retrieve a 64-bit float from the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_float_r(). - */ -#define cmd_ln_float64(name) (float64)cmd_ln_float_r(cmd_ln_get(), name) -/** - * Retrieve a boolean from the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_boolean_r(). - */ -#define cmd_ln_boolean(name) cmd_ln_boolean_r(cmd_ln_get(), name) - -/** - * Set a string in the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_set_str_r(). - */ -#define cmd_ln_set_str(n,s) cmd_ln_set_str_r(cmd_ln_get(),n,s) -/** - * Set a 32-bit integer value in the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_set_int_r(). - */ -#define cmd_ln_set_int32(n,i) cmd_ln_set_int_r(cmd_ln_get(),n,i) -/** - * Set a 32-bit float in the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_set_float_r(). - */ -#define cmd_ln_set_float32(n,f) cmd_ln_set_float_r(cmd_ln_get(),n,f) -/** - * Set a 64-bit float in the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_set_float_r(). - */ -#define cmd_ln_set_float64(n,f) cmd_ln_set_float_r(cmd_ln_get(),n,f) -/** - * Set a boolean value in the global command line. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_set_boolean_r(). - */ -#define cmd_ln_set_boolean(n,b) cmd_ln_set_boolean_r(cmd_ln_get(),n,b) - -/** - * Print a help message listing the valid argument names, and the associated - * attributes as given in defn. - * - * @deprecated This is deprecated in favor of the re-entrant API - * function cmd_ln_print_help_r(). - */ -#define cmd_ln_print_help(f,d) cmd_ln_print_help_r(cmd_ln_get(),f,d) - -/** - * Free the global command line, if any exists. - * @deprecated Use the re-entrant API instead. - */ -SPHINXBASE_EXPORT -void cmd_ln_free (void); +void cmd_ln_log_values_r (cmd_ln_t *cmdln, const arg_t *defn); #ifdef __cplusplus diff --git a/src/util/cmd_ln.c b/src/util/cmd_ln.c index 1f655eb45..ef754e1d9 100644 --- a/src/util/cmd_ln.c +++ b/src/util/cmd_ln.c @@ -82,24 +82,8 @@ #include "sphinxbase/case.h" #include "sphinxbase/strfuncs.h" -typedef struct cmd_ln_val_s { - anytype_t val; - int type; - char *name; -} cmd_ln_val_t; - -struct cmd_ln_s { - int refcount; - hash_table_t *ht; - char **f_argv; - uint32 f_argc; -}; - -/** Global command-line, for non-reentrant API. */ -cmd_ln_t *global_cmdln; - static void -arg_dump_r(cmd_ln_t *, FILE *, arg_t const *, int32); +arg_log_r(cmd_ln_t *, arg_t const *, int32); static cmd_ln_t * parse_options(cmd_ln_t *, const arg_t *, int32, char* [], int32); @@ -239,60 +223,43 @@ arg_resolve_env(const char *str) } static void -arg_dump_r(cmd_ln_t *cmdln, FILE *fp, const arg_t * defn, int32 doc) +arg_log_r(cmd_ln_t *cmdln, const arg_t * defn, int32 doc) { arg_t const **pos; int32 i, n; size_t l; int32 namelen, deflen; - anytype_t *vp; + cmd_ln_val_t const *vp; char const **array; /* No definitions, do nothing. */ - if (defn == NULL || fp == NULL) + if (defn == NULL) return; /* Find max lengths of name and default value fields, and #entries in defn */ n = arg_strlen(defn, &namelen, &deflen); - /* E_INFO("String length %d. Name length %d, Default Length %d\n",n, namelen, deflen); */ - namelen = namelen & 0xfffffff8; /* Previous tab position */ - deflen = deflen & 0xfffffff8; /* Previous tab position */ - - fprintf(fp, "[NAME]"); - for (l = strlen("[NAME]"); l < namelen; l += 8) - fprintf(fp, "\t"); - fprintf(fp, "\t[DEFLT]"); - for (l = strlen("[DEFLT]"); l < deflen; l += 8) - fprintf(fp, "\t"); - + namelen += 4; + deflen += 4; + E_INFO("%-*s", namelen, "[NAME]"); + E_INFOCONT("%-*s", deflen, "[DEFLT]"); if (doc) { - fprintf(fp, "\t[DESCR]\n"); + E_INFOCONT(" [DESCR]\n"); } else { - fprintf(fp, "\t[VALUE]\n"); + E_INFOCONT(" [VALUE]\n"); } /* Print current configuration, sorted by name */ pos = arg_sort(defn, n); for (i = 0; i < n; i++) { - fprintf(fp, "%s", pos[i]->name); - for (l = strlen(pos[i]->name); l < namelen; l += 8) - fprintf(fp, "\t"); - - fprintf(fp, "\t"); - if (pos[i]->deflt) { - fprintf(fp, "%s", pos[i]->deflt); - l = strlen(pos[i]->deflt); - } + E_INFO("%-*s", namelen, pos[i]->name); + if (pos[i]->deflt) + E_INFOCONT("%-*s", deflen, pos[i]->deflt); else - l = 0; - for (; l < deflen; l += 8) - fprintf(fp, "\t"); - - fprintf(fp, "\t"); + E_INFOCONT("%-*s", deflen, ""); if (doc) { if (pos[i]->doc) - fprintf(fp, "%s", pos[i]->doc); + E_INFOCONT(" %s", pos[i]->doc); } else { vp = cmd_ln_access_r(cmdln, pos[i]->name); @@ -300,27 +267,28 @@ arg_dump_r(cmd_ln_t *cmdln, FILE *fp, const arg_t * defn, int32 doc) switch (pos[i]->type) { case ARG_INTEGER: case REQARG_INTEGER: - fprintf(fp, "%ld", vp->i); + E_INFOCONT(" %ld", vp->val.i); break; case ARG_FLOATING: case REQARG_FLOATING: - fprintf(fp, "%e", vp->fl); + E_INFOCONT(" %e", vp->val.fl); break; case ARG_STRING: case REQARG_STRING: - if (vp->ptr) - fprintf(fp, "%s", (char *)vp->ptr); + if (vp->val.ptr) + E_INFOCONT(" %s", (char *)vp->val.ptr); break; case ARG_STRING_LIST: - array = (char const**)vp->ptr; + array = (char const**)vp->val.ptr; if (array) + E_INFOCONT(" "); for (l = 0; array[l] != 0; l++) { - fprintf(fp, "%s,", array[l]); + E_INFOCONT("%s,", array[l]); } break; case ARG_BOOLEAN: case REQARG_BOOLEAN: - fprintf(fp, "%s", vp->i ? "yes" : "no"); + E_INFOCONT(" %s", vp->val.i ? "yes" : "no"); break; default: E_ERROR("Unknown argument type: %d\n", pos[i]->type); @@ -328,11 +296,10 @@ arg_dump_r(cmd_ln_t *cmdln, FILE *fp, const arg_t * defn, int32 doc) } } - fprintf(fp, "\n"); + E_INFOCONT("\n"); } ckd_free(pos); - - fprintf(fp, "\n"); + E_INFO("\n"); } static char ** @@ -489,71 +456,10 @@ cmd_ln_val_free(cmd_ln_val_t *val) ckd_free(val); } -cmd_ln_t * -cmd_ln_get(void) -{ - return global_cmdln; -} - -void -cmd_ln_appl_enter(int argc, char *argv[], - const char *default_argfn, - const arg_t * defn) -{ - /* Look for default or specified arguments file */ - const char *str; - - str = NULL; - - if ((argc == 2) && (strcmp(argv[1], "help") == 0)) { - cmd_ln_print_help(stderr, defn); - exit(1); - } - - if ((argc == 2) && (argv[1][0] != '-')) - str = argv[1]; - else if (argc == 1) { - FILE *fp; - E_INFO("Looking for default argument file: %s\n", default_argfn); - - if ((fp = fopen(default_argfn, "r")) == NULL) { - E_INFO("Can't find default argument file %s.\n", - default_argfn); - } - else { - str = default_argfn; - } - if (fp != NULL) - fclose(fp); - } - - - if (str) { - /* Build command line argument list from file */ - E_INFO("Parsing command lines from file %s\n", str); - if (cmd_ln_parse_file(defn, str, TRUE)) { - E_INFOCONT("Usage:\n"); - E_INFOCONT("\t%s argument-list, or\n", argv[0]); - E_INFOCONT("\t%s [argument-file] (default file: . %s)\n\n", - argv[0], default_argfn); - cmd_ln_print_help(stderr, defn); - exit(1); - } - } - else { - cmd_ln_parse(defn, argc, argv, TRUE); - } -} - -void -cmd_ln_appl_exit() -{ - cmd_ln_free(); -} - cmd_ln_t * -cmd_ln_parse_r(cmd_ln_t *inout_cmdln, const arg_t * defn, int32 argc, char *argv[], int strict) +cmd_ln_parse_r(cmd_ln_t *inout_cmdln, const arg_t * defn, + int32 argc, char *argv[], int strict) { int32 i, j, n, argstart; hash_table_t *defidx = NULL; @@ -566,6 +472,7 @@ cmd_ln_parse_r(cmd_ln_t *inout_cmdln, const arg_t * defn, int32 argc, char *argv } else cmdln = inout_cmdln; + cmdln->defn = defn; /* Build a hash table for argument definitions */ defidx = hash_table_new(50, 0); @@ -616,7 +523,6 @@ cmd_ln_parse_r(cmd_ln_t *inout_cmdln, const arg_t * defn, int32 argc, char *argv /* Enter argument value */ if (j + 1 >= argc) { - cmd_ln_print_help_r(cmdln, stderr, defn); E_ERROR("Argument value for '%s' missing\n", argv[j]); goto error; } @@ -625,7 +531,6 @@ cmd_ln_parse_r(cmd_ln_t *inout_cmdln, const arg_t * defn, int32 argc, char *argv val = cmd_ln_val_init(ARG_STRING, argv[j], argv[j + 1]); else { if ((val = cmd_ln_val_init(argdef->type, argv[j], argv[j + 1])) == NULL) { - cmd_ln_print_help_r(cmdln, stderr, defn); E_ERROR("Bad argument value for %s: %s\n", argv[j], argv[j + 1]); goto error; @@ -674,13 +579,11 @@ cmd_ln_parse_r(cmd_ln_t *inout_cmdln, const arg_t * defn, int32 argc, char *argv } } if (j > 0) { - cmd_ln_print_help_r(cmdln, stderr, defn); goto error; } if (strict && argc == 1) { - E_ERROR("No arguments given, available options are:\n"); - cmd_ln_print_help_r(cmdln, stderr, defn); + E_ERROR("No arguments given\n"); if (defidx) hash_table_free(defidx); if (inout_cmdln == NULL) @@ -688,11 +591,6 @@ cmd_ln_parse_r(cmd_ln_t *inout_cmdln, const arg_t * defn, int32 argc, char *argv return NULL; } - /* If we use it from something except pocketsphinx, print current values */ - if (!cmd_ln_exists_r(cmdln, "-logfn") && err_get_logfp()) { - cmd_ln_print_values_r(cmdln, err_get_logfp(), defn); - } - hash_table_free(defidx); return cmdln; @@ -742,24 +640,6 @@ cmd_ln_init(cmd_ln_t *inout_cmdln, const arg_t *defn, int32 strict, ...) return parse_options(inout_cmdln, defn, f_argc, f_argv, strict); } -int -cmd_ln_parse(const arg_t * defn, int32 argc, char *argv[], int strict) -{ - cmd_ln_t *cmdln; - - cmdln = cmd_ln_parse_r(global_cmdln, defn, argc, argv, strict); - if (cmdln == NULL) { - /* Old, bogus behaviour... */ - E_ERROR("Failed to parse arguments list, forced exit\n"); - exit(-1); - } - /* Initialize global_cmdln if not present. */ - if (global_cmdln == NULL) { - global_cmdln = cmdln; - } - return 0; -} - cmd_ln_t * cmd_ln_parse_file_r(cmd_ln_t *inout_cmdln, const arg_t * defn, const char *filename, int32 strict) { @@ -891,38 +771,22 @@ cmd_ln_parse_file_r(cmd_ln_t *inout_cmdln, const arg_t * defn, const char *filen return parse_options(inout_cmdln, defn, argc, f_argv, strict); } -int -cmd_ln_parse_file(const arg_t * defn, const char *filename, int32 strict) -{ - cmd_ln_t *cmdln; - - cmdln = cmd_ln_parse_file_r(global_cmdln, defn, filename, strict); - if (cmdln == NULL) { - return -1; - } - /* Initialize global_cmdln if not present. */ - if (global_cmdln == NULL) { - global_cmdln = cmdln; - } - return 0; -} - void -cmd_ln_print_help_r(cmd_ln_t *cmdln, FILE *fp, arg_t const* defn) +cmd_ln_log_help_r(cmd_ln_t *cmdln, arg_t const* defn) { if (defn == NULL) return; - fprintf(fp, "Arguments list definition:\n"); - arg_dump_r(cmdln, fp, defn, TRUE); + E_INFO("Arguments list definition:\n"); + arg_log_r(cmdln, defn, TRUE); } void -cmd_ln_print_values_r(cmd_ln_t *cmdln, FILE *fp, arg_t const* defn) +cmd_ln_log_values_r(cmd_ln_t *cmdln, arg_t const* defn) { if (defn == NULL) return; - fprintf(fp, "Current configuration:\n"); - arg_dump_r(cmdln, fp, defn, FALSE); + E_INFO("Current configuration:\n"); + arg_log_r(cmdln, defn, FALSE); } int @@ -934,7 +798,7 @@ cmd_ln_exists_r(cmd_ln_t *cmdln, const char *name) return (hash_table_lookup(cmdln->ht, name, &val) == 0); } -anytype_t * +cmd_ln_val_t * cmd_ln_access_r(cmd_ln_t *cmdln, const char *name) { void *val; @@ -942,60 +806,90 @@ cmd_ln_access_r(cmd_ln_t *cmdln, const char *name) E_ERROR("Unknown argument: %s\n", name); return NULL; } - return (anytype_t *)val; + return (cmd_ln_val_t *)val; } +int +cmd_ln_type_r(cmd_ln_t *cmdln, char const *name) +{ + cmd_ln_val_t *val = cmd_ln_access_r(cmdln, name); + if (val == NULL) + return 0; + return val->type; +} + + char const * cmd_ln_str_r(cmd_ln_t *cmdln, char const *name) { - anytype_t *val; + cmd_ln_val_t *val; val = cmd_ln_access_r(cmdln, name); if (val == NULL) return NULL; - return (char const *)val->ptr; + if (!(val->type & ARG_STRING)) { + E_ERROR("Argument %s does not have string type\n", name); + return NULL; + } + return (char const *)val->val.ptr; } char const ** cmd_ln_str_list_r(cmd_ln_t *cmdln, char const *name) { - anytype_t *val; + cmd_ln_val_t *val; val = cmd_ln_access_r(cmdln, name); if (val == NULL) return NULL; - return (char const **)val->ptr; + if (!(val->type & ARG_STRING_LIST)) { + E_ERROR("Argument %s does not have string list type\n", name); + return NULL; + } + return (char const **)val->val.ptr; } long cmd_ln_int_r(cmd_ln_t *cmdln, char const *name) { - anytype_t *val; + cmd_ln_val_t *val; val = cmd_ln_access_r(cmdln, name); if (val == NULL) return 0L; - return val->i; + if (!(val->type & (ARG_INTEGER | ARG_BOOLEAN))) { + E_ERROR("Argument %s does not have integer type\n", name); + return 0L; + } + return val->val.i; } double cmd_ln_float_r(cmd_ln_t *cmdln, char const *name) { - anytype_t *val; + cmd_ln_val_t *val; val = cmd_ln_access_r(cmdln, name); if (val == NULL) return 0.0; - return val->fl; + if (!(val->type & ARG_FLOATING)) { + E_ERROR("Argument %s does not have floating-point type\n", name); + return 0.0; + } + return val->val.fl; } void cmd_ln_set_str_r(cmd_ln_t *cmdln, char const *name, char const *str) { - anytype_t *val; + cmd_ln_val_t *val; val = cmd_ln_access_r(cmdln, name); if (val == NULL) { E_ERROR("Unknown argument: %s\n", name); return; } - ckd_free(val->ptr); - val->ptr = ckd_salloc(str); + if (!(val->type & ARG_STRING)) { + E_ERROR("Argument %s does not have string type\n", name); + return; + } + ckd_free(val->val.ptr); + val->val.ptr = ckd_salloc(str); } void @@ -1006,6 +900,10 @@ cmd_ln_set_str_extra_r(cmd_ln_t *cmdln, char const *name, char const *str) val = cmd_ln_val_init(ARG_STRING, name, str); hash_table_enter(cmdln->ht, val->name, (void *)val); } else { + if (!(val->type & ARG_STRING)) { + E_ERROR("Argument %s does not have string type\n", name); + return; + } ckd_free(val->val.ptr); val->val.ptr = ckd_salloc(str); } @@ -1014,25 +912,33 @@ cmd_ln_set_str_extra_r(cmd_ln_t *cmdln, char const *name, char const *str) void cmd_ln_set_int_r(cmd_ln_t *cmdln, char const *name, long iv) { - anytype_t *val; + cmd_ln_val_t *val; val = cmd_ln_access_r(cmdln, name); if (val == NULL) { E_ERROR("Unknown argument: %s\n", name); return; } - val->i = iv; + if (!(val->type & (ARG_INTEGER | ARG_BOOLEAN))) { + E_ERROR("Argument %s does not have integer type\n", name); + return; + } + val->val.i = iv; } void cmd_ln_set_float_r(cmd_ln_t *cmdln, char const *name, double fv) { - anytype_t *val; + cmd_ln_val_t *val; val = cmd_ln_access_r(cmdln, name); if (val == NULL) { E_ERROR("Unknown argument: %s\n", name); return; } - val->fl = fv; + if (!(val->type & ARG_FLOATING)) { + E_ERROR("Argument %s does not have floating-point type\n", name); + return; + } + val->val.fl = fv; } cmd_ln_t * @@ -1067,7 +973,7 @@ cmd_ln_free_r(cmd_ln_t *cmdln) if (cmdln->f_argv) { int32 i; - for (i = 0; i < cmdln->f_argc; ++i) { + for (i = 0; i < (int32)cmdln->f_argc; ++i) { ckd_free(cmdln->f_argv[i]); } ckd_free(cmdln->f_argv); @@ -1078,11 +984,4 @@ cmd_ln_free_r(cmd_ln_t *cmdln) return 0; } -void -cmd_ln_free(void) -{ - cmd_ln_free_r(global_cmdln); - global_cmdln = NULL; -} - /* vim: set ts=4 sw=4: */ diff --git a/test/unit/test_cmdln/_test_parse_badargs.res b/test/unit/test_cmdln/_test_parse_badargs.res index 748ddb830..1c4e04656 100644 --- a/test/unit/test_cmdln/_test_parse_badargs.res +++ b/test/unit/test_cmdln/_test_parse_badargs.res @@ -1,9 +1,6 @@ ERROR: Bad argument value for -a: foobar ERROR: Failed to parse arguments list -ERROR: Failed to parse arguments list, forced exit ERROR: Unknown argument name '-noarg' ERROR: Failed to parse arguments list -ERROR: Failed to parse arguments list, forced exit ERROR: Argument value for '-c' missing ERROR: Failed to parse arguments list -ERROR: Failed to parse arguments list, forced exit diff --git a/test/unit/test_cmdln/_test_parse_defaults.res b/test/unit/test_cmdln/_test_parse_defaults.res index b237a7c6a..28ec180ea 100644 --- a/test/unit/test_cmdln/_test_parse_defaults.res +++ b/test/unit/test_cmdln/_test_parse_defaults.res @@ -1,6 +1 @@ --a 42 This is the first argument. --b This is the second argument. --c no This is the third argument. --d 1e-50 This is the fourth argument. --l This is the fifth argument. - +42 (null) 0 0.000000 diff --git a/test/unit/test_cmdln/_test_parse_defaults.test b/test/unit/test_cmdln/_test_parse_defaults.test index 58b7a6cf5..3cfd7e6d7 100755 --- a/test/unit/test_cmdln/_test_parse_defaults.test +++ b/test/unit/test_cmdln/_test_parse_defaults.test @@ -3,8 +3,6 @@ set -e testname=`basename $0 .test` -./cmdln_parse > $testname.out 2>&1 || true -sed -ne 's,^-,-,p' < $testname.out > $testname.tmp.out \ - && mv $testname.tmp.out $testname.out +./cmdln_parse > $testname.out compare_table defaults $testname.out $tests/unit/test_cmdln/$testname.res 100 -rm -f $testname.out +#rm -f $testname.out diff --git a/test/unit/test_cmdln/_test_parse_defaults_r.res b/test/unit/test_cmdln/_test_parse_defaults_r.res index 8be304ed4..f0cb75dde 100644 --- a/test/unit/test_cmdln/_test_parse_defaults_r.res +++ b/test/unit/test_cmdln/_test_parse_defaults_r.res @@ -1,10 +1,4 @@ --a 42 42 --b --c no no --d 1e-50 1.000000e-50 --l --a 42 42 --b foobie --c no no --d 1e-50 1.000000e-50 --l +42 (null) 0 0.000000 +42 foobie 0 0.000000 +foobie +blatz diff --git a/test/unit/test_cmdln/_test_parse_defaults_r.test b/test/unit/test_cmdln/_test_parse_defaults_r.test index 069e39b18..4989c2d77 100755 --- a/test/unit/test_cmdln/_test_parse_defaults_r.test +++ b/test/unit/test_cmdln/_test_parse_defaults_r.test @@ -4,7 +4,5 @@ set -e testname=`basename $0 .test` ./cmdln_parse_r -a 42 > $testname.out 2>&1 -sed -ne 's,^-,-,p' < $testname.out > $testname.tmp.out \ - && mv $testname.tmp.out $testname.out compare_table defaults $testname.out $tests/unit/test_cmdln/$testname.res 100 -rm -f $testname.out +#rm -f $testname.out diff --git a/test/unit/test_cmdln/_test_parse_goodargs.test b/test/unit/test_cmdln/_test_parse_goodargs.test index 725bb422f..5114c0062 100755 --- a/test/unit/test_cmdln/_test_parse_goodargs.test +++ b/test/unit/test_cmdln/_test_parse_goodargs.test @@ -5,4 +5,4 @@ set -e testname=`basename $0 .test` ./cmdln_parse -a 36 -b hello -c yes -d 4.5 > $testname.out 2>/dev/null compare_table defaults $testname.out $tests/unit/test_cmdln/$testname.res -rm -f $testname.out +#rm -f $testname.out diff --git a/test/unit/test_cmdln/_test_parse_multiple.test b/test/unit/test_cmdln/_test_parse_multiple.test index ef43e39ee..bd0375e7c 100755 --- a/test/unit/test_cmdln/_test_parse_multiple.test +++ b/test/unit/test_cmdln/_test_parse_multiple.test @@ -5,4 +5,4 @@ set -e testname=`basename $0 .test` ./cmdln_parse_multiple -a 42 -d 4.5 > $testname.out 2>/dev/null compare_table defaults $testname.out $tests/unit/test_cmdln/$testname.res -rm -f $testname.out +#rm -f $testname.out diff --git a/test/unit/test_cmdln/cmdln_parse.c b/test/unit/test_cmdln/cmdln_parse.c index 15be020ae..6c897996e 100644 --- a/test/unit/test_cmdln/cmdln_parse.c +++ b/test/unit/test_cmdln/cmdln_parse.c @@ -7,10 +7,10 @@ #include const arg_t defs[] = { - { "-a", ARG_INT32, "42", "This is the first argument." }, + { "-a", ARG_INTEGER, "42", "This is the first argument." }, { "-b", ARG_STRING, NULL, "This is the second argument." }, { "-c", ARG_BOOLEAN, "no", "This is the third argument." }, - { "-d", ARG_FLOAT64, "1e-50", "This is the fourth argument." }, + { "-d", ARG_FLOATING, "1e-50", "This is the fourth argument." }, { "-l", ARG_STRING_LIST, NULL, "This is the fifth argument." }, { NULL, 0, NULL, NULL } }; @@ -18,14 +18,14 @@ const arg_t defs[] = { int main(int argc, char *argv[]) { - cmd_ln_parse(defs, argc, argv, TRUE); - printf("%d %s %d %f\n", - cmd_ln_int32("-a"), - cmd_ln_str("-b") ? cmd_ln_str("-b") : "(null)", - cmd_ln_boolean("-c"), - cmd_ln_float64("-d")); + cmd_ln_t *config = cmd_ln_parse_r(NULL, defs, argc, argv, FALSE); + printf("%ld %s %d %f\n", + cmd_ln_int_r(config, "-a"), + cmd_ln_str_r(config, "-b") ? cmd_ln_str_r(config, "-b") : "(null)", + cmd_ln_boolean_r(config, "-c"), + cmd_ln_float_r(config, "-d")); - cmd_ln_free(); + cmd_ln_free_r(config); return 0; } diff --git a/test/unit/test_cmdln/cmdln_parse_multiple.c b/test/unit/test_cmdln/cmdln_parse_multiple.c index 73ab1d1c2..705c55e8a 100644 --- a/test/unit/test_cmdln/cmdln_parse_multiple.c +++ b/test/unit/test_cmdln/cmdln_parse_multiple.c @@ -7,10 +7,10 @@ #include const arg_t defs[] = { - { "-a", ARG_INT32, "42", "This is the first argument." }, + { "-a", ARG_INTEGER, "42", "This is the first argument." }, { "-b", ARG_STRING, NULL, "This is the second argument." }, { "-c", ARG_BOOLEAN, "no", "This is the third argument." }, - { "-d", ARG_FLOAT64, "1e-50", "This is the fourth argument." }, + { "-d", ARG_FLOATING, "1e-50", "This is the fourth argument." }, { NULL, 0, NULL, NULL } }; @@ -23,14 +23,14 @@ static int orig_argc = sizeof(orig_argv) / sizeof(orig_argv[0]); int main(int argc, char *argv[]) { - cmd_ln_parse(defs, orig_argc, orig_argv, TRUE); - cmd_ln_parse(defs, argc, argv, FALSE); - printf("%d %s %d %f\n", - cmd_ln_int32("-a"), - cmd_ln_str("-b") ? cmd_ln_str("-b") : "(null)", - cmd_ln_boolean("-c"), - cmd_ln_float64("-d")); - cmd_ln_free(); + cmd_ln_t *config = cmd_ln_parse_r(NULL, defs, orig_argc, orig_argv, TRUE); + cmd_ln_parse_r(config, defs, argc, argv, FALSE); + printf("%ld %s %d %f\n", + cmd_ln_int_r(config, "-a"), + cmd_ln_str_r(config, "-b") ? cmd_ln_str_r(config, "-b") : "(null)", + cmd_ln_boolean_r(config, "-c"), + cmd_ln_float_r(config, "-d")); + cmd_ln_free_r(config); return 0; } diff --git a/test/unit/test_cmdln/cmdln_parse_r.c b/test/unit/test_cmdln/cmdln_parse_r.c index e33c08f6d..2d543fe8a 100644 --- a/test/unit/test_cmdln/cmdln_parse_r.c +++ b/test/unit/test_cmdln/cmdln_parse_r.c @@ -7,10 +7,10 @@ #include const arg_t defs[] = { - { "-a", ARG_INT32, "42", "This is the first argument." }, + { "-a", ARG_INTEGER, "42", "This is the first argument." }, { "-b", ARG_STRING, NULL, "This is the second argument." }, { "-c", ARG_BOOLEAN, "no", "This is the third argument." }, - { "-d", ARG_FLOAT64, "1e-50", "This is the fourth argument." }, + { "-d", ARG_FLOATING, "1e-50", "This is the fourth argument." }, { "-l", ARG_STRING_LIST, NULL, "This is the fifth argument." }, { NULL, 0, NULL, NULL } }; From 2f2504afad2ba4d00f03b4d2073611a17596f1a4 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:23:42 -0400 Subject: [PATCH 73/94] fix: remove deprecated APIs --- include/sphinxbase/fe.h | 42 ++++----- include/sphinxbase/feat.h | 6 +- programs/pocketsphinx_batch.c | 12 +-- programs/sphinx_cepview.c | 33 +++---- programs/sphinx_fe.c | 14 +-- programs/sphinx_lm_convert.c | 2 +- programs/sphinx_lm_eval.c | 6 +- programs/sphinx_pitch.c | 163 +++++++++++++++++----------------- src/fe/fe_interface.c | 6 -- 9 files changed, 136 insertions(+), 148 deletions(-) diff --git a/include/sphinxbase/fe.h b/include/sphinxbase/fe.h index 41b029152..f63bcdbc6 100644 --- a/include/sphinxbase/fe.h +++ b/include/sphinxbase/fe.h @@ -127,42 +127,42 @@ extern "C" { "Which type of transform to use to calculate cepstra (legacy, dct, or htk)" }, \ \ { "-alpha", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ ARG_STRINGIFY(DEFAULT_PRE_EMPHASIS_ALPHA), \ "Preemphasis parameter" }, \ \ { "-samprate", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ ARG_STRINGIFY(DEFAULT_SAMPLING_RATE), \ "Sampling rate" }, \ \ { "-frate", \ - ARG_INT32, \ + ARG_INTEGER, \ ARG_STRINGIFY(DEFAULT_FRAME_RATE), \ "Frame rate" }, \ \ { "-wlen", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ ARG_STRINGIFY(DEFAULT_WINDOW_LENGTH), \ "Hamming window length" }, \ \ { "-nfft", \ - ARG_INT32, \ + ARG_INTEGER, \ ARG_STRINGIFY(DEFAULT_FFT_SIZE), \ "Size of FFT" }, \ \ { "-nfilt", \ - ARG_INT32, \ + ARG_INTEGER, \ ARG_STRINGIFY(DEFAULT_NUM_FILTERS), \ "Number of filter banks" }, \ \ { "-lowerf", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ ARG_STRINGIFY(DEFAULT_LOWER_FILT_FREQ), \ "Lower edge of filters" }, \ \ { "-upperf", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ ARG_STRINGIFY(DEFAULT_UPPER_FILT_FREQ), \ "Upper edge of filters" }, \ \ @@ -177,7 +177,7 @@ extern "C" { "Round mel filter frequencies to DFT points" }, \ \ { "-ncep", \ - ARG_INT32, \ + ARG_INTEGER, \ ARG_STRINGIFY(DEFAULT_NUM_CEPSTRA), \ "Number of cep coefficients" }, \ \ @@ -187,27 +187,27 @@ extern "C" { "Use double bandwidth filters (same center freq)" }, \ \ { "-lifter", \ - ARG_INT32, \ + ARG_INTEGER, \ "0", \ "Length of sin-curve for liftering, or 0 for no liftering." }, \ \ { "-vad_prespeech", \ - ARG_INT32, \ + ARG_INTEGER, \ ARG_STRINGIFY(DEFAULT_PRE_SPEECH), \ "Num of speech frames to keep before silence to speech." }, \ \ { "-vad_startspeech", \ - ARG_INT32, \ + ARG_INTEGER, \ ARG_STRINGIFY(DEFAULT_START_SPEECH), \ "Num of speech frames to trigger vad from silence to speech." }, \ \ { "-vad_postspeech", \ - ARG_INT32, \ + ARG_INTEGER, \ ARG_STRINGIFY(DEFAULT_POST_SPEECH), \ "Num of silence frames to keep after from speech to silence." }, \ \ { "-vad_threshold", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "3.0", \ "Threshold for decision between noise and silence frames. Log-ratio between signal level and noise level." }, \ \ @@ -232,7 +232,7 @@ extern "C" { "Add 1/2-bit noise" }, \ \ { "-seed", \ - ARG_INT32, \ + ARG_INTEGER, \ ARG_STRINGIFY(SEED), \ "Seed for random number generator; if less than zero, pick our own" }, \ \ @@ -304,16 +304,6 @@ enum fe_error_e { FE_INVALID_PARAM_ERROR = -10 }; -/** - * Initialize a front-end object from global command-line. - * - * This is equivalent to calling fe_init_auto_r(cmd_ln_get()). - * - * @return Newly created front-end object. - */ -SPHINXBASE_EXPORT -fe_t* fe_init_auto(void); - /** * Get the default set of arguments for fe_init_auto_r(). * @@ -368,7 +358,7 @@ int fe_start_utt(fe_t *fe); * It is usually the number of MFCC * coefficients, but it might be the number of log-spectrum bins, if * the -logspec or -smoothspec options to - * fe_init_auto() were true. + * fe_init_auto_r() were true. * * @param fe Front-end object * @return Dimensionality of front-end output. diff --git a/include/sphinxbase/feat.h b/include/sphinxbase/feat.h index 0c1462bbe..421852de6 100644 --- a/include/sphinxbase/feat.h +++ b/include/sphinxbase/feat.h @@ -71,7 +71,7 @@ extern "C" { "1s_c_d_dd", \ "Feature stream type, depends on the acoustic model" }, \ { "-ceplen", \ - ARG_INT32, \ + ARG_INTEGER, \ "13", \ "Number of components in the input feature vector" }, \ { "-cmn", \ @@ -91,7 +91,7 @@ extern "C" { "none", \ "Automatic gain control for c0 ('max', 'emax', 'noise', or 'none')" }, \ { "-agcthresh", \ - ARG_FLOAT32, \ + ARG_FLOATING, \ "2.0", \ "Initial threshold for automatic gain control" }, \ { "-lda", \ @@ -99,7 +99,7 @@ extern "C" { NULL, \ "File containing transformation matrix to be applied to features (single-stream features only)" }, \ { "-ldadim", \ - ARG_INT32, \ + ARG_INTEGER, \ "0", \ "Dimensionality of output of feature transformation (0 to use entire matrix)" }, \ {"-svspec", \ diff --git a/programs/pocketsphinx_batch.c b/programs/pocketsphinx_batch.c index 8f10f6451..aca16acd3 100644 --- a/programs/pocketsphinx_batch.c +++ b/programs/pocketsphinx_batch.c @@ -71,15 +71,15 @@ static const arg_t ps_args_def[] = { NULL, "Control file listing utterances to be processed" }, { "-ctloffset", - ARG_INT32, + ARG_INTEGER, "0", "No. of utterances at the beginning of -ctl file to be skipped" }, { "-ctlcount", - ARG_INT32, + ARG_INTEGER, "-1", "No. of utterances to be processed (after skipping -ctloffset entries)" }, { "-ctlincr", - ARG_INT32, + ARG_INTEGER, "1", "Do every Nth line in the control file" }, { "-mllrctl", @@ -129,7 +129,7 @@ static const arg_t ps_args_def[] = { "no", "Input is raw audio data" }, { "-adchdr", - ARG_INT32, + ARG_INTEGER, "0", "Size of audio file header in bytes (headers are ignored)" }, { "-senin", @@ -171,7 +171,7 @@ static const arg_t ps_args_def[] = { ".lat", "Filename extension for dumping word lattices" }, { "-outlatbeam", - ARG_FLOAT64, + ARG_FLOATING, "1e-5", "Minimum posterior probability for output lattice nodes" }, { "-build_outdirs", @@ -187,7 +187,7 @@ static const arg_t ps_args_def[] = { ".hyp", "Extension for N-best hypothesis list files" }, { "-nbest", - ARG_INT32, + ARG_INTEGER, "0", "Number of N-best hypotheses to write to -nbestdir (0 for no N-best)" }, diff --git a/programs/sphinx_cepview.c b/programs/sphinx_cepview.c index 36544d3c1..c859d7764 100644 --- a/programs/sphinx_cepview.c +++ b/programs/sphinx_cepview.c @@ -73,34 +73,34 @@ static arg_t arg[] = { {"-i", - ARG_INT32, + ARG_INTEGER, NUM_COEFF, "Number of coefficients in the feature vector."}, {"-d", - ARG_INT32, + ARG_INTEGER, DISPLAY_SIZE, "Number of displayed coefficients."}, {"-header", - ARG_INT32, + ARG_INTEGER, "0", "Whether header is shown."}, {"-describe", - ARG_INT32, + ARG_INTEGER, "0", "Whether description will be shown."}, {"-b", - ARG_INT32, + ARG_INTEGER, "0", "The beginning frame 0-based."}, {"-e", - ARG_INT32, + ARG_INTEGER, "2147483647", "The ending frame."}, {"-f", ARG_STRING, NULL, "Input feature file."}, - {NULL, ARG_INT32, NULL, NULL} + {NULL, ARG_INTEGER, NULL, NULL} }; int read_cep(char const *file, float ***cep, int *nframes, int numcep); @@ -114,15 +114,16 @@ main(int argc, char *argv[]) int is_header, is_describe; float *z, **cep; char const *cepfile; + cmd_ln_t *config; - cmd_ln_appl_enter(argc, argv, "default.arg", arg); + config = cmd_ln_parse_r(NULL, arg, argc, argv, TRUE); - vsize = cmd_ln_int32("-i"); - dsize = cmd_ln_int32("-d"); - frm_begin = cmd_ln_int32("-b"); - frm_end = cmd_ln_int32("-e"); - is_header = cmd_ln_int32("-header"); - is_describe = cmd_ln_int32("-describe"); + vsize = cmd_ln_int_r(config, "-i"); + dsize = cmd_ln_int_r(config, "-d"); + frm_begin = cmd_ln_int_r(config, "-b"); + frm_end = cmd_ln_int_r(config, "-e"); + is_header = cmd_ln_int_r(config, "-header"); + is_describe = cmd_ln_int_r(config, "-describe"); if (vsize < 0) E_FATAL("-i : Input vector size should be larger than 0.\n"); @@ -137,7 +138,7 @@ main(int argc, char *argv[]) E_FATAL ("Ending frame (-e) should be larger than beginning frame (-b).\n"); - if ((cepfile = cmd_ln_str("-f")) == NULL) { + if ((cepfile = cmd_ln_str_r(config, "-f")) == NULL) { E_FATAL("Input file was not specified with (-f)\n"); } if (read_cep(cepfile, &cep, &noframe, vsize) == IO_ERR) @@ -178,8 +179,8 @@ main(int argc, char *argv[]) offset += vsize; } fflush(stdout); - cmd_ln_appl_exit(); ckd_free_2d(cep); + cmd_ln_free_r(config); return (IO_SUCCESS); diff --git a/programs/sphinx_fe.c b/programs/sphinx_fe.c index 5f8749593..2bb64aa5e 100644 --- a/programs/sphinx_fe.c +++ b/programs/sphinx_fe.c @@ -117,22 +117,22 @@ static arg_t defn[] = { "Control file for batch processing" }, { "-nskip", - ARG_INT32, + ARG_INTEGER, "0", "If a control file was specified, the number of utterances to skip at the head of the file" }, { "-runlen", - ARG_INT32, + ARG_INTEGER, "-1", "If a control file was specified, the number of utterances to process, or -1 for all" }, { "-part", - ARG_INT32, + ARG_INTEGER, "0", "Index of the part to run (supersedes -nskip and -runlen if non-zero)" }, { "-npart", - ARG_INT32, + ARG_INTEGER, "0", "Number of parts to run in (supersedes -nskip and -runlen if non-zero)" }, @@ -182,12 +182,12 @@ static arg_t defn[] = { "Defines input format as Microsoft Wav (RIFF)" }, { "-nchans", - ARG_INT32, + ARG_INTEGER, "1", "Number of channels of data (interlaced samples assumed)" }, { "-whichchan", - ARG_INT32, + ARG_INTEGER, "0", "Channel to process (numbered from 1), or 0 to mix all channels" }, @@ -206,7 +206,7 @@ static arg_t defn[] = { "Endianness of machine, big or little" }, { "-blocksize", - ARG_INT32, + ARG_INTEGER, "2048", "Number of samples to read at a time." }, diff --git a/programs/sphinx_lm_convert.c b/programs/sphinx_lm_convert.c index eede6b6c7..f34c500c7 100644 --- a/programs/sphinx_lm_convert.c +++ b/programs/sphinx_lm_convert.c @@ -57,7 +57,7 @@ static const arg_t defn[] = { "Shows the usage of the tool"}, { "-logbase", - ARG_FLOAT64, + ARG_FLOATING, "1.0001", "Base in which all log-likelihoods calculated" }, diff --git a/programs/sphinx_lm_eval.c b/programs/sphinx_lm_eval.c index a9a13c1f8..db5246dfc 100644 --- a/programs/sphinx_lm_eval.c +++ b/programs/sphinx_lm_eval.c @@ -57,7 +57,7 @@ static const arg_t defn[] = { "Shows the usage of the tool"}, { "-logbase", - ARG_FLOAT64, + ARG_FLOATING, "1.0001", "Base in which all log-likelihoods calculated" }, @@ -96,12 +96,12 @@ static const arg_t defn[] = { "Use memory-mapped I/O for reading binary LM files"}, { "-lw", - ARG_FLOAT32, + ARG_FLOATING, "1.0", "Language model weight" }, { "-wip", - ARG_FLOAT32, + ARG_FLOATING, "1.0", "Word insertion probability" }, diff --git a/programs/sphinx_pitch.c b/programs/sphinx_pitch.c index 381958072..e7b33eae4 100644 --- a/programs/sphinx_pitch.c +++ b/programs/sphinx_pitch.c @@ -67,12 +67,12 @@ static arg_t defn[] = { "Control file for batch processing" }, { "-nskip", - ARG_INT32, + ARG_INTEGER, "0", "If a control file was specified, the number of utterances to skip at the head of the file" }, { "-runlen", - ARG_INT32, + ARG_INTEGER, "-1", "If a control file was specified, the number of utterances to process (see -nskip too)" }, @@ -112,7 +112,7 @@ static arg_t defn[] = { "Defines input format as Microsoft Wav (RIFF)" }, { "-samprate", - ARG_INT32, + ARG_INTEGER, "0", "Sampling rate of audio data (will be determined automatically if 0)" }, @@ -122,57 +122,59 @@ static arg_t defn[] = { "Endianness of audio data (will be determined automatically if not given)" }, { "-fshift", - ARG_FLOAT32, + ARG_FLOATING, "0.01", "Frame shift: number of seconds between each analysis frame." }, { "-flen", - ARG_FLOAT32, + ARG_FLOATING, "0.025", "Number of seconds in each analysis frame (needs to be greater than twice the longest period you wish to detect - to detect down to 80Hz you need a frame length of 2.0/80 = 0.025)." }, { "-smooth_window", - ARG_INT32, + ARG_INTEGER, "2", "Number of frames on either side of the current frame to use for smoothing." }, { "-voice_thresh", - ARG_FLOAT32, + ARG_FLOATING, "0.1", "Threshold of normalized difference under which to search for the fundamental period." }, { "-search_range", - ARG_FLOAT32, + ARG_FLOATING, "0.2", "Fraction of the best local estimate to use as a search range for smoothing." }, { NULL, 0, NULL, NULL } }; -static int extract_pitch(const char *in, const char *out); -static int run_control_file(const char *ctl); +static int extract_pitch(const char *in, const char *out, cmd_ln_t *config); +static int run_control_file(const char *ctl, cmd_ln_t *config); int main(int argc, char *argv[]) { - cmd_ln_parse(defn, argc, argv, TRUE); + cmd_ln_t *config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE); /* Run a control file if requested. */ - if (cmd_ln_str("-c")) { - if (run_control_file(cmd_ln_str("-c")) < 0) + if (cmd_ln_str_r(config, "-c")) { + if (run_control_file(cmd_ln_str_r(config, "-c"), config) < 0) return 1; } else { - if (extract_pitch(cmd_ln_str("-i"), cmd_ln_str("-o")) < 0) + if (extract_pitch(cmd_ln_str_r(config, "-i"), + cmd_ln_str_r(config, "-o"), + config) < 0) return 1; } - cmd_ln_free(); + cmd_ln_free_r(config); return 0; } static int -guess_file_type(char const *file, FILE *infh) +guess_file_type(char const *file, FILE *infh, cmd_ln_t *config) { char header[4]; @@ -183,21 +185,21 @@ guess_file_type(char const *file, FILE *infh) } if (0 == memcmp(header, "RIFF", 4)) { E_INFO("%s appears to be a WAV file\n", file); - cmd_ln_set_boolean("-mswav", TRUE); - cmd_ln_set_boolean("-nist", FALSE); - cmd_ln_set_boolean("-raw", FALSE); + cmd_ln_set_boolean_r(config, "-mswav", TRUE); + cmd_ln_set_boolean_r(config, "-nist", FALSE); + cmd_ln_set_boolean_r(config, "-raw", FALSE); } else if (0 == memcmp(header, "NIST", 4)) { E_INFO("%s appears to be a NIST SPHERE file\n", file); - cmd_ln_set_boolean("-mswav", FALSE); - cmd_ln_set_boolean("-nist", TRUE); - cmd_ln_set_boolean("-raw", FALSE); + cmd_ln_set_boolean_r(config, "-mswav", FALSE); + cmd_ln_set_boolean_r(config, "-nist", TRUE); + cmd_ln_set_boolean_r(config, "-raw", FALSE); } else { E_INFO("%s appears to be raw data\n", file); - cmd_ln_set_boolean("-mswav", FALSE); - cmd_ln_set_boolean("-nist", FALSE); - cmd_ln_set_boolean("-raw", TRUE); + cmd_ln_set_boolean_r(config, "-mswav", FALSE); + cmd_ln_set_boolean_r(config, "-nist", FALSE); + cmd_ln_set_boolean_r(config, "-raw", TRUE); } fseek(infh, 0, SEEK_SET); return 0; @@ -210,14 +212,14 @@ guess_file_type(char const *file, FILE *infh) } static int -read_riff_header(FILE *infh) +read_riff_header(FILE *infh, cmd_ln_t *config) { char id[4]; int32 intval, header_len; int16 shortval; /* RIFF files are little-endian by definition. */ - cmd_ln_set_str("-input_endian", "little"); + cmd_ln_set_str_r(config, "-input_endian", "little"); /* Read in all the header chunks and etcetera. */ TRY_FREAD(id, 1, 4, infh); @@ -259,11 +261,11 @@ read_riff_header(FILE *infh) /* Sampling rate (finally!) */ TRY_FREAD(&intval, 4, 1, infh); SWAP_LE_32(&intval); - if (cmd_ln_int32("-samprate") == 0) - cmd_ln_set_int32("-samprate", intval); - else if (cmd_ln_int32("-samprate") != intval) { + if (cmd_ln_int_r(config, "-samprate") == 0) + cmd_ln_set_int_r(config, "-samprate", intval); + else if (cmd_ln_int_r(config, "-samprate") != intval) { E_WARN("WAVE file sampling rate %d != -samprate %d\n", - intval, cmd_ln_int32("-samprate")); + intval, cmd_ln_int_r(config, "-samprate")); } /* Average bytes per second (we don't care) */ @@ -308,7 +310,7 @@ read_riff_header(FILE *infh) } static int -read_nist_header(FILE *infh) +read_nist_header(FILE *infh, cmd_ln_t *config) { char hdr[1024]; char *line, *c; @@ -330,11 +332,11 @@ read_nist_header(FILE *infh) goto error_out; } ++c; - if (cmd_ln_int32("-samprate") == 0) - cmd_ln_set_int32("-samprate", atoi(c)); - else if (cmd_ln_int32("-samprate") != atoi(c)) { + if (cmd_ln_int_r(config, "-samprate") == 0) + cmd_ln_set_int_r(config, "-samprate", atoi(c)); + else if (cmd_ln_int_r(config, "-samprate") != atoi(c)) { E_WARN("NIST file sampling rate %d != -samprate %d\n", - atoi(c), cmd_ln_int32("-samprate")); + atoi(c), cmd_ln_int_r(config, "-samprate")); } if (line + strlen(line) < hdr + 1023) @@ -352,10 +354,10 @@ read_nist_header(FILE *infh) } ++c; if (0 == memcmp(c, "01", 2)) { - cmd_ln_set_str("-input_endian", "little"); + cmd_ln_set_str_r(config, "-input_endian", "little"); } else if (0 == memcmp(c, "10", 2)) { - cmd_ln_set_str("-input_endian", "big"); + cmd_ln_set_str_r(config, "-input_endian", "big"); } else { E_ERROR("Unknown byte order %s\n", c); @@ -369,7 +371,7 @@ read_nist_header(FILE *infh) } static int -extract_pitch(const char *in, const char *out) +extract_pitch(const char *in, const char *out, cmd_ln_t *config) { FILE *infh = NULL, *outfh = NULL; size_t flen, fshift, nsamps; @@ -394,39 +396,39 @@ extract_pitch(const char *in, const char *out) /* If we weren't told what the file type is, weakly try to * determine it (actually it's pretty obvious) */ - if (!(cmd_ln_boolean("-raw") - || cmd_ln_boolean("-mswav") - || cmd_ln_boolean("-nist"))) { - if (guess_file_type(in, infh) < 0) + if (!(cmd_ln_boolean_r(config, "-raw") + || cmd_ln_boolean_r(config, "-mswav") + || cmd_ln_boolean_r(config, "-nist"))) { + if (guess_file_type(in, infh, config) < 0) goto error_out; } /* Grab the sampling rate and byte order from the header and also * make sure this is 16-bit linear PCM. */ - if (cmd_ln_boolean("-mswav")) { - if (read_riff_header(infh) < 0) + if (cmd_ln_boolean_r(config, "-mswav")) { + if (read_riff_header(infh, config) < 0) goto error_out; } - else if (cmd_ln_boolean("-nist")) { - if (read_nist_header(infh) < 0) + else if (cmd_ln_boolean_r(config, "-nist")) { + if (read_nist_header(infh, config) < 0) goto error_out; } - else if (cmd_ln_boolean("-raw")) { + else if (cmd_ln_boolean_r(config, "-raw")) { /* Just use some defaults for sampling rate and endian. */ - if (cmd_ln_str("-input_endian") == NULL) { - cmd_ln_set_str("-input_endian", "little"); + if (cmd_ln_str_r(config, "-input_endian") == NULL) { + cmd_ln_set_str_r(config, "-input_endian", "little"); } - if (cmd_ln_int32("-samprate") == 0) - cmd_ln_set_int32("-samprate", 16000); + if (cmd_ln_int_r(config, "-samprate") == 0) + cmd_ln_set_int_r(config, "-samprate", 16000); } /* Now read frames and write pitch estimates. */ - sps = cmd_ln_int32("-samprate"); - flen = (size_t)(0.5 + sps * cmd_ln_float32("-flen")); - fshift = (size_t)(0.5 + sps * cmd_ln_float32("-fshift")); - yin = yin_init(flen, cmd_ln_float32("-voice_thresh"), - cmd_ln_float32("-search_range"), - cmd_ln_int32("-smooth_window")); + sps = cmd_ln_int_r(config, "-samprate"); + flen = (size_t)(0.5 + sps * cmd_ln_float_r(config, "-flen")); + fshift = (size_t)(0.5 + sps * cmd_ln_float_r(config, "-fshift")); + yin = yin_init(flen, cmd_ln_float_r(config, "-voice_thresh"), + cmd_ln_float_r(config, "-search_range"), + cmd_ln_int_r(config, "-smooth_window")); if (yin == NULL) { E_ERROR("Failed to initialize YIN\n"); goto error_out; @@ -488,7 +490,7 @@ extract_pitch(const char *in, const char *out) } static int -run_control_file(const char *ctl) +run_control_file(const char *ctl, cmd_ln_t *config) { FILE *ctlfh; char *line; @@ -497,36 +499,36 @@ run_control_file(const char *ctl) int rv, guess_type, guess_sps, guess_endian; int32 skip, runlen; - skip = cmd_ln_int32("-nskip"); - runlen = cmd_ln_int32("-runlen"); + skip = cmd_ln_int_r(config, "-nskip"); + runlen = cmd_ln_int_r(config, "-runlen"); /* Whether to guess file types */ - guess_type = !(cmd_ln_boolean("-raw") - || cmd_ln_boolean("-mswav") - || cmd_ln_boolean("-nist")); + guess_type = !(cmd_ln_boolean_r(config, "-raw") + || cmd_ln_boolean_r(config, "-mswav") + || cmd_ln_boolean_r(config, "-nist")); /* Whether to guess sampling rate */ - guess_sps = (cmd_ln_int32("-samprate") == 0); + guess_sps = (cmd_ln_int_r(config, "-samprate") == 0); /* Whether to guess endian */ - guess_endian = (cmd_ln_str("-input_endian") == NULL); + guess_endian = (cmd_ln_str_r(config, "-input_endian") == NULL); if ((ctlfh = fopen(ctl, "r")) == NULL) { E_ERROR_SYSTEM("Failed to open control file %s", ctl); return -1; } - if (cmd_ln_str("-di")) - di = string_join(cmd_ln_str("-di"), "/", NULL); + if (cmd_ln_str_r(config, "-di")) + di = string_join(cmd_ln_str_r(config, "-di"), "/", NULL); else di = ckd_salloc(""); - if (cmd_ln_str("-do")) - dout = string_join(cmd_ln_str("-do"), "/", NULL); + if (cmd_ln_str_r(config, "-do")) + dout = string_join(cmd_ln_str_r(config, "-do"), "/", NULL); else dout = ckd_salloc(""); - if (cmd_ln_str("-ei")) - ei = string_join(".", cmd_ln_str("-ei"), NULL); + if (cmd_ln_str_r(config, "-ei")) + ei = string_join(".", cmd_ln_str_r(config, "-ei"), NULL); else ei = ckd_salloc(""); - if (cmd_ln_str("-eo")) - eio = string_join(".", cmd_ln_str("-eo"), NULL); + if (cmd_ln_str_r(config, "-eo")) + eio = string_join(".", cmd_ln_str_r(config, "-eo"), NULL); else eio = ckd_salloc(""); rv = 0; @@ -551,16 +553,16 @@ run_control_file(const char *ctl) /* Reset various guessed information */ if (guess_type) { - cmd_ln_set_boolean("-nist", FALSE); - cmd_ln_set_boolean("-mswav", FALSE); - cmd_ln_set_boolean("-raw", FALSE); + cmd_ln_set_boolean_r(config, "-nist", FALSE); + cmd_ln_set_boolean_r(config, "-mswav", FALSE); + cmd_ln_set_boolean_r(config, "-raw", FALSE); } if (guess_sps) - cmd_ln_set_int32("-samprate", 0); + cmd_ln_set_int_r(config, "-samprate", 0); if (guess_endian) - cmd_ln_set_str("-input_endian", NULL); + cmd_ln_set_str_r(config, "-input_endian", NULL); - rv = extract_pitch(infile, outfile); + rv = extract_pitch(infile, outfile, config); ckd_free(infile); ckd_free(outfile); @@ -574,5 +576,6 @@ run_control_file(const char *ctl) ckd_free(ei); ckd_free(eio); fclose(ctlfh); + cmd_ln_free_r(config); return rv; } diff --git a/src/fe/fe_interface.c b/src/fe/fe_interface.c index 098aeb4d1..b8b738ed1 100644 --- a/src/fe/fe_interface.c +++ b/src/fe/fe_interface.c @@ -202,12 +202,6 @@ fe_print_current(fe_t const *fe) fe->mel_fb->doublewide ? "" : "not "); } -fe_t * -fe_init_auto() -{ - return fe_init_auto_r(cmd_ln_get()); -} - fe_t * fe_init_auto_r(cmd_ln_t *config) { From c897ab65260cea46c6ce26ec625f9d310a88755c Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:23:56 -0400 Subject: [PATCH 74/94] fix: use C99 types if possible --- include/sphinxbase/prim_type.h | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/include/sphinxbase/prim_type.h b/include/sphinxbase/prim_type.h index d4011f363..4351257e5 100644 --- a/include/sphinxbase/prim_type.h +++ b/include/sphinxbase/prim_type.h @@ -111,27 +111,39 @@ typedef union anytype_s { double fl; } anytype_t; -/* - * Assume P64 or LP64. If you need to port this to a DSP, let us know. - */ +/* Use C99 types if available */ +#if defined(HAVE_STDINT_H) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) +#include +typedef int32_t int32; +typedef int16_t int16; +typedef int8_t int8; +typedef uint32_t uint32; +typedef uint16_t uint16; +typedef uint8_t uint8; +typedef int64_t int64; +typedef uint64_t uint64; +/* Take a wild guess otherwise */ +#else typedef int int32; typedef short int16; typedef signed char int8; typedef unsigned int uint32; typedef unsigned short uint16; typedef unsigned char uint8; -typedef float float32; -typedef double float64; -#if defined(_MSC_VER) +# if defined(_MSC_VER) typedef __int64 int64; typedef unsigned __int64 uint64; -#elif defined(HAVE_LONG_LONG) && (SIZEOF_LONG_LONG == 8) +# else typedef long long int64; typedef unsigned long long uint64; -#else /* !HAVE_LONG_LONG && SIZEOF_LONG_LONG == 8 */ -typedef double int64; -typedef double uint64; -#endif /* !HAVE_LONG_LONG && SIZEOF_LONG_LONG == 8 */ +# endif +#endif /* not C99 or POSIX */ + +/* We should maybe stop using these as there isn't any good way to + know their exact size, but it's 99% certain they are 32 and 64 + bits. */ +typedef float float32; +typedef double float64; #ifndef TRUE #define TRUE 1 From 7c8d0509f623fa86fc8a4d7bbd550d07965ed07f Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:24:26 -0400 Subject: [PATCH 75/94] fix: manage mllr properly, expose mismatch API --- src/acmod.c | 36 +++++++++++++++++++++++++++--------- src/acmod.h | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 56 insertions(+), 20 deletions(-) diff --git a/src/acmod.c b/src/acmod.c index 5fb2dada4..dcf9e4fed 100644 --- a/src/acmod.c +++ b/src/acmod.c @@ -231,7 +231,7 @@ acmod_init(cmd_ln_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb) acmod = ckd_calloc(1, sizeof(*acmod)); acmod->config = cmd_ln_retain(config); - acmod->lmath = lmath; + acmod->lmath = logmath_retain(lmath); acmod->state = ACMOD_IDLE; /* Initialize feature computation. */ @@ -331,6 +331,7 @@ acmod_free(acmod_t *acmod) ps_mgau_free(acmod->mgau); if (acmod->mllr) ps_mllr_free(acmod->mllr); + logmath_free(acmod->lmath); ckd_free(acmod); } @@ -340,7 +341,7 @@ acmod_update_mllr(acmod_t *acmod, ps_mllr_t *mllr) { if (acmod->mllr) ps_mllr_free(acmod->mllr); - acmod->mllr = mllr; + acmod->mllr = ps_mllr_retain(mllr); ps_mgau_transform(acmod->mgau, mllr); return mllr; @@ -458,9 +459,9 @@ acmod_end_utt(acmod_t *acmod) feat_update_stats(acmod->fcb); } if (acmod->mfcfh) { - long outlen; - int32 rv; + int32 outlen, rv; outlen = (ftell(acmod->mfcfh) - 4) / 4; + SWAP_BE_32(&outlen); /* Try to seek and write */ if ((rv = fseek(acmod->mfcfh, 0, SEEK_SET)) == 0) { fwrite(&outlen, 4, 1, acmod->mfcfh); @@ -485,11 +486,27 @@ static int acmod_log_mfc(acmod_t *acmod, mfcc_t **cep, int n_frames) { - int n = n_frames * feat_cepsize(acmod->fcb); + size_t i, n; + int32 *ptr = (int32 *)cep[0]; + + n = n_frames * feat_cepsize(acmod->fcb); + /* Swap bytes. */ +#if !WORDS_BIGENDIAN + for (i = 0; i < (n * sizeof(mfcc_t) / sizeof(int32)); ++i) { + SWAP_INT32(ptr + i); + } +#endif /* Write features. */ if (fwrite(cep[0], sizeof(mfcc_t), n, acmod->mfcfh) != n) { - E_ERROR_SYSTEM("Failed to write %d values to file", n); + E_ERROR_SYSTEM("Failed to write %d values to log file", n); + } + + /* Swap them back. */ +#if !WORDS_BIGENDIAN + for (i = 0; i < (n * sizeof(mfcc_t) / sizeof(int32)); ++i) { + SWAP_INT32(ptr + i); } +#endif return 0; } @@ -500,7 +517,7 @@ acmod_process_full_cep(acmod_t *acmod, { int32 nfr; - /* Write to file. */ + /* Write to log file. */ if (acmod->mfcfh) acmod_log_mfc(acmod, *inout_cep, *inout_n_frames); @@ -524,7 +541,6 @@ acmod_process_full_cep(acmod_t *acmod, assert(acmod->n_feat_frame <= acmod->n_feat_alloc); *inout_cep += *inout_n_frames; *inout_n_frames = 0; - return nfr; } @@ -708,7 +724,7 @@ acmod_process_cep(acmod_t *acmod, if (full_utt) return acmod_process_full_cep(acmod, inout_cep, inout_n_frames); - /* Write to file. */ + /* Write to log file. */ if (acmod->mfcfh) acmod_log_mfc(acmod, *inout_cep, *inout_n_frames); @@ -1221,6 +1237,7 @@ acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm) case 5: MPX_BITVEC_SET(acmod, hmm, 4); MPX_BITVEC_SET(acmod, hmm, 3); + /* FALLTHRU */ case 3: MPX_BITVEC_SET(acmod, hmm, 2); MPX_BITVEC_SET(acmod, hmm, 1); @@ -1237,6 +1254,7 @@ acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm) case 5: NONMPX_BITVEC_SET(acmod, hmm, 4); NONMPX_BITVEC_SET(acmod, hmm, 3); + /* FALLTHRU */ case 3: NONMPX_BITVEC_SET(acmod, hmm, 2); NONMPX_BITVEC_SET(acmod, hmm, 1); diff --git a/src/acmod.h b/src/acmod.h index eed710110..6ec345b56 100644 --- a/src/acmod.h +++ b/src/acmod.h @@ -211,29 +211,47 @@ typedef struct acmod_s acmod_t; /** * Initialize an acoustic model. * - * @param config a command-line object containing parameters. This - * pointer is not retained by this object. + * @param config a command-line object containing parameters. + * Ownership of this pointer is retained by this object, + * so you may free it if you no longer need it. * @param lmath global log-math parameters. * @param fe a previously-initialized acoustic feature module to use, * or NULL to create one automatically. If this is supplied * and its parameters do not match those in the acoustic - * model, this function will fail. This pointer is not retained. - * @param fe a previously-initialized dynamic feature module to use, + * model, this function will fail. This pointer is retained. + * @param fcb a previously-initialized dynamic feature module to use, * or NULL to create one automatically. If this is supplied * and its parameters do not match those in the acoustic - * model, this function will fail. This pointer is not retained. + * model, this function will fail. This pointer is retained. * @return a newly initialized acmod_t, or NULL on failure. */ acmod_t *acmod_init(cmd_ln_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb); +/** + * Verify that feature extraction parameters are compatible with + * acoustic model. + * + * @param fe acoustic feature extraction module to verify. + * @return TRUE if compatible, FALSE otherwise + */ +int acmod_fe_mismatch(acmod_t *acmod, fe_t *fe); + +/** + * Verify that dynamic feature computation parameters are compatible + * with acoustic model. + * + * @param fcb dynamic feature computation module to verify. + * @return TRUE if compatible, FALSE otherwise + */ +int acmod_feat_mismatch(acmod_t *acmod, feat_t *fcb); + /** * Adapt acoustic model using a linear transform. * - * @param mllr The new transform to use, or NULL to update the existing - * transform. The decoder retains ownership of this pointer, - * so you should not attempt to free it manually. Use - * ps_mllr_retain() if you wish to reuse it - * elsewhere. + * @param mllr The new transform to use, or NULL to update the + * existing transform. The decoder retains ownership of + * this pointer, so you may free it if you no longer need + * it. * @return The updated transform object for this decoder, or * NULL on failure. */ @@ -446,7 +464,7 @@ void acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm); #define acmod_activate_sen(acmod, sen) bitvec_set((acmod)->senone_active_vec, sen) /** - * Build active list from + * Build active list. */ int32 acmod_flags2list(acmod_t *acmod); From e1bf678bd7d01986b468ece0ff54e8f205261766 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:24:38 -0400 Subject: [PATCH 76/94] refactor: minor compile warning fixes --- src/bin_mdef.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/bin_mdef.c b/src/bin_mdef.c index 65c70c6e2..3ea605889 100644 --- a/src/bin_mdef.c +++ b/src/bin_mdef.c @@ -70,6 +70,8 @@ bin_mdef_read_text(cmd_ln_t *config, const char *filename) int i, nodes, ci_idx, lc_idx, rc_idx; int nchars; + (void)config; + if ((mdef = mdef_init((char *) filename, TRUE)) == NULL) return NULL; @@ -124,6 +126,7 @@ bin_mdef_read_text(cmd_ln_t *config, const char *filename) bmdef->ciname[0] = ckd_calloc(nchars, 1); strcpy(bmdef->ciname[0], mdef->ciphone[0].name); for (i = 1; i < bmdef->n_ciphone; ++i) { + assert(i > 0); /* No reason to imagine it wouldn't be, but... */ bmdef->ciname[i] = bmdef->ciname[i - 1] + strlen(bmdef->ciname[i - 1]) + 1; strcpy(bmdef->ciname[i], mdef->ciphone[i].name); @@ -426,7 +429,7 @@ bin_mdef_read(cmd_ln_t *config, const char *filename) end = ftell(fh); fseek(fh, pos, SEEK_SET); m->ciname[0] = ckd_malloc(end - pos); - if (fread(m->ciname[0], 1, end - pos, fh) != end - pos) + if (fread(m->ciname[0], 1, end - pos, fh) != (size_t)(end - pos)) E_FATAL("Failed to read %d bytes of data from %s\n", end - pos, filename); } From d02c8e0d91b242be115410d02ea0d288c962892d Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:24:48 -0400 Subject: [PATCH 77/94] refactor: minor compile warning fixes --- src/dict.c | 1 + src/dict2pid.c | 6 ------ 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/dict.c b/src/dict.c index 7b3e5fd91..d57aebd3f 100644 --- a/src/dict.c +++ b/src/dict.c @@ -223,6 +223,7 @@ dict_write(dict_t *dict, char const *filename, char const *format) FILE *fh; int i; + (void)format; /* FIXME */ if ((fh = fopen(filename, "w")) == NULL) { E_ERROR_SYSTEM("Failed to open '%s'", filename); return -1; diff --git a/src/dict2pid.c b/src/dict2pid.c index 762e58c78..126898f02 100644 --- a/src/dict2pid.c +++ b/src/dict2pid.c @@ -492,7 +492,6 @@ dict2pid_build(bin_mdef_t * mdef, dict_t * dict) ckd_free_3d(rdiph_rc); - dict2pid_report(dict2pid); return dict2pid; } @@ -529,11 +528,6 @@ dict2pid_free(dict2pid_t * d2p) return 0; } -void -dict2pid_report(dict2pid_t * d2p) -{ -} - void dict2pid_dump(FILE * fp, dict2pid_t * d2p) { From 6d1fb7a72bcd1063baa030f538605cff30fc3855 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:24:55 -0400 Subject: [PATCH 78/94] refactor: minor compile warning fixes --- src/fsg_history.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/fsg_history.c b/src/fsg_history.c index 5e172b6f4..f51c76ec4 100644 --- a/src/fsg_history.c +++ b/src/fsg_history.c @@ -284,6 +284,7 @@ fsg_history_utt_start(fsg_history_t * h) void fsg_history_utt_end(fsg_history_t * h) { + (void)h; } void @@ -291,6 +292,7 @@ fsg_history_print(fsg_history_t *h, dict_t *dict) { int bpidx, bp; + (void)dict; for (bpidx = 0; bpidx < blkarray_list_n_valid(h->entries); bpidx++) { bp = bpidx; printf("History entry: "); From 8ff3556d5e561cebea7978f438e868de0c1c290f Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:25:05 -0400 Subject: [PATCH 79/94] fix: manage lmath properly --- src/ms_gauden.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ms_gauden.c b/src/ms_gauden.c index f9cd27c7d..0961acd62 100644 --- a/src/ms_gauden.c +++ b/src/ms_gauden.c @@ -318,7 +318,7 @@ gauden_init(char const *meanfile, char const *varfile, float32 varfloor, logmath assert(varfloor > 0.0); g = (gauden_t *) ckd_calloc(1, sizeof(gauden_t)); - g->lmath = lmath; + g->lmath = logmath_retain(lmath); g->mean = (mfcc_t ****)gauden_param_read(meanfile, &g->n_mgau, &g->n_feat, &g->n_density, &g->featlen); @@ -367,6 +367,8 @@ gauden_free(gauden_t * g) ckd_free_3d(g->det); if (g->featlen) ckd_free(g->featlen); + if (g->lmath) + logmath_free(g->lmath); ckd_free(g); } From 5eee0c03f2ec725a6bd4869f9c6394523c25f930 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:25:18 -0400 Subject: [PATCH 80/94] fix: remove broken debug logging --- src/ms_senone.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/ms_senone.c b/src/ms_senone.c index 807d9ede4..43277c93a 100644 --- a/src/ms_senone.c +++ b/src/ms_senone.c @@ -374,21 +374,12 @@ senone_eval(senone_t * s, int id, gauden_dist_t ** dist, int32 n_top) scr = 0; for (f = 0; f < s->n_feat; f++) { -#ifdef SPHINX_DEBUG - int top; -#endif fdist = dist[f]; - /* Top codeword for feature f */ -#ifdef SPHINX_DEBUG - top = -#endif fden = ((int32)fdist[0].dist + ((1<> SENSCR_SHIFT; fscr = (s->n_gauden > 1) ? (fden + -s->pdf[id][f][fdist[0].id]) /* untransposed */ : (fden + -s->pdf[f][fdist[0].id][id]); /* transposed */ - E_DEBUG("fden[%d][%d] l+= %d + %d = %d\n", - id, f, -(fscr - fden), -(fden-top), -(fscr-top)); /* Remaining of n_top codewords for feature f */ for (t = 1; t < n_top; t++) { fden = ((int32)fdist[t].dist + ((1<> SENSCR_SHIFT; @@ -396,8 +387,6 @@ senone_eval(senone_t * s, int id, gauden_dist_t ** dist, int32 n_top) (fden + -s->pdf[id][f][fdist[t].id]) : (fden + -s->pdf[f][fdist[t].id][id]); fscr = logmath_add(s->lmath, fscr, fwscr); - E_DEBUG("fden[%d][%d] l+= %d + %d = %d\n", - id, f, -(fwscr - fden), -(fden-top), -(fscr-top)); } /* Senone scores are also scaled, negated logs3 values. Hence * we have to negate the stuff we calculated above. */ From 543cbf77536475ae3b3ea73fa5973fcffedaf589 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:25:34 -0400 Subject: [PATCH 81/94] refactor: minor compile warning fixes --- src/util/bio.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/util/bio.c b/src/util/bio.c index 56c620f68..8a66a48a2 100644 --- a/src/util/bio.c +++ b/src/util/bio.c @@ -374,7 +374,7 @@ bio_fread_1d(void **buf, size_t el_sz, uint32 * n_el, FILE * fp, *buf = (void *) ckd_calloc(*n_el, el_sz); /* Read array data */ - if (bio_fread(*buf, el_sz, *n_el, fp, sw, ck) != *n_el) + if (bio_fread(*buf, el_sz, *n_el, fp, sw, ck) != (int32)*n_el) E_FATAL("fread(arraydata) failed\n"); return *n_el; @@ -414,7 +414,7 @@ bio_fread_2d(void ***arr, } return -1; } - if (bio_fread_1d(&raw, e_sz, &n, fp, swap, chksum) != n) + if (bio_fread_1d(&raw, e_sz, &n, fp, swap, chksum) != (int32)n) return -1; assert(n == l_d1*l_d2); @@ -474,7 +474,7 @@ bio_fread_3d(void ****arr, return -1; } - if (bio_fread_1d(&raw, e_sz, &n, fp, swap, chksum) != n) { + if (bio_fread_1d(&raw, e_sz, &n, fp, swap, chksum) != (int32)n) { return -1; } @@ -601,6 +601,7 @@ bio_read_wavfile(char const *directory, size_t n, l; int16 *data; + (void)endian; n = strlen(extension); l = strlen(filename); if ((n <= l) && (0 == strcmp(filename + l - n, extension))) From b548fdef100f5f5d49595cfb0fe9acae23a18a46 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:25:43 -0400 Subject: [PATCH 82/94] fix: set loglevel --- test/unit/test_hash/deletehash.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/unit/test_hash/deletehash.c b/test/unit/test_hash/deletehash.c index b84316ff8..1fb72235e 100644 --- a/test/unit/test_hash/deletehash.c +++ b/test/unit/test_hash/deletehash.c @@ -19,6 +19,8 @@ main(int argc, char **argv) exit(-1); } + /* Make sure failure gets printed! */ + err_set_loglevel(ERR_INFO); ht = hash_table_new(75, 0); if (hash_table_enter(ht, "-hmmdump", (void *)1) != (void *)1) { From 88a2866ff16da1645d685f2e3207658b1d8c0cfc Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 11:30:07 -0400 Subject: [PATCH 83/94] fix: printf formats --- test/unit/test_fe.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/unit/test_fe.c b/test/unit/test_fe.c index 2f22bc4ec..33bb34ff1 100644 --- a/test/unit/test_fe.c +++ b/test/unit/test_fe.c @@ -51,7 +51,7 @@ main(int argc, char *argv[]) printf("frame_size %d frame_shift %d\n", frame_size, frame_shift); /* Process the first frame. */ TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[0], &nfr, NULL) >= 0); - printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, nfr); + printf("inptr %ld nsamp %ld nfr %d\n", inptr - buf, nsamp, nfr); /* First frame assumed to be unvoiced to init noise reduction */ TEST_EQUAL(nfr, 0); @@ -62,17 +62,17 @@ main(int argc, char *argv[]) * First 1024 samples of chan3.raw is silence, nfr is expected to stay 0 */ nfr = 1; TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[1], &nfr, NULL) >= 0); - printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, nfr); + printf("inptr %ld nsamp %ld nfr %d\n", inptr - buf, nsamp, nfr); TEST_EQUAL(nfr, 0); nfr = 1; TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[2], &nfr, NULL) >= 0); - printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, nfr); + printf("inptr %ld nsamp %ld nfr %d\n", inptr - buf, nsamp, nfr); TEST_EQUAL(nfr, 0); nfr = 1; TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[3], &nfr, NULL) >= 0); - printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, nfr); + printf("inptr %ld nsamp %ld nfr %d\n", inptr - buf, nsamp, nfr); TEST_EQUAL(nfr, 0); nfr = 1; @@ -120,25 +120,25 @@ main(int argc, char *argv[]) fe_start_stream(fe); TEST_EQUAL(0, fe_start_utt(fe)); TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i, NULL) >= 0); - printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, i); + printf("inptr %ld nsamp %ld nfr %d\n", inptr - buf, nsamp, i); cptr += i; nfr -= i; i = nfr; nsamp = 256; TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i, NULL) >= 0); - printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, i); + printf("inptr %ld nsamp %ld nfr %d\n", inptr - buf, nsamp, i); cptr += i; nfr -= i; i = nfr; nsamp = 256; TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i, NULL) >= 0); - printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, i); + printf("inptr %ld nsamp %ld nfr %d\n", inptr - buf, nsamp, i); cptr += i; nfr -= i; i = nfr; nsamp = 256; TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i, NULL) >= 0); - printf("inptr %d nsamp %d nfr %d\n", inptr - buf, nsamp, i); + printf("inptr %ld nsamp %ld nfr %d\n", inptr - buf, nsamp, i); cptr += i; nfr -= i; printf("nfr %d\n", nfr); From 192ac3f1141558d91381bc1700bddbabed4d878b Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 12:55:38 -0400 Subject: [PATCH 84/94] fix: support trie language model on big-endian (we hope) --- CMakeLists.txt | 7 +++ src/lm/lm_trie.c | 60 +++++++++++++++++++-- src/lm/lm_trie_quant.c | 5 ++ src/lm/ngram_model_trie.c | 23 +++++++- test/unit/test_alloc/test_ckd_alloc_abort.c | 3 +- test/unit/test_alloc/test_ckd_alloc_catch.c | 3 +- test/unit/test_alloc/test_ckd_alloc_fail.c | 3 +- test/unit/test_bitvec.c | 4 +- test/unit/test_ngram/test_lm_write.c | 9 +++- 9 files changed, 101 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 95bc46203..9295b24b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,13 @@ cmake_print_variables(WORDS_BIGENDIAN) # set(SPHINX_DEBUG 1) #endif() +# Compiles some code as the wrong endianness in order to ensure that +# it works properly +if(DEBUG_ENDIAN) + add_definitions(-DDEBUG_ENDIAN) +endif() +cmake_print_variables(SPHINX_DEBUG DEBUG_ENDIAN) + if(MSVC) add_compile_options(/W3) else() diff --git a/src/lm/lm_trie.c b/src/lm/lm_trie.c index 12e93b7af..9ec0b7999 100644 --- a/src/lm/lm_trie.c +++ b/src/lm/lm_trie.c @@ -39,7 +39,12 @@ #include #include +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include +#include #include #include #include @@ -374,29 +379,76 @@ lm_trie_create(uint32 unigram_count, int order) return trie; } +static size_t +lm_trie_read_ug(lm_trie_t * trie, uint32 * counts, FILE * fp) +{ + size_t rv = fread(trie->unigrams, sizeof(*trie->unigrams), + (counts[0] + 1), fp); +#if defined(DEBUG_ENDIAN) || defined(WORDS_BIGENDIAN) + { + int i; + for (i = 0; i < counts[0] + 1; ++i) { + SWAP_FLOAT32(&trie->unigrams[i].prob); + SWAP_FLOAT32(&trie->unigrams[i].bo); + SWAP_INT32(&trie->unigrams[i].next); + } + } +#endif + return rv; +} + lm_trie_t * lm_trie_read_bin(uint32 * counts, int order, FILE * fp) { lm_trie_t *trie = lm_trie_init(counts[0]); trie->quant = (order > 1) ? lm_trie_quant_read_bin(fp, order) : NULL; - fread(trie->unigrams, sizeof(*trie->unigrams), (counts[0] + 1), fp); + E_DEBUG("pos after quant: %ld\n", ftell(fp)); + lm_trie_read_ug(trie, counts, fp); + E_DEBUG("pos after ug: %ld\n", ftell(fp)); + /* It looks like quant and ngram_mem are just blobs of bits so no + swapping needed. */ if (order > 1) { lm_trie_alloc_ngram(trie, counts, order); fread(trie->ngram_mem, 1, trie->ngram_mem_size, fp); + E_DEBUG("#ngram_mem: %ld\n", trie->ngram_mem_size); } return trie; } +static size_t +lm_trie_write_ug(lm_trie_t * trie, uint32 unigram_count, FILE * fp) +{ +#if defined(DEBUG_ENDIAN) || defined(WORDS_BIGENDIAN) + int i; + for (i = 0; i < unigram_count + 1; ++i) { + unigram_t ug = trie->unigrams[i]; + SWAP_FLOAT32(&ug.prob); + SWAP_FLOAT32(&ug.bo); + SWAP_INT32(&ug.next); + if (fwrite(&ug, sizeof(ug), 1, fp) != 1) + return -1; + } + return (size_t)i; +#else + return fwrite(trie->unigrams, sizeof(*trie->unigrams), + (unigram_count + 1), fp); + +#endif +} + void lm_trie_write_bin(lm_trie_t * trie, uint32 unigram_count, FILE * fp) { if (trie->quant) lm_trie_quant_write_bin(trie->quant, fp); - fwrite(trie->unigrams, sizeof(*trie->unigrams), (unigram_count + 1), - fp); - if (trie->ngram_mem) + E_DEBUG("pos after quant: %ld\n", ftell(fp)); + lm_trie_write_ug(trie, unigram_count, fp); + E_DEBUG("pos after ug: %ld\n", ftell(fp)); + if (trie->ngram_mem) { fwrite(trie->ngram_mem, 1, trie->ngram_mem_size, fp); + E_DEBUG("#ngram_mem: %ld\n", trie->ngram_mem_size); + } } void diff --git a/src/lm/lm_trie_quant.c b/src/lm/lm_trie_quant.c index 525e69daa..ad5810928 100644 --- a/src/lm/lm_trie_quant.c +++ b/src/lm/lm_trie_quant.c @@ -37,8 +37,13 @@ #include +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include +#include #include #include "ngram_model_internal.h" diff --git a/src/lm/ngram_model_trie.c b/src/lm/ngram_model_trie.c index a4e841131..38304706a 100644 --- a/src/lm/ngram_model_trie.c +++ b/src/lm/ngram_model_trie.c @@ -310,6 +310,10 @@ read_word_str(ngram_model_t * base, FILE * fp) /* read ascii word strings */ base->writable = TRUE; fread(&k, sizeof(k), 1, fp); +#if defined(DEBUG_ENDIAN) || defined(WORDS_BIGENDIAN) + SWAP_INT32(&k); +#endif + E_INFO("#word_str: %d\n", k); tmp_word_str = (char *) ckd_calloc((size_t) k, 1); fread(tmp_word_str, 1, (size_t) k, fp); @@ -371,6 +375,12 @@ ngram_model_trie_read_bin(cmd_ln_t * config, fread(&order, sizeof(order), 1, fp); for (i = 0; i < order; i++) { fread(&counts[i], sizeof(counts[i]), 1, fp); +#if defined(DEBUG_ENDIAN) || defined(WORDS_BIGENDIAN) + /* For some reason nobody ever considered the endianness of + this file. I declare it to be canonically little-endian. */ + SWAP_INT32(&counts[i]); +#endif + E_INFO("#%d-grams: %d\n", i + 1, counts[i]); } ngram_model_init(base, &ngram_model_trie_funcs, lmath, order, (int32) counts[0]); @@ -394,6 +404,10 @@ write_word_str(FILE * fp, ngram_model_t * model) k = 0; for (i = 0; i < model->n_counts[0]; i++) k += strlen(model->word_str[i]) + 1; + E_DEBUG("#word_str: %d\n", k); +#if defined(DEBUG_ENDIAN) || defined(WORDS_BIGENDIAN) + SWAP_INT32(&k); +#endif fwrite(&k, sizeof(k), 1, fp); for (i = 0; i < model->n_counts[0]; i++) fwrite(model->word_str[i], 1, strlen(model->word_str[i]) + 1, fp); @@ -414,8 +428,13 @@ ngram_model_trie_write_bin(ngram_model_t * base, const char *path) fwrite(trie_hdr, sizeof(*trie_hdr), strlen(trie_hdr), fp); fwrite(&model->base.n, sizeof(model->base.n), 1, fp); for (i = 0; i < model->base.n; i++) { - fwrite(&model->base.n_counts[i], sizeof(model->base.n_counts[i]), - 1, fp); + uint32 count = model->base.n_counts[i]; +#if defined(DEBUG_ENDIAN) || defined(WORDS_BIGENDIAN) + /* For some reason nobody ever considered the endianness of + this file. I declare it to be canonically little-endian. */ + SWAP_INT32(&count); +#endif + fwrite(&count, sizeof(count), 1, fp); } lm_trie_write_bin(model->trie, base->n_counts[0], fp); write_word_str(fp, base); diff --git a/test/unit/test_alloc/test_ckd_alloc_abort.c b/test/unit/test_alloc/test_ckd_alloc_abort.c index 8b56367b3..8a326d9db 100644 --- a/test/unit/test_alloc/test_ckd_alloc_abort.c +++ b/test/unit/test_alloc/test_ckd_alloc_abort.c @@ -7,12 +7,11 @@ int main(int argc, char *argv[]) { - int *alloc1; int bad_alloc_did_not_fail = FALSE; ckd_set_jump(NULL, TRUE); /* Guaranteed to fail, we hope!. */ - alloc1 = ckd_calloc(-1,-1); + (void) ckd_calloc(-1,-1); TEST_ASSERT(bad_alloc_did_not_fail); return 0; diff --git a/test/unit/test_alloc/test_ckd_alloc_catch.c b/test/unit/test_alloc/test_ckd_alloc_catch.c index 178f7c54b..8f3afd78d 100644 --- a/test/unit/test_alloc/test_ckd_alloc_catch.c +++ b/test/unit/test_alloc/test_ckd_alloc_catch.c @@ -7,7 +7,6 @@ int main(int argc, char *argv[]) { - int *alloc1; jmp_buf env; ckd_set_jump(&env, FALSE); @@ -18,7 +17,7 @@ main(int argc, char *argv[]) int failed_to_catch_bad_alloc = FALSE; /* Guaranteed to fail, we hope!. */ - alloc1 = ckd_calloc(-1,-1); + (void) ckd_calloc(-1,-1); TEST_ASSERT(failed_to_catch_bad_alloc); } diff --git a/test/unit/test_alloc/test_ckd_alloc_fail.c b/test/unit/test_alloc/test_ckd_alloc_fail.c index f1c98c5ae..1eef7281b 100644 --- a/test/unit/test_alloc/test_ckd_alloc_fail.c +++ b/test/unit/test_alloc/test_ckd_alloc_fail.c @@ -7,12 +7,11 @@ int main(int argc, char *argv[]) { - int *alloc1; int bad_alloc_did_not_fail = FALSE; ckd_set_jump(NULL, FALSE); /* Guaranteed to fail, we hope!. */ - alloc1 = ckd_calloc(-1,-1); + (void) ckd_calloc(-1,-1); TEST_ASSERT(bad_alloc_did_not_fail); return 0; diff --git a/test/unit/test_bitvec.c b/test/unit/test_bitvec.c index 0924ba6f6..363e012be 100644 --- a/test/unit/test_bitvec.c +++ b/test/unit/test_bitvec.c @@ -48,13 +48,13 @@ main(int argc, char *argv[]) bv = bitvec_alloc(13); for (i = 1; i < 13; i+=2) bitvec_set(bv, i); - printf("Bits set %d\n", bitvec_count_set(bv, 13)); + printf("Bits set %ld\n", bitvec_count_set(bv, 13)); TEST_EQUAL(6, bitvec_count_set(bv, 13)); bv = bitvec_realloc(bv, 13, 2000); for (i = 0; i < 2000; i++) { /* printf("%d %d\n", i, bitvec_is_set(bv, i) != 0); */ } - printf("Bits set after realloc %d\n", bitvec_count_set(bv, 2000)); + printf("Bits set after realloc %ld\n", bitvec_count_set(bv, 2000)); TEST_EQUAL(6, bitvec_count_set(bv, 2000)); bitvec_free(bv); diff --git a/test/unit/test_ngram/test_lm_write.c b/test/unit/test_ngram/test_lm_write.c index 600f7b70f..cba53bcce 100644 --- a/test/unit/test_ngram/test_lm_write.c +++ b/test/unit/test_ngram/test_lm_write.c @@ -28,8 +28,6 @@ test_lm_vals(ngram_model_t *model) TEST_EQUAL_LOG(ngram_bg_score(model, ngram_wid(model, "sphinxtrain"), NGRAM_INVALID_WID, &n_used), -64208); TEST_EQUAL(n_used, 1); - printf("FOO %d\n", ngram_score(model, "huggins", "david", NULL)); - printf("FOO %d\n", ngram_score(model, "daines", "huggins", "david", NULL)); /* Test bigrams. */ TEST_EQUAL_LOG(ngram_score(model, "huggins", "david", NULL), -831); /* Test trigrams. */ @@ -52,15 +50,22 @@ main(int argc, char *argv[]) TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm.bin", NGRAM_BIN)); ngram_model_free(model); +#ifdef DEBUG_ENDIAN + E_INFO("Debugging endianness, will not use pre-existing model\n"); +#else E_INFO("Converting BIN to ARPA\n"); model = ngram_model_read(NULL, LMDIR "/100.lm.bin", NGRAM_BIN, lmath); test_lm_vals(model); TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm", NGRAM_ARPA)); ngram_model_free(model); +#endif E_INFO("Testing converted BIN\n"); model = ngram_model_read(NULL, "100.tmp.lm.bin", NGRAM_BIN, lmath); test_lm_vals(model); +#ifdef DEBUG_ENDIAN + TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm", NGRAM_ARPA)); +#endif ngram_model_free(model); E_INFO("Testing converted ARPA\n"); From 41259c05cdbd242a4d3d8b053fa27842b46a445e Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 13:58:45 -0400 Subject: [PATCH 85/94] fix: print arguments properly again --- programs/pocketsphinx_batch.c | 2 ++ programs/sphinx_cepview.c | 7 ++++++- programs/sphinx_fe.c | 7 ++++++- programs/sphinx_jsgf2fsg.c | 8 ++++++-- programs/sphinx_lm_convert.c | 8 ++++++-- programs/sphinx_lm_eval.c | 8 ++++++-- programs/sphinx_pitch.c | 7 +++++++ src/util/cmd_ln.c | 27 ++++++++++++++++++++------- 8 files changed, 59 insertions(+), 15 deletions(-) diff --git a/programs/pocketsphinx_batch.c b/programs/pocketsphinx_batch.c index aca16acd3..e582418ec 100644 --- a/programs/pocketsphinx_batch.c +++ b/programs/pocketsphinx_batch.c @@ -896,6 +896,8 @@ main(int32 argc, char *argv[]) if (config == NULL) { /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, ps_args_def); return 1; } diff --git a/programs/sphinx_cepview.c b/programs/sphinx_cepview.c index c859d7764..1a068027b 100644 --- a/programs/sphinx_cepview.c +++ b/programs/sphinx_cepview.c @@ -116,7 +116,12 @@ main(int argc, char *argv[]) char const *cepfile; cmd_ln_t *config; - config = cmd_ln_parse_r(NULL, arg, argc, argv, TRUE); + if ((config = cmd_ln_parse_r(NULL, arg, argc, argv, TRUE)) == NULL) { + /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, arg); + return 1; + } vsize = cmd_ln_int_r(config, "-i"); dsize = cmd_ln_int_r(config, "-d"); diff --git a/programs/sphinx_fe.c b/programs/sphinx_fe.c index 2bb64aa5e..f2644f1b4 100644 --- a/programs/sphinx_fe.c +++ b/programs/sphinx_fe.c @@ -1180,7 +1180,12 @@ main(int argc, char *argv[]) cmd_ln_t *config; int rv; - config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE); + if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) { + /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, defn); + return 1; + } if (config && cmd_ln_str_r(config, "-argfile")) config = cmd_ln_parse_file_r(config, defn, diff --git a/programs/sphinx_jsgf2fsg.c b/programs/sphinx_jsgf2fsg.c index b0b904b70..a579e5279 100644 --- a/programs/sphinx_jsgf2fsg.c +++ b/programs/sphinx_jsgf2fsg.c @@ -132,8 +132,12 @@ main(int argc, char *argv[]) cmd_ln_t *config; const char *rule; - if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) - return 1; + if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) { + /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, defn); + return 1; + } if (cmd_ln_boolean_r(config, "-help")) { usagemsg(argv[0]); diff --git a/programs/sphinx_lm_convert.c b/programs/sphinx_lm_convert.c index f34c500c7..01d88d1ed 100644 --- a/programs/sphinx_lm_convert.c +++ b/programs/sphinx_lm_convert.c @@ -114,8 +114,12 @@ main(int argc, char *argv[]) int itype, otype; char const *kase; - if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) - return 1; + if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) { + /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, defn); + return 1; + } if (cmd_ln_boolean_r(config, "-help")) { usagemsg(argv[0]); diff --git a/programs/sphinx_lm_eval.c b/programs/sphinx_lm_eval.c index db5246dfc..b121857e6 100644 --- a/programs/sphinx_lm_eval.c +++ b/programs/sphinx_lm_eval.c @@ -285,8 +285,12 @@ main(int argc, char *argv[]) logmath_t *lmath; const char *lmfn, *probdefn, *lsnfn, *text; - if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) - return 1; + if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) { + /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, defn); + return 1; + } verbose = cmd_ln_boolean_r(config, "-verbose"); diff --git a/programs/sphinx_pitch.c b/programs/sphinx_pitch.c index e7b33eae4..2ad2c0c01 100644 --- a/programs/sphinx_pitch.c +++ b/programs/sphinx_pitch.c @@ -157,6 +157,13 @@ main(int argc, char *argv[]) { cmd_ln_t *config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE); + if (config == NULL) { + /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, defn); + return 1; + } + /* Run a control file if requested. */ if (cmd_ln_str_r(config, "-c")) { if (run_control_file(cmd_ln_str_r(config, "-c"), config) < 0) diff --git a/src/util/cmd_ln.c b/src/util/cmd_ln.c index ef754e1d9..9b644da08 100644 --- a/src/util/cmd_ln.c +++ b/src/util/cmd_ln.c @@ -83,7 +83,7 @@ #include "sphinxbase/strfuncs.h" static void -arg_log_r(cmd_ln_t *, arg_t const *, int32); +arg_log_r(cmd_ln_t *, arg_t const *, int32, int32); static cmd_ln_t * parse_options(cmd_ln_t *, const arg_t *, int32, char* [], int32); @@ -223,7 +223,7 @@ arg_resolve_env(const char *str) } static void -arg_log_r(cmd_ln_t *cmdln, const arg_t * defn, int32 doc) +arg_log_r(cmd_ln_t *cmdln, const arg_t * defn, int32 doc, int32 lineno) { arg_t const **pos; int32 i, n; @@ -240,7 +240,10 @@ arg_log_r(cmd_ln_t *cmdln, const arg_t * defn, int32 doc) n = arg_strlen(defn, &namelen, &deflen); namelen += 4; deflen += 4; - E_INFO("%-*s", namelen, "[NAME]"); + if (lineno) + E_INFO("%-*s", namelen, "[NAME]"); + else + E_INFOCONT("%-*s", namelen, "[NAME]"); E_INFOCONT("%-*s", deflen, "[DEFLT]"); if (doc) { E_INFOCONT(" [DESCR]\n"); @@ -252,7 +255,10 @@ arg_log_r(cmd_ln_t *cmdln, const arg_t * defn, int32 doc) /* Print current configuration, sorted by name */ pos = arg_sort(defn, n); for (i = 0; i < n; i++) { - E_INFO("%-*s", namelen, pos[i]->name); + if (lineno) + E_INFO("%-*s", namelen, pos[i]->name); + else + E_INFOCONT("%-*s", namelen, pos[i]->name); if (pos[i]->deflt) E_INFOCONT("%-*s", deflen, pos[i]->deflt); else @@ -299,7 +305,7 @@ arg_log_r(cmd_ln_t *cmdln, const arg_t * defn, int32 doc) E_INFOCONT("\n"); } ckd_free(pos); - E_INFO("\n"); + E_INFOCONT("\n"); } static char ** @@ -774,10 +780,17 @@ cmd_ln_parse_file_r(cmd_ln_t *inout_cmdln, const arg_t * defn, const char *filen void cmd_ln_log_help_r(cmd_ln_t *cmdln, arg_t const* defn) { + if (defn == NULL) return; E_INFO("Arguments list definition:\n"); - arg_log_r(cmdln, defn, TRUE); + if (cmdln == NULL) { + cmdln = cmd_ln_parse_r(NULL, defn, 0, NULL, FALSE); + arg_log_r(cmdln, defn, TRUE, FALSE); + cmd_ln_free_r(cmdln); + } + else + arg_log_r(cmdln, defn, TRUE, FALSE); } void @@ -786,7 +799,7 @@ cmd_ln_log_values_r(cmd_ln_t *cmdln, arg_t const* defn) if (defn == NULL) return; E_INFO("Current configuration:\n"); - arg_log_r(cmdln, defn, FALSE); + arg_log_r(cmdln, defn, FALSE, FALSE); } int From f38aa3d33720ded288dd317aae2cea1e2efdf79b Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 14:16:28 -0400 Subject: [PATCH 86/94] doc: clarify -allphone --- include/pocketsphinx/cmdln_macro.h | 2 +- src/pocketsphinx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/pocketsphinx/cmdln_macro.h b/include/pocketsphinx/cmdln_macro.h index ee94ef2b8..1237d1fd8 100644 --- a/include/pocketsphinx/cmdln_macro.h +++ b/include/pocketsphinx/cmdln_macro.h @@ -231,7 +231,7 @@ { "-allphone", \ ARG_STRING, \ NULL, \ - "Perform phoneme decoding with phonetic lm" }, \ + "Perform phoneme decoding with phonetic lm (given here)" }, \ { "-allphone_ci", \ ARG_BOOLEAN, \ "yes", \ diff --git a/src/pocketsphinx.c b/src/pocketsphinx.c index 811b273ed..20a9f4166 100644 --- a/src/pocketsphinx.c +++ b/src/pocketsphinx.c @@ -369,7 +369,7 @@ ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) } if ((path = cmd_ln_str_r(ps->config, "-lm")) && - !cmd_ln_boolean_r(ps->config, "-allphone")) { + !cmd_ln_str_r(ps->config, "-allphone")) { if (ps_set_lm_file(ps, PS_DEFAULT_SEARCH, path) || ps_set_search(ps, PS_DEFAULT_SEARCH)) return -1; From 6a617218ddc400d0dd12d8a163bdb942c6625e0e Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 14:16:35 -0400 Subject: [PATCH 87/94] turn up logging in regression tests --- test/regression/test-align.sh | 1 + test/regression/test-cards.sh | 1 + test/regression/test-lm.sh | 1 + test/regression/test-tidigits-fsg.sh | 1 + test/regression/test-tidigits-simple.sh | 1 + 5 files changed, 5 insertions(+) diff --git a/test/regression/test-align.sh b/test/regression/test-align.sh index 8281676cf..f3088f126 100755 --- a/test/regression/test-align.sh +++ b/test/regression/test-align.sh @@ -6,6 +6,7 @@ bn=`basename $0 .sh` echo "Test: $bn" run_program pocketsphinx_batch \ + -loglevel INFO \ -hmm $model/en-us/en-us \ -dict $model/en-us/cmudict-en-us.dict \ -alignctl $data/librivox/fileids \ diff --git a/test/regression/test-cards.sh b/test/regression/test-cards.sh index b76316a2d..65c91db3a 100755 --- a/test/regression/test-cards.sh +++ b/test/regression/test-cards.sh @@ -6,6 +6,7 @@ bn=`basename $0 .sh` echo "Test: $bn" run_program pocketsphinx_batch \ + -loglevel INFO \ -hmm $model/en-us/en-us \ -jsgf $data/cards/cards.gram \ -dict $model/en-us/cmudict-en-us.dict\ diff --git a/test/regression/test-lm.sh b/test/regression/test-lm.sh index 2f43adcb0..4b3653e4e 100755 --- a/test/regression/test-lm.sh +++ b/test/regression/test-lm.sh @@ -14,6 +14,7 @@ run_program pocketsphinx_batch \ -cepext .wav \ -adcin yes \ -hyp $bn.match \ + -loglevel INFO \ -backtrace yes \ > $bn.log 2>&1 diff --git a/test/regression/test-tidigits-fsg.sh b/test/regression/test-tidigits-fsg.sh index 5116ac170..7583f7a19 100755 --- a/test/regression/test-tidigits-fsg.sh +++ b/test/regression/test-tidigits-fsg.sh @@ -13,6 +13,7 @@ run_program pocketsphinx_batch \ -cepdir $data/tidigits \ -hyp $bn.match \ -wbeam 1e-48 \ + -loglevel INFO \ > $bn.log 2>&1 # Test whether it actually completed diff --git a/test/regression/test-tidigits-simple.sh b/test/regression/test-tidigits-simple.sh index 282335d94..35f1e1352 100755 --- a/test/regression/test-tidigits-simple.sh +++ b/test/regression/test-tidigits-simple.sh @@ -12,6 +12,7 @@ run_program pocketsphinx_batch \ -ctl $data/tidigits/tidigits.ctl \ -cepdir $data/tidigits \ -hyp $bn.match \ + -loglevel INFO \ > $bn.log 2>&1 # Test whether it actually completed From 082a288b3732c7190509d57a78f3cae1d7b9eaa1 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 15:15:04 -0400 Subject: [PATCH 88/94] build: turn on SWIG Python module (not sure how to install it though) --- CMakeLists.txt | 3 ++- swig/CMakeLists.txt | 5 +++++ swig/python/CMakeLists.txt | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 swig/CMakeLists.txt create mode 100644 swig/python/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 9295b24b2..9439a013a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.14) project(PocketSphinx VERSION 1.0.0 DESCRIPTION "A small speech recognizer" @@ -72,6 +72,7 @@ add_subdirectory(model) add_subdirectory(programs) add_subdirectory(doc) add_subdirectory(test) +add_subdirectory(swig) configure_file(pocketsphinx.pc.in pocketsphinx.pc @ONLY) install(FILES ${CMAKE_BINARY_DIR}/pocketsphinx.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt new file mode 100644 index 000000000..e7c082fb3 --- /dev/null +++ b/swig/CMakeLists.txt @@ -0,0 +1,5 @@ +find_package(SWIG REQUIRED) +# mysteriously necessary +include(${SWIG_USE_FILE}) + +add_subdirectory(python) diff --git a/swig/python/CMakeLists.txt b/swig/python/CMakeLists.txt new file mode 100644 index 000000000..54871bb62 --- /dev/null +++ b/swig/python/CMakeLists.txt @@ -0,0 +1,15 @@ +find_package(Python3 COMPONENTS Interpreter Development) +set_property(SOURCE ../pocketsphinx.i PROPERTY SWIG_MODULE_NAME pocketsphinx) +swig_add_library(pocketsphinx_python + LANGUAGE python + SOURCES + ../pocketsphinx.i + ) +swig_link_libraries(pocketsphinx_python pocketsphinx Python3::Python) +set_property(SOURCE ../sphinxbase.i PROPERTY SWIG_MODULE_NAME sphinxbase) +swig_add_library(sphinxbase_python + LANGUAGE python + SOURCES + ../sphinxbase.i + ) +swig_link_libraries(sphinxbase_python pocketsphinx Python3::Python) From 933f5a44ad408f2a8b81fc22d7fc1571e500cf1e Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 15:26:17 -0400 Subject: [PATCH 89/94] build: make SWIG not required, ideally should be optional build --- swig/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt index e7c082fb3..66a055536 100644 --- a/swig/CMakeLists.txt +++ b/swig/CMakeLists.txt @@ -1,4 +1,4 @@ -find_package(SWIG REQUIRED) +find_package(SWIG) # mysteriously necessary include(${SWIG_USE_FILE}) From 694a62867d7b6a3577419f5099813eaf71dd0152 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 19:34:43 -0400 Subject: [PATCH 90/94] add swig to build deps --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 538d988f0..e26b3a632 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Install Build Dependencies - run: sudo apt-get -y install doxygen + run: sudo apt-get -y install doxygen swig - name: Checkout uses: actions/checkout@v3 - name: Build From 561a4b1c4bd93118ba87e00bbf98b7d746b5f0b8 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 19:34:59 -0400 Subject: [PATCH 91/94] build: do not require doxygen or swig --- doc/CMakeLists.txt | 78 +++++++++++++++++++++++---------------------- swig/CMakeLists.txt | 8 +++-- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 772f03273..3c9048930 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -1,42 +1,44 @@ find_package(Doxygen) -doxygen_add_docs(docs - ${CMAKE_SOURCE_DIR}/include/pocketsphinx.h - ${CMAKE_SOURCE_DIR}/include/pocketsphinx/ps_lattice.h - ${CMAKE_SOURCE_DIR}/include/pocketsphinx/ps_mllr.h - ${CMAKE_SOURCE_DIR}/include/pocketsphinx/ps_search.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/agc.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/bio.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/bitvec.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/byteorder.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/case.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/ckd_alloc.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/clapack_lite.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/cmd_ln.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/cmn.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/err.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/f2c.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/fe.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/feat.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/filename.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/fixpoint.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/fsg_model.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/genrand.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/glist.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/hash_table.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/heap.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/jsgf.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/listelem_alloc.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/logmath.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/matrix.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/mmio.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/ngram_model.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/pio.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/prim_type.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/profile.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/sphinxbase_export.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/strfuncs.h - ${CMAKE_SOURCE_DIR}/include/sphinxbase/yin.h - ) +if(DOXYGEN_FOUND) + doxygen_add_docs(docs + ${CMAKE_SOURCE_DIR}/include/pocketsphinx.h + ${CMAKE_SOURCE_DIR}/include/pocketsphinx/ps_lattice.h + ${CMAKE_SOURCE_DIR}/include/pocketsphinx/ps_mllr.h + ${CMAKE_SOURCE_DIR}/include/pocketsphinx/ps_search.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/agc.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/bio.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/bitvec.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/byteorder.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/case.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/ckd_alloc.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/clapack_lite.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/cmd_ln.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/cmn.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/err.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/f2c.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/fe.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/feat.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/filename.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/fixpoint.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/fsg_model.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/genrand.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/glist.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/hash_table.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/heap.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/jsgf.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/listelem_alloc.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/logmath.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/matrix.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/mmio.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/ngram_model.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/pio.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/prim_type.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/profile.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/sphinxbase_export.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/strfuncs.h + ${CMAKE_SOURCE_DIR}/include/sphinxbase/yin.h + ) +endif() install(FILES pocketsphinx_batch.1 pocketsphinx_continuous.1 diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt index 66a055536..3fe5d36e7 100644 --- a/swig/CMakeLists.txt +++ b/swig/CMakeLists.txt @@ -1,5 +1,7 @@ find_package(SWIG) -# mysteriously necessary -include(${SWIG_USE_FILE}) -add_subdirectory(python) +if(SWIG_FOUND) + # mysteriously necessary + include(${SWIG_USE_FILE}) + add_subdirectory(python) +endif() From 025ce5f53be8f4c488849469025381d3b0775470 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 19:56:24 -0400 Subject: [PATCH 92/94] build: make a suitably bogus version number and fix the homepage --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9439a013a..3762db115 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,8 @@ -cmake_minimum_required(VERSION 3.14) +cmake_minimum_required(VERSION 3.14) # I like pie -project(PocketSphinx VERSION 1.0.0 +project(PocketSphinx VERSION 0.9.999.0 DESCRIPTION "A small speech recognizer" - HOMEPAGE_URL "https://github.com/dhdaines/pocketsphinx") + HOMEPAGE_URL "https://github.com/cmusphinx/pocketsphinx") include(CMakePrintHelpers) set(PACKAGE_NAME ${PROJECT_NAME}) string(TOLOWER ${PROJECT_NAME} PROJECT_SHORTNAME) From dd96e1badf976564aa9efc89d3d807a0c462a5b6 Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 20:01:50 -0400 Subject: [PATCH 93/94] fix: silence a variety of compiler warnings --- sphinx_config.h.in | 2 ++ src/util/blas_lite.c | 2 +- test/unit/test_feat/test_feat.c | 2 +- test/unit/test_feat/test_feat_fe.c | 2 +- test/unit/test_feat/test_feat_live.c | 2 +- test/unit/test_feat/test_subvq.c | 2 +- test/unit/test_util/test_fopen.c | 10 +++++----- 7 files changed, 12 insertions(+), 10 deletions(-) diff --git a/sphinx_config.h.in b/sphinx_config.h.in index e4f4f7f86..b1dd983e5 100644 --- a/sphinx_config.h.in +++ b/sphinx_config.h.in @@ -10,7 +10,9 @@ #cmakedefine SIZEOF_LONG @SIZEOF_LONG@ /* Define if the system has the type `long long'. */ +#ifndef HAVE_LONG_LONG /* sometimes it is already defined */ #cmakedefine HAVE_LONG_LONG +#endif /* The size of `long long', as computed by sizeof. */ #cmakedefine SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@ diff --git a/src/util/blas_lite.c b/src/util/blas_lite.c index 3d36cff4b..f730ec2d0 100644 --- a/src/util/blas_lite.c +++ b/src/util/blas_lite.c @@ -392,7 +392,7 @@ doublereal sdot_(integer *n, real *sx, integer *incx, real *sy, integer *incy) } else { nrowb = *n; } - + (void) ncola; /* Test the input parameters. */ info = 0; diff --git a/test/unit/test_feat/test_feat.c b/test/unit/test_feat/test_feat.c index 77d3d422b..fc6024009 100644 --- a/test/unit/test_feat/test_feat.c +++ b/test/unit/test_feat/test_feat.c @@ -9,7 +9,7 @@ #include #include -const mfcc_t data[6][13] = { +mfcc_t data[6][13] = { { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), FLOAT2MFCC(0.186), FLOAT2MFCC(-0.656), FLOAT2MFCC(-0.226), FLOAT2MFCC(-0.105), FLOAT2MFCC(-0.412), FLOAT2MFCC(-0.024), diff --git a/test/unit/test_feat/test_feat_fe.c b/test/unit/test_feat/test_feat_fe.c index 2a9cb7e08..cfa0b45fd 100644 --- a/test/unit/test_feat/test_feat_fe.c +++ b/test/unit/test_feat/test_feat_fe.c @@ -39,7 +39,7 @@ main(int argc, char *argv[]) fseek(raw, 0, SEEK_END); nsamp = ftell(raw) / sizeof(int16); fe_process_frames(fe, NULL, &nsamp, NULL, &total_frames, NULL); - printf("%d samples, %d + 1 frames\n", nsamp, total_frames); + printf("%ld samples, %d + 1 frames\n", nsamp, total_frames); total_frames++; /* For the possible fe_end_utt() frame */ cepbuf = ckd_calloc_2d(total_frames + 1, fe_get_output_size(fe), sizeof(**cepbuf)); fseek(raw, 0, SEEK_SET); diff --git a/test/unit/test_feat/test_feat_live.c b/test/unit/test_feat/test_feat_live.c index 030d9779a..a87668ede 100644 --- a/test/unit/test_feat/test_feat_live.c +++ b/test/unit/test_feat/test_feat_live.c @@ -11,7 +11,7 @@ #include "test_macros.h" -const mfcc_t data[6][13] = { +mfcc_t data[6][13] = { { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), FLOAT2MFCC(0.186), FLOAT2MFCC(-0.656), FLOAT2MFCC(-0.226), FLOAT2MFCC(-0.105), FLOAT2MFCC(-0.412), FLOAT2MFCC(-0.024), diff --git a/test/unit/test_feat/test_subvq.c b/test/unit/test_feat/test_subvq.c index 12e38ced0..f5aa0c368 100644 --- a/test/unit/test_feat/test_subvq.c +++ b/test/unit/test_feat/test_subvq.c @@ -11,7 +11,7 @@ #include "test_macros.h" -const mfcc_t data[6][13] = { +mfcc_t data[6][13] = { { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), FLOAT2MFCC(0.186), FLOAT2MFCC(-0.656), FLOAT2MFCC(-0.226), FLOAT2MFCC(-0.105), FLOAT2MFCC(-0.412), FLOAT2MFCC(-0.024), diff --git a/test/unit/test_util/test_fopen.c b/test/unit/test_util/test_fopen.c index 92beb8cce..424fcff4d 100644 --- a/test/unit/test_util/test_fopen.c +++ b/test/unit/test_util/test_fopen.c @@ -13,30 +13,30 @@ int main(int argc, char *argv[]) { FILE *fh; - char line[256], *c; + char line[256]; int ispipe; fh = fopen_comp(LMDIR "/100.lm.gz", "r", &ispipe); TEST_ASSERT(fh != NULL); - c = fgets(line, sizeof(line), fh); + (void) fgets(line, sizeof(line), fh); TEST_EQUAL('#', line[0]); fclose_comp(fh, ispipe); fh = fopen_compchk(LMDIR "/100.lm.gz", &ispipe); TEST_ASSERT(fh != NULL); - c = fgets(line, sizeof(line), fh); + (void) fgets(line, sizeof(line), fh); TEST_EQUAL('#', line[0]); fclose_comp(fh, ispipe); fh = fopen_compchk(LMDIR "/100.lm.bz2", &ispipe); TEST_ASSERT(fh != NULL); - c = fgets(line, sizeof(line), fh); + (void) fgets(line, sizeof(line), fh); TEST_EQUAL('#', line[0]); fclose_comp(fh, ispipe); fh = fopen_compchk(LMDIR "/100.lm", &ispipe); TEST_ASSERT(fh != NULL); - c = fgets(line, sizeof(line), fh); + (void) fgets(line, sizeof(line), fh); TEST_EQUAL('#', line[0]); fclose_comp(fh, ispipe); From d4d6091be4bef71bfa5fbe96c1f7f333de87e30a Mon Sep 17 00:00:00 2001 From: David Huggins-Daines Date: Wed, 8 Jun 2022 20:05:30 -0400 Subject: [PATCH 94/94] fix: Add useful link directory for MacOS --- src/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7b07d4241..a74f943d1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -88,6 +88,10 @@ target_include_directories( pocketsphinx PUBLIC ${CMAKE_BINARY_DIR}/include pocketsphinx INTERFACE ${CMAKE_SOURCE_DIR}/include ) +if(APPLE) + # Things we might need are here + target_link_directories(pocketsphinx PUBLIC /usr/local/lib) +endif() find_library(MATH_LIBRARY m) if(MATH_LIBRARY) target_link_libraries(pocketsphinx PUBLIC ${MATH_LIBRARY})