# HG changeset patch
# User Chris Cannam
# Date 1425029377 0
# Node ID cca298ecfc7239be2a2f1e7f7311ddc4979ffb3a
# Parent a68204b9a529352a0042a9343f99b0d2b64c9ffc# Parent 082ff90f1c82636c294963dd13f95b17fe99a6fe
Merge from branch re-minimise
diff -r a68204b9a529 -r cca298ecfc72 .hgignore
--- a/.hgignore Fri Nov 14 10:24:13 2014 +0000
+++ b/.hgignore Fri Feb 27 09:29:37 2015 +0000
@@ -4,3 +4,7 @@
*.dylib
*.so
*.o
+*.orig
+re:^test/TestDistanceMetric$
+re:^test/TestFeatureConditioner$
+re:^test/TestFeatureExtractor$
diff -r a68204b9a529 -r cca298ecfc72 Makefile.inc
--- a/Makefile.inc Fri Nov 14 10:24:13 2014 +0000
+++ b/Makefile.inc Fri Feb 27 09:29:37 2015 +0000
@@ -4,37 +4,65 @@
CXX ?= g++
CC ?= gcc
+CXXFLAGS := -Isrc -DUSE_COMPACT_TYPES $(CXXFLAGS)
+
+TEST_LDFLAGS += -lboost_unit_test_framework
+
HEADERS := $(wildcard src/*.h)
SOURCES := $(wildcard src/*.cpp)
-
OBJECTS := $(SOURCES:.cpp=.o)
+TEST_SOURCES := $(wildcard test/*.cpp)
+TEST_OBJECTS := $(TEST_SOURCES:.cpp=.o)
+TESTS := $(TEST_OBJECTS:.o=)
+
+all: $(PLUGIN) $(TESTS)
+ for t in $(TESTS); do echo "Running $$t"; ./"$$t" || exit 1; done
+
$(PLUGIN): $(OBJECTS)
- $(CXX) -o $@ $^ $(LDFLAGS)
+ $(CXX) -o $@ $^ $(LDFLAGS) $(PLUGIN_LDFLAGS)
+
+test/%: test/%.o $(OBJECTS)
+ $(CXX) -o $@ $^ $(LDFLAGS) $(TEST_LDFLAGS)
clean:
- rm -f $(OBJECTS)
+ rm -f $(OBJECTS) $(TEST_OBJECTS) $(TESTS)
distclean: clean
rm -f $(PLUGIN)
depend:
- makedepend -Y -fMakefile.inc $(SOURCES) $(HEADERS)
+ makedepend -Y -fMakefile.inc $(SOURCES) $(HEADERS) $(TEST_SOURCES)
+
# DO NOT DELETE
src/DistanceMetric.o: src/DistanceMetric.h
-src/MatchFeeder.o: src/MatchFeeder.h src/Matcher.h src/DistanceMetric.h
-src/MatchFeeder.o: src/Finder.h
src/Path.o: src/Path.h
+src/FeatureConditioner.o: src/FeatureConditioner.h
src/MatchFeatureFeeder.o: src/MatchFeatureFeeder.h src/Matcher.h
-src/MatchFeatureFeeder.o: src/DistanceMetric.h src/Finder.h
-src/Finder.o: src/Finder.h src/Matcher.h src/DistanceMetric.h src/Path.h
-src/Matcher.o: src/Matcher.h src/DistanceMetric.h
-src/MatchVampPlugin.o: src/MatchVampPlugin.h src/Matcher.h
-src/MatchVampPlugin.o: src/DistanceMetric.h src/MatchFeeder.h src/Finder.h
+src/MatchFeatureFeeder.o: src/DistanceMetric.h src/MatchTypes.h src/Finder.h
+src/FeatureExtractor.o: src/FeatureExtractor.h
+src/Finder.o: src/Finder.h src/Matcher.h src/DistanceMetric.h src/MatchTypes.h
+src/Finder.o: src/Path.h
+src/Matcher.o: src/Matcher.h src/DistanceMetric.h src/MatchTypes.h
+src/MatchPipeline.o: src/MatchPipeline.h src/Matcher.h src/DistanceMetric.h
+src/MatchPipeline.o: src/MatchTypes.h src/Finder.h src/FeatureExtractor.h
+src/MatchPipeline.o: src/FeatureConditioner.h src/MatchFeatureFeeder.h
+src/MatchVampPlugin.o: src/MatchVampPlugin.h src/MatchPipeline.h
+src/MatchVampPlugin.o: src/Matcher.h src/DistanceMetric.h src/MatchTypes.h
+src/MatchVampPlugin.o: src/Finder.h src/FeatureExtractor.h
+src/MatchVampPlugin.o: src/FeatureConditioner.h src/MatchFeatureFeeder.h
src/MatchVampPlugin.o: src/Path.h
-src/MatchFeeder.o: src/Matcher.h src/DistanceMetric.h src/Finder.h
-src/MatchFeatureFeeder.o: src/Matcher.h src/DistanceMetric.h src/Finder.h
-src/Finder.o: src/Matcher.h src/DistanceMetric.h
-src/Matcher.o: src/DistanceMetric.h
-src/MatchVampPlugin.o: src/Matcher.h src/DistanceMetric.h
+src/MatchFeatureFeeder.o: src/Matcher.h src/DistanceMetric.h src/MatchTypes.h
+src/MatchFeatureFeeder.o: src/Finder.h
+src/Finder.o: src/Matcher.h src/DistanceMetric.h src/MatchTypes.h
+src/Matcher.o: src/DistanceMetric.h src/MatchTypes.h
+src/MatchPipeline.o: src/Matcher.h src/DistanceMetric.h src/MatchTypes.h
+src/MatchPipeline.o: src/Finder.h src/FeatureExtractor.h
+src/MatchPipeline.o: src/FeatureConditioner.h src/MatchFeatureFeeder.h
+src/MatchVampPlugin.o: src/MatchPipeline.h src/Matcher.h src/DistanceMetric.h
+src/MatchVampPlugin.o: src/MatchTypes.h src/Finder.h src/FeatureExtractor.h
+src/MatchVampPlugin.o: src/FeatureConditioner.h src/MatchFeatureFeeder.h
+test/TestFeatureConditioner.o: src/FeatureConditioner.h
+test/TestDistanceMetric.o: src/DistanceMetric.h
+test/TestFeatureExtractor.o: src/FeatureExtractor.h
diff -r a68204b9a529 -r cca298ecfc72 Makefile.linux
--- a/Makefile.linux Fri Nov 14 10:24:13 2014 +0000
+++ b/Makefile.linux Fri Feb 27 09:29:37 2015 +0000
@@ -1,6 +1,10 @@
-CXXFLAGS += -fPIC -ffast-math -O3 -Wall -Werror
-LDFLAGS += -shared -Wl,-Bstatic -lvamp-sdk -Wl,-Bdynamic -Wl,-Bsymbolic -Wl,-z,defs -lpthread -Wl,--version-script=vamp-plugin.map
+CXXFLAGS += -fPIC -ffast-math -O3 -Wall -Werror -Werror=old-style-cast -Wconversion -std=c++11 -DPERFORM_ERROR_CHECKS=1
+
+#CXXFLAGS += -fPIC -g -Wall -Werror -Werror=old-style-cast -Wconversion -DPERFORM_ERROR_CHECKS=1 -std=c++11
+
+LDFLAGS += -Wl,-Bstatic -lvamp-sdk -Wl,-Bdynamic
+PLUGIN_LDFLAGS += -shared -Wl,-Bsymbolic -Wl,-z,defs -lpthread -Wl,--version-script=vamp-plugin.map
include Makefile.inc
diff -r a68204b9a529 -r cca298ecfc72 Makefile.osx
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Makefile.osx Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,12 @@
+
+ARCHFLAGS := -arch x86_64 -mmacosx-version-min=10.7
+CFLAGS := $(ARCHFLAGS) -O3 -I../vamp-plugin-sdk -I/usr/local/boost -Wall -fPIC -std=c++11
+CXXFLAGS := $(CFLAGS)
+
+LDFLAGS := -L../vamp-plugin-sdk -lvamp-sdk $(ARCHFLAGS)
+PLUGIN_LDFLAGS := -dynamiclib $(LDFLAGS) -exported_symbols_list vamp-plugin.list
+TEST_LDFLAGS := $(LDFLAGS) -lboost_unit_test_framework
+PLUGIN_EXT := .dylib
+
+include Makefile.inc
+
diff -r a68204b9a529 -r cca298ecfc72 match-vamp-plugin.n3
--- a/match-vamp-plugin.n3 Fri Nov 14 10:24:13 2014 +0000
+++ b/match-vamp-plugin.n3 Fri Feb 27 09:29:37 2015 +0000
@@ -6,24 +6,26 @@
@prefix dc: .
@prefix af: .
@prefix foaf: .
+@prefix doap: .
@prefix cc: .
@prefix : <#> .
-<> a vamp:PluginDescription ;
- foaf:maker ;
- foaf:primaryTopic .
+<> a vamp:PluginDescription ;
+ foaf:maker ;
+ foaf:primaryTopic .
-:maker
+:library_maker
foaf:name "Simon Dixon and Chris Cannam" ;
foaf:logo ;
- foaf:page .
+ foaf:page ;
+ .
plugbase:library a vamp:PluginLibrary ;
vamp:identifier "match-vamp-plugin" ;
dc:title "MATCH Vamp Plugin" ;
dc:description """Vamp implementation of the MATCH audio alignment algorithm from Simon Dixon. Sonic Visualiser can use this for automatic time alignment among multiple audio files.""" ;
vamp:available_plugin plugbase:match ;
- foaf:maker :maker ;
+ foaf:maker :library_maker ;
foaf:page ;
.
@@ -31,15 +33,27 @@
dc:title "Match Performance Aligner" ;
vamp:name "Match Performance Aligner" ;
dc:description """Calculate alignment between two performances in separate channel inputs""" ;
- foaf:maker :maker ;
+ foaf:maker :library_maker ;
dc:rights """GPL""" ;
# cc:license ;
vamp:identifier "match" ;
vamp:vamp_API_version vamp:api_version_2 ;
- owl:versionInfo "1" ;
+ owl:versionInfo "3" ;
vamp:input_domain vamp:FrequencyDomain ;
-
+ vamp:parameter plugbase:match_param_freq1 ;
+ vamp:parameter plugbase:match_param_freq2 ;
+ vamp:parameter plugbase:match_param_usechroma ;
+ vamp:parameter plugbase:match_param_usespecdiff ;
+ vamp:parameter plugbase:match_param_framenorm ;
+ vamp:parameter plugbase:match_param_metric ;
+ vamp:parameter plugbase:match_param_distnorm ;
+ vamp:parameter plugbase:match_param_silencethreshold ;
+ vamp:parameter plugbase:match_param_noise ;
+ vamp:parameter plugbase:match_param_gradientlimit ;
+ vamp:parameter plugbase:match_param_zonewidth ;
+ vamp:parameter plugbase:match_param_diagonalweight ;
+ vamp:parameter plugbase:match_param_smooth ;
vamp:parameter plugbase:match_param_serialise ;
vamp:output plugbase:match_output_path ;
@@ -47,10 +61,155 @@
vamp:output plugbase:match_output_b_a ;
vamp:output plugbase:match_output_a_b_divergence ;
vamp:output plugbase:match_output_a_b_temporatio ;
+ vamp:output plugbase:match_output_a_features ;
+ vamp:output plugbase:match_output_b_features ;
+ vamp:output plugbase:match_output_a_cfeatures ;
+ vamp:output plugbase:match_output_b_cfeatures ;
+ vamp:output plugbase:match_output_overall_cost ;
+ .
+
+plugbase:match_param_freq1 a vamp:Parameter ;
+ vamp:identifier "freq1" ;
+ dc:title "Tuning frequency of first input" ;
+ dc:format "Hz" ;
+ vamp:min_value 220 ;
+ vamp:max_value 880 ;
+ vamp:unit "Hz" ;
+ vamp:default_value 440 ;
+ vamp:value_names ();
+ .
+plugbase:match_param_freq2 a vamp:Parameter ;
+ vamp:identifier "freq2" ;
+ dc:title "Tuning frequency of second input" ;
+ dc:format "Hz" ;
+ vamp:min_value 220 ;
+ vamp:max_value 880 ;
+ vamp:unit "Hz" ;
+ vamp:default_value 440 ;
+ vamp:value_names ();
+ .
+plugbase:match_param_usechroma a vamp:QuantizedParameter ;
+ vamp:identifier "usechroma" ;
+ dc:title "Feature type" ;
+ dc:format "" ;
+ vamp:min_value 0 ;
+ vamp:max_value 1 ;
+ vamp:unit "" ;
+ vamp:quantize_step 1 ;
+ vamp:default_value 0 ;
+ vamp:value_names ( "Spectral" "Chroma");
+ .
+plugbase:match_param_usespecdiff a vamp:QuantizedParameter ;
+ vamp:identifier "usespecdiff" ;
+ dc:title "Use feature difference" ;
+ dc:format "" ;
+ vamp:min_value 0 ;
+ vamp:max_value 1 ;
+ vamp:unit "" ;
+ vamp:quantize_step 1 ;
+ vamp:default_value 1 ;
+ vamp:value_names ();
+ .
+plugbase:match_param_framenorm a vamp:QuantizedParameter ;
+ vamp:identifier "framenorm" ;
+ dc:title "Frame normalisation" ;
+ dc:format "" ;
+ vamp:min_value 0 ;
+ vamp:max_value 2 ;
+ vamp:unit "" ;
+ vamp:quantize_step 1 ;
+ vamp:default_value 1 ;
+ vamp:value_names ( "None" "Sum to 1" "Long-term average");
+ .
+plugbase:match_param_metric a vamp:QuantizedParameter ;
+ vamp:identifier "metric" ;
+ dc:title "Distance metric" ;
+ dc:format "" ;
+ vamp:min_value 0 ;
+ vamp:max_value 2 ;
+ vamp:unit "" ;
+ vamp:quantize_step 1 ;
+ vamp:default_value 0 ;
+ vamp:value_names ( "Manhattan" "Euclidean" "Cosine");
+ .
+plugbase:match_param_distnorm a vamp:QuantizedParameter ;
+ vamp:identifier "distnorm" ;
+ dc:title "Distance normalisation" ;
+ dc:format "" ;
+ vamp:min_value 0 ;
+ vamp:max_value 2 ;
+ vamp:unit "" ;
+ vamp:quantize_step 1 ;
+ vamp:default_value 2 ;
+ vamp:value_names ( "None" "Sum of frames" "Log sum of frames");
+ .
+plugbase:match_param_silencethreshold a vamp:Parameter ;
+ vamp:identifier "silencethreshold" ;
+ dc:title "Silence threshold" ;
+ dc:format "" ;
+ vamp:min_value 0 ;
+ vamp:max_value 0.1 ;
+ vamp:unit "" ;
+ vamp:default_value 0.01 ;
+ vamp:value_names ();
+ .
+plugbase:match_param_noise a vamp:QuantizedParameter ;
+ vamp:identifier "noise" ;
+ dc:title "Add noise" ;
+ dc:format "" ;
+ vamp:min_value 0 ;
+ vamp:max_value 1 ;
+ vamp:unit "" ;
+ vamp:quantize_step 1 ;
+ vamp:default_value 1 ;
+ vamp:value_names ();
+ .
+plugbase:match_param_gradientlimit a vamp:QuantizedParameter ;
+ vamp:identifier "gradientlimit" ;
+ dc:title "Gradient limit" ;
+ dc:format "" ;
+ vamp:min_value 1 ;
+ vamp:max_value 10 ;
+ vamp:unit "" ;
+ vamp:quantize_step 1 ;
+ vamp:default_value 3 ;
+ vamp:value_names ();
+ .
+plugbase:match_param_zonewidth a vamp:QuantizedParameter ;
+ vamp:identifier "zonewidth" ;
+ dc:title "Search zone width" ;
+ dc:format "s" ;
+ vamp:min_value 1 ;
+ vamp:max_value 60 ;
+ vamp:unit "s" ;
+ vamp:quantize_step 1 ;
+ vamp:default_value 10 ;
+ vamp:value_names ();
+ .
+plugbase:match_param_diagonalweight a vamp:Parameter ;
+ vamp:identifier "diagonalweight" ;
+ dc:title "Diagonal weight" ;
+ dc:format "" ;
+ vamp:min_value 1 ;
+ vamp:max_value 2 ;
+ vamp:unit "" ;
+ vamp:default_value 2 ;
+ vamp:value_names ();
+ .
+plugbase:match_param_smooth a vamp:QuantizedParameter ;
+ vamp:identifier "smooth" ;
+ dc:title "Use path smoothing" ;
+ dc:format "" ;
+ vamp:min_value 0 ;
+ vamp:max_value 1 ;
+ vamp:unit "" ;
+ vamp:quantize_step 1 ;
+ vamp:default_value 0 ;
+ vamp:value_names ();
.
plugbase:match_param_serialise a vamp:QuantizedParameter ;
vamp:identifier "serialise" ;
- dc:title "Serialise Plugin Invocations" ;
+ dc:title "Serialise plugin invocations" ;
dc:format "" ;
vamp:min_value 0 ;
vamp:max_value 1 ;
@@ -62,7 +221,7 @@
plugbase:match_output_path a vamp:SparseOutput ;
vamp:identifier "path" ;
dc:title "Path" ;
- dc:description "Alignment path" ;
+ dc:description """Alignment path""" ;
vamp:fixed_bin_count "true" ;
vamp:unit "" ;
a vamp:QuantizedOutput ;
@@ -77,7 +236,7 @@
plugbase:match_output_a_b a vamp:SparseOutput ;
vamp:identifier "a_b" ;
dc:title "A-B Timeline" ;
- dc:description "Timing in performance B corresponding to moments in performance A" ;
+ dc:description """Timing in performance B corresponding to moments in performance A""" ;
vamp:fixed_bin_count "true" ;
vamp:unit "sec" ;
vamp:bin_count 1 ;
@@ -90,7 +249,7 @@
plugbase:match_output_b_a a vamp:SparseOutput ;
vamp:identifier "b_a" ;
dc:title "B-A Timeline" ;
- dc:description "Timing in performance A corresponding to moments in performance B" ;
+ dc:description """Timing in performance A corresponding to moments in performance B""" ;
vamp:fixed_bin_count "true" ;
vamp:unit "sec" ;
vamp:bin_count 1 ;
@@ -103,7 +262,7 @@
plugbase:match_output_a_b_divergence a vamp:SparseOutput ;
vamp:identifier "a_b_divergence" ;
dc:title "A-B Divergence" ;
- dc:description "Difference between timings in performances A and B" ;
+ dc:description """Difference between timings in performances A and B""" ;
vamp:fixed_bin_count "true" ;
vamp:unit "sec" ;
vamp:bin_count 1 ;
@@ -116,7 +275,7 @@
plugbase:match_output_a_b_temporatio a vamp:SparseOutput ;
vamp:identifier "a_b_temporatio" ;
dc:title "A-B Tempo Ratio" ;
- dc:description "Ratio of tempi between performances A and B" ;
+ dc:description """Ratio of tempi between performances A and B""" ;
vamp:fixed_bin_count "true" ;
vamp:unit "" ;
vamp:bin_count 1 ;
@@ -126,4 +285,59 @@
# vamp:computes_feature ;
# vamp:computes_signal_type ;
.
+plugbase:match_output_a_features a vamp:DenseOutput ;
+ vamp:identifier "a_features" ;
+ dc:title "Raw A Features" ;
+ dc:description """Spectral features extracted from performance A""" ;
+ vamp:fixed_bin_count "true" ;
+ vamp:unit "" ;
+ vamp:bin_count 84 ;
+# vamp:computes_event_type ;
+# vamp:computes_feature ;
+# vamp:computes_signal_type ;
+ .
+plugbase:match_output_b_features a vamp:DenseOutput ;
+ vamp:identifier "b_features" ;
+ dc:title "Raw B Features" ;
+ dc:description """Spectral features extracted from performance B""" ;
+ vamp:fixed_bin_count "true" ;
+ vamp:unit "" ;
+ vamp:bin_count 84 ;
+# vamp:computes_event_type ;
+# vamp:computes_feature ;
+# vamp:computes_signal_type ;
+ .
+plugbase:match_output_a_cfeatures a vamp:DenseOutput ;
+ vamp:identifier "a_cfeatures" ;
+ dc:title "Conditioned A Features" ;
+ dc:description """Spectral features extracted from performance A, after normalisation and conditioning""" ;
+ vamp:fixed_bin_count "true" ;
+ vamp:unit "" ;
+ vamp:bin_count 84 ;
+# vamp:computes_event_type ;
+# vamp:computes_feature ;
+# vamp:computes_signal_type ;
+ .
+plugbase:match_output_b_cfeatures a vamp:DenseOutput ;
+ vamp:identifier "b_cfeatures" ;
+ dc:title "Conditioned B Features" ;
+ dc:description """Spectral features extracted from performance B, after norrmalisation and conditioning""" ;
+ vamp:fixed_bin_count "true" ;
+ vamp:unit "" ;
+ vamp:bin_count 84 ;
+# vamp:computes_event_type ;
+# vamp:computes_feature ;
+# vamp:computes_signal_type ;
+ .
+plugbase:match_output_overall_cost a vamp:DenseOutput ;
+ vamp:identifier "overall_cost" ;
+ dc:title "Overall Cost" ;
+ dc:description """Normalised overall path cost for the cheapest path""" ;
+ vamp:fixed_bin_count "true" ;
+ vamp:unit "" ;
+ vamp:bin_count 1 ;
+# vamp:computes_event_type ;
+# vamp:computes_feature ;
+# vamp:computes_signal_type ;
+ .
diff -r a68204b9a529 -r cca298ecfc72 src/DistanceMetric.cpp
--- a/src/DistanceMetric.cpp Fri Nov 14 10:24:13 2014 +0000
+++ b/src/DistanceMetric.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -18,50 +18,173 @@
#include
#include
+#include
-using std::vector;
+using namespace std;
-double
-DistanceMetric::calcDistance(const vector &f1,
- const vector &f2)
+//#define DEBUG_DISTANCE_METRIC 1
+
+template <> uint8_t
+DistanceMetric::scaleIntoRange(double distance)
+{
+ double scaled = m_params.scale * distance;
+ if (scaled < 0) {
+ scaled = 0;
+ }
+ if (scaled > MaxDistance) {
+ scaled = MaxDistance;
+ ++m_overcount;
+ }
+ return uint8_t(scaled);
+}
+
+template <> float
+DistanceMetric::scaleIntoRange(double distance)
+{
+ return float(distance);
+}
+
+template <> double
+DistanceMetric::scaleIntoRange(double distance)
+{
+ return distance;
+}
+
+DistanceMetric::DistanceMetric(Parameters params) :
+ m_params(params),
+ m_max(0),
+ m_overcount(0)
+{
+#ifdef DEBUG_DISTANCE_METRIC
+ cerr << "*** DistanceMetric: metric = " << m_params.metric
+ << ", norm = " << m_params.norm
+ << ", noise = " << m_params.noise
+ << ", scale = " << m_params.scale
+ << endl;
+#endif
+}
+
+DistanceMetric::~DistanceMetric()
+{
+#ifdef DEBUG_DISTANCE_METRIC
+ cerr << "*** DistanceMetric::~DistanceMetric: metric = " << m_params.metric
+ << ", norm = " << m_params.norm
+ << ", noise = " << m_params.noise;
+#ifdef USE_COMPACT_TYPES
+ cerr << ", scale = " << m_params.scale;
+ cerr << "\n*** DistanceMetric::~DistanceMetric: max scaled value = "
+ << distance_print_t(m_max)
+ << ", " << m_overcount << " clipped" << endl;
+#else
+ cerr << ", no scaling";
+ cerr << "\n*** DistanceMetric::~DistanceMetric: max value = "
+ << distance_print_t(m_max)
+ << endl;
+#endif
+#endif
+}
+
+distance_t
+DistanceMetric::scaleValueIntoDistanceRange(double value)
+{
+ return scaleIntoRange(value);
+}
+
+distance_t
+DistanceMetric::scaleAndTally(double value)
+{
+ distance_t dist = scaleIntoRange(value);
+ if (dist > m_max) m_max = dist;
+ return dist;
+}
+
+distance_t
+DistanceMetric::calcDistance(const feature_t &f1,
+ const feature_t &f2)
{
double d = 0;
double sum = 0;
+ double eps = 1e-16;
- int featureSize = f1.size();
- assert(int(f2.size()) == featureSize);
+ assert(f2.size() == f1.size());
+ int featureSize = static_cast(f1.size());
+
+ double minNoise = 0.0;
+#ifdef USE_COMPACT_TYPES
+ minNoise = 1.0 / m_params.scale;
+#endif
- for (int i = 0; i < featureSize; i++) {
- d += fabs(f1[i] - f2[i]);
- sum += f1[i] + f2[i];
+ if (m_params.metric == Cosine) {
+
+ double num = 0, denom1 = 0, denom2 = 0;
+
+ for (int i = 0; i < featureSize; ++i) {
+ num += f1[i] * f2[i];
+ denom1 += f1[i] * f1[i];
+ denom2 += f2[i] * f2[i];
+ }
+
+ d = 1.0 - (num / (eps + sqrt(denom1 * denom2)));
+
+ if (m_params.noise == AddNoise) {
+ double noise = 1e-2;
+ if (noise < minNoise) noise = minNoise;
+ d += noise;
+ }
+ if (d > 1.0) d = 1.0;
+
+ return scaleAndTally(d); // normalisation param ignored
}
- if (sum == 0)
- return 0;
- if (m_norm == NormaliseDistanceToSum)
- return d / sum; // 0 <= d/sum <= 2
- if (m_norm != NormaliseDistanceToLogSum)
- return d;
+ if (m_params.metric == Manhattan) {
+ for (int i = 0; i < featureSize; i++) {
+ d += fabs(f1[i] - f2[i]);
+ sum += fabs(f1[i]) + fabs(f2[i]);
+ }
+ } else {
+ // Euclidean
+ for (int i = 0; i < featureSize; i++) {
+ d += (f1[i] - f2[i]) * (f1[i] - f2[i]);
+ sum += fabs(f1[i]) + fabs(f2[i]);
+ }
+ d = sqrt(d);
+ }
- // note if this were to be restored, it would have to use
- // totalEnergies vector instead of f1[freqMapSize] which used to
- // store the total energy:
- // double weight = (5 + Math.log(f1[freqMapSize] + f2[freqMapSize]))/10.0;
+ if (m_params.noise == AddNoise) {
+ double noise = 1e-3 * featureSize;
+ if (noise < minNoise) noise = minNoise;
+ d += noise;
+ sum += noise;
+ }
+
+ if (sum == 0) {
+ return scaleAndTally(0);
+ }
- double weight = (8 + log(sum)) / 10.0;
+ double distance = 0;
- if (weight < 0) weight = 0;
- else if (weight > 1) weight = 1;
+ if (m_params.norm == NormaliseDistanceToSum) {
- return d / sum * weight;
+ distance = d / sum; // 0 <= d/sum <= 2
+
+ } else if (m_params.norm == NormaliseDistanceToLogSum) {
+
+ // note if this were to be restored, it would have to use
+ // totalEnergies vector instead of f1[freqMapSize] which used to
+ // store the total energy:
+ // double weight = (5 + Math.log(f1[freqMapSize] + f2[freqMapSize]))/10.0;
+
+ double weight = (8 + log(sum)) / 10.0;
+
+ if (weight < 0) weight = 0;
+ else if (weight > 1) weight = 1;
+
+ distance = d / sum * weight;
+
+ } else {
+
+ distance = d;
+ }
+
+ return scaleAndTally(distance);
}
-
-int
-DistanceMetric::calcDistanceScaled(const vector &f1,
- const vector &f2,
- double scale)
-{
- double distance = calcDistance(f1, f2);
- return int(distance * scale);
-}
-
diff -r a68204b9a529 -r cca298ecfc72 src/DistanceMetric.h
--- a/src/DistanceMetric.h Fri Nov 14 10:24:13 2014 +0000
+++ b/src/DistanceMetric.h Fri Feb 27 09:29:37 2015 +0000
@@ -17,11 +17,28 @@
#ifndef DISTANCE_METRIC_H
#define DISTANCE_METRIC_H
-#include
+#include "MatchTypes.h"
class DistanceMetric
{
public:
+ enum Metric {
+
+ /** Calculate the Manhattan distance between feature
+ * vectors. If the vectors contain energy, as the default
+ * MATCH feature does, this could be considered as a squared
+ * Euclidean distance metric. */
+ Manhattan,
+
+ /** Calculate the Euclidean distance between feature vectors. */
+ Euclidean,
+
+ /** Calculate the cosine distance between feature vectors. The
+ * normalisation setting will be ignored as the result is
+ * already magnitude-independent. */
+ Cosine,
+ };
+
enum DistanceNormalisation {
/** Do not normalise distance metrics */
@@ -35,39 +52,61 @@
* of the sum of the frames. */
NormaliseDistanceToLogSum,
};
+
+ enum NoiseAddition {
- DistanceMetric(DistanceNormalisation norm) : m_norm(norm) { }
+ /** Don't add noise. */
+ NoNoise,
+
+ /** Add a constant noise term. This can help avoid
+ * mis-tracking when one file contains a lot of silence. */
+ AddNoise,
+ };
- /** Calculates the Manhattan distance between two vectors, with an
- * optional normalisation by the combined values in the
- * vectors. Since the vectors contain energy, this could be
- * considered as a squared Euclidean distance metric. Note that
- * normalisation assumes the values are all non-negative.
+ struct Parameters {
+
+ Parameters() :
+ metric(Manhattan),
+ norm(NormaliseDistanceToLogSum),
+ noise(AddNoise),
+ scale(100.)
+ {}
+
+ Metric metric;
+ DistanceNormalisation norm;
+ NoiseAddition noise;
+ double scale;
+ };
+
+ DistanceMetric(Parameters params);
+
+ ~DistanceMetric();
+
+ /** Calculates the distance in some metric between two vectors,
+ * with an optional normalisation by the combined values in the
+ * vectors. Note that normalisation assumes the values are all
+ * non-negative.
*
* @param f1 one of the vectors involved in the distance calculation
* @param f2 one of the vectors involved in the distance calculation
* @return the distance
*/
- double calcDistance(const std::vector &f1,
- const std::vector &f2);
+ distance_t calcDistance(const feature_t &f1,
+ const feature_t &f2);
+
+ /**
+ * Mostly for internal use and testing
+ */
+ distance_t scaleValueIntoDistanceRange(double value);
- /** Calculates the Manhattan distance between two vectors, with an
- * optional normalisation by the combined values in the
- * vectors. Since the vectors contain energy, this could be
- * considered as a squared Euclidean distance metric. Note that
- * normalisation assumes the values are all non-negative.
- *
- * @param f1 one of the vectors involved in the distance calculation
- * @param f2 one of the vectors involved in the distance calculation
- * @param scale the scaling factor to place the result in integer range
- * @return the distance, scaled by scale and truncated to an integer
- */
- int calcDistanceScaled(const std::vector &f1,
- const std::vector &f2,
- double scale);
+private:
+ Parameters m_params;
-private:
- DistanceNormalisation m_norm;
+ distance_t scaleAndTally(double);
+ template T scaleIntoRange(double);
+
+ distance_t m_max;
+ int m_overcount;
};
#endif
diff -r a68204b9a529 -r cca298ecfc72 src/FeatureConditioner.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/FeatureConditioner.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,108 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Vamp feature extraction plugin using the MATCH audio alignment
+ algorithm.
+
+ Centre for Digital Music, Queen Mary, University of London.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "FeatureConditioner.h"
+
+#include
+#include
+
+using namespace std;
+
+//#define DEBUG_FEATURE_CONDITIONER 1
+
+FeatureConditioner::FeatureConditioner(Parameters parameters) :
+ m_params(parameters),
+ m_ltAverage(0.0)
+{
+#ifdef DEBUG_FEATURE_CONDITIONER
+ cerr << "*** FeatureConditioner: norm = " << parameters.norm
+ << ", order = " << parameters.order
+ << ", silenceThreshold = " << parameters.silenceThreshold
+ << ", decay = " << parameters.decay << endl;
+#endif
+}
+
+feature_t
+FeatureConditioner::process(const feature_t &feature)
+{
+ if (m_prev.empty()) {
+ m_prev.resize(feature.size(), 0.0);
+ }
+ if (m_prev.size() != feature.size()) {
+ cerr << "ERROR: FeatureConditioner::process: feature size "
+ << feature.size() << " differs from previous feature size "
+ << m_prev.size() << endl;
+ return feature;
+ }
+
+ int size = static_cast(feature.size());
+
+ feature_t out(size, 0.0);
+
+ double totalEnergy = 0;
+
+ switch (m_params.order) {
+
+ case OutputRectifiedDerivative:
+ for (int i = 0; i < size; i++) {
+ totalEnergy += feature[i];
+ if (feature[i] > m_prev[i]) {
+ out[i] = feature[i] - m_prev[i];
+ } else {
+ out[i] = 0;
+ }
+ }
+ break;
+
+ case OutputDerivative:
+ for (int i = 0; i < size; i++) {
+ totalEnergy += feature[i];
+ out[i] = fabs(feature[i] - m_prev[i]);
+ }
+ break;
+
+ case OutputFeatures:
+ for (int i = 0; i < size; i++) {
+ totalEnergy += feature[i];
+ out[i] = feature[i];
+ }
+ break;
+ }
+
+ if (m_ltAverage == 0.0) {
+ m_ltAverage = totalEnergy;
+ } else {
+ double decay = m_params.decay;
+ m_ltAverage = m_ltAverage * decay + totalEnergy * (1.0 - decay);
+ }
+
+ if (totalEnergy <= m_params.silenceThreshold) {
+ for (int i = 0; i < size; i++) {
+ out[i] = 0;
+ }
+ } else if (m_params.norm == NormaliseToSum1) {
+ for (int i = 0; i < size; i++) {
+ out[i] = featurebin_t(out[i] / totalEnergy);
+ }
+ } else if (m_params.norm == NormaliseToLTAverage) {
+ for (int i = 0; i < size; i++) {
+ out[i] = featurebin_t(out[i] / m_ltAverage);
+ }
+ }
+
+ m_prev = feature;
+ return out;
+}
+
diff -r a68204b9a529 -r cca298ecfc72 src/FeatureConditioner.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/FeatureConditioner.h Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,112 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Vamp feature extraction plugin using the MATCH audio alignment
+ algorithm.
+
+ Centre for Digital Music, Queen Mary, University of London.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef FEATURE_CONDITIONER_H
+#define FEATURE_CONDITIONER_H
+
+#include "MatchTypes.h"
+
+/**
+ * Take a series of feature vectors and apply conditioning of some
+ * sort, such as normalisation or first-order derivative.
+ *
+ * Note that FeatureConditioner maintains internal frame-to-frame
+ * state: use one FeatureConditioner per audio source, and construct a
+ * new one for each new source.
+ */
+class FeatureConditioner
+{
+public:
+ enum Normalisation {
+
+ /** Do not normalise */
+ NoNormalisation,
+
+ /** Normalise each feature vector to have a sum of 1 */
+ NormaliseToSum1,
+
+ /** Normalise each feature vector by the long-term average of
+ * the summed energy */
+ NormaliseToLTAverage,
+ };
+
+ enum OutputOrder {
+
+ /** Output the normalised features without further processing */
+ OutputFeatures,
+
+ /** Output the half-wave rectified difference between the
+ * previous and current features instead of the straight
+ * feature values. */
+ OutputRectifiedDerivative,
+
+ /** Output the absolute difference between the previous and
+ * current features instead of the straight feature
+ * values. */
+ OutputDerivative,
+ };
+
+ struct Parameters {
+
+ Parameters() :
+ norm(NormaliseToSum1),
+ order(OutputRectifiedDerivative),
+ silenceThreshold(0.01),
+ decay(0.99)
+ {}
+
+ /** Feature normalisation. */
+ Normalisation norm;
+
+ /** Type of output to generate (plain feature, derivative etc). */
+ OutputOrder order;
+
+ /** Silence threshold. If non-zero, any feature whose total
+ * energy (simply the sum of feature values) is below that
+ * threshold will be rounded down to all zeros. Note that
+ * this refers to the energy of the pre-norm feature, not of
+ * its derivative even if that is what is being returned. */
+ double silenceThreshold;
+
+ /** Frame-to-frame decay factor in calculating long-term average */
+ double decay;
+ };
+
+ /**
+ * Construct a FeatureConditioner with the given parameters.
+ *
+ * Note that FeatureConditioner maintains internal frame-to-frame
+ * state: use one FeatureConditioner per audio source, and construct
+ * a new one for each new source.
+ */
+ FeatureConditioner(Parameters parameters);
+
+ /**
+ * Process the given feature and return the conditioned feature.
+ */
+ feature_t process(const feature_t &feature);
+
+protected:
+ Parameters m_params;
+
+ /** Long term average feature energy. */
+ double m_ltAverage;
+
+ /** The most recent feature, used for calculating the feature to
+ * feature difference. This is therefore not yet normalised. */
+ feature_t m_prev;
+};
+
+#endif
diff -r a68204b9a529 -r cca298ecfc72 src/FeatureExtractor.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/FeatureExtractor.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,263 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Vamp feature extraction plugin using the MATCH audio alignment
+ algorithm.
+
+ Centre for Digital Music, Queen Mary, University of London.
+ This file copyright 2007 Simon Dixon, Chris Cannam and QMUL.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "FeatureExtractor.h"
+
+#include
+
+#include
+#include
+#include
+
+using namespace std;
+
+//#define DEBUG_FEATURE_EXTRACTOR 1
+
+FeatureExtractor::FeatureExtractor(Parameters parameters) :
+ m_params(parameters)
+{
+ m_featureSize = getFeatureSizeFor(parameters);
+ makeFreqMap();
+
+#ifdef DEBUG_FEATURE_EXTRACTOR
+ cerr << "*** FeatureExtractor: sampleRate = " << parameters.sampleRate
+ << ", useChromaFrequencyMap = " << parameters.useChromaFrequencyMap
+ << ", fftSize = " << parameters.fftSize << endl;
+#endif
+}
+
+int
+FeatureExtractor::getFeatureSizeFor(Parameters parameters)
+{
+ if (parameters.useChromaFrequencyMap) {
+ return 13;
+ } else {
+ return 84;
+ }
+}
+
+void
+FeatureExtractor::makeFreqMap()
+{
+ m_freqMap = vector(m_params.fftSize / 2 + 1, 0);
+
+ if (m_params.useChromaFrequencyMap) {
+#ifdef DEBUG_FEATURE_EXTRACTOR
+ cerr << "makeFreqMap: calling makeChromaFrequencyMap" << endl;
+#endif
+ makeChromaFrequencyMap();
+ } else {
+#ifdef DEBUG_FEATURE_EXTRACTOR
+ cerr << "makeFreqMap: calling makeStandardFrequencyMap" << endl;
+#endif
+ makeStandardFrequencyMap();
+ }
+}
+
+void
+FeatureExtractor::makeStandardFrequencyMap()
+{
+ // Our handling of the referenceFrequency parameter depends on the
+ // frequency map in use.
+
+ // With the chroma frequency map, we use referenceFrequency to set
+ // up the chroma bin frequencies when constructing the map, and
+ // then just follow the map (without having to refer to
+ // referenceFrequency again) when we get the frequency-domain
+ // audio.
+
+ // With the standard frequency map, using referenceFrequency to
+ // set up the map doesn't work so well -- it only really affects
+ // the crossover frequency, and much of the useful information is
+ // below that frequency. What we do instead is to ignore the
+ // referenceFrequency when creating the map -- setting it up for
+ // 440Hz -- and then use it to scale the individual
+ // frequency-domain audio frames before applying the map to them.
+
+ double refFreq = 440.; // See above -- *not* the parameter!
+ double binWidth = double(m_params.sampleRate) / m_params.fftSize;
+ int crossoverBin = int(2 / (pow(2, 1/12.0) - 1));
+ int crossoverMidi = int(log(crossoverBin * binWidth / refFreq)/
+ log(2.0) * 12 + 69 + 0.5);
+
+ int i = 0;
+ while (i <= crossoverBin) {
+ double freq = i * binWidth;
+ if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
+ m_freqMap[i++] = -1;
+ } else {
+ m_freqMap[i] = i;
+ i++;
+ }
+ }
+
+ while (i <= m_params.fftSize/2) {
+ double freq = i * binWidth;
+ if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
+ m_freqMap[i++] = -1;
+ } else {
+ double midi = log(freq / refFreq) / log(2.0) * 12 + 69;
+ if (midi > 127) midi = 127;
+ int target = crossoverBin + int(midi + 0.5) - crossoverMidi;
+ if (target >= m_featureSize) target = m_featureSize - 1;
+ m_freqMap[i++] = target;
+ }
+ }
+
+#ifdef DEBUG_FEATURE_EXTRACTOR
+ cerr << "FeatureExtractor: crossover bin is " << crossoverBin << " for midi "
+ << crossoverMidi << endl;
+ cerr << "FeatureExtractor: map is:" << endl;
+ for (i = 0; i <= m_params.fftSize/2; ++i) {
+ cerr << i << ": " << m_freqMap[i] << ", ";
+ }
+ cerr << endl;
+#endif
+}
+
+void
+FeatureExtractor::makeChromaFrequencyMap()
+{
+ double refFreq = m_params.referenceFrequency;
+ double binWidth = double(m_params.sampleRate) / m_params.fftSize;
+ int crossoverBin = int(1 / (pow(2, 1/12.0) - 1));
+ int i = 0;
+ while (i <= crossoverBin) {
+ double freq = i * binWidth;
+ if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
+ m_freqMap[i++] = -1;
+ } else {
+ m_freqMap[i++] = 0;
+ }
+ }
+ while (i <= m_params.fftSize/2) {
+ double freq = i * binWidth;
+ if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
+ m_freqMap[i++] = -1;
+ } else {
+ double midi = log(freq / refFreq) / log(2.0) * 12 + 69;
+ m_freqMap[i++] = (int(midi + 0.5)) % 12 + 1;
+ }
+ }
+}
+
+feature_t
+FeatureExtractor::process(const vector &real, const vector &imag)
+{
+ vector mags(m_params.fftSize/2 + 1, 0.0);
+
+ for (int i = 0; i <= m_params.fftSize/2; i++) {
+ mags[i] = float(real[i] * real[i] + imag[i] * imag[i]);
+ }
+
+ return processMags(mags);
+}
+
+feature_t
+FeatureExtractor::process(const vector &real, const vector &imag)
+{
+ vector mags(m_params.fftSize/2 + 1, 0.0);
+
+ for (int i = 0; i <= m_params.fftSize/2; i++) {
+ mags[i] = real[i] * real[i] + imag[i] * imag[i];
+ }
+
+ return processMags(mags);
+}
+
+feature_t
+FeatureExtractor::process(const float *cframe)
+{
+ vector mags(m_params.fftSize/2 + 1, 0.0);
+
+ for (int i = 0; i <= m_params.fftSize/2; i++) {
+ mags[i] = cframe[i*2] * cframe[i*2] + cframe[i*2+1] * cframe[i*2+1];
+ }
+
+ return processMags(mags);
+}
+
+feature_t
+FeatureExtractor::processMags(const vector &mags)
+{
+ feature_t frame(m_featureSize, 0.0);
+
+ if (!m_params.useChromaFrequencyMap &&
+ (m_params.referenceFrequency != 440.)) {
+
+ // See comment in makeStandardFrequencyMap above
+ vector scaled = scaleMags(mags);
+
+ for (int i = 0; i <= m_params.fftSize/2; i++) {
+ int index = m_freqMap[i];
+ if (index >= 0) {
+ frame[index] += scaled[i];
+ }
+ }
+
+ } else {
+ for (int i = 0; i <= m_params.fftSize/2; i++) {
+ int index = m_freqMap[i];
+ if (index >= 0) {
+ frame[index] += mags[i];
+ }
+ }
+ }
+
+ return frame;
+}
+
+vector
+FeatureExtractor::scaleMags(const vector &mags)
+{
+ // Scale the pitch content in the given magnitude spectrum to
+ // accommodate a difference in tuning frequency (between the 440Hz
+ // reference and the actual tuning frequency of the input audio).
+ // We only do this when not using chroma features -- see the
+ // comment in makeStandardFrequencyMap() above.
+
+ if (m_params.useChromaFrequencyMap) return mags;
+
+ double ratio = 440.f / m_params.referenceFrequency;
+
+ int n = static_cast(mags.size());
+
+ vector scaled(n, 0.0);
+
+ for (int target = 0; target < n; ++target) {
+
+ double source = target / ratio;
+
+ int lower = int(source);
+ int higher = lower + 1;
+
+ double lowerProp = higher - source;
+ double higherProp = source - lower;
+
+ double value = 0.0;
+ if (lower >= 0 && lower < n) {
+ value += lowerProp * mags[lower];
+ }
+ if (higher >= 0 && higher < n) {
+ value += higherProp * mags[higher];
+ }
+
+ scaled[target] = float(value);
+ }
+
+ return scaled;
+}
+
diff -r a68204b9a529 -r cca298ecfc72 src/FeatureExtractor.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/FeatureExtractor.h Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,178 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Vamp feature extraction plugin using the MATCH audio alignment
+ algorithm.
+
+ Centre for Digital Music, Queen Mary, University of London.
+ This file copyright 2007 Simon Dixon, Chris Cannam and QMUL.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef FEATURE_EXTRACTOR_H
+#define FEATURE_EXTRACTOR_H
+
+#include "MatchTypes.h"
+
+/**
+ * Convert frequency-domain audio frames into features suitable for
+ * MATCH alignment calculation.
+ *
+ * The default feature is a warping of the frequency data to map FFT
+ * frequency bins into feature bins. The mapping is linear (1-1) until
+ * the resolution reaches 2 points per semitone, then logarithmic with
+ * a semitone resolution. e.g. for 44.1kHz sampling rate and fftSize
+ * of 2048 (46ms), bin spacing is 21.5Hz, which is mapped linearly for
+ * bins 0-34 (0 to 732Hz), and logarithmically for the remaining bins
+ * (midi notes 79 to 127, bins 35 to 83), where all energy above note
+ * 127 is mapped into the final bin.
+ *
+ * Alternatively a chroma mapping is also available. This produces a
+ * 13-bin feature by mapping all FFT bins into bin 0 until the
+ * resolution reaches 1 point per semitone, then mapping each
+ * subsequent bin into its corresponding semitone in the remaining 12
+ * bins (where bin 1 is C). e.g. e.g. for 44.1kHz sampling rate and
+ * fftSize of 2048 (46ms), frequencies up to 361 Hz go to bin 0,
+ * subsequent frequencies to the chroma bins.
+ */
+class FeatureExtractor
+{
+public:
+ struct Parameters {
+
+ Parameters(float rate_, int fftSize_) :
+ sampleRate(rate_),
+ useChromaFrequencyMap(false),
+ fftSize(fftSize_),
+ referenceFrequency(440.0),
+ minFrequency(100.),
+ maxFrequency(rate_/2.)
+ {}
+
+ /** Sample rate of audio */
+ float sampleRate;
+
+ /** Flag indicating whether to use a chroma frequency map (12
+ * bins) instead of the default warped spectrogram */
+ bool useChromaFrequencyMap;
+
+ /** Size of an FFT frame in samples. Note that the data passed
+ * in is already in the frequency domain, so this expresses
+ * the size of the frame that the caller will be providing. */
+ int fftSize;
+
+ /** Frequency of concert A */
+ double referenceFrequency;
+
+ /** Minimum frequency cutoff to include in feature */
+ double minFrequency;
+
+ /** Maximum frequency cutoff to include in feature */
+ double maxFrequency;
+ };
+
+ /**
+ * Construct a FeatureExtractor with the given parameters.
+ *
+ * Note that FeatureExtractor maintains internal frame-to-frame
+ * state: use one FeatureExtractor per audio source, and construct
+ * a new one for each new source.
+ */
+ FeatureExtractor(Parameters params);
+
+ /**
+ * Return the feature vector size that will be returned from process().
+ */
+ int getFeatureSize() const { return m_featureSize; }
+
+ /**
+ * Return the feature vector size that would be returned from
+ * process() with these parameters.
+ */
+ static int getFeatureSizeFor(Parameters params);
+
+ /**
+ * Process one frequency-domain audio frame (provided as real &
+ * imaginary components from the FFT output). Return a feature
+ * vector of size given by getFeatureSize(). Input vectors must
+ * have at least params.fftSize/2+1 elements each.
+ *
+ * Operates by mapping the frequency bins into a part-linear
+ * part-logarithmic array, unless useChromaFrequencyMap is true in
+ * which case they are mapped into chroma bins.
+ */
+ feature_t process(const std::vector &real,
+ const std::vector &imag);
+
+ /**
+ * Process one frequency-domain audio frame (provided as real &
+ * imaginary components from the FFT output). Return a feature
+ * vector of size given by getFeatureSize(). Input vectors must
+ * have at least params.fftSize/2+1 elements each.
+ *
+ * Operates by mapping the frequency bins into a part-linear
+ * part-logarithmic array, unless useChromaFrequencyMap is true in
+ * which case they are mapped into chroma bins.
+ */
+ feature_t process(const std::vector &real,
+ const std::vector &imag);
+
+ /**
+ * Process one frequency-domain audio frame, provided as a single
+ * array of alternating real and imaginary components. Input array
+ * must have at least 2 * (params.fftSize/2 + 1) elements.
+ *
+ * Operates by mapping the frequency bins into a part-linear
+ * part-logarithmic array, unless useChromaFrequencyMap is true in
+ * which case they are mapped into chroma bins.
+ */
+ feature_t process(const float *carray);
+
+protected:
+ /** Make either standard or chroma map, depending on m_params */
+ void makeFreqMap();
+
+ /** Creates a map of FFT frequency bins to comparison bins. Where
+ * the spacing of FFT bins is less than 0.5 semitones, the
+ * mapping is one to one. Where the spacing is greater than 0.5
+ * semitones, the FFT energy is mapped into semitone-wide
+ * bins. No scaling is performed; that is the energy is summed
+ * into the comparison bins. */
+ void makeStandardFrequencyMap();
+
+ /** Creates a map of FFT frequency bins to semitone chroma bins. */
+ void makeChromaFrequencyMap();
+
+ /** Configuration parameters */
+ Parameters m_params;
+
+ /** A mapping function for mapping FFT bins to final frequency
+ * bins. The mapping is linear (1-1) until the resolution
+ * reaches 2 points per semitone, then logarithmic with a
+ * semitone resolution. e.g. for 44.1kHz sampling rate and
+ * fftSize of 2048 (46ms), bin spacing is 21.5Hz, which is mapped
+ * linearly for bins 0-34 (0 to 732Hz), and logarithmically for
+ * the remaining bins (midi notes 79 to 127, bins 35 to 83),
+ * where all energy above note 127 is mapped into the final
+ * bin.
+ *
+ * If a bin's frequency is outside the minFrequency->maxFrequency
+ * range, it will be mapped to a target bin of -1 and should be
+ * discarded.
+ */
+ std::vector m_freqMap;
+
+ feature_t processMags(const std::vector &mags);
+ std::vector scaleMags(const std::vector &mags);
+
+ /** The size of a returned feature. */
+ int m_featureSize;
+};
+
+#endif
+
diff -r a68204b9a529 -r cca298ecfc72 src/Finder.cpp
--- a/src/Finder.cpp Fri Nov 14 10:24:13 2014 +0000
+++ b/src/Finder.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -19,267 +19,480 @@
#include "Path.h"
#include
+#include
+using namespace std;
-Finder::Finder(Matcher *p1, Matcher *p2)
+//#define DEBUG_FINDER 1
+//#define PERFORM_ERROR_CHECKS 1
+
+Finder::Finder(Matcher *pm)
{
- if (!p1->firstPM)
- std::cerr << "Warning: wrong args in Finder()" << std::endl;
- pm1 = p1;
- pm2 = p2;
- index1 = 0;
- index2 = 0;
- rowRange = new int[2];
- colRange = new int[2];
+ m_m = pm;
+ m_duration1 = -1;
+ m_duration2 = -1;
} // constructor
Finder::~Finder()
{
- delete[] rowRange;
- delete[] colRange;
+}
+
+void
+Finder::setMatcher(Matcher *pm)
+{
+ cerr << "Finder::setMatcher: finder " << this << ", matcher " << pm << endl;
+ m_m = pm;
+}
+
+void
+Finder::setDurations(int d1, int d2)
+{
+#ifdef DEBUG_FINDER
+ cerr << "*** setDurations: " << d1 << ", " << d2 << endl;
+#endif
+ m_duration1 = d1;
+ m_duration2 = d2;
}
bool
-Finder::find(int i1, int i2)
+Finder::getBestRowCost(int row, int &bestCol, normpathcost_t &min)
{
- if (i1 >= 0) {
- index1 = i1;
- index2 = i2 - pm1->first[i1];
+ if (!m_m->isRowAvailable(row)) return false;
+ pair colRange = m_m->getColRange(row);
+ if (colRange.first >= colRange.second) return false;
+ for (int index = colRange.first; index < colRange.second; index++) {
+ normpathcost_t tmp = m_m->getNormalisedPathCost(row, index);
+ if (index == colRange.first || tmp < min) {
+ min = tmp;
+ bestCol = index;
+ }
}
- return (i1 >= 0) && (i2 >= pm1->first[i1]) && (i2 < pm1->last[i1]);
-} // find()
+ return true;
+}
+
+bool
+Finder::getBestColCost(int col, int &bestRow, normpathcost_t &min)
+{
+ if (!m_m->isColAvailable(col)) return false;
+ pair rowRange = m_m->getRowRange(col);
+ if (rowRange.first >= rowRange.second) return false;
+ bestRow = rowRange.first;
+ for (int index = rowRange.first; index < rowRange.second; index++) {
+ normpathcost_t tmp = m_m->getNormalisedPathCost(index, col);
+ if (index == rowRange.first) {
+ min = tmp;
+ } else if (tmp < min) {
+ min = tmp;
+ bestRow = index;
+ }
+ }
+ return true;
+}
void
-Finder::getColRange(int row, int *range)
+Finder::getBestEdgeCost(int row, int col,
+ int &bestRow, int &bestCol,
+ normpathcost_t &min)
{
- range[0] = pm1->first[row];
- range[1] = pm1->last[row];
-} // getColRange()
-
-void
-Finder::getRowRange(int col, int *range)
-{
- range[0] = pm2->first[col];
- range[1] = pm2->last[col];
-} // getRowRange()
-
-int
-Finder::getExpandDirection(int row, int col)
-{
- return getExpandDirection(row, col, false);
-} // getExpandDirection()
-
-int
-Finder::getExpandDirection(int row, int col, bool check)
-{
- int min = getPathCost(row, col);
+ min = m_m->getNormalisedPathCost(row, col);
+
bestRow = row;
bestCol = col;
- getRowRange(col, rowRange);
- if (rowRange[1] > row+1)
- rowRange[1] = row+1; // don't cheat by looking at future :)
- for (int index = rowRange[0]; index < rowRange[1]; index++) {
- int tmp = getPathCost(index, col);
+
+ pair rowRange = m_m->getRowRange(col);
+ if (rowRange.second > row+1) {
+ rowRange.second = row+1; // don't cheat by looking at future :)
+ }
+ for (int index = rowRange.first; index < rowRange.second; index++) {
+ normpathcost_t tmp = m_m->getNormalisedPathCost(index, col);
if (tmp < min) {
min = tmp;
bestRow = index;
}
}
- getColRange(row, colRange);
- if (colRange[1] > col+1)
- colRange[1] = col+1; // don't cheat by looking at future :)
- for (int index = colRange[0]; index < colRange[1]; index++) {
- int tmp = getPathCost(row, index);
+
+ pair colRange = m_m->getColRange(row);
+ if (colRange.second > col+1) {
+ colRange.second = col+1; // don't cheat by looking at future :)
+ }
+ for (int index = colRange.first; index < colRange.second; index++) {
+ normpathcost_t tmp = m_m->getNormalisedPathCost(row, index);
if (tmp < min) {
min = tmp;
bestCol = index;
bestRow = row;
}
}
- // System.err.print(" BEST: " + bestRow + " " + bestCol + " " + check);
- // System.err.println(" " + pm1->frameCount + " " + pm2->frameCount);
- if (check) {
- // System.err.println(find(row+1, col) + " " + find(row, col+1));
- if (!find(row, col+1))
- return ADVANCE_THIS;
- if (!find(row+1, col))
- return ADVANCE_OTHER;
+}
+
+advance_t
+Finder::getExpandDirection()
+{
+ return getExpandDirection(m_m->getFrameCount() - 1,
+ m_m->getOtherFrameCount() - 1);
+}
+
+advance_t
+Finder::getExpandDirection(int row, int col)
+{
+ // To determine which direction to expand the search area in, we
+ // look at the path costs along the leading edges of the search
+ // area (the final row and column within the area). We find the
+ // lowest path cost within the final row, and the lowest within
+ // the final column, and we compare them. If the row is cheaper
+ // then we expand by adding another row next to it; if the column
+ // is cheaper then we expand by adding another column next to
+ // it. (The overall lowest path cost across the row and column
+ // represents the best alignment we have within the entire search
+ // area given the data available and the assumption that the piece
+ // is not ending yet.)
+
+ int bestRow = row;
+ int bestCol = col;
+ normpathcost_t bestCost = -1;
+
+// cerr << "Finder " << this << "::getExpandDirection: ";
+
+ getBestEdgeCost(row, col, bestRow, bestCol, bestCost);
+
+// cerr << "at [" << row << "," << col << "] (cost " << m_m->getPathCost(row, col) << ") blocksize = " << m_m->getBlockSize() << " best is [" << bestRow << "," << bestCol << "] (cost " << bestCost << ")" << endl;
+
+ if (bestRow == row) {
+ if (bestCol == col) {
+ return AdvanceBoth;
+ } else {
+ return AdvanceThis;
+ }
+ } else if (bestCol == col) {
+ return AdvanceOther;
+ } else {
+ return AdvanceNone;
}
- return ((bestRow==row)? ADVANCE_THIS: 0) |
- ((bestCol==col)? ADVANCE_OTHER: 0);
-
-} // getExpandDirection()
-
-unsigned char
-Finder::getDistance(int row, int col)
-{
- if (find(row, col)) {
- return pm1->distance[row][col - pm1->first[row]];
- }
- std::cerr << "getDistance(" << row << "," << col << "): out of bounds" << std::endl;
- throw "getDistance index out of bounds";
-} // getDistance()/2
-
-void
-Finder::setDistance(int row, int col, unsigned char b)
-{
- if (find(row, col)) {
- pm1->distance[row][col - pm1->first[row]] = b;
- return;
- }
- std::cerr << "setDistance(" << row << "," << col << "," << b << "): out of bounds" << std::endl;
- throw "setDistance index out of bounds";
-} // setDistance()
-
-int
-Finder::getPathCost(int row, int col)
-{
- if (find(row, col)) // "1" avoids div by 0 below
- return pm1->bestPathCost[row][col - pm1->first[row]]*100/ (1+row+col);
- std::cerr << "getPathCost(" << row << "," << col << "): out of bounds" << std::endl;
- throw "getPathCost index out of bounds";
-} // getPathCost()
-
-int
-Finder::getRawPathCost(int row, int col)
-{
- if (find(row, col))
- return pm1->bestPathCost[row][col - pm1->first[row]];
- std::cerr << "getRawPathCost(" << row << "," << col << "): out of bounds" << std::endl;
- throw "getRawPathCost index out of bounds";
-} // getRawPathCost()
-
-void
-Finder::setPathCost(int row, int col, int i)
-{
- if (find(row, col)) {
- pm1->bestPathCost[row][col - pm1->first[row]] = i;
- return;
- }
- std::cerr << "setPathCost(" << row << "," << col << "," << i << "): out of bounds" << std::endl;
- throw "setPathCost index out of bounds";
-} // setPathCost()
-
-unsigned char
-Finder::getDistance()
-{
- return pm1->distance[index1][index2];
-} // getDistance()/0
-
-void
-Finder::setDistance(int b)
-{
- pm1->distance[index1][index2] = (unsigned char)b;
-} // setDistance()
-
-int
-Finder::getPathCost()
-{
- return pm1->bestPathCost[index1][index2];
-} // getPathCost()
-
-void
-Finder::setPathCost(int i)
-{
- pm1->bestPathCost[index1][index2] = i;
-} // setPathCost()
+}
void
Finder::recalculatePathCostMatrix(int r1, int c1, int r2, int c2)
{
- if (!find(r1,c1)) {
- std::cerr << "recalculatePathCostMatrix(" << r1 << "," << c1 << "): out of bounds" << std::endl;
- throw "recalculatePathCostMatrix index out of bounds";
+ int prevRowStart = 0, prevRowStop = 0;
+
+ for (int r = r1; r <= r2; r++) {
+
+ pair colRange = m_m->getColRange(r);
+
+ int rowStart = max(c1, colRange.first);
+ int rowStop = min(c2 + 1, colRange.second);
+
+ for (int c = rowStart; c < rowStop; c++) {
+
+ advance_t dir = AdvanceNone;
+ pathcost_t straightIncrement = m_m->getDistance(r, c);
+ pathcost_t diagIncrement = pathcost_t(straightIncrement *
+ m_m->getDiagonalWeight());
+
+ if (r > r1) { // not first row
+ pathcost_t min = -1;
+ if ((c > prevRowStart) && (c <= prevRowStop)) {
+ // diagonal from (r-1,c-1)
+ min = m_m->getPathCost(r-1, c-1) + diagIncrement;
+ dir = AdvanceBoth;
+ }
+ if ((c >= prevRowStart) && (c < prevRowStop)) {
+ // vertical from (r-1,c)
+ pathcost_t cost = m_m->getPathCost(r-1, c) + straightIncrement;
+ if ((min < 0) || (cost < min)) {
+ min = cost;
+ dir = AdvanceThis;
+ }
+ }
+ if (c > rowStart) {
+ // horizontal from (r,c-1)
+ pathcost_t cost = m_m->getPathCost(r, c-1) + straightIncrement;
+ if ((min < 0) || (cost < min)) {
+ min = cost;
+ dir = AdvanceOther;
+ }
+ }
+
+ m_m->setPathCost(r, c, dir, min);
+
+ } else if (c > rowStart) { // first row
+ // horizontal from (r,c-1)
+ m_m->setPathCost(r, c, AdvanceOther,
+ m_m->getPathCost(r, c-1) + straightIncrement);
+ }
+ }
+
+ prevRowStart = rowStart;
+ prevRowStop = rowStop;
}
- int thisRowStart, c;
+}
+
+#ifdef PERFORM_ERROR_CHECKS
+Finder::ErrorPosition
+Finder::checkPathCostMatrix()
+{
+ ErrorPosition err;
+
+ int r1 = 0;
+ int c1 = 0;
+ int r2 = m_m->getFrameCount() - 1;
+ int c2 = m_m->getOtherFrameCount() - 1;
+
+ if (r2 < r1 || c2 < c1) {
+ return err;
+ }
+
int prevRowStart = 0, prevRowStop = 0;
+
for (int r = r1; r <= r2; r++) {
- thisRowStart = pm1->first[r];
- if (thisRowStart < c1)
- thisRowStart = c1;
- for (c = thisRowStart; c <= c2; c++) {
- if (find(r,c)) {
- int i2 = index2;
- int newCost = pm1->distance[r][i2];
- int dir = 0;
- if (r > r1) { // not first row
- int min = -1;
- if ((c > prevRowStart) && (c <= prevRowStop)) {
- // diagonal from (r-1,c-1)
- min = pm1->bestPathCost[r-1][c-pm1->first[r-1]-1] +
- newCost * 2;
- dir = ADVANCE_BOTH;
+
+ pair colRange = m_m->getColRange(r);
+
+ int rowStart = max(c1, colRange.first);
+ int rowStop = min(c2 + 1, colRange.second);
+
+ for (int c = rowStart; c < rowStop; c++) {
+
+ advance_t dir = AdvanceNone;
+ pathcost_t updateTo = InvalidPathCost;
+ distance_t distance = m_m->getDistance(r, c);
+ pathcost_t straightIncrement = distance;
+ pathcost_t diagIncrement = pathcost_t(distance * m_m->getDiagonalWeight());
+ err.distance = distance;
+
+ if (r > r1) { // not first row
+ pathcost_t min = -1;
+ if ((c > prevRowStart) && (c <= prevRowStop)) {
+ // diagonal from (r-1,c-1)
+ min = m_m->getPathCost(r-1, c-1) + diagIncrement;
+ err.prevCost = m_m->getPathCost(r-1, c-1);
+ dir = AdvanceBoth;
+ }
+ if ((c >= prevRowStart) && (c < prevRowStop)) {
+ // vertical from (r-1,c)
+ pathcost_t cost = m_m->getPathCost(r-1, c) + straightIncrement;
+ if ((min < 0) || (cost < min)) {
+ min = cost;
+ err.prevCost = m_m->getPathCost(r-1, c);
+ dir = AdvanceThis;
}
- if ((c >= prevRowStart) && (c < prevRowStop)) {
- // vertical from (r-1,c)
- int cost = pm1->bestPathCost[r-1][c-pm1->first[r-1]] +
- newCost;
- if ((min == -1) || (cost < min)) {
- min = cost;
- dir = ADVANCE_THIS;
- }
+ }
+ if (c > rowStart) {
+ // horizontal from (r,c-1)
+ pathcost_t cost = m_m->getPathCost(r, c-1) + straightIncrement;
+ if ((min < 0) || (cost < min)) {
+ min = cost;
+ err.prevCost = m_m->getPathCost(r, c-1);
+ dir = AdvanceOther;
}
- if (c > thisRowStart) {
- // horizontal from (r,c-1)
- int cost =pm1->bestPathCost[r][i2-1]+newCost;
- if ((min == -1) || (cost < min)) {
- min = cost;
- dir = ADVANCE_OTHER;
- }
- }
- pm1->bestPathCost[r][i2] = min;
- } else if (c > thisRowStart) { // first row
+ }
+
+ updateTo = min;
+
+ } else { // first row
+
+ if (c > rowStart) {
// horizontal from (r,c-1)
- pm1->bestPathCost[r][i2] = pm1->bestPathCost[r][i2-1] +
- newCost;
- dir = ADVANCE_OTHER;
+ updateTo = m_m->getPathCost(r, c-1) + straightIncrement;
+ err.prevCost = m_m->getPathCost(r, c-1);
+ dir = AdvanceOther;
}
- if ((r != r1) || (c != c1)) {
- pm1->distance[r][i2] = (unsigned char)
- ((pm1->distance[r][i2] & MASK) | dir);
+ }
+
+ if (dir != AdvanceNone) {
+ if (m_m->getAdvance(r, c) != dir) {
+ err.type = ErrorPosition::WrongAdvance;
+ err.r = r;
+ err.c = c;
+ err.costWas = m_m->getPathCost(r, c);
+ err.costShouldBe = updateTo;
+ err.advanceWas = m_m->getAdvance(r, c);
+ err.advanceShouldBe = dir;
+ return err;
}
- } else
- break; // end of row
+ if (m_m->getPathCost(r, c) != updateTo) {
+ err.type = ErrorPosition::WrongCost;
+ err.r = r;
+ err.c = c;
+ err.costWas = m_m->getPathCost(r, c);
+ err.costShouldBe = updateTo;
+ err.advanceWas = m_m->getAdvance(r, c);
+ err.advanceShouldBe = dir;
+ return err;
+ }
+ } else {
+ // AdvanceNone should occur only at r = r1, c = c1
+ if (r != r1 || c != c1) {
+ err.type = ErrorPosition::NoAdvance;
+ err.r = r;
+ err.c = c;
+ err.costWas = m_m->getPathCost(r, c);
+ err.costShouldBe = updateTo;
+ err.advanceWas = m_m->getAdvance(r, c);
+ err.advanceShouldBe = dir;
+ return err;
+ }
+ }
}
- prevRowStart = thisRowStart;
- prevRowStop = c;
+
+ prevRowStart = rowStart;
+ prevRowStop = rowStop;
}
-} // recalculatePathCostMatrix()
+
+ return err;
+}
+
+void
+Finder::checkAndReport()
+{
+ cerr << "Finder: Checking path-cost matrix..." << endl;
+ ErrorPosition err = checkPathCostMatrix();
+ if (err.type == ErrorPosition::NoError) {
+ cerr << "No errors found" << endl;
+ } else {
+ cerr << "\nWARNING: Checking path-cost matrix returned mismatch:" << endl;
+ cerr << "Type: " << err.type << ": ";
+ switch (err.type) {
+ case ErrorPosition::NoError: break;
+ case ErrorPosition::WrongCost: cerr << "WrongCost"; break;
+ case ErrorPosition::WrongAdvance: cerr << "WrongAdvance"; break;
+ case ErrorPosition::NoAdvance: cerr << "NoAdvance"; break;
+ }
+ cerr << endl;
+ cerr << "At row " << err.r << ", column " << err.c
+ << "\nShould be advancing "
+ << Matcher::advanceToString(err.advanceShouldBe)
+ << ", advance in matrix is "
+ << Matcher::advanceToString(err.advanceWas)
+ << "\nPrev cost " << err.prevCost
+ << " plus distance " << distance_print_t(err.distance)
+ << " [perhaps diagonalised] gives "
+ << err.costShouldBe << ", matrix contains " << err.costWas
+ << endl;
+ cerr << "Note: diagonal weight = " << m_m->getDiagonalWeight() << endl;
+ cerr << endl;
+
+ int w(4);
+ int ww(15);
+
+ cerr << "Distance matrix leading up to this point:" << endl;
+ cerr << setprecision(12) << setw(w) << "";
+ for (int i = -4; i <= 0; ++i) {
+ cerr << setw(ww) << i;
+ }
+ cerr << endl;
+ for (int j = -4; j <= 0; ++j) {
+ cerr << setw(w) << j;
+ for (int i = -4; i <= 0; ++i) {
+ cerr << setw(ww)
+ << distance_print_t(m_m->getDistance(err.r + j, err.c + i));
+ }
+ cerr << endl;
+ }
+ cerr << endl;
+
+ cerr << "Cost matrix leading up to this point:" << endl;
+ cerr << setw(w) << "";
+ for (int i = -4; i <= 0; ++i) {
+ cerr << setw(ww) << i;
+ }
+ cerr << endl;
+ for (int j = -4; j <= 0; ++j) {
+ cerr << setw(w) << j;
+ for (int i = -4; i <= 0; ++i) {
+ cerr << setw(ww) << m_m->getPathCost(err.r + j, err.c + i);
+ }
+ cerr << endl;
+ }
+ cerr << endl;
+ }
+}
+#endif
+
+pathcost_t
+Finder::getOverallCost()
+{
+ int ex = m_m->getOtherFrameCount() - 1;
+ int ey = m_m->getFrameCount() - 1;
+
+ if (ex < 0 || ey < 0) {
+ return 0;
+ }
+
+ return m_m->getPathCost(ey, ex);
+}
int
Finder::retrievePath(bool smooth, vector &pathx, vector &pathy)
{
- int x = pm2->getFrameCount() - 1;
- int y = pm1->getFrameCount() - 1;
+ pathx.clear();
+ pathy.clear();
+
+#ifdef PERFORM_ERROR_CHECKS
+ checkAndReport();
+#endif
+
+ int ex = m_m->getOtherFrameCount() - 1;
+ int ey = m_m->getFrameCount() - 1;
+
+ if (ex < 0 || ey < 0) {
+ return 0;
+ }
+
+ int x = ex;
+ int y = ey;
+
+#ifdef DEBUG_FINDER
+ cerr << "*** retrievePath: smooth = " << smooth << endl;
+ cerr << "*** retrievePath: before: x = " << x << ", y = " << y << endl;
+#endif
+
+ if (m_duration2 > 0 && m_duration2 < m_m->getOtherFrameCount()) {
+ x = m_duration2 - 1;
+ }
+ if (m_duration1 > 0 && m_duration1 < m_m->getFrameCount()) {
+ y = m_duration1 - 1;
+ }
+
+ if (!m_m->isAvailable(y, x)) {
+ // Path did not pass through the expected end point --
+ // probably means the pieces are substantially different in
+ // the later bits. Reset the expected end point to the end of
+ // both files including any trailing silence.
+ cerr << "NOTE: Path did not pass through expected end point, inputs are probably significantly different" << endl;
+ x = ex;
+ y = ey;
+ }
recalculatePathCostMatrix(0, 0, y, x);
- pathx.clear();
- pathy.clear();
-
- while (find(y, x) && ((x > 0) || (y > 0))) {
+#ifdef DEBUG_FINDER
+ cerr << "*** retrievePath: start: x = " << x << ", y = " << y << endl;
+#endif
+
+ while (m_m->isAvailable(y, x) && (x > 0 || y > 0)) {
// cerr << "x = " << x << ", y = " << y;
pathx.push_back(x);
pathy.push_back(y);
- switch (getDistance() & ADVANCE_BOTH) {
- case ADVANCE_THIS:
-// cerr << ", going down (dist = " << (int)getDistance() << ")" << endl;
+ switch (m_m->getAdvance(y, x)) {
+ case AdvanceThis:
+// cerr << ", going down (dist = " << getDistance() << ")" << endl;
y--;
break;
- case ADVANCE_OTHER:
-// cerr << ", going left (dist = " << (int)getDistance() << ")" << endl;
+ case AdvanceOther:
+// cerr << ", going left (dist = " << getDistance() << ")" << endl;
x--;
break;
- case ADVANCE_BOTH:
-// cerr << ", going diag (dist = " << (int)getDistance() << ")" << endl;
+ case AdvanceBoth:
+// cerr << ", going diag (dist = " << getDistance() << ")" << endl;
x--;
y--;
break;
- default: // this would indicate a bug, but we wouldn't want to hang
-// cerr << "WARNING: Neither matcher advanced in path backtrack at (" << x << "," << y << ")" << endl;
+ case AdvanceNone: // this would indicate a bug, but we wouldn't want to hang
+ cerr << "WARNING: Neither matcher advanced in path backtrack at (" << x << "," << y << ")" << endl;
if (x > y) {
x--;
} else {
@@ -289,14 +502,20 @@
}
}
- std::reverse(pathx.begin(), pathx.end());
- std::reverse(pathy.begin(), pathy.end());
+ if (x > 0 || y > 0) {
+ cerr << "WARNING: Ran out of available path at (" << y << "," << x
+ << ")!" << endl;
+ }
+
+ reverse(pathx.begin(), pathx.end());
+ reverse(pathy.begin(), pathy.end());
if (smooth) {
- int smoothedLen = Path().smooth(pathx, pathy, pathx.size());
+ int smoothedLen = Path().smooth
+ (pathx, pathy, static_cast(pathx.size()));
return smoothedLen;
} else {
- return pathx.size();
+ return static_cast(pathx.size());
}
}
diff -r a68204b9a529 -r cca298ecfc72 src/Finder.h
--- a/src/Finder.h Fri Nov 14 10:24:13 2014 +0000
+++ b/src/Finder.h Fri Feb 27 09:29:37 2015 +0000
@@ -22,57 +22,66 @@
#include "Matcher.h"
-/** Maps cost matrix coordinates into an efficient
- * (linear instead of quadratic space) representation.
- * Stores result of most recent mapping for fast
- * sequential access.
- */
-class Finder {
+class Finder
+{
+public:
+ Finder(Matcher *pm);
-protected:
- Matcher *pm1, *pm2;
- int index1, index2, bestRow, bestCol;
- int *rowRange;
- int *colRange;
-
-public:
- Finder(Matcher *p1, Matcher *p2);
+ // default copy ctor and operator= are fine
~Finder();
- /** Sets up the instance variables to point to the given
- * coordinate in the distance matrix.
- *
- * @param i1 frameNumber in the first Matcher
- * @param i2 frameNumber in the second Matcher
- * @return true iff the point (i2,i1) is represented in the distance matrix
+ void setMatcher(Matcher *pm);
+
+ /**
+ * Tell the finder that one or both files ends sooner than it
+ * thought, i.e. that some of the trailing features are silence or
+ * otherwise to be ignored. d1 and d2 are feature frame counts for
+ * matchers 1 and 2 respectively. If this is not called, the full
+ * duration of each input will be considered.
*/
- bool find(int i1, int i2);
+ void setDurations(int d1, int d2);
- /** Returns the range [lo,hi) of legal column indices for the
- * given row. */
- void getColRange(int row, int *range);
+ /**
+ * Find the location and normalised path cost of the column with
+ * the cheapest path cost within the given row. If the row is out
+ * of range, return false and leave the bestCol and bestCost
+ * variables unchanged.
+ */
+ bool getBestRowCost(int row, int &bestCol, normpathcost_t &bestCost);
- /** Returns the range [lo,hi) of legal row indices for the given
- * column. */
- void getRowRange(int col, int *range);
+ /**
+ * Find the location and normalised path cost of the row with the
+ * cheapest path cost within the given column. If the column is
+ * out of range, return false and leave the bestRow and bestCost
+ * variables unchanged.
+ */
+ bool getBestColCost(int col, int &bestRow, normpathcost_t &bestCost);
+
+ /**
+ * Find the location and normalised path cost of the cheapest path
+ * cost within the final row and column of the search area, given
+ * that the area extends as far as the point at (row, col). This
+ * is used by getExpandDirection and can also be used, for
+ * example, to determine the current best estimate alignment for a
+ * frame we have just reached.
+ */
+ void getBestEdgeCost(int row, int col,
+ int &bestRow, int &bestCol,
+ normpathcost_t &bestCost);
- int getExpandDirection(int row, int col);
- int getExpandDirection(int row, int col, bool check);
-
- unsigned char getDistance(int row, int col);
- void setDistance(int row, int col, unsigned char b);
-
- int getPathCost(int row, int col);
- int getRawPathCost(int row, int col);
- void setPathCost(int row, int col, int i);
-
- unsigned char getDistance();
- void setDistance(int b);
-
- int getPathCost();
- void setPathCost(int i);
-
+ /**
+ * Calculate which direction to expand the search area in, given
+ * its current extents.
+ */
+ advance_t getExpandDirection();
+
+ /**
+ * Calculate which direction to expand the search area in, given
+ * that so far it extends as far as the point at (row, col).
+ */
+ advance_t getExpandDirection(int row, int col);
+
/** Calculates a rectangle of the path cost matrix so that the
* minimum cost path between the bottom left and top right
* corners can be computed. Caches previous values to avoid
@@ -97,7 +106,36 @@
* @param smooth whether to smooth the path before returning it
*/
int retrievePath(bool smooth, std::vector &pathx, std::vector &pathy);
+
+ /**
+ * Get the path cost for the overall path to the end of both
+ * sources.
+ */
+ pathcost_t getOverallCost();
-}; // class Finder
+protected:
+#ifdef PERFORM_ERROR_CHECKS
+ struct ErrorPosition {
+ enum Type { NoError = 0, WrongCost, WrongAdvance, NoAdvance };
+ ErrorPosition() : type(NoError) { }
+ Type type;
+ int r;
+ int c;
+ pathcost_t prevCost;
+ distance_t distance;
+ pathcost_t costWas;
+ pathcost_t costShouldBe;
+ advance_t advanceWas;
+ advance_t advanceShouldBe;
+ };
+ ErrorPosition checkPathCostMatrix();
+ void checkAndReport();
+#endif
+
+ Matcher *m_m; // I do not own this
+
+ int m_duration1;
+ int m_duration2;
+};
#endif
diff -r a68204b9a529 -r cca298ecfc72 src/MatchFeatureFeeder.cpp
--- a/src/MatchFeatureFeeder.cpp Fri Nov 14 10:24:13 2014 +0000
+++ b/src/MatchFeatureFeeder.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -19,23 +19,57 @@
using std::vector;
MatchFeatureFeeder::MatchFeatureFeeder(Matcher *m1, Matcher *m2) :
- pm1(m1), pm2(m2)
+ m_pm1(m1),
+ m_pm2(m2),
+ m_finder(m_pm1)
{
- finder = new Finder(m1, m2);
}
MatchFeatureFeeder::~MatchFeatureFeeder()
{
- delete finder;
}
void
-MatchFeatureFeeder::feed(vector f1, vector f2)
+MatchFeatureFeeder::feed(feature_t f1, feature_t f2)
{
- q1.push(f1);
- q2.push(f2);
+ // We maintain two FIFO queues of feature vectors, one per input
+ // stream. When the match-feeder function is entered, it knows
+ // that it has at least one feature in each queue. It loops,
+ // processing up to one feature per matcher, until a queue is
+ // empty. Then it returns, to be called again with more data.
- while (!q1.empty() && !q2.empty()) {
+ if (!f1.empty()) {
+ m_q1.push(f1);
+ }
+
+ if (!f2.empty()) {
+ m_q2.push(f2);
+ }
+
+ while (!m_q1.empty() && !m_q2.empty()) {
+ feedBlock();
+ }
+}
+
+int
+MatchFeatureFeeder::getEstimatedReferenceFrame()
+{
+ if (m_pm1->getFrameCount() == 0 || m_pm2->getFrameCount() == 0) {
+ return 0;
+ }
+ int bestRow = 0;
+ normpathcost_t bestCost = 0;
+ if (!m_finder.getBestColCost(m_pm2->getFrameCount()-1, bestRow, bestCost)) {
+ return -1;
+ } else {
+ return bestRow;
+ }
+}
+
+void
+MatchFeatureFeeder::finish()
+{
+ while (!m_q1.empty() || !m_q2.empty()) {
feedBlock();
}
}
@@ -43,42 +77,50 @@
void
MatchFeatureFeeder::feedBlock()
{
- if (pm1->frameCount < pm1->blockSize) { // fill initial block
+ if (m_q1.empty()) { // ended
+ feed2();
+ } else if (m_q2.empty()) { // ended
+ feed1();
+ } else if (m_pm1->isFillingInitialBlock()) {
feed1();
feed2();
- }
- else if (pm1->runCount >= pm1->params.maxRunCount) { // slope constraints
+ } else if (m_pm1->isOverrunning()) { // slope constraints
feed2();
- } else if (pm2->runCount >= pm2->params.maxRunCount) {
+ } else if (m_pm2->isOverrunning()) {
feed1();
} else {
- switch (finder->getExpandDirection
- (pm1->frameCount-1, pm2->frameCount-1)) {
- case ADVANCE_THIS:
+ switch (m_finder.getExpandDirection()) {
+ case AdvanceThis:
feed1();
break;
- case ADVANCE_OTHER:
+ case AdvanceOther:
feed2();
break;
- case ADVANCE_BOTH:
+ case AdvanceBoth:
feed1();
feed2();
break;
+ case AdvanceNone:
+ cerr << "m_finder says AdvanceNone!" << endl;
+ break;
}
}
+
+ m_fpx.push_back(m_pm2->getFrameCount());
+ m_fpy.push_back(m_pm1->getFrameCount());
}
void
MatchFeatureFeeder::feed1()
{
- pm1->consumeFeatureVector(q1.front());
- q1.pop();
+ m_pm1->consumeFeatureVector(m_q1.front());
+ m_q1.pop();
}
void
MatchFeatureFeeder::feed2()
{
- pm2->consumeFeatureVector(q2.front());
- q2.pop();
+ m_pm2->consumeFeatureVector(m_q2.front());
+ m_q2.pop();
}
diff -r a68204b9a529 -r cca298ecfc72 src/MatchFeatureFeeder.h
--- a/src/MatchFeatureFeeder.h Fri Nov 14 10:24:13 2014 +0000
+++ b/src/MatchFeatureFeeder.h Fri Feb 27 09:29:37 2015 +0000
@@ -33,22 +33,60 @@
* respectively (depending on their advance status). Matchers must
* have been constructed using the external featureSize
* constructor.
+ *
+ * f1 and f2 are normally expected to have the same number of
+ * values, and that number should be the featureSize passed to the
+ * constructors for both Matchers. The exception is when one input
+ * ends before the other one: subsequent calls should pass a
+ * feature vector as normal for the input that is still going on,
+ * and an empty vector for the one that has ended.
*/
- void feed(std::vector f1, std::vector f2);
+ void feed(feature_t f1, feature_t f2);
- Finder *getFinder() { return finder; }
+ /**
+ * Get the best estimate for the frame in the reference (f1)
+ * corresponding to the latest frame in the other input (f2).
+ */
+ int getEstimatedReferenceFrame();
+
+ /**
+ * Indicate that both inputs have come to an end.
+ */
+ void finish();
+
+ /**
+ * Return the forward path, that is, the estimate of the
+ * lowest-cost path that was generated (possibly in real-time)
+ * while initially tracking the inputs. This is the path that is
+ * used to determine the shape of the search zone within which the
+ * eventual reverse path will be sought by the Finder.
+ */
+ void retrieveForwardPath(std::vector &pathx, std::vector &pathy) {
+ pathx = m_fpx;
+ pathy = m_fpy;
+ }
+
+ Finder *getFinder() { return &m_finder; }
protected:
void feedBlock();
void feed1();
void feed2();
- Finder *finder;
- Matcher *pm1;
- Matcher *pm2;
+ Matcher *m_pm1; // I do not own this
+ Matcher *m_pm2; // I do not own this
- std::queue > q1;
- std::queue > q2;
+ Finder m_finder; // I own this, and it refers to m_pm1
+
+ std::queue m_q1;
+ std::queue m_q2;
+
+ vector m_fpx;
+ vector m_fpy;
+
+ // not provided:
+ MatchFeatureFeeder(const MatchFeatureFeeder &other);
+ MatchFeatureFeeder &operator=(const MatchFeatureFeeder &other);
};
#endif
diff -r a68204b9a529 -r cca298ecfc72 src/MatchFeeder.cpp
--- a/src/MatchFeeder.cpp Fri Nov 14 10:24:13 2014 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,170 +0,0 @@
-/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
-
-/*
- Vamp feature extraction plugin using the MATCH audio alignment
- algorithm.
-
- Centre for Digital Music, Queen Mary, University of London.
- This file copyright 2007 Simon Dixon, Chris Cannam and QMUL.
-
- 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. See the file
- COPYING included with this distribution for more information.
-*/
-
-#include "MatchFeeder.h"
-
-using std::vector;
-
-MatchFeeder::MatchFeeder(Matcher *m1, Matcher *m2) :
- pm1(m1), pm2(m2)
-{
- fftSize = m1->params.fftSize;
- finder = new Finder(m1, m2);
- reBuffer = new double[fftSize/2+1];
- imBuffer = new double[fftSize/2+1];
-}
-
-MatchFeeder::~MatchFeeder()
-{
- delete[] imBuffer;
- delete[] reBuffer;
- while (!q1.empty()) {
- delete[] q1.front();
- q1.pop();
- }
- while (!q2.empty()) {
- delete[] q2.front();
- q2.pop();
- }
- delete finder;
-}
-
-void
-MatchFeeder::feed(const float *const *input)
-{
- // We maintain two FIFO queues of audio data frame block pointers,
- // one per input stream. When the match-feeder function is
- // entered, it knows that it has at least one block in each queue.
- // It loops, processing up to one block per matcher, until a queue
- // is empty. Then it returns, to be called again with more data.
-
- prepare(input);
-
- while (!q1.empty() && !q2.empty()) {
-// std::cerr << "MatchFeeder::feed: q1 " << q1.size() << " q2 " << q2.size() << std::endl;
- (void)feedBlock();
- }
-}
-
-MatchFeeder::Features
-MatchFeeder::feedAndGetFeatures(const float *const *input)
-{
- prepare(input);
-
- Features all;
-
- while (!q1.empty() && !q2.empty()) {
- Features ff = feedBlock();
- all.f1.insert(all.f1.end(), ff.f1.begin(), ff.f1.end());
- all.f2.insert(all.f2.end(), ff.f2.begin(), ff.f2.end());
- }
-
- return all;
-}
-
-void
-MatchFeeder::prepare(const float *const *input)
-{
- float *block = new float[fftSize+2];
- for (size_t i = 0; i < fftSize+2; ++i) {
- block[i] = input[0][i];
- }
- q1.push(block);
-
- block = new float[fftSize+2];
- for (size_t i = 0; i < fftSize+2; ++i) {
- block[i] = input[1][i];
- }
- q2.push(block);
-}
-
-MatchFeeder::Features
-MatchFeeder::feedBlock()
-{
- Features ff;
- vector f1, f2;
-
- if (pm1->frameCount < pm1->blockSize) { // fill initial block
-// std::cerr << "feeding initial block" << std::endl;
- f1 = feed1();
- f2 = feed2();
- }
-//!!! } else if (pm1->atEnd) {
-// feed2();
-//!!! } else if (pm2->atEnd)
-// feed1();
- else if (pm1->runCount >= pm1->params.maxRunCount) { // slope constraints
-// std::cerr << "pm1 too slopey" << std::endl;
- f2 = feed2();
- } else if (pm2->runCount >= pm2->params.maxRunCount) {
-// std::cerr << "pm2 too slopey" << std::endl;
- f1 = feed1();
- } else {
- switch (finder->getExpandDirection
- (pm1->frameCount-1, pm2->frameCount-1)) {
- case ADVANCE_THIS:
-// std::cerr << "finder says ADVANCE_THIS" << std::endl;
- f1 = feed1();
- break;
- case ADVANCE_OTHER:
-// std::cerr << "finder says ADVANCE_OTHER" << std::endl;
- f2 = feed2();
- break;
- case ADVANCE_BOTH:
-// std::cerr << "finder says ADVANCE_BOTH" << std::endl;
- f1 = feed1();
- f2 = feed2();
- break;
- }
- }
-
- if (!f1.empty()) ff.f1.push_back(f1);
- if (!f2.empty()) ff.f2.push_back(f2);
- return ff;
-}
-
-vector
-MatchFeeder::feed1()
-{
-// std::cerr << "feed1" << std::endl;
- float *block = q1.front();
- q1.pop();
- for (size_t i = 0; i <= fftSize/2; ++i) {
- reBuffer[i] = block[i*2];
- }
- for (size_t i = 0; i <= fftSize/2; ++i) {
- imBuffer[i] = block[i*2+1];
- }
- delete[] block;
- return pm1->consumeFrame(reBuffer, imBuffer);
-}
-
-vector
-MatchFeeder::feed2()
-{
-// std::cerr << "feed2" << std::endl;
- float *block = q2.front();
- q2.pop();
- for (size_t i = 0; i <= fftSize/2; ++i) {
- reBuffer[i] = block[i*2];
- }
- for (size_t i = 0; i <= fftSize/2; ++i) {
- imBuffer[i] = block[i*2+1];
- }
- delete[] block;
- return pm2->consumeFrame(reBuffer, imBuffer);
-}
-
diff -r a68204b9a529 -r cca298ecfc72 src/MatchFeeder.h
--- a/src/MatchFeeder.h Fri Nov 14 10:24:13 2014 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
-/*
- Vamp feature extraction plugin using the MATCH audio alignment
- algorithm.
-
- Centre for Digital Music, Queen Mary, University of London.
- This file copyright 2007 Simon Dixon, Chris Cannam and QMUL.
-
- 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. See the file
- COPYING included with this distribution for more information.
-*/
-
-#ifndef _MATCH_FEEDER_H_
-#define _MATCH_FEEDER_H_
-
-#include "Matcher.h"
-#include "Finder.h"
-
-#include
-#include
-
-class MatchFeeder
-{
-public:
- MatchFeeder(Matcher *m1, Matcher *m2);
- ~MatchFeeder();
-
- /**
- * Feed the two supplied channels of frequency-domain input data
- * to feeders 1 and 2 respectively, as appropriate (depending on
- * their advance status).
- */
- void feed(const float *const *input);
-
- struct Features {
- std::vector > f1;
- std::vector > f2;
- };
-
- /**
- * Feed the two supplied channels of frequency-domain input data
- * to matchers 1 and 2 respectively, as appropriate (depending on
- * their advance status) and return any new feature vectors
- * calculated by the two feeders.
- */
- Features feedAndGetFeatures(const float *const *input);
-
- Finder *getFinder() { return finder; }
-
-protected:
- void prepare(const float *const *input);
- Features feedBlock();
- std::vector feed1();
- std::vector feed2();
-
- Finder *finder;
- Matcher *pm1;
- Matcher *pm2;
-
- size_t fftSize;
- double *reBuffer;
- double *imBuffer;
-
- std::queue q1;
- std::queue q2;
-};
-
-#endif
diff -r a68204b9a529 -r cca298ecfc72 src/MatchPipeline.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/MatchPipeline.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,162 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+/*
+ Vamp feature extraction plugin using the MATCH audio alignment
+ algorithm.
+
+ Centre for Digital Music, Queen Mary, University of London.
+ This file copyright 2007 Simon Dixon, Chris Cannam and QMUL.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "MatchPipeline.h"
+
+//#define DEBUG_MATCH_PIPELINE 1
+
+MatchPipeline::MatchPipeline(FeatureExtractor::Parameters feParams,
+ FeatureConditioner::Parameters fcParams,
+ DistanceMetric::Parameters dParams,
+ Matcher::Parameters matchParams,
+ double secondReferenceFrequency) :
+ m_fe1(feParams),
+ m_fe2(paramsWithFreq(feParams, secondReferenceFrequency)),
+ m_fc1(fcParams),
+ m_fc2(fcParams),
+ m_pm1(matchParams, dParams, 0),
+ m_pm2(matchParams, dParams, &m_pm1),
+ m_feeder(&m_pm1, &m_pm2),
+ m_lastFrameIn1(0),
+ m_lastFrameIn2(0),
+ m_frameNo(0)
+{
+ m_pm1.setOtherMatcher(&m_pm2);
+}
+
+MatchPipeline::~MatchPipeline()
+{
+}
+
+FeatureExtractor::Parameters
+MatchPipeline::paramsWithFreq(FeatureExtractor::Parameters params, double freq)
+{
+ if (freq == 0.0) return params;
+ params.referenceFrequency = freq;
+ return params;
+}
+
+void
+MatchPipeline::feedFrequencyDomainAudio(const float *arr1, const float *arr2)
+{
+ feedFeatures(m_fe1.process(arr1), m_fe2.process(arr2));
+}
+
+void
+MatchPipeline::feedFeatures(const feature_t &f1, const feature_t &f2)
+{
+ m_f1 = f1;
+ m_f2 = f2;
+
+#ifdef DEBUG_MATCH_PIPELINE
+ if (m_lastFrameIn1 == 1) {
+ cerr << "features 1 -> ";
+ for (int i = 0; i < (int) m_f1.size(); ++i) {
+ cerr << m_f1[i] << " ";
+ }
+ cerr << endl;
+ }
+#endif
+
+ feedConditionedFeatures(m_fc1.process(f1), m_fc2.process(f2));
+}
+
+void
+MatchPipeline::feedConditionedFeatures(const feature_t &c1, const feature_t &c2)
+{
+ m_c1 = c1;
+ m_c2 = c2;
+
+#ifdef DEBUG_MATCH_PIPELINE
+ if (m_lastFrameIn1 == 1) {
+ cerr << "conditioned features 1 -> ";
+ for (int i = 0; i < (int) m_c1.size(); ++i) {
+ cerr << m_c1[i] << " ";
+ }
+ cerr << endl;
+ }
+#endif
+
+ m_feeder.feed(c1, c2);
+
+ if (aboveThreshold(c1)) m_lastFrameIn1 = m_frameNo;
+ if (aboveThreshold(c2)) m_lastFrameIn2 = m_frameNo;
+
+#ifdef DEBUG_MATCH_PIPELINE
+ cerr << "last frames are " << m_lastFrameIn1 << ", " << m_lastFrameIn2
+ << endl;
+#endif
+
+ ++m_frameNo;
+}
+
+void
+MatchPipeline::extractFeatures(feature_t &f1, feature_t &f2)
+{
+ f1 = m_f1;
+ f2 = m_f2;
+}
+
+void
+MatchPipeline::extractConditionedFeatures(feature_t &c1, feature_t &c2)
+{
+ c1 = m_c1;
+ c2 = m_c2;
+}
+
+bool
+MatchPipeline::aboveThreshold(const feature_t &f)
+{
+ // This threshold is used only to determine when either of the
+ // input streams has ended -- the last frame for a stream is
+ // considered to be the last one that was above the
+ // threshold. This is different from the silence threshold in
+ // FeatureConditioner.
+ double threshold = 1e-4f;
+ double sum = 0.f;
+ for (int i = 0; i < int(f.size()); ++i) {
+ sum += f[i] * f[i];
+ }
+#ifdef DEBUG_MATCH_PIPELINE
+ cerr << "aboveThreshold: sum " << sum << ", threshold " << threshold
+ << ", returning " << (sum >= threshold) << endl;
+#endif
+ return (sum >= threshold);
+}
+
+void
+MatchPipeline::finish()
+{
+ m_feeder.finish();
+ m_feeder.getFinder()->setDurations(m_lastFrameIn1, m_lastFrameIn2);
+}
+
+int
+MatchPipeline::retrievePath(bool smooth, std::vector &pathx, std::vector &pathy)
+{
+ return m_feeder.getFinder()->retrievePath(smooth, pathx, pathy);
+}
+
+void
+MatchPipeline::retrieveForwardPath(std::vector &pathx, std::vector &pathy) {
+ return m_feeder.retrieveForwardPath(pathx, pathy);
+}
+
+double
+MatchPipeline::getOverallCost()
+{
+ return m_feeder.getFinder()->getOverallCost();
+}
+
diff -r a68204b9a529 -r cca298ecfc72 src/MatchPipeline.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/MatchPipeline.h Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,142 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+/*
+ Vamp feature extraction plugin using the MATCH audio alignment
+ algorithm.
+
+ Centre for Digital Music, Queen Mary, University of London.
+ This file copyright 2007 Simon Dixon, Chris Cannam and QMUL.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef MATCH_PIPELINE_H
+#define MATCH_PIPELINE_H
+
+#include "Matcher.h"
+#include "Finder.h"
+#include "FeatureExtractor.h"
+#include "FeatureConditioner.h"
+#include "MatchFeatureFeeder.h"
+
+class MatchPipeline
+{
+public:
+ /**
+ * Pipeline consisting of two Matchers, two FeatureConditioners,
+ * two FeatureExtractors, and a Finder. Features may be inserted
+ * at any point in the pipeline.
+ *
+ * The pipeline goes:
+ * Frequency-domain audio
+ * -> Features
+ * -> Conditioned features
+ * -> Matcher
+ *
+ * Only one set of FeatureExtractor::Parameters is provided; this
+ * contains a single reference frequency, but it's possible the
+ * two input streams may have different tuning frequencies. A
+ * separate frequency for the second input can be provided here as
+ * an optional parameter if needed.
+ */
+ MatchPipeline(FeatureExtractor::Parameters feParams,
+ FeatureConditioner::Parameters fcParams,
+ DistanceMetric::Parameters dParams,
+ Matcher::Parameters matchParams,
+ double secondReferenceFrequency = 0.0);
+
+ ~MatchPipeline();
+
+ /**
+ * Feed in data at the first pipeline stage. The input arrays
+ * represent frames of audio from the two different sources. Each
+ * is provided as a single array of alternating real and imaginary
+ * components.
+ *
+ * Input arrays must have at least 2 * (feParams.fftSize/2 + 1)
+ * elements. The arrays will be passed to FeatureExtractor and
+ * then on into the rest of the pipeline.
+ */
+ void feedFrequencyDomainAudio(const float *arr1, const float *arr2);
+
+ /**
+ * Feed in data at the second pipeline stage. The vectors
+ * represent feature frames from two different sources. They will
+ * be passed in to FeatureConditioner and then on to the rest of
+ * the pipeline.
+ */
+ void feedFeatures(const feature_t &f1, const feature_t &f2);
+
+ /**
+ * Feed in data at the third pipeline stage. The vectors represent
+ * conditioned feature frames from two different sources. They
+ * will be passed to MatchFeatureFeeder for feeding to the two
+ * matchers.
+ */
+ void feedConditionedFeatures(const feature_t &f1, const feature_t &f2);
+
+ /**
+ * If a frame was just fed in at the first or second pipeline
+ * stage, it can be retrieved from the second stage here. That is,
+ * if you provided frequency-domain audio, extractFeatures will
+ * give you back the FeatureExtractor's features.
+ */
+ void extractFeatures(feature_t &f1, feature_t &f2);
+
+ /**
+ * Retrieve the conditioned features from the third pipeline stage.
+ */
+ void extractConditionedFeatures(feature_t &f1, feature_t &f2);
+
+ /**
+ * Indicate that both inputs have come to an end.
+ */
+ void finish();
+
+ /**
+ * Retrieve the final path. Only valid once all the features have
+ * been supplied and finish() has been called.
+ *
+ * See Finder::retrievePath for more details.
+ */
+ int retrievePath(bool smooth, std::vector &pathx, std::vector &pathy);
+
+ /**
+ * Retrieve the forward path resulting from the online search.
+ *
+ * See MatchFeatureFeeder::retrieveForwardPath for more details.
+ */
+ void retrieveForwardPath(std::vector &pathx, std::vector &pathy);
+
+ /**
+ * Get the path cost for the overall path to the end of both
+ * sources.
+ *
+ * See Finder::getOverallCost for more details.
+ */
+ double getOverallCost();
+
+private:
+ FeatureExtractor m_fe1;
+ FeatureExtractor m_fe2;
+ FeatureConditioner m_fc1;
+ FeatureConditioner m_fc2;
+ Matcher m_pm1;
+ Matcher m_pm2;
+ MatchFeatureFeeder m_feeder;
+ int m_lastFrameIn1;
+ int m_lastFrameIn2;
+ int m_frameNo;
+ feature_t m_f1;
+ feature_t m_f2;
+ feature_t m_c1;
+ feature_t m_c2;
+ bool aboveThreshold(const feature_t &f);
+ FeatureExtractor::Parameters paramsWithFreq(FeatureExtractor::Parameters,
+ double);
+};
+
+#endif
diff -r a68204b9a529 -r cca298ecfc72 src/MatchTypes.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/MatchTypes.h Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,114 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Vamp feature extraction plugin using the MATCH audio alignment
+ algorithm.
+
+ Centre for Digital Music, Queen Mary, University of London.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef MATCH_TYPES_H
+#define MATCH_TYPES_H
+
+#include
+#include
+#include
+
+#ifdef USE_COMPACT_TYPES
+
+/// A single value in a feature vector
+typedef float featurebin_t;
+
+/// The distance between two feature vectors
+typedef uint8_t distance_t;
+
+/// What to cast a distance_t to when printing it (to avoid printing as char)
+typedef int distance_print_t;
+
+const distance_t MaxDistance = 0xfe;
+const distance_t InvalidDistance = 0xff;
+
+/// The integrated distance (path cost) from the origin to a given point
+typedef uint32_t pathcost_t;
+
+const pathcost_t MaxPathCost = 0xfffffffe;
+const pathcost_t InvalidPathCost = 0xffffffff;
+
+/// A direction advance instruction or state
+enum advance_t : uint8_t {
+ AdvanceNone,
+ AdvanceBoth,
+ AdvanceThis,
+ AdvanceOther
+};
+
+#else
+
+#ifndef USE_PRECISE_TYPES
+#error You must define either USE_COMPACT_TYPES or USE_PRECISE_TYPES
+#endif
+
+/// A single value in a feature vector
+typedef double featurebin_t;
+
+/// The distance between two feature vectors
+typedef float distance_t;
+
+/// What to cast a distance_t to when printing it
+typedef distance_t distance_print_t;
+
+const float MaxDistance = FLT_MAX;
+const float InvalidDistance = -1.f;
+
+/// The integrated distance (path cost) from the origin to a given point
+typedef double pathcost_t;
+
+const double MaxPathCost = DBL_MAX;
+const double InvalidPathCost = -1.;
+
+/// A direction advance instruction or state
+enum advance_t {
+ AdvanceNone,
+ AdvanceBoth,
+ AdvanceThis,
+ AdvanceOther
+};
+
+#endif
+
+
+/// A feature vector
+typedef std::vector feature_t;
+
+/// A sequence of feature vectors
+typedef std::vector featureseq_t;
+
+/// A distance vector
+typedef std::vector distancevec_t;
+
+/// A distance matrix
+typedef std::vector distancemat_t;
+
+/// A vector of path costs
+typedef std::vector pathcostvec_t;
+
+/// A matrix of path costs
+typedef std::vector pathcostmat_t;
+
+/// A vector of advance directions
+typedef std::vector advancevec_t;
+
+/// A matrix of advance directions
+typedef std::vector advancemat_t;
+
+/// A normalised path cost, i.e. a pathcost_t divided by some scale factor
+typedef double normpathcost_t;
+
+
+#endif
diff -r a68204b9a529 -r cca298ecfc72 src/MatchVampPlugin.cpp
--- a/src/MatchVampPlugin.cpp Fri Nov 14 10:24:13 2014 +0000
+++ b/src/MatchVampPlugin.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -17,7 +17,8 @@
#include "MatchVampPlugin.h"
#include "Matcher.h"
-#include "MatchFeeder.h"
+#include "MatchFeatureFeeder.h"
+#include "FeatureExtractor.h"
#include "Path.h"
#include
@@ -45,19 +46,27 @@
// sample rates
static float sampleRateMin = 5000.f;
-static float defaultStepTime = 0.020;
+static float defaultStepTime = 0.020f;
MatchVampPlugin::MatchVampPlugin(float inputSampleRate) :
Plugin(inputSampleRate),
- m_stepSize(inputSampleRate * defaultStepTime + 0.001),
+ m_stepSize(int(inputSampleRate * defaultStepTime + 0.001)),
m_stepTime(defaultStepTime),
m_blockSize(2048),
m_serialise(false),
m_begin(true),
m_locked(false),
- m_smooth(true),
- m_params(inputSampleRate, defaultStepTime, m_blockSize),
- m_defaultParams(inputSampleRate, defaultStepTime, m_blockSize)
+ m_smooth(false),
+ m_frameNo(0),
+ m_params(defaultStepTime),
+ m_defaultParams(defaultStepTime),
+ m_feParams(inputSampleRate, m_blockSize),
+ m_defaultFeParams(inputSampleRate, m_blockSize),
+ m_secondReferenceFrequency(m_defaultFeParams.referenceFrequency),
+ m_fcParams(),
+ m_defaultFcParams(),
+ m_dParams(),
+ m_defaultDParams()
{
if (inputSampleRate < sampleRateMin) {
std::cerr << "MatchVampPlugin::MatchVampPlugin: input sample rate "
@@ -75,9 +84,7 @@
#endif
}
- pm1 = 0;
- pm2 = 0;
- feeder = 0;
+ m_pipeline = 0;
// std::cerr << "MatchVampPlugin::MatchVampPlugin(" << this << "): extant = " << ++extant << std::endl;
}
@@ -85,9 +92,7 @@
{
// std::cerr << "MatchVampPlugin::~MatchVampPlugin(" << this << "): extant = " << --extant << std::endl;
- delete feeder;
- delete pm1;
- delete pm2;
+ delete m_pipeline;
if (m_locked) {
#ifdef _WIN32
@@ -126,7 +131,7 @@
int
MatchVampPlugin::getPluginVersion() const
{
- return 2;
+ return 3;
}
string
@@ -142,8 +147,193 @@
ParameterDescriptor desc;
+ desc.identifier = "freq1";
+ desc.name = "Tuning frequency of first input";
+ desc.description = "Tuning frequency (concert A) for the reference audio.";
+ desc.minValue = 220.0;
+ desc.maxValue = 880.0;
+ desc.defaultValue = float(m_defaultFeParams.referenceFrequency);
+ desc.isQuantized = false;
+ desc.unit = "Hz";
+ list.push_back(desc);
+
+ desc.identifier = "freq2";
+ desc.name = "Tuning frequency of second input";
+ desc.description = "Tuning frequency (concert A) for the other audio.";
+ desc.minValue = 220.0;
+ desc.maxValue = 880.0;
+ desc.defaultValue = float(m_defaultFeParams.referenceFrequency);
+ desc.isQuantized = false;
+ desc.unit = "Hz";
+ list.push_back(desc);
+
+ desc.identifier = "minfreq";
+ desc.name = "Minimum frequency";
+ desc.description = "Minimum frequency to include in features.";
+ desc.minValue = 0.0;
+ desc.maxValue = float(m_inputSampleRate / 4.f);
+ desc.defaultValue = float(m_defaultFeParams.minFrequency);
+ desc.isQuantized = false;
+ desc.unit = "Hz";
+ list.push_back(desc);
+
+ desc.identifier = "maxfreq";
+ desc.name = "Maximum frequency";
+ desc.description = "Maximum frequency to include in features.";
+ desc.minValue = 1000.0;
+ desc.maxValue = float(m_inputSampleRate / 2.f);
+ desc.defaultValue = float(m_defaultFeParams.maxFrequency);
+ desc.isQuantized = false;
+ desc.unit = "Hz";
+ list.push_back(desc);
+
+ desc.unit = "";
+
+ desc.identifier = "usechroma";
+ desc.name = "Feature type";
+ desc.description = "Whether to use warped spectrogram or chroma frequency map";
+ desc.minValue = 0;
+ desc.maxValue = 1;
+ desc.defaultValue = m_defaultFeParams.useChromaFrequencyMap ? 1 : 0;
+ desc.isQuantized = true;
+ desc.quantizeStep = 1;
+ desc.valueNames.clear();
+ desc.valueNames.push_back("Spectral");
+ desc.valueNames.push_back("Chroma");
+ list.push_back(desc);
+
+ desc.valueNames.clear();
+
+ desc.identifier = "usespecdiff";
+ desc.name = "Use feature difference";
+ desc.description = "Whether to use half-wave rectified feature-to-feature difference instead of straight spectral or chroma feature";
+ desc.minValue = 0;
+ desc.maxValue = 1;
+ desc.defaultValue = float(m_defaultFcParams.order);
+ desc.isQuantized = true;
+ desc.quantizeStep = 1;
+ list.push_back(desc);
+
+ desc.identifier = "framenorm";
+ desc.name = "Frame normalisation";
+ desc.description = "Type of normalisation to use for features";
+ desc.minValue = 0;
+ desc.maxValue = 2;
+ desc.defaultValue = float(m_defaultFcParams.norm);
+ desc.isQuantized = true;
+ desc.quantizeStep = 1;
+ desc.valueNames.clear();
+ desc.valueNames.push_back("None");
+ desc.valueNames.push_back("Sum to 1");
+ desc.valueNames.push_back("Long-term average");
+ list.push_back(desc);
+ desc.valueNames.clear();
+ desc.defaultValue = float(m_defaultFcParams.silenceThreshold);
+
+ desc.identifier = "metric";
+ desc.name = "Distance metric";
+ desc.description = "Metric for distance calculations.";
+ desc.minValue = 0;
+ desc.maxValue = 2;
+ desc.defaultValue = float(m_defaultDParams.metric);
+ desc.isQuantized = true;
+ desc.quantizeStep = 1;
+ desc.valueNames.clear();
+ desc.valueNames.push_back("Manhattan");
+ desc.valueNames.push_back("Euclidean");
+ desc.valueNames.push_back("Cosine");
+ list.push_back(desc);
+ desc.valueNames.clear();
+
+ desc.identifier = "distnorm";
+ desc.name = "Distance normalisation";
+ desc.description = "Type of normalisation to use for distance metric";
+ desc.minValue = 0;
+ desc.maxValue = 2;
+ desc.defaultValue = float(m_defaultDParams.norm);
+ desc.isQuantized = true;
+ desc.quantizeStep = 1;
+ desc.valueNames.clear();
+ desc.valueNames.push_back("None");
+ desc.valueNames.push_back("Sum of frames");
+ desc.valueNames.push_back("Log sum of frames");
+ list.push_back(desc);
+ desc.valueNames.clear();
+
+#ifdef USE_COMPACT_TYPES
+ desc.identifier = "scale";
+ desc.name = "Distance scale";
+ desc.description = "Scale factor to use when mapping distance metric into byte range for storage";
+ desc.minValue = 1;
+ desc.maxValue = 1000;
+ desc.defaultValue = float(m_defaultDParams.scale);
+ desc.isQuantized = false;
+ list.push_back(desc);
+#endif
+
+ desc.identifier = "silencethreshold";
+ desc.name = "Silence threshold";
+ desc.description = "Total frame energy threshold below which a feature will be regarded as silent";
+ desc.minValue = 0;
+ desc.maxValue = 0.1f;
+ desc.defaultValue = float(m_defaultFcParams.silenceThreshold);
+ desc.isQuantized = false;
+ list.push_back(desc);
+
+ desc.identifier = "noise";
+ desc.name = "Add noise";
+ desc.description = "Whether to mix in a small constant white noise term when calculating feature distance. This can improve alignment against sources containing cleanly synthesised audio.";
+ desc.minValue = 0;
+ desc.maxValue = 1;
+ desc.defaultValue = float(m_defaultDParams.noise);
+ desc.isQuantized = true;
+ desc.quantizeStep = 1;
+ list.push_back(desc);
+
+ desc.identifier = "gradientlimit";
+ desc.name = "Gradient limit";
+ desc.description = "Limit of number of frames that will be accepted from one source without a frame from the other source being accepted";
+ desc.minValue = 1;
+ desc.maxValue = 10;
+ desc.defaultValue = float(m_defaultParams.maxRunCount);
+ desc.isQuantized = true;
+ desc.quantizeStep = 1;
+ list.push_back(desc);
+
+ desc.identifier = "zonewidth";
+ desc.name = "Search zone width";
+ desc.description = "Width of the search zone (error margin) either side of the ongoing match position, in seconds";
+ desc.minValue = 1;
+ desc.maxValue = 60;
+ desc.defaultValue = float(m_defaultParams.blockTime);
+ desc.isQuantized = true;
+ desc.quantizeStep = 1;
+ desc.unit = "s";
+ list.push_back(desc);
+
+ desc.identifier = "diagonalweight";
+ desc.name = "Diagonal weight";
+ desc.description = "Weight applied to cost of diagonal step relative to horizontal or vertical step. The default of 2.0 is good for gross tracking of quite different performances; closer to 1.0 produces a smoother path for performances more similar in tempo";
+ desc.minValue = 1.0;
+ desc.maxValue = 2.0;
+ desc.defaultValue = float(m_defaultParams.diagonalWeight);
+ desc.isQuantized = false;
+ desc.unit = "";
+ list.push_back(desc);
+
+ desc.identifier = "smooth";
+ desc.name = "Use path smoothing";
+ desc.description = "Smooth the path by replacing steps with diagonals. (This was enabled by default in earlier versions of the MATCH plugin, but the default now is to produce an un-smoothed path.)";
+ desc.minValue = 0;
+ desc.maxValue = 1;
+ desc.defaultValue = 0;
+ desc.isQuantized = true;
+ desc.quantizeStep = 1;
+ desc.unit = "";
+ list.push_back(desc);
+
desc.identifier = "serialise";
- desc.name = "Serialise Plugin Invocations";
+ desc.name = "Serialise plugin invocations";
desc.description = "Reduce potential memory load at the expense of multiprocessor performance by serialising multi-threaded plugin runs";
desc.minValue = 0;
desc.maxValue = 1;
@@ -151,89 +341,7 @@
desc.isQuantized = true;
desc.quantizeStep = 1;
list.push_back(desc);
-
- desc.identifier = "framenorm";
- desc.name = "Frame Normalisation";
- desc.description = "Type of normalisation to use for frequency-domain audio features";
- desc.minValue = 0;
- desc.maxValue = 2;
- desc.defaultValue = (int)m_defaultParams.frameNorm;
- desc.isQuantized = true;
- desc.quantizeStep = 1;
- desc.valueNames.clear();
- desc.valueNames.push_back("None");
- desc.valueNames.push_back("Sum To 1");
- desc.valueNames.push_back("Long-Term Average");
- list.push_back(desc);
- desc.valueNames.clear();
-
- desc.identifier = "distnorm";
- desc.name = "Distance Normalisation";
- desc.description = "Type of normalisation to use for distance metric";
- desc.minValue = 0;
- desc.maxValue = 2;
- desc.defaultValue = (int)m_defaultParams.distanceNorm;
- desc.isQuantized = true;
- desc.quantizeStep = 1;
- desc.valueNames.clear();
- desc.valueNames.push_back("None");
- desc.valueNames.push_back("Sum of Frames");
- desc.valueNames.push_back("Log Sum of Frames");
- list.push_back(desc);
- desc.valueNames.clear();
-
- desc.identifier = "usespecdiff";
- desc.name = "Use Spectral Difference";
- desc.description = "Whether to use half-wave rectified spectral difference instead of straight spectrum";
- desc.minValue = 0;
- desc.maxValue = 1;
- desc.defaultValue = m_defaultParams.useSpectralDifference ? 1 : 0;
- desc.isQuantized = true;
- desc.quantizeStep = 1;
- list.push_back(desc);
-
- desc.identifier = "usechroma";
- desc.name = "Use Chroma Frequency Map";
- desc.description = "Whether to use a chroma frequency map instead of the default warped spectrogram";
- desc.minValue = 0;
- desc.maxValue = 1;
- desc.defaultValue = m_defaultParams.useChromaFrequencyMap ? 1 : 0;
- desc.isQuantized = true;
- desc.quantizeStep = 1;
- list.push_back(desc);
-
- desc.identifier = "gradientlimit";
- desc.name = "Gradient Limit";
- desc.description = "Limit of number of frames that will be accepted from one source without a frame from the other source being accepted";
- desc.minValue = 1;
- desc.maxValue = 10;
- desc.defaultValue = m_defaultParams.maxRunCount;
- desc.isQuantized = true;
- desc.quantizeStep = 1;
- list.push_back(desc);
-
- desc.identifier = "zonewidth";
- desc.name = "Search Zone Width";
- desc.description = "Width of the search zone (error margin) either side of the ongoing match position, in seconds";
- desc.minValue = 1;
- desc.maxValue = 60;
- desc.defaultValue = m_defaultParams.blockTime;
- desc.isQuantized = true;
- desc.quantizeStep = 1;
- desc.unit = "s";
- list.push_back(desc);
-
- desc.identifier = "smooth";
- desc.name = "Smooth Path";
- desc.description = "Smooth the path by replacing steps with diagonals";
- desc.minValue = 0;
- desc.maxValue = 1;
- desc.defaultValue = 1;
- desc.isQuantized = true;
- desc.quantizeStep = 1;
- desc.unit = "";
- list.push_back(desc);
-
+
return list;
}
@@ -243,19 +351,37 @@
if (name == "serialise") {
return m_serialise ? 1.0 : 0.0;
} else if (name == "framenorm") {
- return (int)m_params.frameNorm;
+ return float(m_fcParams.norm);
} else if (name == "distnorm") {
- return (int)m_params.distanceNorm;
+ return float(m_dParams.norm);
} else if (name == "usespecdiff") {
- return m_params.useSpectralDifference ? 1.0 : 0.0;
+ return float(m_fcParams.order);
} else if (name == "usechroma") {
- return m_params.useChromaFrequencyMap ? 1.0 : 0.0;
+ return m_feParams.useChromaFrequencyMap ? 1.0 : 0.0;
} else if (name == "gradientlimit") {
- return m_params.maxRunCount;
+ return float(m_params.maxRunCount);
+ } else if (name == "diagonalweight") {
+ return float(m_params.diagonalWeight);
} else if (name == "zonewidth") {
- return m_params.blockTime;
+ return float(m_params.blockTime);
} else if (name == "smooth") {
return m_smooth ? 1.0 : 0.0;
+ } else if (name == "silencethreshold") {
+ return float(m_fcParams.silenceThreshold);
+ } else if (name == "metric") {
+ return float(m_dParams.metric);
+ } else if (name == "noise") {
+ return m_dParams.noise;
+ } else if (name == "scale") {
+ return float(m_dParams.scale);
+ } else if (name == "freq1") {
+ return float(m_feParams.referenceFrequency);
+ } else if (name == "freq2") {
+ return float(m_secondReferenceFrequency);
+ } else if (name == "minfreq") {
+ return float(m_feParams.minFrequency);
+ } else if (name == "maxfreq") {
+ return float(m_feParams.maxFrequency);
}
return 0.0;
@@ -267,26 +393,44 @@
if (name == "serialise") {
m_serialise = (value > 0.5);
} else if (name == "framenorm") {
- m_params.frameNorm = (Matcher::FrameNormalisation)(int(value + 0.1));
+ m_fcParams.norm = FeatureConditioner::Normalisation(int(value + 0.1));
} else if (name == "distnorm") {
- m_params.distanceNorm = (DistanceMetric::DistanceNormalisation)(int(value + 0.1));
+ m_dParams.norm = DistanceMetric::DistanceNormalisation(int(value + 0.1));
} else if (name == "usespecdiff") {
- m_params.useSpectralDifference = (value > 0.5);
+ m_fcParams.order = FeatureConditioner::OutputOrder(int(value + 0.1));
} else if (name == "usechroma") {
- m_params.useChromaFrequencyMap = (value > 0.5);
+ m_feParams.useChromaFrequencyMap = (value > 0.5);
} else if (name == "gradientlimit") {
m_params.maxRunCount = int(value + 0.1);
+ } else if (name == "diagonalweight") {
+ m_params.diagonalWeight = value;
} else if (name == "zonewidth") {
m_params.blockTime = value;
} else if (name == "smooth") {
m_smooth = (value > 0.5);
+ } else if (name == "silencethreshold") {
+ m_fcParams.silenceThreshold = value;
+ } else if (name == "metric") {
+ m_dParams.metric = DistanceMetric::Metric(int(value + 0.1));
+ } else if (name == "noise") {
+ m_dParams.noise = DistanceMetric::NoiseAddition(int(value + 0.1));
+ } else if (name == "scale") {
+ m_dParams.scale = value;
+ } else if (name == "freq1") {
+ m_feParams.referenceFrequency = value;
+ } else if (name == "freq2") {
+ m_secondReferenceFrequency = value;
+ } else if (name == "minfreq") {
+ m_feParams.minFrequency = value;
+ } else if (name == "maxfreq") {
+ m_feParams.maxFrequency = value;
}
}
size_t
MatchVampPlugin::getPreferredStepSize() const
{
- return m_inputSampleRate * defaultStepTime;
+ return int(m_inputSampleRate * defaultStepTime + 0.001);
}
size_t
@@ -299,11 +443,10 @@
MatchVampPlugin::createMatchers()
{
m_params.hopTime = m_stepTime;
- m_params.fftSize = m_blockSize;
- pm1 = new Matcher(m_params, 0);
- pm2 = new Matcher(m_params, pm1);
- pm1->setOtherMatcher(pm2);
- feeder = new MatchFeeder(pm1, pm2);
+ m_feParams.fftSize = m_blockSize;
+
+ m_pipeline = new MatchPipeline(m_feParams, m_fcParams, m_dParams, m_params,
+ m_secondReferenceFrequency);
}
bool
@@ -320,9 +463,9 @@
if (stepSize > blockSize/2 ||
blockSize != getPreferredBlockSize()) return false;
- m_stepSize = stepSize;
+ m_stepSize = int(stepSize);
m_stepTime = float(stepSize) / m_inputSampleRate;
- m_blockSize = blockSize;
+ m_blockSize = int(blockSize);
createMatchers();
m_begin = true;
@@ -334,13 +477,9 @@
void
MatchVampPlugin::reset()
{
- delete feeder;
- delete pm1;
- delete pm2;
- feeder = 0;
- pm1 = 0;
- pm2 = 0;
-
+ delete m_pipeline;
+ m_pipeline = 0;
+ m_frameNo = 0;
createMatchers();
m_begin = true;
m_locked = false;
@@ -351,7 +490,7 @@
{
OutputList list;
- float outRate = 1.0 / m_stepTime;
+ float outRate = 1.0f / m_stepTime;
OutputDescriptor desc;
desc.identifier = "path";
@@ -365,7 +504,7 @@
desc.quantizeStep = 1;
desc.sampleType = OutputDescriptor::VariableSampleRate;
desc.sampleRate = outRate;
- m_pathOutNo = list.size();
+ m_pathOutNo = int(list.size());
list.push_back(desc);
desc.identifier = "a_b";
@@ -378,7 +517,7 @@
desc.isQuantized = false;
desc.sampleType = OutputDescriptor::VariableSampleRate;
desc.sampleRate = outRate;
- m_abOutNo = list.size();
+ m_abOutNo = int(list.size());
list.push_back(desc);
desc.identifier = "b_a";
@@ -391,7 +530,7 @@
desc.isQuantized = false;
desc.sampleType = OutputDescriptor::VariableSampleRate;
desc.sampleRate = outRate;
- m_baOutNo = list.size();
+ m_baOutNo = int(list.size());
list.push_back(desc);
desc.identifier = "a_b_divergence";
@@ -404,7 +543,7 @@
desc.isQuantized = false;
desc.sampleType = OutputDescriptor::VariableSampleRate;
desc.sampleRate = outRate;
- m_abDivOutNo = list.size();
+ m_abDivOutNo = int(list.size());
list.push_back(desc);
desc.identifier = "a_b_temporatio";
@@ -417,35 +556,76 @@
desc.isQuantized = false;
desc.sampleType = OutputDescriptor::VariableSampleRate;
desc.sampleRate = outRate;
- m_abRatioOutNo = list.size();
+ m_abRatioOutNo = int(list.size());
list.push_back(desc);
+ int featureSize = FeatureExtractor(m_feParams).getFeatureSize();
+
desc.identifier = "a_features";
- desc.name = "A Features";
+ desc.name = "Raw A Features";
desc.description = "Spectral features extracted from performance A";
desc.unit = "";
desc.hasFixedBinCount = true;
- desc.binCount = Matcher::getFeatureSizeFor(m_params);
+ desc.binCount = featureSize;
desc.hasKnownExtents = false;
desc.isQuantized = false;
desc.sampleType = OutputDescriptor::FixedSampleRate;
desc.sampleRate = outRate;
- m_aFeaturesOutNo = list.size();
+ m_aFeaturesOutNo = int(list.size());
list.push_back(desc);
desc.identifier = "b_features";
- desc.name = "B Features";
+ desc.name = "Raw B Features";
desc.description = "Spectral features extracted from performance B";
desc.unit = "";
desc.hasFixedBinCount = true;
- desc.binCount = Matcher::getFeatureSizeFor(m_params);
+ desc.binCount = featureSize;
desc.hasKnownExtents = false;
desc.isQuantized = false;
desc.sampleType = OutputDescriptor::FixedSampleRate;
desc.sampleRate = outRate;
- m_bFeaturesOutNo = list.size();
+ m_bFeaturesOutNo = int(list.size());
list.push_back(desc);
+ desc.identifier = "a_cfeatures";
+ desc.name = "Conditioned A Features";
+ desc.description = "Spectral features extracted from performance A, after normalisation and conditioning";
+ desc.unit = "";
+ desc.hasFixedBinCount = true;
+ desc.binCount = featureSize;
+ desc.hasKnownExtents = false;
+ desc.isQuantized = false;
+ desc.sampleType = OutputDescriptor::FixedSampleRate;
+ desc.sampleRate = outRate;
+ m_caFeaturesOutNo = int(list.size());
+ list.push_back(desc);
+
+ desc.identifier = "b_cfeatures";
+ desc.name = "Conditioned B Features";
+ desc.description = "Spectral features extracted from performance B, after norrmalisation and conditioning";
+ desc.unit = "";
+ desc.hasFixedBinCount = true;
+ desc.binCount = featureSize;
+ desc.hasKnownExtents = false;
+ desc.isQuantized = false;
+ desc.sampleType = OutputDescriptor::FixedSampleRate;
+ desc.sampleRate = outRate;
+ m_cbFeaturesOutNo = int(list.size());
+ list.push_back(desc);
+
+ desc.identifier = "overall_cost";
+ desc.name = "Overall Cost";
+ desc.description = "Normalised overall path cost for the cheapest path";
+ desc.unit = "";
+ desc.hasFixedBinCount = true;
+ desc.binCount = 1;
+ desc.hasKnownExtents = false;
+ desc.isQuantized = false;
+ desc.sampleType = OutputDescriptor::FixedSampleRate;
+ desc.sampleRate = 1;
+ m_overallCostOutNo = int(list.size());
+ list.push_back(desc);
+
return list;
}
@@ -468,45 +648,60 @@
// std::cerr << timestamp.toString();
- MatchFeeder::Features ff = feeder->feedAndGetFeatures(inputBuffers);
+ m_pipeline->feedFrequencyDomainAudio(inputBuffers[0], inputBuffers[1]);
FeatureSet returnFeatures;
+ feature_t f1, f2;
+ m_pipeline->extractFeatures(f1, f2);
+
+ feature_t cf1, cf2;
+ m_pipeline->extractConditionedFeatures(cf1, cf2);
+
Feature f;
f.hasTimestamp = false;
- for (int i = 0; i < (int)ff.f1.size(); ++i) {
- f.values.clear();
- for (int j = 0; j < (int)ff.f1[i].size(); ++j) {
- f.values.push_back(ff.f1[i][j]);
- }
- returnFeatures[m_aFeaturesOutNo].push_back(f);
- }
+ f.values.clear();
+ for (auto v: f1) f.values.push_back(float(v));
+ returnFeatures[m_aFeaturesOutNo].push_back(f);
- for (int i = 0; i < (int)ff.f2.size(); ++i) {
- f.values.clear();
- for (int j = 0; j < (int)ff.f2[i].size(); ++j) {
- f.values.push_back(ff.f2[i][j]);
- }
- returnFeatures[m_bFeaturesOutNo].push_back(f);
- }
+ f.values.clear();
+ for (auto v: f2) f.values.push_back(float(v));
+ returnFeatures[m_bFeaturesOutNo].push_back(f);
+
+ f.values.clear();
+ for (auto v: cf1) f.values.push_back(float(v));
+ returnFeatures[m_caFeaturesOutNo].push_back(f);
+
+ f.values.clear();
+ for (auto v: cf2) f.values.push_back(float(v));
+ returnFeatures[m_cbFeaturesOutNo].push_back(f);
// std::cerr << ".";
// std::cerr << std::endl;
+ ++m_frameNo;
+
return returnFeatures;
}
MatchVampPlugin::FeatureSet
MatchVampPlugin::getRemainingFeatures()
{
- Finder *finder = feeder->getFinder();
+ m_pipeline->finish();
+
+ FeatureSet returnFeatures;
+
std::vector pathx;
std::vector pathy;
- int len = finder->retrievePath(m_smooth, pathx, pathy);
+ int len = m_pipeline->retrievePath(m_smooth, pathx, pathy);
+
+ double cost = m_pipeline->getOverallCost();
+ Feature costFeature;
+ costFeature.hasTimestamp = false;
+ costFeature.values.push_back(float(cost));
+ returnFeatures[m_overallCostOutNo].push_back(costFeature);
- FeatureSet returnFeatures;
-
int prevx = 0;
int prevy = 0;
@@ -516,15 +711,15 @@
int y = pathy[i];
Vamp::RealTime xt = Vamp::RealTime::frame2RealTime
- (x * m_stepSize, lrintf(m_inputSampleRate));
+ (x * m_stepSize, int(m_inputSampleRate + 0.5));
Vamp::RealTime yt = Vamp::RealTime::frame2RealTime
- (y * m_stepSize, lrintf(m_inputSampleRate));
+ (y * m_stepSize, int(m_inputSampleRate + 0.5));
Feature feature;
feature.hasTimestamp = true;
feature.timestamp = m_startTime + xt;
feature.values.clear();
- feature.values.push_back(yt.sec + double(yt.nsec)/1.0e9);
+ feature.values.push_back(float(yt.sec + double(yt.nsec)/1.0e9));
returnFeatures[m_pathOutNo].push_back(feature);
if (x != prevx) {
@@ -532,12 +727,12 @@
feature.hasTimestamp = true;
feature.timestamp = m_startTime + xt;
feature.values.clear();
- feature.values.push_back(yt.sec + yt.msec()/1000.0);
+ feature.values.push_back(float(yt.sec + yt.msec()/1000.0));
returnFeatures[m_abOutNo].push_back(feature);
Vamp::RealTime diff = yt - xt;
feature.values.clear();
- feature.values.push_back(diff.sec + diff.msec()/1000.0);
+ feature.values.push_back(float(diff.sec + diff.msec()/1000.0));
returnFeatures[m_abDivOutNo].push_back(feature);
if (i > 0) {
@@ -560,7 +755,7 @@
feature.hasTimestamp = true;
feature.timestamp = m_startTime + yt;
feature.values.clear();
- feature.values.push_back(xt.sec + xt.msec()/1000.0);
+ feature.values.push_back(float(xt.sec + xt.msec()/1000.0));
returnFeatures[m_baOutNo].push_back(feature);
}
@@ -568,12 +763,8 @@
prevy = y;
}
- delete feeder;
- delete pm1;
- delete pm2;
- feeder = 0;
- pm1 = 0;
- pm2 = 0;
+ delete m_pipeline;
+ m_pipeline = 0;
if (m_locked) {
#ifdef _WIN32
diff -r a68204b9a529 -r cca298ecfc72 src/MatchVampPlugin.h
--- a/src/MatchVampPlugin.h Fri Nov 14 10:24:13 2014 +0000
+++ b/src/MatchVampPlugin.h Fri Feb 27 09:29:37 2015 +0000
@@ -25,9 +25,7 @@
#include
#endif
-#include "Matcher.h"
-
-class MatchFeeder;
+#include "MatchPipeline.h"
class MatchVampPlugin : public Vamp::Plugin
{
@@ -66,10 +64,9 @@
protected:
void createMatchers();
+ bool aboveThreshold(const float *);
- Matcher *pm1;
- Matcher *pm2;
- MatchFeeder *feeder;
+ MatchPipeline *m_pipeline;
Vamp::RealTime m_startTime;
int m_stepSize;
@@ -80,9 +77,21 @@
bool m_locked;
bool m_smooth;
+ int m_frameNo;
+
Matcher::Parameters m_params;
Matcher::Parameters m_defaultParams;
+ FeatureExtractor::Parameters m_feParams;
+ FeatureExtractor::Parameters m_defaultFeParams;
+ double m_secondReferenceFrequency;
+
+ FeatureConditioner::Parameters m_fcParams;
+ FeatureConditioner::Parameters m_defaultFcParams;
+
+ DistanceMetric::Parameters m_dParams;
+ DistanceMetric::Parameters m_defaultDParams;
+
mutable int m_pathOutNo;
mutable int m_abOutNo;
mutable int m_baOutNo;
@@ -90,6 +99,9 @@
mutable int m_abRatioOutNo;
mutable int m_aFeaturesOutNo;
mutable int m_bFeaturesOutNo;
+ mutable int m_caFeaturesOutNo;
+ mutable int m_cbFeaturesOutNo;
+ mutable int m_overallCostOutNo;
#ifdef _WIN32
static HANDLE m_serialisingMutex;
diff -r a68204b9a529 -r cca298ecfc72 src/Matcher.cpp
--- a/src/Matcher.cpp Fri Nov 14 10:24:13 2014 +0000
+++ b/src/Matcher.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -21,71 +21,34 @@
#include
#include
-bool Matcher::silent = true;
+using namespace std;
//#define DEBUG_MATCHER 1
-Matcher::Matcher(Parameters parameters, Matcher *p) :
- params(parameters),
- metric(parameters.distanceNorm)
+Matcher::Matcher(Parameters parameters, DistanceMetric::Parameters dparams,
+ Matcher *p) :
+ m_params(parameters),
+ m_metric(dparams)
{
#ifdef DEBUG_MATCHER
- cerr << "Matcher::Matcher(" << params.sampleRate << ", " << p << ")" << endl;
+ cerr << "*** Matcher: hopTime = " << parameters.hopTime
+ << ", blockTime = " << parameters.blockTime
+ << ", maxRunCount = " << parameters.maxRunCount
+ << ", diagonalWeight = " << parameters.diagonalWeight << endl;
+#endif
+
+ m_otherMatcher = p; // the first matcher will need this to be set later
+ m_firstPM = (!p);
+ m_frameCount = 0;
+ m_runCount = 0;
+ m_blockSize = 0;
+
+ m_blockSize = int(m_params.blockTime / m_params.hopTime + 0.5);
+#ifdef DEBUG_MATCHER
+ cerr << "Matcher: m_blockSize = " << m_blockSize << endl;
#endif
- otherMatcher = p; // the first matcher will need this to be set later
- firstPM = (!p);
- ltAverage = 0;
- frameCount = 0;
- runCount = 0;
- freqMapSize = 0;
- externalFeatureSize = 0;
- featureSize = 0;
- blockSize = 0;
-
- blockSize = lrint(params.blockTime / params.hopTime);
-#ifdef DEBUG_MATCHER
- cerr << "Matcher: blockSize = " << blockSize << endl;
-#endif
-
- distance = 0;
- bestPathCost = 0;
- distYSizes = 0;
- distXSize = 0;
-
- initialised = false;
-}
-
-Matcher::Matcher(Parameters parameters, Matcher *p, int featureSize) :
- params(parameters),
- externalFeatureSize(featureSize),
- metric(parameters.distanceNorm)
-{
-#ifdef DEBUG_MATCHER
- cerr << "Matcher::Matcher(" << params.sampleRate << ", " << p << ", " << featureSize << ")" << endl;
-#endif
-
- otherMatcher = p; // the first matcher will need this to be set later
- firstPM = (!p);
- ltAverage = 0;
- frameCount = 0;
- runCount = 0;
- freqMapSize = 0;
- featureSize = 0;
- blockSize = 0;
-
- blockSize = lrint(params.blockTime / params.hopTime);
-#ifdef DEBUG_MATCHER
- cerr << "Matcher: blockSize = " << blockSize << endl;
-#endif
-
- distance = 0;
- bestPathCost = 0;
- distYSizes = 0;
- distXSize = 0;
-
- initialised = false;
-
+ m_initialised = false;
}
Matcher::~Matcher()
@@ -93,418 +56,410 @@
#ifdef DEBUG_MATCHER
cerr << "Matcher(" << this << ")::~Matcher()" << endl;
#endif
-
- if (initialised) {
-
- for (int i = 0; i < distXSize; ++i) {
- if (distance[i]) {
- free(distance[i]);
- free(bestPathCost[i]);
- }
- }
- free(distance);
- free(bestPathCost);
-
- free(first);
- free(last);
-
- free(distYSizes);
- }
}
void
Matcher::init()
{
- if (initialised) return;
+ if (m_initialised) return;
- initialised = true;
+ m_features = featureseq_t(m_blockSize);
- if (externalFeatureSize == 0) {
- freqMapSize = getFeatureSizeFor(params);
- featureSize = freqMapSize;
- makeFreqMap();
- } else {
- featureSize = externalFeatureSize;
+ m_distXSize = m_blockSize * 2;
+
+ size();
+
+ m_frameCount = 0;
+ m_runCount = 0;
+
+ m_initialised = true;
+}
+
+bool
+Matcher::isRowAvailable(int i)
+{
+ if (i < 0 || i >= int(m_first.size())) return false;
+
+ for (int j = m_first[i]; j < int(m_first[i] + m_bestPathCost[i].size()); ++j) {
+ if (isAvailable(i, j)) {
+ return true;
+ }
}
- initVector(prevFrame, featureSize);
- initVector(newFrame, featureSize);
- initMatrix(frames, blockSize, featureSize);
- initVector(totalEnergies, blockSize);
+ return false;
+}
- int distSize = (params.maxRunCount + 1) * blockSize;
+bool
+Matcher::isColAvailable(int i)
+{
+ return m_otherMatcher->isRowAvailable(i);
+}
- distXSize = blockSize * 2;
+bool
+Matcher::isInRange(int i, int j)
+{
+ if (m_firstPM) {
+ return ((i >= 0) &&
+ (i < int(m_first.size())) &&
+ (j >= m_first[i]) &&
+ (j < int(m_first[i] + m_bestPathCost[i].size())));
+ } else {
+ return m_otherMatcher->isInRange(j, i);
+ }
+}
- distance = (unsigned char **)malloc(distXSize * sizeof(unsigned char *));
- bestPathCost = (int **)malloc(distXSize * sizeof(int *));
- distYSizes = (int *)malloc(distXSize * sizeof(int));
+bool
+Matcher::isAvailable(int i, int j)
+{
+ if (m_firstPM) {
+ if (isInRange(i, j)) {
+ return (m_bestPathCost[i][j - m_first[i]] >= 0);
+ } else {
+ return false;
+ }
+ } else {
+ return m_otherMatcher->isAvailable(j, i);
+ }
+}
- for (int i = 0; i < blockSize; ++i) {
- distance[i] = (unsigned char *)malloc(distSize * sizeof(unsigned char));
- bestPathCost[i] = (int *)malloc(distSize * sizeof(int));
- distYSizes[i] = distSize;
+pair
+Matcher::getColRange(int i)
+{
+ if (i < 0 || i >= int(m_first.size())) {
+ cerr << "ERROR: Matcher::getColRange(" << i << "): Index out of range"
+ << endl;
+ throw "Index out of range";
+ } else {
+ return pair(m_first[i], m_last[i]);
}
- for (int i = blockSize; i < distXSize; ++i) {
- distance[i] = 0;
+}
+
+pair
+Matcher::getRowRange(int i)
+{
+ return m_otherMatcher->getColRange(i);
+}
+
+distance_t
+Matcher::getDistance(int i, int j)
+{
+ if (m_firstPM) {
+ if (!isInRange(i, j)) {
+ cerr << "ERROR: Matcher::getDistance(" << i << ", " << j << "): "
+ << "Location is not in range" << endl;
+ throw "Distance not available";
+ }
+ distance_t dist = m_distance[i][j - m_first[i]];
+ if (dist == InvalidDistance) {
+ cerr << "ERROR: Matcher::getDistance(" << i << ", " << j << "): "
+ << "Location is in range, but distance ("
+ << distance_print_t(dist)
+ << ") is invalid or has not been set" << endl;
+ throw "Distance not available";
+ }
+ return dist;
+ } else {
+ return m_otherMatcher->getDistance(j, i);
}
-
- first = (int *)malloc(distXSize * sizeof(int));
- last = (int *)malloc(distXSize * sizeof(int));
+}
+
+void
+Matcher::setDistance(int i, int j, distance_t distance)
+{
+ if (m_firstPM) {
+ if (!isInRange(i, j)) {
+ cerr << "ERROR: Matcher::setDistance(" << i << ", " << j << ", "
+ << distance_print_t(distance)
+ << "): Location is out of range" << endl;
+ throw "Indices out of range";
+ }
+ m_distance[i][j - m_first[i]] = distance;
+ } else {
+ m_otherMatcher->setDistance(j, i, distance);
+ }
+}
- frameCount = 0;
- runCount = 0;
- ltAverage = 0;
+normpathcost_t
+Matcher::getNormalisedPathCost(int i, int j)
+{
+ // normalised for path length. 1+ prevents division by zero here
+ return normpathcost_t(getPathCost(i, j)) / normpathcost_t(1 + i + j);
+}
-} // init
-
+pathcost_t
+Matcher::getPathCost(int i, int j)
+{
+ if (m_firstPM) {
+ if (!isAvailable(i, j)) {
+ if (!isInRange(i, j)) {
+ cerr << "ERROR: Matcher::getPathCost(" << i << ", " << j << "): "
+ << "Location is not in range" << endl;
+ } else {
+ cerr << "ERROR: Matcher::getPathCost(" << i << ", " << j << "): "
+ << "Location is in range, but pathCost ("
+ << m_bestPathCost[i][j - m_first[i]]
+ << ") is invalid or has not been set" << endl;
+ }
+ throw "Path cost not available";
+ }
+ return m_bestPathCost[i][j - m_first[i]];
+ } else {
+ return m_otherMatcher->getPathCost(j, i);
+ }
+}
+
void
-Matcher::makeFreqMap()
+Matcher::setPathCost(int i, int j, advance_t dir, pathcost_t pathCost)
{
- initVector(freqMap, params.fftSize/2 + 1);
-
- if (params.useChromaFrequencyMap) {
-#ifdef DEBUG_MATCHER
- cerr << "makeFreqMap: calling makeChromaFrequencyMap" << endl;
-#endif
- makeChromaFrequencyMap();
+ if (m_firstPM) {
+ if (!isInRange(i, j)) {
+ cerr << "ERROR: Matcher::setPathCost(" << i << ", " << j << ", "
+ << dir << ", " << pathCost
+ << "): Location is out of range" << endl;
+ throw "Indices out of range";
+ }
+ m_advance[i][j - m_first[i]] = dir;
+ m_bestPathCost[i][j - m_first[i]] = pathCost;
} else {
-#ifdef DEBUG_MATCHER
- cerr << "makeFreqMap: calling makeStandardFrequencyMap" << endl;
-#endif
- makeStandardFrequencyMap();
- }
-} // makeFreqMap()
-
-int
-Matcher::getFeatureSizeFor(Parameters params)
-{
- if (params.useChromaFrequencyMap) {
- return 13;
- } else {
- return 84;
+ if (dir == AdvanceThis) {
+ dir = AdvanceOther;
+ } else if (dir == AdvanceOther) {
+ dir = AdvanceThis;
+ }
+ m_otherMatcher->setPathCost(j, i, dir, pathCost);
}
}
void
-Matcher::makeStandardFrequencyMap()
+Matcher::size()
{
- double binWidth = params.sampleRate / params.fftSize;
- int crossoverBin = (int)(2 / (pow(2, 1/12.0) - 1));
- int crossoverMidi = lrint(log(crossoverBin*binWidth/440.0)/
- log(2.0) * 12 + 69);
- // freq = 440 * Math.pow(2, (midi-69)/12.0) / binWidth;
- int i = 0;
- while (i <= crossoverBin) {
- freqMap[i] = i;
- ++i;
- }
- while (i <= params.fftSize/2) {
- double midi = log(i*binWidth/440.0) / log(2.0) * 12 + 69;
- if (midi > 127) midi = 127;
- int target = crossoverBin + lrint(midi) - crossoverMidi;
- if (target >= freqMapSize) target = freqMapSize - 1;
- freqMap[i++] = target;
- }
-
- if (!silent) {
- cerr << "Standard map size: " << freqMapSize
- << "; Crossover at: " << crossoverBin << endl;
- for (i = 0; i < params.fftSize / 2; i++)
- cerr << "freqMap[" << i << "] = " << freqMap[i] << endl;
- }
-} // makeStandardFrequencyMap()
-
-void
-Matcher::makeChromaFrequencyMap()
-{
- double binWidth = params.sampleRate / params.fftSize;
- int crossoverBin = (int)(1 / (pow(2, 1/12.0) - 1));
- // freq = 440 * Math.pow(2, (midi-69)/12.0) / binWidth;
- int i = 0;
- while (i <= crossoverBin)
- freqMap[i++] = 0;
- while (i <= params.fftSize/2) {
- double midi = log(i*binWidth/440.0) / log(2.0) * 12 + 69;
- freqMap[i++] = (lrint(midi)) % 12 + 1;
- }
- if (!silent) {
- cerr << "Chroma map size: " << freqMapSize
- << "; Crossover at: " << crossoverBin << endl;
- for (i = 0; i < params.fftSize / 2; i++)
- cerr << "freqMap[" << i << "] = " << freqMap[i] << endl;
- }
-} // makeChromaFrequencyMap()
-
-vector
-Matcher::consumeFrame(double *reBuffer, double *imBuffer)
-{
- if (!initialised) init();
-
- vector processedFrame =
- processFrameFromFreqData(reBuffer, imBuffer);
-
- calcAdvance();
-
- return processedFrame;
+ int distSize = (m_params.maxRunCount + 1) * m_blockSize;
+ m_bestPathCost.resize(m_distXSize, pathcostvec_t(distSize, InvalidPathCost));
+ m_distance.resize(m_distXSize, distancevec_t(distSize, InvalidDistance));
+ m_advance.resize(m_distXSize, advancevec_t(distSize, AdvanceNone));
+ m_first.resize(m_distXSize, 0);
+ m_last.resize(m_distXSize, 0);
}
void
-Matcher::consumeFeatureVector(std::vector feature)
+Matcher::consumeFeatureVector(const feature_t &feature)
{
- if (!initialised) init();
- int frameIndex = frameCount % blockSize;
- frames[frameIndex] = feature;
+ if (!m_initialised) init();
+ int frameIndex = m_frameCount % m_blockSize;
+ m_features[frameIndex] = feature;
calcAdvance();
}
-vector
-Matcher::processFrameFromFreqData(double *reBuffer, double *imBuffer)
-{
- for (int i = 0; i < (int)newFrame.size(); ++i) {
- newFrame[i] = 0;
- }
- double rms = 0;
- for (int i = 0; i <= params.fftSize/2; i++) {
- double mag = reBuffer[i] * reBuffer[i] +
- imBuffer[i] * imBuffer[i];
- rms += mag;
- newFrame[freqMap[i]] += mag;
- }
- rms = sqrt(rms / (params.fftSize/2));
-
- int frameIndex = frameCount % blockSize;
-
- vector processedFrame(freqMapSize, 0.0);
-
- double totalEnergy = 0;
- if (params.useSpectralDifference) {
- for (int i = 0; i < freqMapSize; i++) {
- totalEnergy += newFrame[i];
- if (newFrame[i] > prevFrame[i]) {
- processedFrame[i] = newFrame[i] - prevFrame[i];
- } else {
- processedFrame[i] = 0;
- }
- }
- } else {
- for (int i = 0; i < freqMapSize; i++) {
- processedFrame[i] = newFrame[i];
- totalEnergy += processedFrame[i];
- }
- }
- totalEnergies[frameIndex] = totalEnergy;
-
- double decay = frameCount >= 200 ? 0.99:
- (frameCount < 100? 0: (frameCount - 100) / 100.0);
-
- if (ltAverage == 0)
- ltAverage = totalEnergy;
- else
- ltAverage = ltAverage * decay + totalEnergy * (1.0 - decay);
-
- if (rms <= params.silenceThreshold)
- for (int i = 0; i < freqMapSize; i++)
- processedFrame[i] = 0;
- else if (params.frameNorm == NormaliseFrameToSum1)
- for (int i = 0; i < freqMapSize; i++)
- processedFrame[i] /= totalEnergy;
- else if (params.frameNorm == NormaliseFrameToLTAverage)
- for (int i = 0; i < freqMapSize; i++)
- processedFrame[i] /= ltAverage;
-
- vector tmp = prevFrame;
- prevFrame = newFrame;
- newFrame = tmp;
-
- frames[frameIndex] = processedFrame;
-
- if ((frameCount % 100) == 0) {
- if (!silent) {
- cerr << "Progress:" << frameCount << " " << ltAverage << endl;
- }
- }
-
- return processedFrame;
-}
-
void
Matcher::calcAdvance()
{
- int frameIndex = frameCount % blockSize;
+ int frameIndex = m_frameCount % m_blockSize;
- if (frameCount >= distXSize) {
-// std::cerr << "Resizing " << distXSize << " -> " << distXSize * 2 << std::endl;
- distXSize *= 2;
- distance = (unsigned char **)realloc(distance, distXSize * sizeof(unsigned char *));
- bestPathCost = (int **)realloc(bestPathCost, distXSize * sizeof(int *));
- distYSizes = (int *)realloc(distYSizes, distXSize * sizeof(int));
- first = (int *)realloc(first, distXSize * sizeof(int));
- last = (int *)realloc(last, distXSize * sizeof(int));
-
- for (int i = distXSize/2; i < distXSize; ++i) {
- distance[i] = 0;
- }
+ if (m_frameCount >= m_distXSize) {
+ m_distXSize *= 2;
+ size();
}
- if (firstPM && (frameCount >= blockSize)) {
+ if (m_firstPM && (m_frameCount >= m_blockSize)) {
- int len = last[frameCount - blockSize] -
- first[frameCount - blockSize];
+ int len = m_last[m_frameCount - m_blockSize] -
+ m_first[m_frameCount - m_blockSize];
- // We need to copy distance[frameCount-blockSize] to
- // distance[frameCount], and then truncate
- // distance[frameCount-blockSize] to its first len elements.
+ // We need to copy distance[m_frameCount-m_blockSize] to
+ // distance[m_frameCount], and then truncate
+ // distance[m_frameCount-m_blockSize] to its first len elements.
// Same for bestPathCost.
-/*
- std::cerr << "Matcher(" << this << "): moving " << distYSizes[frameCount - blockSize] << " from " << frameCount - blockSize << " to "
- << frameCount << ", allocating " << len << " for "
- << frameCount - blockSize << std::endl;
-*/
- distance[frameCount] = distance[frameCount - blockSize];
- distance[frameCount - blockSize] = (unsigned char *)
- malloc(len * sizeof(unsigned char));
+ distancevec_t dOld(m_distance[m_frameCount - m_blockSize]);
+ distancevec_t dNew(len, InvalidDistance);
+
+ pathcostvec_t bpcOld(m_bestPathCost[m_frameCount - m_blockSize]);
+ pathcostvec_t bpcNew(len, InvalidPathCost);
+
+ advancevec_t adOld(m_advance[m_frameCount - m_blockSize]);
+ advancevec_t adNew(len, AdvanceNone);
+
for (int i = 0; i < len; ++i) {
- distance[frameCount - blockSize][i] =
- distance[frameCount][i];
+ dNew[i] = dOld[i];
+ bpcNew[i] = bpcOld[i];
+ adNew[i] = adOld[i];
}
+
+ m_distance[m_frameCount] = dOld;
+ m_distance[m_frameCount - m_blockSize] = dNew;
- bestPathCost[frameCount] = bestPathCost[frameCount - blockSize];
+ m_bestPathCost[m_frameCount] = bpcOld;
+ m_bestPathCost[m_frameCount - m_blockSize] = bpcNew;
- bestPathCost[frameCount - blockSize] = (int *)
- malloc(len * sizeof(int));
- for (int i = 0; i < len; ++i) {
- bestPathCost[frameCount - blockSize][i] =
- bestPathCost[frameCount][i];
- }
-
- distYSizes[frameCount] = distYSizes[frameCount - blockSize];
- distYSizes[frameCount - blockSize] = len;
+ m_advance[m_frameCount] = adOld;
+ m_advance[m_frameCount - m_blockSize] = adNew;
}
- int stop = otherMatcher->frameCount;
- int index = stop - blockSize;
- if (index < 0)
- index = 0;
- first[frameCount] = index;
- last[frameCount] = stop;
+ int stop = m_otherMatcher->m_frameCount;
+ int index = stop - m_blockSize;
+ if (index < 0) index = 0;
- bool overflow = false;
- int mn= -1;
- int mx= -1;
+ m_first[m_frameCount] = index;
+ m_last[m_frameCount] = stop;
+
for ( ; index < stop; index++) {
- int dMN = metric.calcDistanceScaled
- (frames[frameIndex],
- otherMatcher->frames[index % blockSize],
- params.distanceScale);
-
- if (mx<0)
- mx = mn = dMN;
- else if (dMN > mx)
- mx = dMN;
- else if (dMN < mn)
- mn = dMN;
- if (dMN >= 255) {
- overflow = true;
- dMN = 255;
- }
+ distance_t distance = m_metric.calcDistance
+ (m_features[frameIndex],
+ m_otherMatcher->m_features[index % m_blockSize]);
- if ((frameCount == 0) && (index == 0)) // first element
- setValue(0, 0, 0, 0, dMN);
- else if (frameCount == 0) // first row
- setValue(0, index, ADVANCE_OTHER,
- getValue(0, index-1, true), dMN);
- else if (index == 0) // first column
- setValue(frameCount, index, ADVANCE_THIS,
- getValue(frameCount - 1, 0, true), dMN);
- else if (index == otherMatcher->frameCount - blockSize) {
+ pathcost_t straightIncrement(distance);
+ pathcost_t diagIncrement = pathcost_t(distance * m_params.diagonalWeight);
+
+ if ((m_frameCount == 0) && (index == 0)) { // first element
+
+ updateValue(0, 0, AdvanceNone,
+ 0,
+ distance);
+
+ } else if (m_frameCount == 0) { // first row
+
+ updateValue(0, index, AdvanceOther,
+ getPathCost(0, index-1),
+ distance);
+
+ } else if (index == 0) { // first column
+
+ updateValue(m_frameCount, index, AdvanceThis,
+ getPathCost(m_frameCount - 1, 0),
+ distance);
+
+ } else if (index == m_otherMatcher->m_frameCount - m_blockSize) {
+
// missing value(s) due to cutoff
// - no previous value in current row (resp. column)
// - no diagonal value if prev. dir. == curr. dirn
- int min2 = getValue(frameCount - 1, index, true);
- // if ((firstPM && (first[frameCount - 1] == index)) ||
- // (!firstPM && (last[index-1] < frameCount)))
- if (first[frameCount - 1] == index)
- setValue(frameCount, index, ADVANCE_THIS, min2, dMN);
- else {
- int min1 = getValue(frameCount - 1, index - 1, true);
- if (min1 + dMN <= min2)
- setValue(frameCount, index, ADVANCE_BOTH, min1,dMN);
- else
- setValue(frameCount, index, ADVANCE_THIS, min2,dMN);
+
+ pathcost_t min2 = getPathCost(m_frameCount - 1, index);
+
+// cerr << "NOTE: missing value at i = " << m_frameCount << ", j = "
+// << index << " (first = " << m_firstPM << ")" << endl;
+
+ // if ((m_firstPM && (first[m_frameCount - 1] == index)) ||
+ // (!m_firstPM && (m_last[index-1] < m_frameCount)))
+ if (m_first[m_frameCount - 1] == index) {
+
+ updateValue(m_frameCount, index, AdvanceThis,
+ min2, distance);
+
+ } else {
+
+ pathcost_t min1 = getPathCost(m_frameCount - 1, index - 1);
+ if (min1 + diagIncrement <= min2 + straightIncrement) {
+ updateValue(m_frameCount, index, AdvanceBoth,
+ min1, distance);
+ } else {
+ updateValue(m_frameCount, index, AdvanceThis,
+ min2, distance);
+ }
}
+
} else {
- int min1 = getValue(frameCount, index-1, true);
- int min2 = getValue(frameCount - 1, index, true);
- int min3 = getValue(frameCount - 1, index-1, true);
- if (min1 <= min2) {
- if (min3 + dMN <= min1)
- setValue(frameCount, index, ADVANCE_BOTH, min3,dMN);
- else
- setValue(frameCount, index, ADVANCE_OTHER,min1,dMN);
+
+ pathcost_t min1 = getPathCost(m_frameCount, index - 1);
+ pathcost_t min2 = getPathCost(m_frameCount - 1, index);
+ pathcost_t min3 = getPathCost(m_frameCount - 1, index - 1);
+
+ pathcost_t cost1 = min1 + straightIncrement;
+ pathcost_t cost2 = min2 + straightIncrement;
+ pathcost_t cost3 = min3 + diagIncrement;
+
+ // Choosing is easy if there is a strict cheapest of the
+ // three. If two or more share the lowest cost, we choose
+ // in order of preference: cost3 (AdvanceBoth), cost2
+ // (AdvanceThis), cost1 (AdvanceOther) if we are the first
+ // matcher; and cost3 (AdvanceBoth), cost1 (AdvanceOther),
+ // cost2 (AdvanceThis) if we are the second matcher. That
+ // is, we always prioritise the diagonal followed by the
+ // first matcher.
+
+ if (( m_firstPM && (cost1 < cost2)) ||
+ (!m_firstPM && (cost1 <= cost2))) {
+ if (cost3 <= cost1) {
+ updateValue(m_frameCount, index, AdvanceBoth,
+ min3, distance);
+ } else {
+ updateValue(m_frameCount, index, AdvanceOther,
+ min1, distance);
+ }
} else {
- if (min3 + dMN <= min2)
- setValue(frameCount, index, ADVANCE_BOTH, min3,dMN);
- else
- setValue(frameCount, index, ADVANCE_THIS, min2,dMN);
+ if (cost3 <= cost2) {
+ updateValue(m_frameCount, index, AdvanceBoth,
+ min3, distance);
+ } else {
+ updateValue(m_frameCount, index, AdvanceThis,
+ min2, distance);
+ }
}
}
- otherMatcher->last[index]++;
+
+ m_otherMatcher->m_last[index]++;
} // loop for row (resp. column)
- frameCount++;
- runCount++;
+ m_frameCount++;
+ m_runCount++;
- otherMatcher->runCount = 0;
-
- if (overflow && !silent)
- cerr << "WARNING: overflow in distance metric: "
- << "frame " << frameCount << ", val = " << mx << endl;
-
- if (!silent)
- std::cerr << "Frame " << frameCount << ", d = " << (mx-mn) << std::endl;
+ m_otherMatcher->m_runCount = 0;
}
-int
-Matcher::getValue(int i, int j, bool firstAttempt)
+void
+Matcher::updateValue(int i, int j, advance_t dir, pathcost_t value, distance_t distance)
{
- if (firstPM)
- return bestPathCost[i][j - first[i]];
- else
- return otherMatcher->bestPathCost[j][i - otherMatcher->first[j]];
-} // getValue()
+ pathcost_t increment = distance;
+ if (dir == AdvanceBoth) {
+ increment = pathcost_t(increment * m_params.diagonalWeight);
+ }
-void
-Matcher::setValue(int i, int j, int dir, int value, int dMN)
-{
- if (firstPM) {
- distance[i][j - first[i]] = (unsigned char)((dMN & MASK) | dir);
- bestPathCost[i][j - first[i]] =
- (value + (dir==ADVANCE_BOTH? dMN*2: dMN));
+ pathcost_t newValue = value + increment;
+ if (MaxPathCost - increment < value) {
+ cerr << "ERROR: Path cost overflow at i=" << i << ", j=" << j << ": "
+ << value << " + " << increment << " > " << MaxPathCost << endl;
+ newValue = MaxPathCost;
+ }
+
+ if (m_firstPM) {
+
+ setDistance(i, j, distance);
+ setPathCost(i, j, dir, newValue);
+
} else {
- if (dir == ADVANCE_THIS)
- dir = ADVANCE_OTHER;
- else if (dir == ADVANCE_OTHER)
- dir = ADVANCE_THIS;
- int idx = i - otherMatcher->first[j];
- if (idx == (int)otherMatcher->distYSizes[j]) {
+
+ if (dir == AdvanceThis) dir = AdvanceOther;
+ else if (dir == AdvanceOther) dir = AdvanceThis;
+
+ int idx = i - m_otherMatcher->m_first[j];
+
+ if (idx < 0 || size_t(idx) == m_otherMatcher->m_distance[j].size()) {
// This should never happen, but if we allow arbitrary
// pauses in either direction, and arbitrary lengths at
// end, it is better than a segmentation fault.
- std::cerr << "Emergency resize: " << idx << " -> " << idx * 2 << std::endl;
- otherMatcher->distYSizes[j] = idx * 2;
- otherMatcher->bestPathCost[j] =
- (int *)realloc(otherMatcher->bestPathCost[j],
- idx * 2 * sizeof(int));
- otherMatcher->distance[j] =
- (unsigned char *)realloc(otherMatcher->distance[j],
- idx * 2 * sizeof(unsigned char));
+ cerr << "Emergency resize: " << idx << " -> " << idx * 2 << endl;
+ m_otherMatcher->m_bestPathCost[j].resize(idx * 2, InvalidPathCost);
+ m_otherMatcher->m_distance[j].resize(idx * 2, InvalidDistance);
+ m_otherMatcher->m_advance[j].resize(idx * 2, AdvanceNone);
}
- otherMatcher->distance[j][idx] = (unsigned char)((dMN & MASK) | dir);
- otherMatcher->bestPathCost[j][idx] =
- (value + (dir==ADVANCE_BOTH? dMN*2: dMN));
+
+ m_otherMatcher->setDistance(j, i, distance);
+ m_otherMatcher->setPathCost(j, i, dir, newValue);
}
-} // setValue()
+}
+advance_t
+Matcher::getAdvance(int i, int j)
+{
+ if (m_firstPM) {
+ if (!isInRange(i, j)) {
+ cerr << "ERROR: Matcher::getAdvance(" << i << ", " << j << "): "
+ << "Location is not in range" << endl;
+ throw "Advance not available";
+ }
+ return m_advance[i][j - m_first[i]];
+ } else {
+ return m_otherMatcher->getAdvance(j, i);
+ }
+}
diff -r a68204b9a529 -r cca298ecfc72 src/Matcher.h
--- a/src/Matcher.h Fri Nov 14 10:24:13 2014 +0000
+++ b/src/Matcher.h Fri Feb 27 09:29:37 2015 +0000
@@ -14,351 +14,249 @@
COPYING included with this distribution for more information.
*/
-#ifndef _MATCHER_H_
-#define _MATCHER_H_
+#ifndef MATCHER_H
+#define MATCHER_H
#include
#include
#include
#include
-#define ADVANCE_THIS 1
-#define ADVANCE_OTHER 2
-#define ADVANCE_BOTH 3
-#define MASK 0xfc
-
#include "DistanceMetric.h"
+#include "MatchTypes.h"
using std::vector;
using std::string;
using std::cerr;
using std::endl;
-/** Represents an audio stream that can be matched to another audio
- * stream of the same piece of music. The matching algorithm uses
- * dynamic time warping. The distance metric is a Euclidean metric
- * on the FFT data with the higher frequencies mapped onto a linear
- * scale.
+/** Represents an audio feature stream that can be matched to another
+ * audio stream of the same piece of music. The matching algorithm
+ * uses dynamic time warping.
*/
class Matcher
{
public:
- enum FrameNormalisation {
-
- /** Do not normalise audio frames */
- NoFrameNormalisation,
-
- /** Normalise each frame of audio to have a sum of 1 */
- NormaliseFrameToSum1,
-
- /** Normalise each frame of audio by the long-term average
- * of the summed energy */
- NormaliseFrameToLTAverage,
- };
+ static string advanceToString(advance_t a) {
+ switch (a) {
+ case AdvanceNone: return "AdvanceNone";
+ case AdvanceBoth: return "AdvanceBoth";
+ case AdvanceThis: return "AdvanceThis";
+ case AdvanceOther: return "AdvanceOther";
+ }
+ return "(unknown)";
+ }
struct Parameters {
- Parameters(float rate_, double hopTime_, int fftSize_) :
- sampleRate(rate_),
- frameNorm(NormaliseFrameToSum1),
- distanceNorm(DistanceMetric::NormaliseDistanceToLogSum),
- distanceScale(90.0),
- useSpectralDifference(true),
- useChromaFrequencyMap(false),
+ Parameters(double hopTime_) :
hopTime(hopTime_),
- fftSize(fftSize_),
blockTime(10.0),
- silenceThreshold(0.01),
- decay(0.99),
- maxRunCount(3)
+ maxRunCount(3),
+ diagonalWeight(2.0)
{}
- /** Sample rate of audio */
- float sampleRate;
-
- /** Type of audio frame normalisation */
- FrameNormalisation frameNorm;
-
- /** Type of distance metric normalisation */
- DistanceMetric::DistanceNormalisation distanceNorm;
-
- /** Scaling factor for distance metric; must guarantee that the
- * final value fits in the data type used, that is, unsigned
- * char.
- */
- double distanceScale;
-
- /** Flag indicating whether or not the half-wave rectified
- * spectral difference should be used in calculating the
- * distance metric for pairs of audio frames, instead of the
- * straight spectrum values. */
- bool useSpectralDifference;
-
- /** Flag indicating whether to use a chroma frequency map (12
- * bins) instead of the default warped spectrogram */
- bool useChromaFrequencyMap;
-
/** Spacing of audio frames (determines the amount of overlap or
* skip between frames). This value is expressed in
- * seconds. */
+ * seconds.
+ */
double hopTime;
-
- /** Size of an FFT frame in samples. Note that the data passed
- * in to Matcher is already in the frequency domain, so this
- * expresses the size of the frame that the caller will be
- * providing.
- */
- int fftSize;
-
+
/** The width of the search band (error margin) around the current
* match position, measured in seconds. Strictly speaking the
* width is measured backwards from the current point, since the
* algorithm has to work causally.
*/
double blockTime;
-
- /** RMS level below which frame is considered silent */
- double silenceThreshold;
-
- /** Frame-to-frame decay factor in calculating long-term average */
- double decay;
/** Maximum number of frames sequentially processed by this
* matcher, without a frame of the other matcher being
* processed.
*/
int maxRunCount;
+
+ /** Weight applied to cost of diagonal step relative to
+ * horizontal or vertical step. The default of 2.0 means that
+ * a diagonal is not favoured over horizontal+vertical
+ * combined, which is good when maintaining gross tracking of
+ * performances that may have wildly differing speeds but
+ * which also leads to quite jaggy paths. A more typical
+ * normal DTW approach for performances with similar speeds
+ * might use 1.0 or something close to it.
+ */
+ double diagonalWeight;
};
-protected:
- /** Points to the other performance with which this one is being
- * compared. The data for the distance metric and the dynamic
- * time warping is shared between the two matchers. In the
- * original version, only one of the two performance matchers
- * contained the distance metric. (See first
)
- */
- Matcher *otherMatcher;
-
- /** Indicates which performance is considered primary (the
- * score). This is the performance shown on the vertical axis,
- * and referred to as "this" in the codes for the direction of
- * DTW steps. */
- bool firstPM;
-
- /** Configuration parameters */
- Parameters params;
-
- /** Width of the search band in FFT frames (see blockTime
) */
- int blockSize;
-
- /** The number of frames of audio data which have been read. */
- int frameCount;
-
- /** Long term average frame energy (in frequency domain
- * representation). */
- double ltAverage;
-
- /** The number of frames sequentially processed by this matcher,
- * without a frame of the other matcher being processed.
- */
- int runCount;
-
- /** A mapping function for mapping FFT bins to final frequency
- * bins. The mapping is linear (1-1) until the resolution
- * reaches 2 points per semitone, then logarithmic with a
- * semitone resolution. e.g. for 44.1kHz sampling rate and
- * fftSize of 2048 (46ms), bin spacing is 21.5Hz, which is mapped
- * linearly for bins 0-34 (0 to 732Hz), and logarithmically for
- * the remaining bins (midi notes 79 to 127, bins 35 to 83),
- * where all energy above note 127 is mapped into the final
- * bin. */
- vector freqMap;
-
- /** The number of entries in freqMap
. */
- int freqMapSize;
-
- /** The number of values in an externally-supplied feature vector,
- * used in preference to freqMap/freqMapSize if constructed with
- * the external feature version of the Matcher constructor. If
- * this is zero, the internal feature extractor will be used as
- * normal.
- */
- int externalFeatureSize;
-
- /** The number of values in the feature vectors actually in
- * use. This will be externalFeatureSize if greater than zero, or
- * freqMapSize otherwise.
- */
- int featureSize;
-
- /** The most recent frame; used for calculating the frame to frame
- * spectral difference. These are therefore frequency warped but
- * not yet normalised. */
- vector prevFrame;
- vector newFrame;
-
- /** A block of previously seen frames are stored in this structure
- * for calculation of the distance matrix as the new frames are
- * read in. One can think of the structure of the array as a
- * circular buffer of vectors. These are the frames with all
- * applicable processing applied (e.g. spectral difference,
- * normalisation), unlike prevFrame and newFrame. The total
- * energy of frames[i] is stored in totalEnergies[i]. */
- vector > frames;
-
- /** The total energy of each frame in the frames block. */
- vector totalEnergies;
-
- /** The best path cost matrix. */
- int **bestPathCost;
-
- /** The distance matrix. */
- unsigned char **distance;
-
- /** The bounds of each row of data in the distance and path cost matrices.*/
- int *first;
- int *last;
-
- /** Height of each column in distance and bestPathCost matrices */
- int *distYSizes;
-
- /** Width of distance and bestPathCost matrices and first and last vectors */
- int distXSize;
-
- bool initialised;
-
- /** Disable or enable debugging output */
- static bool silent;
-
-public:
/** Constructor for Matcher.
+ *
+ * A Matcher expects to be provided with feature vectors
+ * calculated by some external code (for example, a
+ * FeatureExtractor). Call consumeFeatureVector to provide each
+ * feature frame.
*
* @param p The Matcher representing the performance with which
* this one is going to be matched. Some information is shared
* between the two matchers (currently one possesses the distance
* matrix and optimal path matrix).
*/
- Matcher(Parameters parameters, Matcher *p);
+ Matcher(Parameters params, DistanceMetric::Parameters dparams, Matcher *p);
- /** Constructor for Matcher using externally supplied features.
- * A Matcher made using this constructor will not carry out its
- * own feature extraction from frequency-domain audio data, but
- * instead will accept arbitrary feature frames calculated by
- * some external code.
- *
- * @param p The Matcher representing the performance with which
- * this one is going to be matched. Some information is shared
- * between the two matchers (currently one possesses the distance
- * matrix and optimal path matrix).
- *
- * @param featureSize Number of values in each feature vector.
+ /** Destructor for Matcher.
*/
- Matcher(Parameters parameters, Matcher *p, int featureSize);
-
~Matcher();
- /** For debugging, outputs information about the Matcher to
- * standard error.
- */
- void print();
-
/** Adds a link to the Matcher object representing the performance
* which is going to be matched to this one.
*
* @param p the Matcher representing the other performance
*/
void setOtherMatcher(Matcher *p) {
- otherMatcher = p;
- } // setOtherMatcher()
-
- int getFrameCount() {
- return frameCount;
+ m_otherMatcher = p;
}
- /**
- * Return the feature vector size that will be used for the given
- * parameters.
- */
- static int getFeatureSizeFor(Parameters params);
-
-protected:
- template
- void initVector(vector &vec, int sz, T dflt = 0) {
- vec.clear();
- while ((int)vec.size() < sz) vec.push_back(dflt);
+ int getBlockSize() {
+ return m_blockSize;
}
- template
- void initMatrix(vector > &mat, int hsz, int vsz,
- T dflt = 0, int fillTo = -1) {
- mat.clear();
- if (fillTo < 0) fillTo = hsz;
- for (int i = 0; i < hsz; ++i) {
- mat.push_back(vector());
- if (i < fillTo) {
- while ((int)mat[i].size() < vsz) {
- mat[i].push_back(dflt);
- }
- }
- }
+ bool isFillingInitialBlock() {
+ return m_frameCount < m_blockSize;
+ }
+
+ bool isOverrunning() {
+ return m_runCount >= m_params.maxRunCount;
+ }
+
+ int getFrameCount() {
+ return m_frameCount;
}
- void init();
+ int getOtherFrameCount() {
+ return m_otherMatcher->getFrameCount();
+ }
- void makeFreqMap();
+ double getDiagonalWeight() {
+ return m_params.diagonalWeight;
+ }
+
+ /** Processes a feature vector frame, presumably calculated from
+ * audio data by some external code such as a FeatureExtractor.
+ * Calculates the distance to all frames stored in the
+ * otherMatcher and stores in the distance matrix, before
+ * updating the optimal path matrix using the dynamic time
+ * warping algorithm.
+ *
+ * The supplied features must always be of the same size (within
+ * any pair of Matcher objects).
+ */
+ void consumeFeatureVector(const feature_t &feature);
+
+ /** Tests whether a location is in range in the minimum cost matrix.
+ *
+ * @param i the frame number of this Matcher
+ * @param j the frame number of the other Matcher
+ * @return true if the location is in range
+ */
+ bool isInRange(int i, int j);
- /** Creates a map of FFT frequency bins to comparison bins. Where
- * the spacing of FFT bins is less than 0.5 semitones, the
- * mapping is one to one. Where the spacing is greater than 0.5
- * semitones, the FFT energy is mapped into semitone-wide
- * bins. No scaling is performed; that is the energy is summed
- * into the comparison bins. See also consumeFrame()
+ /** Tests whether any locations in the given row are available.
*/
- void makeStandardFrequencyMap();
+ bool isRowAvailable(int i);
- void makeChromaFrequencyMap();
+ /** Tests whether any locations in the given column are available.
+ */
+ bool isColAvailable(int i);
+
+ /** Tests whether a location is available in the minimum cost matrix.
+ *
+ * @param i the frame number of this Matcher
+ * @param j the frame number of the other Matcher
+ * @return true if the location is in range and contains a valid cost
+ */
+ bool isAvailable(int i, int j);
- /** Processes a frame of audio data by first computing the STFT
- * with a Hamming window, then mapping the frequency bins into a
- * part-linear part-logarithmic array, then (optionally)
- * computing the half-wave rectified spectral difference from the
- * previous frame, then (optionally) normalising to a sum of 1,
- * then calculating the distance to all frames stored in the
- * otherMatcher and storing them in the distance matrix, and
- * finally updating the optimal path matrix using the dynamic
- * time warping algorithm.
+ /** Returns the valid range of columns for the given row, that is,
+ * the range of frames in the other Matcher for the given frame
+ * in this Matcher's minimum cost matrix.
*
- * Return value is the frame (post-processed, with warping,
- * rectification, and normalisation as appropriate).
+ * @param i the frame number of this Matcher
+ * @return the first, last pair of frame numbers for the other
+ * Matcher. Note that the last frame is exclusive (last valid
+ * frame + 1).
+ */
+ std::pair getColRange(int i);
+
+ /** Returns the valid range of rows for the given column, that is,
+ * the range of frames in this Matcher for the given frame in the
+ * other Matcher's minimum cost matrix.
*
- * The Matcher must have been constructed using the constructor
- * without an external featureSize parameter in order to use this
- * function. (Otherwise it will be expecting you to call
- * consumeFeatureVector.)
+ * @param i the frame number of the other Matcher
+ * @return the first, last pair of frame numbers for this
+ * Matcher. Note that the last frame is exclusive (last valid
+ * frame + 1).
*/
- std::vector consumeFrame(double *reBuffer, double *imBuffer);
+ std::pair getRowRange(int i);
+
+ /** Retrieves a value from the distance matrix.
+ *
+ * @param i the frame number of this Matcher
+ * @param j the frame number of the other Matcher
+ * @return the distance metric at this location
+ */
+ distance_t getDistance(int i, int j);
- /** Processes a feature vector frame (presumably calculated from
- * audio data by some external code). As consumeFrame, except
- * that it does not calculate a feature from audio data but
- * instead uses the supplied feature directly.
+ /** Sets a value to the distance matrix.
*
- * The Matcher must have been constructed using the constructor
- * that accepts an external featureSize parameter in order to
- * use this function. The supplied feature must be of the size
- * that was passed to the constructor.
+ * @param i the frame number of this Matcher
+ * @param j the frame number of the other Matcher
+ * @param value the distance metric to set for this location
*/
- void consumeFeatureVector(std::vector feature);
-
- /** Retrieves values from the minimum cost matrix.
+ void setDistance(int i, int j, distance_t distance);
+
+ /** Retrieves a value from the minimum cost matrix.
*
* @param i the frame number of this Matcher
* @param j the frame number of the other Matcher
* @return the cost of the minimum cost path to this location
*/
- int getValue(int i, int j, bool firstAttempt);
+ pathcost_t getPathCost(int i, int j);
- /** Stores entries in the distance matrix and the optimal path matrix.
+ /** Sets a value and an advance direction to the minimum cost matrix.
+ *
+ * @param i the frame number of this Matcher
+ * @param j the frame number of the other Matcher
+ * @param dir the direction from which this position is reached with
+ * minimum cost
+ * @param value the cost of the minimum cost path to set for this location
+ */
+ void setPathCost(int i, int j, advance_t dir, pathcost_t value);
+
+ /** Retrieves a value from the minimum cost matrix, normalised for
+ * path length.
+ *
+ * @param i the frame number of this Matcher
+ * @param j the frame number of the other Matcher
+ * @return the cost of the minimum cost path to this location,
+ * normalised by the Manhattan distance from 0,0 to i,j
+ */
+ normpathcost_t getNormalisedPathCost(int i, int j);
+
+ /** Retrieves an advance direction from the matrix.
+ *
+ * @param i the frame number of this Matcher
+ * @param j the frame number of the other Matcher
+ * @return the direction from which this position is reached with
+ * minimum cost
+ */
+ advance_t getAdvance(int i, int j);
+
+protected:
+ /** Create internal structures and reset. */
+ void init();
+
+ /** The distXSize value has changed: resize internal buffers. */
+ void size();
+
+ /** Updates an entry in the distance matrix and the optimal path matrix.
*
* @param i the frame number of this Matcher
* @param j the frame number of the other Matcher
@@ -367,17 +265,65 @@
* @param value the cost of the minimum path except the current step
* @param dMN the distance cost between the two frames
*/
- void setValue(int i, int j, int dir, int value, int dMN);
+ void updateValue(int i, int j, advance_t dir, pathcost_t value, distance_t dMN);
- vector processFrameFromFreqData(double *, double *);
void calcAdvance();
- DistanceMetric metric;
-
- friend class MatchFeeder;
- friend class MatchFeatureFeeder;
- friend class Finder;
+ /** Points to the other performance with which this one is being
+ * compared. The data for the distance metric and the dynamic
+ * time warping is shared between the two matchers. In the
+ * original version, only one of the two performance matchers
+ * contained the distance metric. (See first
)
+ */
+ Matcher *m_otherMatcher;
-}; // class Matcher
+ /** Indicates which performance is considered primary (the
+ * score). This is the performance shown on the vertical axis,
+ * and referred to as "this" in the codes for the direction of
+ * DTW steps. */
+ bool m_firstPM;
+
+ /** Configuration parameters */
+ Parameters m_params;
+
+ /** Width of the search band in FFT frames (see blockTime
) */
+ int m_blockSize;
+
+ /** The number of frames of audio data which have been read. */
+ int m_frameCount;
+
+ /** The number of frames sequentially processed by this matcher,
+ * without a frame of the other matcher being processed.
+ */
+ int m_runCount;
+
+ /** A block of previously seen feature frames is stored in this
+ * structure for calculation of the distance matrix as the new
+ * frames are received. One can think of the structure of the
+ * array as a circular buffer of vectors. */
+ featureseq_t m_features;
+
+ /** The best path cost matrix. */
+ pathcostmat_t m_bestPathCost;
+
+ /** The distance matrix. */
+ distancemat_t m_distance;
+
+ /** The advance direction matrix. */
+ advancemat_t m_advance;
+
+ /** The bounds of each row of data in the distance, path cost, and
+ * advance direction matrices.*/
+ vector m_first;
+ vector m_last;
+
+ /** Width of distance, path cost, and advance direction matrices
+ * and first and last vectors */
+ int m_distXSize;
+
+ bool m_initialised;
+
+ DistanceMetric m_metric;
+};
#endif
diff -r a68204b9a529 -r cca298ecfc72 src/Path.cpp
--- a/src/Path.cpp Fri Nov 14 10:24:13 2014 +0000
+++ b/src/Path.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -19,55 +19,55 @@
int
Path::smooth(std::vector &x, std::vector &y, int length)
{
- if (length == 0)
+ if (length <= 0)
return 0;
- while ((int)val.size() < length) {
- val.push_back(0);
- len.push_back(0);
+ while (m_val.size() < static_cast::size_type>(length)) {
+ m_val.push_back(0);
+ m_len.push_back(0);
}
int p = 0;
- val[0] = len[0] = 0;
+ m_val[0] = m_len[0] = 0;
for (int i = 1; i < length; i++) { // H = 1; V = 2; D = 3
int current = x[i] - x[i-1] + 2 * (y[i] - y[i-1]);
- if (current == val[p]) {
- len[p]++;
- } else if ((current == 3) || (val[p] == 0)) {
- val[++p] = current;
- len[p] = 1;
- } else if (val[p] + current == 3) { // 1 + 2
- if (--len[p] == 0)
+ if (current == m_val[p]) {
+ m_len[p]++;
+ } else if ((current == 3) || (m_val[p] == 0)) {
+ m_val[++p] = current;
+ m_len[p] = 1;
+ } else if (m_val[p] + current == 3) { // 1 + 2
+ if (--m_len[p] == 0)
p--;
- if (val[p] == 3)
- len[p]++;
+ if (m_val[p] == 3)
+ m_len[p]++;
else {
- val[++p] = 3;
- len[p] = 1;
+ m_val[++p] = 3;
+ m_len[p] = 1;
}
- } else { // val[p] == 3 && current != 3
- if ((val[p-1] == current) ||
- (val[p-1] == 0) ||
- (len[p] > MAX_RUN_LENGTH)) {
- val[++p] = current;
- len[p] = 1;
+ } else { // m_val[p] == 3 && current != 3
+ if ((m_val[p-1] == current) ||
+ (m_val[p-1] == 0) ||
+ (m_len[p] > MAX_RUN_LENGTH)) {
+ m_val[++p] = current;
+ m_len[p] = 1;
} else {
- if (--len[p-1] == 0) {
- val[p-1] = val[p];
- len[p-1] = len[p];
+ if (--m_len[p-1] == 0) {
+ m_val[p-1] = m_val[p];
+ m_len[p-1] = m_len[p];
p--;
- if (val[p-1] == 3) {
- len[p-1] += len[p];
+ if (m_val[p-1] == 3) {
+ m_len[p-1] += m_len[p];
p--;
}
}
- len[p]++;
+ m_len[p]++;
}
}
}
int i = 1;
for (int pp = 1; pp <= p; pp++) {
- int dx = val[pp] & 1;
- int dy = val[pp] >> 1;
- for (int j = len[pp]; j > 0; j--, i++) {
+ int dx = m_val[pp] & 1;
+ int dy = m_val[pp] >> 1;
+ for (int j = m_len[pp]; j > 0; j--, i++) {
x[i] = x[i-1] + dx;
y[i] = y[i-1] + dy;
}
diff -r a68204b9a529 -r cca298ecfc72 src/Path.h
--- a/src/Path.h Fri Nov 14 10:24:13 2014 +0000
+++ b/src/Path.h Fri Feb 27 09:29:37 2015 +0000
@@ -38,8 +38,8 @@
protected:
static const int MAX_RUN_LENGTH = 50;
- std::vector val;
- std::vector len;
+ std::vector m_val;
+ std::vector m_len;
};
#endif
diff -r a68204b9a529 -r cca298ecfc72 test/TestDistanceMetric.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/TestDistanceMetric.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,109 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+#include "DistanceMetric.h"
+
+#include
+#include
+#include
+
+using namespace std;
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MAIN
+
+#include
+
+static feature_t getTestFeature(double m)
+{
+ feature_t f;
+ int fd[] = { 0, 1, 2, 3 };
+ for (int i = 0; i < 4; ++i) {
+ f.push_back(featurebin_t(fd[i] * m));
+ }
+ return f;
+}
+
+BOOST_AUTO_TEST_SUITE(TestDistanceMetric)
+
+BOOST_AUTO_TEST_CASE(scale)
+{
+ DistanceMetric::Parameters params;
+ params.scale = 1.0;
+ DistanceMetric dm(params);
+
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0);
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 1);
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 2);
+
+ if (sizeof(distance_t) == 1) {
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), MaxDistance);
+ } else {
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), 256);
+ }
+
+ params.scale = 2.0;
+ dm = DistanceMetric(params);
+
+ if (sizeof(distance_t) == 1) {
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0);
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 2);
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 4);
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(128.0), MaxDistance);
+ } else {
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(0.0), 0);
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(1.0), 1);
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(2.0), 2);
+ BOOST_CHECK_EQUAL(dm.scaleValueIntoDistanceRange(256.0), 256);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(nonorm)
+{
+ DistanceMetric::Parameters params;
+ params.norm = DistanceMetric::NoDistanceNormalisation;
+ DistanceMetric dm(params);
+ feature_t
+ e1 = getTestFeature(1),
+ e2 = getTestFeature(2),
+ e0 = getTestFeature(0);
+
+ double noise = 1e-3 * 4;
+#ifdef USE_COMPACT_TYPES
+ noise = 1.0 / params.scale;
+#endif
+
+ BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), dm.scaleValueIntoDistanceRange(0.0 + noise));
+ BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), dm.scaleValueIntoDistanceRange(6.0 + noise));
+ BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), dm.scaleValueIntoDistanceRange(6.0 + noise));
+ BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), dm.scaleValueIntoDistanceRange(0.0 + noise));
+ BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), dm.scaleValueIntoDistanceRange(6.0 + noise));
+ BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), dm.scaleValueIntoDistanceRange(12.0 + noise));
+}
+
+BOOST_AUTO_TEST_CASE(sum)
+{
+ DistanceMetric::Parameters params;
+ params.norm = DistanceMetric::NormaliseDistanceToSum;
+ DistanceMetric dm(params);
+ feature_t
+ e1 = getTestFeature(1),
+ e2 = getTestFeature(2),
+ e0 = getTestFeature(0);
+
+ double noise = 1e-3 * 4;
+#ifdef USE_COMPACT_TYPES
+ noise = 1.0 / params.scale;
+#endif
+
+ BOOST_CHECK_EQUAL(dm.calcDistance(e0, e0), dm.scaleValueIntoDistanceRange(1.0));
+ BOOST_CHECK_EQUAL(dm.calcDistance(e1, e0), dm.scaleValueIntoDistanceRange(1.0));
+ BOOST_CHECK_EQUAL(dm.calcDistance(e0, e1), dm.scaleValueIntoDistanceRange(1.0));
+ BOOST_CHECK_EQUAL(dm.calcDistance(e1, e1), dm.scaleValueIntoDistanceRange(noise / (12.0 + noise)));
+ BOOST_CHECK_EQUAL(dm.calcDistance(e1, e2), dm.scaleValueIntoDistanceRange((6.0 + noise) / (18.0 + noise)));
+ BOOST_CHECK_EQUAL(dm.calcDistance(e0, e2), dm.scaleValueIntoDistanceRange(1.0));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+
+
diff -r a68204b9a529 -r cca298ecfc72 test/TestFeatureConditioner.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/TestFeatureConditioner.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,176 @@
+
+#include "FeatureConditioner.h"
+
+#include
+#include
+#include
+
+using namespace std;
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MAIN
+
+#include
+
+static feature_t getTestFeature(double m)
+{
+ feature_t f;
+ int fd[] = { 0, 1, 2, 3 };
+ for (int i = 0; i < 4; ++i) {
+ f.push_back(featurebin_t(fd[i] * m));
+ }
+ return f;
+}
+
+BOOST_AUTO_TEST_SUITE(TestFeatureConditioner)
+
+BOOST_AUTO_TEST_CASE(nonorm_features)
+{
+ FeatureConditioner::Parameters params;
+ params.norm = FeatureConditioner::NoNormalisation;
+ params.order = FeatureConditioner::OutputFeatures;
+ feature_t
+ e1 = getTestFeature(1),
+ e2 = getTestFeature(2),
+ e0 = getTestFeature(0);
+
+ params.silenceThreshold = 1.0;
+ FeatureConditioner fc(params);
+ feature_t out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e1.begin(), e1.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e2.begin(), e2.end());
+
+ params.silenceThreshold = 7.0;
+ fc = FeatureConditioner(params);
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e0.begin(), e0.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e2.begin(), e2.end());
+}
+
+BOOST_AUTO_TEST_CASE(nonorm_rectderiv)
+{
+ FeatureConditioner::Parameters params;
+ params.norm = FeatureConditioner::NoNormalisation;
+ params.order = FeatureConditioner::OutputRectifiedDerivative;
+ feature_t
+ e1 = getTestFeature(1),
+ e2 = getTestFeature(2),
+ e0 = getTestFeature(0);
+
+ params.silenceThreshold = 1.0;
+ FeatureConditioner fc(params);
+ feature_t out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e1.begin(), e1.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e1.begin(), e1.end());
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e0.begin(), e0.end());
+
+ params.silenceThreshold = 7.0;
+ fc = FeatureConditioner(params);
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e0.begin(), e0.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e1.begin(), e1.end());
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e0.begin(), e0.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e1.begin(), e1.end());
+}
+
+BOOST_AUTO_TEST_CASE(nonorm_deriv)
+{
+ FeatureConditioner::Parameters params;
+ params.norm = FeatureConditioner::NoNormalisation;
+ params.order = FeatureConditioner::OutputDerivative;
+ feature_t
+ e1 = getTestFeature(1),
+ e2 = getTestFeature(2),
+ e3 = getTestFeature(3),
+ e0 = getTestFeature(0);
+
+ params.silenceThreshold = 1.0;
+ FeatureConditioner fc(params);
+ feature_t out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e1.begin(), e1.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e1.begin(), e1.end());
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e1.begin(), e1.end());
+
+ params.silenceThreshold = 7.0;
+ fc = FeatureConditioner(params);
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e0.begin(), e0.end());
+ out = fc.process(e3);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e2.begin(), e2.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e1.begin(), e1.end());
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e0.begin(), e0.end());
+}
+
+BOOST_AUTO_TEST_CASE(sum1_features)
+{
+ FeatureConditioner::Parameters params;
+ params.norm = FeatureConditioner::NormaliseToSum1;
+ params.order = FeatureConditioner::OutputFeatures;
+ feature_t
+ e1 = getTestFeature(1),
+ e2 = getTestFeature(2),
+ en = getTestFeature(1.0/6.0),
+ e0 = getTestFeature(0);
+
+ params.silenceThreshold = 1.0;
+ FeatureConditioner fc(params);
+ feature_t out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), en.begin(), en.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), en.begin(), en.end());
+
+ params.silenceThreshold = 7.0;
+ fc = FeatureConditioner(params);
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e0.begin(), e0.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), en.begin(), en.end());
+}
+
+BOOST_AUTO_TEST_CASE(sum1_rectderiv)
+{
+ FeatureConditioner::Parameters params;
+ params.norm = FeatureConditioner::NormaliseToSum1;
+ params.order = FeatureConditioner::OutputRectifiedDerivative;
+ feature_t
+ e1 = getTestFeature(1),
+ e2 = getTestFeature(2),
+ en = getTestFeature(1.0/6.0),
+ en2 = getTestFeature(1.0/12.0),
+ e0 = getTestFeature(0);
+
+ params.silenceThreshold = 1.0;
+ FeatureConditioner fc(params);
+ feature_t out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), en.begin(), en.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), en2.begin(), en2.end());
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e0.begin(), e0.end());
+
+ params.silenceThreshold = 7.0;
+ fc = FeatureConditioner(params);
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e0.begin(), e0.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), en2.begin(), en2.end());
+ out = fc.process(e1);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), e0.begin(), e0.end());
+ out = fc.process(e2);
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), en2.begin(), en2.end());
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
+
diff -r a68204b9a529 -r cca298ecfc72 test/TestFeatureExtractor.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/TestFeatureExtractor.cpp Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,206 @@
+
+#include "FeatureExtractor.h"
+
+#include
+#include
+#include
+
+using namespace std;
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MAIN
+
+#include
+
+static int freq2mid(double freq)
+{
+ return int(round(57.0 + 12.0 * log(freq / 220.) / log(2.)));
+}
+
+static int freq2chroma(double freq)
+{
+ return freq2mid(freq) % 12;
+}
+
+static int bin2warped(int bin, int rate, int sz)
+{
+ // see comments in nonchroma below
+ if (bin <= 33) return bin;
+ double freq = (double(bin) * rate) / sz;
+ int mid = freq2mid(freq);
+ if (mid > 127) mid = 127;
+ int outbin = mid - 77 + 33;
+ return outbin;
+}
+
+BOOST_AUTO_TEST_SUITE(TestFeatureExtractor)
+
+void checkAlternateProcessType(FeatureExtractor &fe, feature_t expected,
+ vector real, vector imag)
+{
+ vector in;
+ for (size_t i = 0; i < real.size(); ++i) {
+ in.push_back(float(real[i]));
+ in.push_back(float(imag[i]));
+ }
+ feature_t alt = fe.process(&in[0]);
+ BOOST_CHECK_EQUAL_COLLECTIONS(alt.begin(), alt.end(),
+ expected.begin(), expected.end());
+}
+
+BOOST_AUTO_TEST_CASE(chroma)
+{
+ int szs[] = { 1024, 2048, 4000 };
+ int rates[] = { 44100, 48000 };
+
+ for (int irate = 0; irate < int(sizeof(rates)/sizeof(rates[0])); ++irate) {
+
+ int rate = rates[irate];
+
+ for (int isz = 0; isz < int(sizeof(szs)/sizeof(szs[0])); ++isz) {
+
+ int sz = szs[isz];
+
+ int hs = sz / 2 + 1;
+ int fsz = 13;
+
+ FeatureExtractor::Parameters params(float(rate), sz);
+ params.useChromaFrequencyMap = true;
+ params.minFrequency = 0;
+ FeatureExtractor fe(params);
+ BOOST_CHECK_EQUAL(fe.getFeatureSize(), fsz);
+
+ for (int bin = 0; bin < hs; ++bin) {
+
+ vector real, imag;
+ real.resize(hs, 0.0);
+ imag.resize(hs, 0.0);
+
+ real[bin] += 10.0;
+ imag[bin] += 10.0;
+
+ // use two input sweeps, so we can test that they are
+ // properly summed into the output bin
+ real[hs-bin-1] += 5.0;
+ imag[hs-bin-1] += 5.0;
+
+ feature_t out = fe.process(real, imag);
+
+ checkAlternateProcessType(fe, out, real, imag);
+
+ // We expect to find all bins are 0 except for:
+ //
+ // * two bins of 200 and 50 respectively, if the two input
+ // bins are distinct and their output chroma are also distinct
+ //
+ // * one bin of value 250 (= 10^2 + 5^2), if the two input
+ // bins are distinct but their output chroma are not
+ //
+ // * one bin of value 450 (= 15^2 + 15^2), if the input bins
+ // are not distinct (the feature extractor sums energies
+ // rather than magnitudes so as to integrate energy for a
+ // partial in the face of spectral leakage)
+ //
+ // The bin corresponding to each input frequency is
+ // that of its semitone value (with C=0), except that
+ // input bins less than the 17th are shepherded into
+ // the separate bin 0 (see docs in FeatureExtractor.h)
+
+ double cutoff = (17.0 * rate) / sz;
+
+ feature_t expected(fsz);
+
+ double infreq1 = (double(bin) * rate) / sz;
+
+ if (bin == hs-bin-1) {
+ expected[freq2chroma(infreq1) + 1] += 450;
+ } else {
+ if (infreq1 < cutoff) {
+ expected[0] += 200;
+ } else {
+ expected[freq2chroma(infreq1) + 1] += 200;
+ }
+ double infreq2 = (double(hs-bin-1) * rate) / sz;
+ if (infreq2 < cutoff) {
+ expected[0] += 50;
+ } else {
+ expected[freq2chroma(infreq2) + 1] += 50;
+ }
+ }
+
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(),
+ expected.begin(), expected.end());
+ }
+ }
+ }
+}
+
+BOOST_AUTO_TEST_CASE(nonchroma)
+{
+ int rate = 44100;
+ int sz = 2048;
+ int hs = sz / 2 + 1;
+ int fsz = 84;
+
+ FeatureExtractor::Parameters params(float(rate), sz);
+ params.minFrequency = 0;
+ FeatureExtractor fe(params);
+ BOOST_CHECK_EQUAL(fe.getFeatureSize(), fsz);
+
+ for (int bin = 0; bin < hs; ++bin) {
+
+ vector real, imag;
+ real.resize(hs, 0.0);
+ imag.resize(hs, 0.0);
+
+ real[bin] += 10.0;
+ imag[bin] += 10.0;
+
+ // use two input sweeps, so we can test that they are properly
+ // summed into the output bin
+ real[hs-bin-1] += 5.0;
+ imag[hs-bin-1] += 5.0;
+
+ feature_t out = fe.process(real, imag);
+
+ checkAlternateProcessType(fe, out, real, imag);
+
+ // We expect to find all bins are 0 except for:
+ //
+ // * two bins of 200 and 50 respectively, if the two input
+ // bins are distinct and their output bins are also distinct
+ //
+ // * one bin of value 250 (= 10^2 + 5^2), if the two input
+ // bins are distinct but their output bins are not
+ //
+ // * one bin of value 450 (= 15^2 + 15^2), if the input bins
+ // are not distinct (the feature extractor sums energies
+ // rather than magnitudes so as to integrate energy for a
+ // partial in the face of spectral leakage)
+ //
+ // The first 34 input bins (i.e. up to and including bin 33,
+ // 733Hz, MIDI pitch 77.something) are mapped linearly, those
+ // above that and up to MIDI pitch 127 (12544Hz) are mapped
+ // logarithmically, remaining bins are all mapped into the
+ // final output bin.
+ //
+ // So MIDI pitches up to and including 77 are mapped linearly
+ // by frequency into 34 bins; those from 78-126 inclusive are
+ // mapped linearly by MIDI pitch into the next 49 bins;
+ // everything above goes into the last bin, for 84 bins total.
+
+ feature_t expected(fsz);
+
+ if (bin == hs-bin-1) {
+ expected[bin2warped(bin, rate, sz)] += 450;
+ } else {
+ expected[bin2warped(bin, rate, sz)] += 200;
+ expected[bin2warped(hs-bin-1, rate, sz)] += 50;
+ }
+
+ BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(),
+ expected.begin(), expected.end());
+ }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff -r a68204b9a529 -r cca298ecfc72 test/expected.csv
--- a/test/expected.csv Fri Nov 14 10:24:13 2014 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5369 +0,0 @@
-0.000000000,0.02
-0.000000000,0.04
-0.000000000,0.06
-0.000000000,0.08
-0.000000000,0.1
-0.000000000,0.12
-0.000000000,0.14
-0.000000000,0.16
-0.000000000,0.18
-0.000000000,0.2
-0.000000000,0.22
-0.000000000,0.24
-0.000000000,0.26
-0.000000000,0.28
-0.000000000,0.3
-0.000000000,0.32
-0.000000000,0.34
-0.000000000,0.36
-0.000000000,0.38
-0.000000000,0.4
-0.000000000,0.42
-0.000000000,0.44
-0.000000000,0.46
-0.000000000,0.48
-0.000000000,0.5
-0.000000000,0.52
-0.000000000,0.54
-0.000000000,0.56
-0.000000000,0.58
-0.000000000,0.6
-0.000000000,0.62
-0.000000000,0.64
-0.000000000,0.66
-0.000000000,0.68
-0.000000000,0.7
-0.000000000,0.72
-0.000000000,0.74
-0.000000000,0.76
-0.000000000,0.78
-0.000000000,0.8
-0.000000000,0.82
-0.000000000,0.84
-0.000000000,0.86
-0.000000000,0.88
-0.000000000,0.9
-0.000000000,0.92
-0.000000000,0.94
-0.000000000,0.96
-0.000000000,0.98
-0.000000000,1
-0.000000000,1.02
-0.000000000,1.04
-0.000000000,1.06
-0.000000000,1.08
-0.000000000,1.1
-0.000000000,1.12
-0.000000000,1.14
-0.000000000,1.16
-0.000000000,1.18
-0.000000000,1.2
-0.000000000,1.22
-0.000000000,1.24
-0.000000000,1.26
-0.000000000,1.28
-0.000000000,1.3
-0.000000000,1.32
-0.000000000,1.34
-0.000000000,1.36
-0.000000000,1.38
-0.000000000,1.4
-0.000000000,1.42
-0.000000000,1.44
-0.000000000,1.46
-0.000000000,1.48
-0.000000000,1.5
-0.000000000,1.52
-0.000000000,1.54
-0.000000000,1.56
-0.020000000,1.58
-0.040000000,1.6
-0.060000000,1.62
-0.080000000,1.64
-0.100000000,1.66
-0.120000000,1.68
-0.140000000,1.7
-0.160000000,1.72
-0.180000000,1.74
-0.200000000,1.76
-0.220000000,1.78
-0.240000000,1.8
-0.260000000,1.82
-0.280000000,1.84
-0.300000000,1.86
-0.320000000,1.88
-0.340000000,1.9
-0.360000000,1.92
-0.380000000,1.94
-0.400000000,1.96
-0.420000000,1.98
-0.440000000,2
-0.460000000,2.02
-0.480000000,2.04
-0.500000000,2.06
-0.520000000,2.08
-0.540000000,2.1
-0.560000000,2.12
-0.580000000,2.14
-0.600000000,2.16
-0.620000000,2.18
-0.640000000,2.2
-0.660000000,2.22
-0.680000000,2.24
-0.700000000,2.26
-0.720000000,2.28
-0.740000000,2.3
-0.760000000,2.32
-0.780000000,2.34
-0.800000000,2.36
-0.820000000,2.38
-0.840000000,2.4
-0.860000000,2.42
-0.880000000,2.44
-0.900000000,2.46
-0.920000000,2.48
-0.940000000,2.5
-0.960000000,2.52
-0.980000000,2.54
-1.000000000,2.56
-1.020000000,2.58
-1.040000000,2.6
-1.060000000,2.62
-1.080000000,2.64
-1.100000000,2.64
-1.120000000,2.64
-1.140000000,2.66
-1.160000000,2.68
-1.180000000,2.7
-1.200000000,2.72
-1.220000000,2.74
-1.240000000,2.76
-1.260000000,2.78
-1.280000000,2.8
-1.300000000,2.82
-1.320000000,2.84
-1.340000000,2.86
-1.360000000,2.88
-1.380000000,2.9
-1.400000000,2.92
-1.420000000,2.94
-1.440000000,2.96
-1.460000000,2.98
-1.480000000,3
-1.500000000,3.02
-1.520000000,3.04
-1.540000000,3.06
-1.560000000,3.08
-1.580000000,3.1
-1.600000000,3.12
-1.620000000,3.12
-1.640000000,3.12
-1.660000000,3.12
-1.680000000,3.12
-1.700000000,3.12
-1.720000000,3.12
-1.740000000,3.12
-1.760000000,3.12
-1.780000000,3.12
-1.800000000,3.12
-1.820000000,3.14
-1.840000000,3.16
-1.860000000,3.18
-1.880000000,3.2
-1.900000000,3.22
-1.920000000,3.24
-1.940000000,3.26
-1.960000000,3.28
-1.980000000,3.3
-2.000000000,3.32
-2.020000000,3.34
-2.040000000,3.36
-2.060000000,3.38
-2.080000000,3.4
-2.100000000,3.42
-2.120000000,3.44
-2.140000000,3.46
-2.160000000,3.48
-2.180000000,3.5
-2.200000000,3.52
-2.220000000,3.54
-2.240000000,3.56
-2.260000000,3.58
-2.280000000,3.6
-2.300000000,3.62
-2.320000000,3.64
-2.340000000,3.66
-2.360000000,3.68
-2.380000000,3.7
-2.400000000,3.72
-2.420000000,3.74
-2.440000000,3.76
-2.460000000,3.78
-2.480000000,3.8
-2.500000000,3.82
-2.520000000,3.84
-2.540000000,3.86
-2.560000000,3.88
-2.580000000,3.88
-2.600000000,3.88
-2.620000000,3.88
-2.640000000,3.88
-2.660000000,3.88
-2.680000000,3.88
-2.700000000,3.88
-2.720000000,3.88
-2.740000000,3.88
-2.760000000,3.88
-2.780000000,3.88
-2.800000000,3.9
-2.820000000,3.92
-2.840000000,3.94
-2.860000000,3.96
-2.880000000,3.98
-2.900000000,4
-2.920000000,4.02
-2.940000000,4.04
-2.960000000,4.06
-2.980000000,4.08
-3.000000000,4.1
-3.020000000,4.12
-3.040000000,4.14
-3.060000000,4.16
-3.080000000,4.18
-3.100000000,4.2
-3.120000000,4.22
-3.140000000,4.24
-3.160000000,4.26
-3.180000000,4.28
-3.200000000,4.3
-3.220000000,4.32
-3.240000000,4.34
-3.260000000,4.36
-3.280000000,4.38
-3.300000000,4.4
-3.320000000,4.42
-3.340000000,4.44
-3.360000000,4.46
-3.380000000,4.48
-3.400000000,4.5
-3.420000000,4.52
-3.440000000,4.54
-3.460000000,4.56
-3.480000000,4.58
-3.500000000,4.6
-3.520000000,4.62
-3.540000000,4.62
-3.560000000,4.62
-3.580000000,4.62
-3.600000000,4.64
-3.620000000,4.66
-3.640000000,4.68
-3.660000000,4.7
-3.680000000,4.72
-3.700000000,4.74
-3.720000000,4.76
-3.740000000,4.78
-3.760000000,4.8
-3.780000000,4.82
-3.800000000,4.84
-3.820000000,4.86
-3.840000000,4.88
-3.860000000,4.9
-3.880000000,4.9
-3.900000000,4.92
-3.920000000,4.92
-3.940000000,4.92
-3.960000000,4.92
-3.980000000,4.92
-4.000000000,4.92
-4.020000000,4.92
-4.040000000,4.92
-4.060000000,4.92
-4.080000000,4.92
-4.100000000,4.92
-4.120000000,4.92
-4.140000000,4.92
-4.160000000,4.92
-4.180000000,4.92
-4.200000000,4.92
-4.220000000,4.94
-4.240000000,4.96
-4.260000000,4.98
-4.280000000,5
-4.300000000,5.02
-4.320000000,5.04
-4.340000000,5.06
-4.360000000,5.08
-4.380000000,5.1
-4.400000000,5.1
-4.420000000,5.1
-4.440000000,5.12
-4.460000000,5.14
-4.480000000,5.16
-4.500000000,5.18
-4.520000000,5.2
-4.540000000,5.22
-4.560000000,5.24
-4.580000000,5.26
-4.600000000,5.28
-4.620000000,5.3
-4.640000000,5.32
-4.660000000,5.32
-4.680000000,5.32
-4.700000000,5.32
-4.720000000,5.32
-4.740000000,5.34
-4.760000000,5.36
-4.780000000,5.36
-4.800000000,5.36
-4.820000000,5.36
-4.840000000,5.36
-4.860000000,5.38
-4.880000000,5.4
-4.900000000,5.4
-4.920000000,5.42
-4.940000000,5.44
-4.960000000,5.46
-4.980000000,5.48
-5.000000000,5.5
-5.020000000,5.52
-5.040000000,5.54
-5.060000000,5.56
-5.080000000,5.56
-5.100000000,5.58
-5.120000000,5.58
-5.140000000,5.58
-5.160000000,5.6
-5.180000000,5.62
-5.200000000,5.64
-5.220000000,5.66
-5.240000000,5.68
-5.260000000,5.7
-5.280000000,5.72
-5.300000000,5.74
-5.320000000,5.76
-5.340000000,5.78
-5.360000000,5.78
-5.380000000,5.8
-5.400000000,5.82
-5.420000000,5.82
-5.440000000,5.82
-5.460000000,5.82
-5.480000000,5.82
-5.500000000,5.82
-5.520000000,5.84
-5.540000000,5.86
-5.560000000,5.88
-5.580000000,5.9
-5.600000000,5.92
-5.620000000,5.94
-5.640000000,5.96
-5.660000000,5.98
-5.680000000,6
-5.700000000,6.02
-5.720000000,6.04
-5.740000000,6.06
-5.760000000,6.08
-5.780000000,6.1
-5.800000000,6.12
-5.820000000,6.12
-5.840000000,6.12
-5.860000000,6.12
-5.880000000,6.14
-5.900000000,6.16
-5.920000000,6.18
-5.940000000,6.2
-5.960000000,6.22
-5.980000000,6.24
-6.000000000,6.26
-6.020000000,6.28
-6.040000000,6.3
-6.060000000,6.32
-6.080000000,6.34
-6.100000000,6.36
-6.120000000,6.38
-6.140000000,6.4
-6.160000000,6.42
-6.180000000,6.44
-6.200000000,6.46
-6.220000000,6.48
-6.240000000,6.5
-6.260000000,6.52
-6.280000000,6.54
-6.300000000,6.56
-6.320000000,6.58
-6.340000000,6.6
-6.360000000,6.62
-6.380000000,6.64
-6.400000000,6.66
-6.420000000,6.68
-6.440000000,6.7
-6.460000000,6.72
-6.480000000,6.74
-6.500000000,6.76
-6.520000000,6.78
-6.540000000,6.8
-6.560000000,6.82
-6.580000000,6.84
-6.600000000,6.86
-6.620000000,6.88
-6.640000000,6.9
-6.660000000,6.92
-6.680000000,6.94
-6.700000000,6.96
-6.720000000,6.98
-6.740000000,7
-6.760000000,7.02
-6.780000000,7.04
-6.800000000,7.06
-6.820000000,7.08
-6.840000000,7.1
-6.860000000,7.12
-6.880000000,7.14
-6.900000000,7.16
-6.920000000,7.18
-6.940000000,7.2
-6.960000000,7.22
-6.980000000,7.24
-7.000000000,7.26
-7.020000000,7.28
-7.040000000,7.3
-7.060000000,7.32
-7.080000000,7.34
-7.100000000,7.36
-7.120000000,7.38
-7.140000000,7.4
-7.160000000,7.42
-7.180000000,7.44
-7.200000000,7.46
-7.220000000,7.48
-7.240000000,7.5
-7.260000000,7.52
-7.280000000,7.54
-7.300000000,7.56
-7.320000000,7.58
-7.340000000,7.6
-7.360000000,7.62
-7.380000000,7.64
-7.400000000,7.66
-7.420000000,7.68
-7.440000000,7.7
-7.460000000,7.72
-7.480000000,7.74
-7.500000000,7.76
-7.520000000,7.78
-7.540000000,7.8
-7.560000000,7.82
-7.580000000,7.82
-7.600000000,7.82
-7.620000000,7.82
-7.640000000,7.82
-7.660000000,7.82
-7.680000000,7.82
-7.700000000,7.82
-7.720000000,7.82
-7.740000000,7.82
-7.760000000,7.82
-7.780000000,7.82
-7.800000000,7.82
-7.820000000,7.82
-7.840000000,7.82
-7.860000000,7.82
-7.880000000,7.82
-7.900000000,7.82
-7.920000000,7.82
-7.940000000,7.82
-7.960000000,7.82
-7.980000000,7.82
-8.000000000,7.84
-8.020000000,7.84
-8.040000000,7.84
-8.060000000,7.84
-8.080000000,7.84
-8.100000000,7.84
-8.120000000,7.84
-8.140000000,7.84
-8.160000000,7.84
-8.180000000,7.84
-8.200000000,7.86
-8.220000000,7.88
-8.240000000,7.9
-8.260000000,7.92
-8.280000000,7.94
-8.300000000,7.96
-8.320000000,7.98
-8.340000000,7.98
-8.360000000,7.98
-8.380000000,7.98
-8.400000000,7.98
-8.420000000,8
-8.440000000,8.02
-8.460000000,8.04
-8.480000000,8.06
-8.500000000,8.08
-8.520000000,8.1
-8.540000000,8.12
-8.560000000,8.14
-8.580000000,8.16
-8.600000000,8.18
-8.620000000,8.2
-8.640000000,8.2
-8.660000000,8.2
-8.680000000,8.2
-8.700000000,8.2
-8.720000000,8.2
-8.740000000,8.2
-8.760000000,8.22
-8.780000000,8.24
-8.800000000,8.26
-8.820000000,8.26
-8.840000000,8.26
-8.860000000,8.28
-8.880000000,8.28
-8.900000000,8.28
-8.920000000,8.3
-8.940000000,8.3
-8.960000000,8.32
-8.980000000,8.34
-9.000000000,8.36
-9.020000000,8.36
-9.040000000,8.36
-9.060000000,8.36
-9.080000000,8.36
-9.100000000,8.36
-9.120000000,8.36
-9.140000000,8.36
-9.160000000,8.36
-9.180000000,8.36
-9.200000000,8.36
-9.220000000,8.36
-9.240000000,8.36
-9.260000000,8.36
-9.280000000,8.36
-9.300000000,8.36
-9.320000000,8.36
-9.340000000,8.36
-9.360000000,8.36
-9.380000000,8.36
-9.400000000,8.36
-9.420000000,8.36
-9.440000000,8.36
-9.460000000,8.36
-9.480000000,8.36
-9.500000000,8.36
-9.520000000,8.36
-9.540000000,8.36
-9.560000000,8.36
-9.580000000,8.36
-9.600000000,8.36
-9.620000000,8.36
-9.640000000,8.36
-9.660000000,8.36
-9.680000000,8.36
-9.700000000,8.36
-9.720000000,8.36
-9.740000000,8.36
-9.760000000,8.36
-9.780000000,8.36
-9.800000000,8.36
-9.820000000,8.36
-9.840000000,8.36
-9.860000000,8.36
-9.880000000,8.36
-9.900000000,8.36
-9.920000000,8.36
-9.940000000,8.36
-9.960000000,8.36
-9.980000000,8.36
-10.000000000,8.36
-10.020000000,8.36
-10.040000000,8.36
-10.060000000,8.36
-10.080000000,8.36
-10.100000000,8.36
-10.120000000,8.36
-10.140000000,8.36
-10.160000000,8.36
-10.180000000,8.36
-10.200000000,8.36
-10.220000000,8.36
-10.240000000,8.36
-10.260000000,8.36
-10.280000000,8.38
-10.300000000,8.4
-10.320000000,8.42
-10.340000000,8.44
-10.360000000,8.46
-10.380000000,8.48
-10.400000000,8.5
-10.420000000,8.52
-10.440000000,8.54
-10.460000000,8.54
-10.480000000,8.56
-10.500000000,8.56
-10.520000000,8.56
-10.540000000,8.56
-10.560000000,8.56
-10.580000000,8.56
-10.600000000,8.56
-10.620000000,8.56
-10.640000000,8.58
-10.660000000,8.6
-10.680000000,8.6
-10.700000000,8.62
-10.720000000,8.62
-10.740000000,8.62
-10.760000000,8.64
-10.780000000,8.66
-10.800000000,8.68
-10.820000000,8.7
-10.840000000,8.7
-10.860000000,8.7
-10.880000000,8.72
-10.900000000,8.74
-10.920000000,8.76
-10.940000000,8.76
-10.960000000,8.76
-10.980000000,8.78
-11.000000000,8.78
-11.020000000,8.78
-11.040000000,8.8
-11.060000000,8.8
-11.080000000,8.82
-11.100000000,8.82
-11.120000000,8.82
-11.140000000,8.82
-11.160000000,8.82
-11.180000000,8.82
-11.200000000,8.82
-11.220000000,8.82
-11.240000000,8.82
-11.260000000,8.82
-11.280000000,8.82
-11.300000000,8.82
-11.320000000,8.82
-11.340000000,8.82
-11.360000000,8.82
-11.380000000,8.82
-11.400000000,8.82
-11.420000000,8.82
-11.440000000,8.84
-11.460000000,8.84
-11.480000000,8.84
-11.500000000,8.84
-11.520000000,8.84
-11.540000000,8.84
-11.560000000,8.84
-11.580000000,8.84
-11.600000000,8.84
-11.620000000,8.84
-11.640000000,8.86
-11.660000000,8.86
-11.680000000,8.86
-11.700000000,8.88
-11.720000000,8.88
-11.740000000,8.88
-11.760000000,8.88
-11.780000000,8.88
-11.800000000,8.88
-11.820000000,8.88
-11.840000000,8.88
-11.860000000,8.88
-11.880000000,8.88
-11.900000000,8.88
-11.920000000,8.88
-11.940000000,8.88
-11.960000000,8.88
-11.980000000,8.88
-12.000000000,8.88
-12.020000000,8.88
-12.040000000,8.88
-12.060000000,8.88
-12.080000000,8.88
-12.100000000,8.88
-12.120000000,8.88
-12.140000000,8.88
-12.160000000,8.88
-12.180000000,8.88
-12.200000000,8.88
-12.220000000,8.88
-12.240000000,8.88
-12.260000000,8.88
-12.280000000,8.88
-12.300000000,8.88
-12.320000000,8.88
-12.340000000,8.88
-12.360000000,8.88
-12.380000000,8.88
-12.400000000,8.88
-12.420000000,8.88
-12.440000000,8.88
-12.460000000,8.88
-12.480000000,8.88
-12.500000000,8.88
-12.520000000,8.88
-12.540000000,8.9
-12.560000000,8.92
-12.580000000,8.94
-12.600000000,8.96
-12.620000000,8.98
-12.640000000,8.98
-12.660000000,9
-12.680000000,9
-12.700000000,9
-12.720000000,9
-12.740000000,9
-12.760000000,9
-12.780000000,9
-12.800000000,9
-12.820000000,9
-12.840000000,9
-12.860000000,9
-12.880000000,9
-12.900000000,9.02
-12.920000000,9.04
-12.940000000,9.06
-12.960000000,9.08
-12.980000000,9.1
-13.000000000,9.12
-13.020000000,9.14
-13.040000000,9.16
-13.060000000,9.18
-13.080000000,9.2
-13.100000000,9.22
-13.120000000,9.24
-13.140000000,9.26
-13.160000000,9.28
-13.180000000,9.3
-13.200000000,9.3
-13.220000000,9.32
-13.240000000,9.34
-13.260000000,9.36
-13.280000000,9.38
-13.300000000,9.38
-13.320000000,9.38
-13.340000000,9.38
-13.360000000,9.4
-13.380000000,9.42
-13.400000000,9.44
-13.420000000,9.46
-13.440000000,9.48
-13.460000000,9.5
-13.480000000,9.52
-13.500000000,9.52
-13.520000000,9.54
-13.540000000,9.56
-13.560000000,9.58
-13.580000000,9.58
-13.600000000,9.58
-13.620000000,9.58
-13.640000000,9.58
-13.660000000,9.58
-13.680000000,9.58
-13.700000000,9.58
-13.720000000,9.58
-13.740000000,9.6
-13.760000000,9.62
-13.780000000,9.62
-13.800000000,9.62
-13.820000000,9.64
-13.840000000,9.66
-13.860000000,9.68
-13.880000000,9.68
-13.900000000,9.68
-13.920000000,9.68
-13.940000000,9.68
-13.960000000,9.68
-13.980000000,9.68
-14.000000000,9.68
-14.020000000,9.68
-14.040000000,9.68
-14.060000000,9.7
-14.080000000,9.72
-14.100000000,9.74
-14.120000000,9.74
-14.140000000,9.74
-14.160000000,9.74
-14.180000000,9.74
-14.200000000,9.74
-14.220000000,9.74
-14.240000000,9.76
-14.260000000,9.76
-14.280000000,9.76
-14.300000000,9.78
-14.320000000,9.8
-14.340000000,9.8
-14.360000000,9.8
-14.380000000,9.82
-14.400000000,9.84
-14.420000000,9.84
-14.440000000,9.84
-14.460000000,9.84
-14.480000000,9.84
-14.500000000,9.84
-14.520000000,9.84
-14.540000000,9.84
-14.560000000,9.84
-14.580000000,9.84
-14.600000000,9.84
-14.620000000,9.84
-14.640000000,9.84
-14.660000000,9.84
-14.680000000,9.84
-14.700000000,9.84
-14.720000000,9.84
-14.740000000,9.84
-14.760000000,9.84
-14.780000000,9.84
-14.800000000,9.84
-14.820000000,9.84
-14.840000000,9.86
-14.860000000,9.86
-14.880000000,9.86
-14.900000000,9.86
-14.920000000,9.86
-14.940000000,9.86
-14.960000000,9.86
-14.980000000,9.86
-15.000000000,9.86
-15.020000000,9.86
-15.040000000,9.86
-15.060000000,9.86
-15.080000000,9.86
-15.100000000,9.88
-15.120000000,9.88
-15.140000000,9.88
-15.160000000,9.88
-15.180000000,9.88
-15.200000000,9.88
-15.220000000,9.88
-15.240000000,9.9
-15.260000000,9.92
-15.280000000,9.92
-15.300000000,9.92
-15.320000000,9.92
-15.340000000,9.94
-15.360000000,9.96
-15.380000000,9.98
-15.400000000,10
-15.420000000,10.02
-15.440000000,10.04
-15.460000000,10.04
-15.480000000,10.04
-15.500000000,10.04
-15.520000000,10.04
-15.540000000,10.04
-15.560000000,10.04
-15.580000000,10.04
-15.600000000,10.04
-15.620000000,10.04
-15.640000000,10.04
-15.660000000,10.04
-15.680000000,10.04
-15.700000000,10.04
-15.720000000,10.04
-15.740000000,10.04
-15.760000000,10.04
-15.780000000,10.04
-15.800000000,10.04
-15.820000000,10.04
-15.840000000,10.04
-15.860000000,10.04
-15.880000000,10.06
-15.900000000,10.08
-15.920000000,10.1
-15.940000000,10.12
-15.960000000,10.14
-15.980000000,10.16
-16.000000000,10.18
-16.020000000,10.2
-16.040000000,10.22
-16.060000000,10.24
-16.080000000,10.26
-16.100000000,10.28
-16.120000000,10.3
-16.140000000,10.32
-16.160000000,10.34
-16.180000000,10.34
-16.200000000,10.36
-16.220000000,10.38
-16.240000000,10.4
-16.260000000,10.42
-16.280000000,10.44
-16.300000000,10.46
-16.320000000,10.46
-16.340000000,10.46
-16.360000000,10.46
-16.380000000,10.46
-16.400000000,10.46
-16.420000000,10.46
-16.440000000,10.46
-16.460000000,10.46
-16.480000000,10.46
-16.500000000,10.46
-16.520000000,10.46
-16.540000000,10.46
-16.560000000,10.48
-16.580000000,10.5
-16.600000000,10.52
-16.620000000,10.54
-16.640000000,10.56
-16.660000000,10.58
-16.680000000,10.6
-16.700000000,10.62
-16.720000000,10.64
-16.740000000,10.66
-16.760000000,10.66
-16.780000000,10.68
-16.800000000,10.68
-16.820000000,10.7
-16.840000000,10.7
-16.860000000,10.7
-16.880000000,10.7
-16.900000000,10.7
-16.920000000,10.7
-16.940000000,10.7
-16.960000000,10.7
-16.980000000,10.7
-17.000000000,10.7
-17.020000000,10.7
-17.040000000,10.7
-17.060000000,10.7
-17.080000000,10.7
-17.100000000,10.7
-17.120000000,10.7
-17.140000000,10.7
-17.160000000,10.72
-17.180000000,10.74
-17.200000000,10.76
-17.220000000,10.76
-17.240000000,10.76
-17.260000000,10.78
-17.280000000,10.8
-17.300000000,10.82
-17.320000000,10.84
-17.340000000,10.86
-17.360000000,10.88
-17.380000000,10.9
-17.400000000,10.92
-17.420000000,10.94
-17.440000000,10.96
-17.460000000,10.98
-17.480000000,11
-17.500000000,11.02
-17.520000000,11.02
-17.540000000,11.02
-17.560000000,11.02
-17.580000000,11.02
-17.600000000,11.02
-17.620000000,11.02
-17.640000000,11.02
-17.660000000,11.02
-17.680000000,11.02
-17.700000000,11.02
-17.720000000,11.02
-17.740000000,11.04
-17.760000000,11.06
-17.780000000,11.08
-17.800000000,11.08
-17.820000000,11.1
-17.840000000,11.12
-17.860000000,11.12
-17.880000000,11.12
-17.900000000,11.14
-17.920000000,11.16
-17.940000000,11.18
-17.960000000,11.2
-17.980000000,11.22
-18.000000000,11.24
-18.020000000,11.26
-18.040000000,11.28
-18.060000000,11.3
-18.080000000,11.32
-18.100000000,11.34
-18.120000000,11.36
-18.140000000,11.38
-18.160000000,11.4
-18.180000000,11.42
-18.200000000,11.44
-18.220000000,11.46
-18.240000000,11.48
-18.260000000,11.5
-18.280000000,11.52
-18.300000000,11.54
-18.320000000,11.56
-18.340000000,11.58
-18.360000000,11.58
-18.380000000,11.58
-18.400000000,11.58
-18.420000000,11.58
-18.440000000,11.58
-18.460000000,11.58
-18.480000000,11.6
-18.500000000,11.62
-18.520000000,11.64
-18.540000000,11.66
-18.560000000,11.68
-18.580000000,11.68
-18.600000000,11.7
-18.620000000,11.7
-18.640000000,11.7
-18.660000000,11.72
-18.680000000,11.72
-18.700000000,11.72
-18.720000000,11.72
-18.740000000,11.74
-18.760000000,11.74
-18.780000000,11.74
-18.800000000,11.76
-18.820000000,11.78
-18.840000000,11.8
-18.860000000,11.8
-18.880000000,11.82
-18.900000000,11.82
-18.920000000,11.82
-18.940000000,11.82
-18.960000000,11.84
-18.980000000,11.84
-19.000000000,11.84
-19.020000000,11.84
-19.040000000,11.84
-19.060000000,11.86
-19.080000000,11.88
-19.100000000,11.9
-19.120000000,11.92
-19.140000000,11.94
-19.160000000,11.96
-19.180000000,11.98
-19.200000000,12
-19.220000000,12.02
-19.240000000,12.04
-19.260000000,12.06
-19.280000000,12.08
-19.300000000,12.1
-19.320000000,12.12
-19.340000000,12.14
-19.360000000,12.16
-19.380000000,12.16
-19.400000000,12.18
-19.420000000,12.18
-19.440000000,12.2
-19.460000000,12.22
-19.480000000,12.24
-19.500000000,12.24
-19.520000000,12.24
-19.540000000,12.24
-19.560000000,12.26
-19.580000000,12.28
-19.600000000,12.3
-19.620000000,12.32
-19.640000000,12.34
-19.660000000,12.34
-19.680000000,12.36
-19.700000000,12.36
-19.720000000,12.36
-19.740000000,12.36
-19.760000000,12.36
-19.780000000,12.36
-19.800000000,12.36
-19.820000000,12.38
-19.840000000,12.4
-19.860000000,12.4
-19.880000000,12.42
-19.900000000,12.44
-19.920000000,12.46
-19.940000000,12.46
-19.960000000,12.48
-19.980000000,12.5
-20.000000000,12.5
-20.020000000,12.5
-20.040000000,12.5
-20.060000000,12.5
-20.080000000,12.52
-20.100000000,12.54
-20.120000000,12.56
-20.140000000,12.58
-20.160000000,12.6
-20.180000000,12.6
-20.200000000,12.62
-20.220000000,12.62
-20.240000000,12.64
-20.260000000,12.66
-20.280000000,12.68
-20.300000000,12.7
-20.320000000,12.72
-20.340000000,12.74
-20.360000000,12.74
-20.380000000,12.74
-20.400000000,12.74
-20.420000000,12.74
-20.440000000,12.74
-20.460000000,12.74
-20.480000000,12.74
-20.500000000,12.74
-20.520000000,12.74
-20.540000000,12.74
-20.560000000,12.74
-20.580000000,12.74
-20.600000000,12.74
-20.620000000,12.74
-20.640000000,12.74
-20.660000000,12.76
-20.680000000,12.78
-20.700000000,12.8
-20.720000000,12.82
-20.740000000,12.84
-20.760000000,12.86
-20.780000000,12.86
-20.800000000,12.86
-20.820000000,12.86
-20.840000000,12.86
-20.860000000,12.86
-20.880000000,12.86
-20.900000000,12.86
-20.920000000,12.86
-20.940000000,12.86
-20.960000000,12.86
-20.980000000,12.86
-21.000000000,12.86
-21.020000000,12.86
-21.040000000,12.86
-21.060000000,12.86
-21.080000000,12.86
-21.100000000,12.86
-21.120000000,12.86
-21.140000000,12.86
-21.160000000,12.86
-21.180000000,12.86
-21.200000000,12.86
-21.220000000,12.86
-21.240000000,12.86
-21.260000000,12.86
-21.280000000,12.86
-21.300000000,12.86
-21.320000000,12.86
-21.340000000,12.86
-21.360000000,12.86
-21.380000000,12.86
-21.400000000,12.88
-21.420000000,12.9
-21.440000000,12.92
-21.460000000,12.94
-21.480000000,12.96
-21.500000000,12.98
-21.520000000,13
-21.540000000,13
-21.560000000,13
-21.580000000,13.02
-21.600000000,13.02
-21.620000000,13.04
-21.640000000,13.04
-21.660000000,13.06
-21.680000000,13.06
-21.700000000,13.06
-21.720000000,13.06
-21.740000000,13.06
-21.760000000,13.08
-21.780000000,13.08
-21.800000000,13.08
-21.820000000,13.08
-21.840000000,13.08
-21.860000000,13.08
-21.880000000,13.08
-21.900000000,13.1
-21.920000000,13.12
-21.940000000,13.14
-21.960000000,13.16
-21.980000000,13.18
-22.000000000,13.2
-22.020000000,13.22
-22.040000000,13.24
-22.060000000,13.26
-22.080000000,13.28
-22.100000000,13.3
-22.120000000,13.32
-22.140000000,13.34
-22.160000000,13.36
-22.180000000,13.36
-22.200000000,13.36
-22.220000000,13.36
-22.240000000,13.36
-22.260000000,13.36
-22.280000000,13.36
-22.300000000,13.36
-22.320000000,13.36
-22.340000000,13.36
-22.360000000,13.36
-22.380000000,13.36
-22.400000000,13.36
-22.420000000,13.36
-22.440000000,13.36
-22.460000000,13.36
-22.480000000,13.36
-22.500000000,13.38
-22.520000000,13.4
-22.540000000,13.42
-22.560000000,13.44
-22.580000000,13.46
-22.600000000,13.48
-22.620000000,13.5
-22.640000000,13.52
-22.660000000,13.54
-22.680000000,13.56
-22.700000000,13.56
-22.720000000,13.58
-22.740000000,13.6
-22.760000000,13.62
-22.780000000,13.64
-22.800000000,13.66
-22.820000000,13.68
-22.840000000,13.7
-22.860000000,13.7
-22.880000000,13.7
-22.900000000,13.72
-22.920000000,13.74
-22.940000000,13.76
-22.960000000,13.78
-22.980000000,13.78
-23.000000000,13.78
-23.020000000,13.8
-23.040000000,13.8
-23.060000000,13.8
-23.080000000,13.82
-23.100000000,13.82
-23.120000000,13.82
-23.140000000,13.84
-23.160000000,13.86
-23.180000000,13.88
-23.200000000,13.9
-23.220000000,13.92
-23.240000000,13.94
-23.260000000,13.96
-23.280000000,13.98
-23.300000000,14
-23.320000000,14
-23.340000000,14.02
-23.360000000,14.02
-23.380000000,14.02
-23.400000000,14.04
-23.420000000,14.06
-23.440000000,14.08
-23.460000000,14.1
-23.480000000,14.12
-23.500000000,14.14
-23.520000000,14.16
-23.540000000,14.16
-23.560000000,14.18
-23.580000000,14.18
-23.600000000,14.18
-23.620000000,14.18
-23.640000000,14.18
-23.660000000,14.18
-23.680000000,14.2
-23.700000000,14.22
-23.720000000,14.24
-23.740000000,14.26
-23.760000000,14.28
-23.780000000,14.3
-23.800000000,14.3
-23.820000000,14.3
-23.840000000,14.32
-23.860000000,14.34
-23.880000000,14.34
-23.900000000,14.34
-23.920000000,14.36
-23.940000000,14.38
-23.960000000,14.4
-23.980000000,14.42
-24.000000000,14.44
-24.020000000,14.46
-24.040000000,14.48
-24.060000000,14.5
-24.080000000,14.52
-24.100000000,14.54
-24.120000000,14.56
-24.140000000,14.56
-24.160000000,14.56
-24.180000000,14.58
-24.200000000,14.6
-24.220000000,14.62
-24.240000000,14.64
-24.260000000,14.66
-24.280000000,14.68
-24.300000000,14.7
-24.320000000,14.72
-24.340000000,14.74
-24.360000000,14.76
-24.380000000,14.76
-24.400000000,14.76
-24.420000000,14.76
-24.440000000,14.76
-24.460000000,14.76
-24.480000000,14.76
-24.500000000,14.76
-24.520000000,14.76
-24.540000000,14.76
-24.560000000,14.76
-24.580000000,14.76
-24.600000000,14.76
-24.620000000,14.76
-24.640000000,14.76
-24.660000000,14.76
-24.680000000,14.76
-24.700000000,14.76
-24.720000000,14.76
-24.740000000,14.76
-24.760000000,14.76
-24.780000000,14.76
-24.800000000,14.76
-24.820000000,14.76
-24.840000000,14.78
-24.860000000,14.8
-24.880000000,14.82
-24.900000000,14.84
-24.920000000,14.86
-24.940000000,14.88
-24.960000000,14.9
-24.980000000,14.92
-25.000000000,14.94
-25.020000000,14.94
-25.040000000,14.94
-25.060000000,14.96
-25.080000000,14.96
-25.100000000,14.96
-25.120000000,14.96
-25.140000000,14.96
-25.160000000,14.96
-25.180000000,14.98
-25.200000000,15
-25.220000000,15.02
-25.240000000,15.04
-25.260000000,15.06
-25.280000000,15.08
-25.300000000,15.1
-25.320000000,15.12
-25.340000000,15.14
-25.360000000,15.16
-25.380000000,15.16
-25.400000000,15.16
-25.420000000,15.16
-25.440000000,15.16
-25.460000000,15.16
-25.480000000,15.16
-25.500000000,15.18
-25.520000000,15.2
-25.540000000,15.22
-25.560000000,15.24
-25.580000000,15.26
-25.600000000,15.26
-25.620000000,15.28
-25.640000000,15.3
-25.660000000,15.32
-25.680000000,15.34
-25.700000000,15.36
-25.720000000,15.38
-25.740000000,15.4
-25.760000000,15.42
-25.780000000,15.44
-25.800000000,15.46
-25.820000000,15.48
-25.840000000,15.5
-25.860000000,15.5
-25.880000000,15.5
-25.900000000,15.5
-25.920000000,15.5
-25.940000000,15.5
-25.960000000,15.5
-25.980000000,15.5
-26.000000000,15.5
-26.020000000,15.5
-26.040000000,15.5
-26.060000000,15.5
-26.080000000,15.5
-26.100000000,15.5
-26.120000000,15.5
-26.140000000,15.5
-26.160000000,15.52
-26.180000000,15.54
-26.200000000,15.56
-26.220000000,15.58
-26.240000000,15.58
-26.260000000,15.6
-26.280000000,15.6
-26.300000000,15.62
-26.320000000,15.64
-26.340000000,15.66
-26.360000000,15.68
-26.380000000,15.7
-26.400000000,15.72
-26.420000000,15.74
-26.440000000,15.76
-26.460000000,15.78
-26.480000000,15.8
-26.500000000,15.8
-26.520000000,15.82
-26.540000000,15.84
-26.560000000,15.84
-26.580000000,15.84
-26.600000000,15.84
-26.620000000,15.84
-26.640000000,15.86
-26.660000000,15.88
-26.680000000,15.9
-26.700000000,15.92
-26.720000000,15.94
-26.740000000,15.96
-26.760000000,15.96
-26.780000000,15.96
-26.800000000,15.96
-26.820000000,15.98
-26.840000000,16
-26.860000000,16.02
-26.880000000,16.04
-26.900000000,16.06
-26.920000000,16.08
-26.940000000,16.1
-26.960000000,16.12
-26.980000000,16.14
-27.000000000,16.16
-27.020000000,16.18
-27.040000000,16.2
-27.060000000,16.2
-27.080000000,16.2
-27.100000000,16.2
-27.120000000,16.2
-27.140000000,16.2
-27.160000000,16.2
-27.180000000,16.2
-27.200000000,16.2
-27.220000000,16.2
-27.240000000,16.2
-27.260000000,16.2
-27.280000000,16.2
-27.300000000,16.2
-27.320000000,16.2
-27.340000000,16.2
-27.360000000,16.22
-27.380000000,16.24
-27.400000000,16.26
-27.420000000,16.28
-27.440000000,16.3
-27.460000000,16.32
-27.480000000,16.34
-27.500000000,16.36
-27.520000000,16.38
-27.540000000,16.4
-27.560000000,16.42
-27.580000000,16.44
-27.600000000,16.46
-27.620000000,16.48
-27.640000000,16.5
-27.660000000,16.52
-27.680000000,16.54
-27.700000000,16.56
-27.720000000,16.58
-27.740000000,16.6
-27.760000000,16.62
-27.780000000,16.64
-27.800000000,16.66
-27.820000000,16.68
-27.840000000,16.7
-27.860000000,16.72
-27.880000000,16.74
-27.900000000,16.76
-27.920000000,16.76
-27.940000000,16.76
-27.960000000,16.78
-27.980000000,16.8
-28.000000000,16.82
-28.020000000,16.84
-28.040000000,16.86
-28.060000000,16.88
-28.080000000,16.9
-28.100000000,16.92
-28.120000000,16.94
-28.140000000,16.94
-28.160000000,16.96
-28.180000000,16.96
-28.200000000,16.96
-28.220000000,16.96
-28.240000000,16.96
-28.260000000,16.96
-28.280000000,16.98
-28.300000000,16.98
-28.320000000,16.98
-28.340000000,16.98
-28.360000000,16.98
-28.380000000,16.98
-28.400000000,16.98
-28.420000000,16.98
-28.440000000,16.98
-28.460000000,16.98
-28.480000000,16.98
-28.500000000,17
-28.520000000,17.02
-28.540000000,17.04
-28.560000000,17.06
-28.580000000,17.08
-28.600000000,17.1
-28.620000000,17.12
-28.640000000,17.12
-28.660000000,17.12
-28.680000000,17.12
-28.700000000,17.12
-28.720000000,17.12
-28.740000000,17.12
-28.760000000,17.12
-28.780000000,17.12
-28.800000000,17.12
-28.820000000,17.14
-28.840000000,17.16
-28.860000000,17.18
-28.880000000,17.2
-28.900000000,17.22
-28.920000000,17.24
-28.940000000,17.26
-28.960000000,17.28
-28.980000000,17.3
-29.000000000,17.32
-29.020000000,17.34
-29.040000000,17.36
-29.060000000,17.38
-29.080000000,17.4
-29.100000000,17.42
-29.120000000,17.44
-29.140000000,17.46
-29.160000000,17.48
-29.180000000,17.5
-29.200000000,17.52
-29.220000000,17.54
-29.240000000,17.56
-29.260000000,17.58
-29.280000000,17.6
-29.300000000,17.62
-29.320000000,17.64
-29.340000000,17.66
-29.360000000,17.68
-29.380000000,17.7
-29.400000000,17.72
-29.420000000,17.74
-29.440000000,17.76
-29.460000000,17.78
-29.480000000,17.8
-29.500000000,17.82
-29.520000000,17.84
-29.540000000,17.86
-29.560000000,17.86
-29.580000000,17.86
-29.600000000,17.86
-29.620000000,17.86
-29.640000000,17.86
-29.660000000,17.86
-29.680000000,17.86
-29.700000000,17.86
-29.720000000,17.88
-29.740000000,17.9
-29.760000000,17.92
-29.780000000,17.94
-29.800000000,17.96
-29.820000000,17.98
-29.840000000,18
-29.860000000,18.02
-29.880000000,18.04
-29.900000000,18.06
-29.920000000,18.08
-29.940000000,18.1
-29.960000000,18.12
-29.980000000,18.14
-30.000000000,18.16
-30.020000000,18.18
-30.040000000,18.2
-30.060000000,18.22
-30.080000000,18.24
-30.100000000,18.26
-30.120000000,18.28
-30.140000000,18.3
-30.160000000,18.32
-30.180000000,18.34
-30.200000000,18.36
-30.220000000,18.38
-30.240000000,18.4
-30.260000000,18.42
-30.280000000,18.44
-30.300000000,18.46
-30.320000000,18.48
-30.340000000,18.5
-30.360000000,18.52
-30.380000000,18.54
-30.400000000,18.56
-30.420000000,18.58
-30.440000000,18.6
-30.460000000,18.62
-30.480000000,18.64
-30.500000000,18.66
-30.520000000,18.68
-30.540000000,18.7
-30.560000000,18.72
-30.580000000,18.74
-30.600000000,18.76
-30.620000000,18.78
-30.640000000,18.8
-30.660000000,18.82
-30.680000000,18.84
-30.700000000,18.86
-30.720000000,18.88
-30.740000000,18.9
-30.760000000,18.92
-30.780000000,18.94
-30.800000000,18.96
-30.820000000,18.98
-30.840000000,19
-30.860000000,19.02
-30.880000000,19.04
-30.900000000,19.04
-30.920000000,19.04
-30.940000000,19.04
-30.960000000,19.04
-30.980000000,19.04
-31.000000000,19.04
-31.020000000,19.04
-31.040000000,19.06
-31.060000000,19.06
-31.080000000,19.06
-31.100000000,19.06
-31.120000000,19.06
-31.140000000,19.06
-31.160000000,19.06
-31.180000000,19.06
-31.200000000,19.08
-31.220000000,19.1
-31.240000000,19.1
-31.260000000,19.1
-31.280000000,19.12
-31.300000000,19.14
-31.320000000,19.16
-31.340000000,19.18
-31.360000000,19.2
-31.380000000,19.22
-31.400000000,19.24
-31.420000000,19.26
-31.440000000,19.28
-31.460000000,19.3
-31.480000000,19.32
-31.500000000,19.34
-31.520000000,19.36
-31.540000000,19.38
-31.560000000,19.4
-31.580000000,19.42
-31.600000000,19.44
-31.620000000,19.46
-31.640000000,19.48
-31.660000000,19.5
-31.680000000,19.52
-31.700000000,19.54
-31.720000000,19.56
-31.740000000,19.58
-31.760000000,19.6
-31.780000000,19.62
-31.800000000,19.64
-31.820000000,19.64
-31.840000000,19.64
-31.860000000,19.64
-31.880000000,19.66
-31.900000000,19.68
-31.920000000,19.7
-31.940000000,19.7
-31.960000000,19.7
-31.980000000,19.7
-32.000000000,19.72
-32.020000000,19.74
-32.040000000,19.76
-32.060000000,19.78
-32.080000000,19.78
-32.100000000,19.78
-32.120000000,19.78
-32.140000000,19.78
-32.160000000,19.78
-32.180000000,19.78
-32.200000000,19.78
-32.220000000,19.78
-32.240000000,19.78
-32.260000000,19.78
-32.280000000,19.78
-32.300000000,19.78
-32.320000000,19.78
-32.340000000,19.78
-32.360000000,19.8
-32.380000000,19.82
-32.400000000,19.84
-32.420000000,19.86
-32.440000000,19.88
-32.460000000,19.88
-32.480000000,19.9
-32.500000000,19.92
-32.520000000,19.92
-32.540000000,19.92
-32.560000000,19.92
-32.580000000,19.92
-32.600000000,19.92
-32.620000000,19.92
-32.640000000,19.92
-32.660000000,19.92
-32.680000000,19.92
-32.700000000,19.92
-32.720000000,19.94
-32.740000000,19.96
-32.760000000,19.98
-32.780000000,20
-32.800000000,20.02
-32.820000000,20.04
-32.840000000,20.06
-32.860000000,20.08
-32.880000000,20.1
-32.900000000,20.12
-32.920000000,20.14
-32.940000000,20.16
-32.960000000,20.18
-32.980000000,20.2
-33.000000000,20.22
-33.020000000,20.24
-33.040000000,20.26
-33.060000000,20.28
-33.080000000,20.3
-33.100000000,20.32
-33.120000000,20.34
-33.140000000,20.36
-33.160000000,20.38
-33.180000000,20.4
-33.200000000,20.42
-33.220000000,20.44
-33.240000000,20.46
-33.260000000,20.48
-33.280000000,20.5
-33.300000000,20.52
-33.320000000,20.54
-33.340000000,20.56
-33.360000000,20.58
-33.380000000,20.6
-33.400000000,20.6
-33.420000000,20.62
-33.440000000,20.64
-33.460000000,20.66
-33.480000000,20.68
-33.500000000,20.7
-33.520000000,20.72
-33.540000000,20.72
-33.560000000,20.72
-33.580000000,20.74
-33.600000000,20.76
-33.620000000,20.78
-33.640000000,20.8
-33.660000000,20.82
-33.680000000,20.84
-33.700000000,20.86
-33.720000000,20.88
-33.740000000,20.9
-33.760000000,20.92
-33.780000000,20.92
-33.800000000,20.92
-33.820000000,20.94
-33.840000000,20.94
-33.860000000,20.96
-33.880000000,20.98
-33.900000000,21
-33.920000000,21.02
-33.940000000,21.04
-33.960000000,21.06
-33.980000000,21.08
-34.000000000,21.1
-34.020000000,21.12
-34.040000000,21.12
-34.060000000,21.14
-34.080000000,21.14
-34.100000000,21.14
-34.120000000,21.14
-34.140000000,21.14
-34.160000000,21.16
-34.180000000,21.18
-34.200000000,21.2
-34.220000000,21.22
-34.240000000,21.24
-34.260000000,21.26
-34.280000000,21.28
-34.300000000,21.3
-34.320000000,21.3
-34.340000000,21.3
-34.360000000,21.3
-34.380000000,21.3
-34.400000000,21.3
-34.420000000,21.32
-34.440000000,21.34
-34.460000000,21.36
-34.480000000,21.36
-34.500000000,21.36
-34.520000000,21.36
-34.540000000,21.38
-34.560000000,21.4
-34.580000000,21.4
-34.600000000,21.4
-34.620000000,21.4
-34.640000000,21.4
-34.660000000,21.4
-34.680000000,21.4
-34.700000000,21.4
-34.720000000,21.4
-34.740000000,21.4
-34.760000000,21.4
-34.780000000,21.42
-34.800000000,21.42
-34.820000000,21.44
-34.840000000,21.46
-34.860000000,21.46
-34.880000000,21.46
-34.900000000,21.46
-34.920000000,21.46
-34.940000000,21.46
-34.960000000,21.46
-34.980000000,21.46
-35.000000000,21.46
-35.020000000,21.46
-35.040000000,21.46
-35.060000000,21.46
-35.080000000,21.46
-35.100000000,21.46
-35.120000000,21.46
-35.140000000,21.46
-35.160000000,21.46
-35.180000000,21.46
-35.200000000,21.46
-35.220000000,21.46
-35.240000000,21.46
-35.260000000,21.46
-35.280000000,21.46
-35.300000000,21.46
-35.320000000,21.46
-35.340000000,21.46
-35.360000000,21.48
-35.380000000,21.5
-35.400000000,21.52
-35.420000000,21.54
-35.440000000,21.56
-35.460000000,21.58
-35.480000000,21.6
-35.500000000,21.6
-35.520000000,21.6
-35.540000000,21.6
-35.560000000,21.62
-35.580000000,21.62
-35.600000000,21.62
-35.620000000,21.62
-35.640000000,21.62
-35.660000000,21.62
-35.680000000,21.62
-35.700000000,21.62
-35.720000000,21.62
-35.740000000,21.62
-35.760000000,21.62
-35.780000000,21.62
-35.800000000,21.62
-35.820000000,21.62
-35.840000000,21.62
-35.860000000,21.62
-35.880000000,21.62
-35.900000000,21.62
-35.920000000,21.62
-35.940000000,21.62
-35.960000000,21.64
-35.980000000,21.64
-36.000000000,21.64
-36.020000000,21.64
-36.040000000,21.64
-36.060000000,21.64
-36.080000000,21.64
-36.100000000,21.64
-36.120000000,21.64
-36.140000000,21.66
-36.160000000,21.68
-36.180000000,21.68
-36.200000000,21.68
-36.220000000,21.68
-36.240000000,21.68
-36.260000000,21.68
-36.280000000,21.68
-36.300000000,21.7
-36.320000000,21.7
-36.340000000,21.72
-36.360000000,21.74
-36.380000000,21.76
-36.400000000,21.76
-36.420000000,21.76
-36.440000000,21.76
-36.460000000,21.76
-36.480000000,21.76
-36.500000000,21.76
-36.520000000,21.76
-36.540000000,21.76
-36.560000000,21.76
-36.580000000,21.76
-36.600000000,21.76
-36.620000000,21.76
-36.640000000,21.76
-36.660000000,21.76
-36.680000000,21.76
-36.700000000,21.76
-36.720000000,21.76
-36.740000000,21.76
-36.760000000,21.76
-36.780000000,21.76
-36.800000000,21.76
-36.820000000,21.76
-36.840000000,21.78
-36.860000000,21.8
-36.880000000,21.82
-36.900000000,21.84
-36.920000000,21.86
-36.940000000,21.88
-36.960000000,21.9
-36.980000000,21.92
-37.000000000,21.94
-37.020000000,21.96
-37.040000000,21.98
-37.060000000,22
-37.080000000,22.02
-37.100000000,22.04
-37.120000000,22.06
-37.140000000,22.06
-37.160000000,22.06
-37.180000000,22.06
-37.200000000,22.06
-37.220000000,22.06
-37.240000000,22.06
-37.260000000,22.06
-37.280000000,22.06
-37.300000000,22.06
-37.320000000,22.06
-37.340000000,22.06
-37.360000000,22.06
-37.380000000,22.06
-37.400000000,22.06
-37.420000000,22.06
-37.440000000,22.06
-37.460000000,22.06
-37.480000000,22.08
-37.500000000,22.1
-37.520000000,22.12
-37.540000000,22.14
-37.560000000,22.16
-37.580000000,22.18
-37.600000000,22.18
-37.620000000,22.18
-37.640000000,22.18
-37.660000000,22.18
-37.680000000,22.18
-37.700000000,22.18
-37.720000000,22.2
-37.740000000,22.2
-37.760000000,22.22
-37.780000000,22.22
-37.800000000,22.24
-37.820000000,22.26
-37.840000000,22.28
-37.860000000,22.28
-37.880000000,22.28
-37.900000000,22.28
-37.920000000,22.3
-37.940000000,22.32
-37.960000000,22.34
-37.980000000,22.36
-38.000000000,22.36
-38.020000000,22.36
-38.040000000,22.38
-38.060000000,22.4
-38.080000000,22.4
-38.100000000,22.4
-38.120000000,22.4
-38.140000000,22.4
-38.160000000,22.42
-38.180000000,22.44
-38.200000000,22.44
-38.220000000,22.44
-38.240000000,22.44
-38.260000000,22.44
-38.280000000,22.46
-38.300000000,22.48
-38.320000000,22.48
-38.340000000,22.48
-38.360000000,22.5
-38.380000000,22.5
-38.400000000,22.52
-38.420000000,22.54
-38.440000000,22.54
-38.460000000,22.54
-38.480000000,22.54
-38.500000000,22.54
-38.520000000,22.56
-38.540000000,22.58
-38.560000000,22.6
-38.580000000,22.62
-38.600000000,22.64
-38.620000000,22.66
-38.640000000,22.68
-38.660000000,22.7
-38.680000000,22.72
-38.700000000,22.74
-38.720000000,22.76
-38.740000000,22.78
-38.760000000,22.8
-38.780000000,22.82
-38.800000000,22.84
-38.820000000,22.84
-38.840000000,22.84
-38.860000000,22.84
-38.880000000,22.84
-38.900000000,22.84
-38.920000000,22.84
-38.940000000,22.84
-38.960000000,22.84
-38.980000000,22.84
-39.000000000,22.84
-39.020000000,22.86
-39.040000000,22.88
-39.060000000,22.9
-39.080000000,22.92
-39.100000000,22.94
-39.120000000,22.96
-39.140000000,22.98
-39.160000000,23
-39.180000000,23.02
-39.200000000,23.04
-39.220000000,23.06
-39.240000000,23.08
-39.260000000,23.1
-39.280000000,23.12
-39.300000000,23.14
-39.320000000,23.16
-39.340000000,23.18
-39.360000000,23.2
-39.380000000,23.22
-39.400000000,23.24
-39.420000000,23.26
-39.440000000,23.28
-39.460000000,23.3
-39.480000000,23.32
-39.500000000,23.34
-39.520000000,23.36
-39.540000000,23.38
-39.560000000,23.4
-39.580000000,23.42
-39.600000000,23.44
-39.620000000,23.46
-39.640000000,23.48
-39.660000000,23.5
-39.680000000,23.52
-39.700000000,23.54
-39.720000000,23.56
-39.740000000,23.58
-39.760000000,23.6
-39.780000000,23.62
-39.800000000,23.64
-39.820000000,23.66
-39.840000000,23.68
-39.860000000,23.7
-39.880000000,23.72
-39.900000000,23.74
-39.920000000,23.76
-39.940000000,23.78
-39.960000000,23.8
-39.980000000,23.82
-40.000000000,23.84
-40.020000000,23.86
-40.040000000,23.88
-40.060000000,23.9
-40.080000000,23.92
-40.100000000,23.94
-40.100000000,23.96
-40.100000000,23.98
-40.120000000,24
-40.120000000,24.02
-40.120000000,24.04
-40.120000000,24.06
-40.120000000,24.08
-40.120000000,24.1
-40.120000000,24.12
-40.120000000,24.14
-40.120000000,24.16
-40.120000000,24.18
-40.120000000,24.2
-40.120000000,24.22
-40.140000000,24.24
-40.160000000,24.26
-40.180000000,24.28
-40.200000000,24.3
-40.220000000,24.32
-40.220000000,24.34
-40.220000000,24.36
-40.220000000,24.38
-40.220000000,24.4
-40.220000000,24.42
-40.220000000,24.44
-40.220000000,24.46
-40.220000000,24.48
-40.220000000,24.5
-40.220000000,24.52
-40.240000000,24.54
-40.260000000,24.56
-40.280000000,24.58
-40.280000000,24.6
-40.280000000,24.62
-40.300000000,24.64
-40.320000000,24.66
-40.320000000,24.68
-40.320000000,24.7
-40.320000000,24.72
-40.320000000,24.74
-40.320000000,24.76
-40.320000000,24.78
-40.320000000,24.8
-40.320000000,24.82
-40.320000000,24.84
-40.320000000,24.86
-40.320000000,24.88
-40.320000000,24.9
-40.320000000,24.92
-40.320000000,24.94
-40.320000000,24.96
-40.320000000,24.98
-40.320000000,25
-40.320000000,25.02
-40.320000000,25.04
-40.320000000,25.06
-40.320000000,25.08
-40.340000000,25.1
-40.340000000,25.12
-40.340000000,25.14
-40.340000000,25.16
-40.340000000,25.18
-40.340000000,25.2
-40.340000000,25.22
-40.340000000,25.24
-40.340000000,25.26
-40.340000000,25.28
-40.340000000,25.3
-40.340000000,25.32
-40.340000000,25.34
-40.340000000,25.36
-40.340000000,25.38
-40.340000000,25.4
-40.340000000,25.42
-40.340000000,25.44
-40.340000000,25.46
-40.340000000,25.48
-40.340000000,25.5
-40.340000000,25.52
-40.340000000,25.54
-40.340000000,25.56
-40.340000000,25.58
-40.340000000,25.6
-40.340000000,25.62
-40.340000000,25.64
-40.340000000,25.66
-40.340000000,25.68
-40.340000000,25.7
-40.340000000,25.72
-40.340000000,25.74
-40.340000000,25.76
-40.340000000,25.78
-40.360000000,25.8
-40.380000000,25.82
-40.400000000,25.84
-40.420000000,25.86
-40.440000000,25.88
-40.460000000,25.9
-40.480000000,25.92
-40.500000000,25.94
-40.500000000,25.96
-40.500000000,25.98
-40.520000000,26
-40.540000000,26.02
-40.560000000,26.04
-40.580000000,26.06
-40.600000000,26.08
-40.620000000,26.1
-40.640000000,26.12
-40.660000000,26.14
-40.680000000,26.16
-40.680000000,26.18
-40.680000000,26.2
-40.680000000,26.22
-40.680000000,26.24
-40.680000000,26.26
-40.680000000,26.28
-40.680000000,26.3
-40.700000000,26.32
-40.720000000,26.34
-40.740000000,26.36
-40.740000000,26.38
-40.740000000,26.4
-40.740000000,26.42
-40.740000000,26.44
-40.740000000,26.46
-40.740000000,26.48
-40.740000000,26.5
-40.740000000,26.52
-40.760000000,26.54
-40.780000000,26.56
-40.800000000,26.58
-40.820000000,26.6
-40.820000000,26.62
-40.820000000,26.64
-40.820000000,26.66
-40.820000000,26.68
-40.820000000,26.7
-40.820000000,26.72
-40.820000000,26.74
-40.820000000,26.76
-40.820000000,26.78
-40.820000000,26.8
-40.820000000,26.82
-40.820000000,26.84
-40.820000000,26.86
-40.820000000,26.88
-40.820000000,26.9
-40.820000000,26.92
-40.820000000,26.94
-40.820000000,26.96
-40.820000000,26.98
-40.820000000,27
-40.820000000,27.02
-40.820000000,27.04
-40.820000000,27.06
-40.820000000,27.08
-40.820000000,27.1
-40.820000000,27.12
-40.820000000,27.14
-40.840000000,27.16
-40.840000000,27.18
-40.840000000,27.2
-40.840000000,27.22
-40.840000000,27.24
-40.840000000,27.26
-40.840000000,27.28
-40.840000000,27.3
-40.840000000,27.32
-40.840000000,27.34
-40.840000000,27.36
-40.840000000,27.38
-40.840000000,27.4
-40.840000000,27.42
-40.840000000,27.44
-40.840000000,27.46
-40.840000000,27.48
-40.840000000,27.5
-40.840000000,27.52
-40.840000000,27.54
-40.840000000,27.56
-40.840000000,27.58
-40.840000000,27.6
-40.840000000,27.62
-40.840000000,27.64
-40.840000000,27.66
-40.840000000,27.68
-40.840000000,27.7
-40.840000000,27.72
-40.840000000,27.74
-40.860000000,27.76
-40.860000000,27.78
-40.860000000,27.8
-40.860000000,27.82
-40.860000000,27.84
-40.860000000,27.86
-40.860000000,27.88
-40.860000000,27.9
-40.860000000,27.92
-40.860000000,27.94
-40.860000000,27.96
-40.860000000,27.98
-40.860000000,28
-40.860000000,28.02
-40.860000000,28.04
-40.860000000,28.06
-40.860000000,28.08
-40.860000000,28.1
-40.860000000,28.12
-40.860000000,28.14
-40.860000000,28.16
-40.860000000,28.18
-40.860000000,28.2
-40.860000000,28.22
-40.860000000,28.24
-40.860000000,28.26
-40.860000000,28.28
-40.860000000,28.3
-40.860000000,28.32
-40.860000000,28.34
-40.860000000,28.36
-40.860000000,28.38
-40.860000000,28.4
-40.880000000,28.42
-40.900000000,28.44
-40.920000000,28.46
-40.940000000,28.48
-40.960000000,28.5
-40.980000000,28.52
-41.000000000,28.54
-41.020000000,28.56
-41.040000000,28.58
-41.040000000,28.6
-41.040000000,28.62
-41.040000000,28.64
-41.040000000,28.66
-41.040000000,28.68
-41.040000000,28.7
-41.060000000,28.72
-41.080000000,28.74
-41.100000000,28.76
-41.120000000,28.78
-41.140000000,28.8
-41.160000000,28.82
-41.180000000,28.84
-41.200000000,28.86
-41.220000000,28.88
-41.240000000,28.9
-41.260000000,28.92
-41.280000000,28.94
-41.300000000,28.96
-41.320000000,28.98
-41.340000000,29
-41.360000000,29.02
-41.380000000,29.04
-41.400000000,29.06
-41.400000000,29.08
-41.400000000,29.1
-41.400000000,29.12
-41.400000000,29.14
-41.420000000,29.16
-41.440000000,29.18
-41.440000000,29.2
-41.440000000,29.22
-41.460000000,29.24
-41.460000000,29.26
-41.480000000,29.28
-41.500000000,29.3
-41.500000000,29.32
-41.520000000,29.34
-41.520000000,29.36
-41.520000000,29.38
-41.520000000,29.4
-41.520000000,29.42
-41.520000000,29.44
-41.520000000,29.46
-41.520000000,29.48
-41.520000000,29.5
-41.520000000,29.52
-41.540000000,29.54
-41.560000000,29.56
-41.580000000,29.58
-41.580000000,29.6
-41.580000000,29.62
-41.580000000,29.64
-41.580000000,29.66
-41.580000000,29.68
-41.580000000,29.7
-41.580000000,29.72
-41.580000000,29.74
-41.600000000,29.76
-41.620000000,29.78
-41.640000000,29.8
-41.660000000,29.82
-41.680000000,29.84
-41.700000000,29.86
-41.720000000,29.88
-41.740000000,29.9
-41.740000000,29.92
-41.760000000,29.94
-41.780000000,29.96
-41.800000000,29.98
-41.820000000,30
-41.840000000,30.02
-41.860000000,30.04
-41.860000000,30.06
-41.860000000,30.08
-41.860000000,30.1
-41.860000000,30.12
-41.860000000,30.14
-41.860000000,30.16
-41.860000000,30.18
-41.860000000,30.2
-41.860000000,30.22
-41.880000000,30.24
-41.880000000,30.26
-41.880000000,30.28
-41.880000000,30.3
-41.880000000,30.32
-41.880000000,30.34
-41.880000000,30.36
-41.880000000,30.38
-41.880000000,30.4
-41.880000000,30.42
-41.900000000,30.44
-41.920000000,30.46
-41.920000000,30.48
-41.920000000,30.5
-41.920000000,30.52
-41.920000000,30.54
-41.920000000,30.56
-41.920000000,30.58
-41.920000000,30.6
-41.920000000,30.62
-41.920000000,30.64
-41.920000000,30.66
-41.920000000,30.68
-41.920000000,30.7
-41.920000000,30.72
-41.920000000,30.74
-41.940000000,30.76
-41.940000000,30.78
-41.960000000,30.8
-41.980000000,30.82
-42.000000000,30.84
-42.020000000,30.86
-42.040000000,30.88
-42.060000000,30.9
-42.060000000,30.92
-42.060000000,30.94
-42.060000000,30.96
-42.060000000,30.98
-42.060000000,31
-42.060000000,31.02
-42.060000000,31.04
-42.060000000,31.06
-42.060000000,31.08
-42.060000000,31.1
-42.060000000,31.12
-42.060000000,31.14
-42.060000000,31.16
-42.060000000,31.18
-42.060000000,31.2
-42.060000000,31.22
-42.060000000,31.24
-42.060000000,31.26
-42.060000000,31.28
-42.060000000,31.3
-42.060000000,31.32
-42.060000000,31.34
-42.060000000,31.36
-42.060000000,31.38
-42.060000000,31.4
-42.080000000,31.42
-42.100000000,31.44
-42.120000000,31.46
-42.140000000,31.48
-42.160000000,31.5
-42.180000000,31.52
-42.200000000,31.54
-42.220000000,31.56
-42.240000000,31.58
-42.260000000,31.6
-42.280000000,31.62
-42.300000000,31.64
-42.320000000,31.66
-42.340000000,31.68
-42.360000000,31.7
-42.380000000,31.72
-42.400000000,31.74
-42.420000000,31.76
-42.440000000,31.78
-42.460000000,31.8
-42.480000000,31.82
-42.500000000,31.84
-42.520000000,31.86
-42.540000000,31.88
-42.560000000,31.9
-42.580000000,31.92
-42.600000000,31.94
-42.620000000,31.96
-42.640000000,31.98
-42.660000000,32
-42.680000000,32.02
-42.700000000,32.04
-42.720000000,32.06
-42.740000000,32.08
-42.760000000,32.1
-42.780000000,32.12
-42.800000000,32.14
-42.820000000,32.16
-42.840000000,32.18
-42.860000000,32.2
-42.880000000,32.22
-42.900000000,32.24
-42.920000000,32.26
-42.940000000,32.28
-42.960000000,32.3
-42.980000000,32.32
-43.000000000,32.34
-43.020000000,32.36
-43.040000000,32.38
-43.060000000,32.4
-43.080000000,32.42
-43.100000000,32.42
-43.120000000,32.44
-43.140000000,32.46
-43.160000000,32.46
-43.180000000,32.46
-43.200000000,32.46
-43.220000000,32.46
-43.240000000,32.46
-43.260000000,32.46
-43.280000000,32.46
-43.300000000,32.46
-43.320000000,32.46
-43.340000000,32.46
-43.360000000,32.46
-43.380000000,32.46
-43.400000000,32.46
-43.420000000,32.48
-43.440000000,32.5
-43.460000000,32.52
-43.480000000,32.52
-43.500000000,32.52
-43.520000000,32.52
-43.540000000,32.52
-43.560000000,32.52
-43.580000000,32.52
-43.600000000,32.52
-43.620000000,32.52
-43.640000000,32.52
-43.660000000,32.52
-43.680000000,32.52
-43.700000000,32.52
-43.720000000,32.52
-43.740000000,32.52
-43.760000000,32.52
-43.780000000,32.52
-43.800000000,32.52
-43.820000000,32.52
-43.840000000,32.52
-43.860000000,32.52
-43.880000000,32.52
-43.900000000,32.52
-43.920000000,32.52
-43.940000000,32.52
-43.960000000,32.52
-43.980000000,32.52
-44.000000000,32.52
-44.020000000,32.52
-44.040000000,32.52
-44.060000000,32.52
-44.080000000,32.52
-44.100000000,32.52
-44.120000000,32.52
-44.140000000,32.52
-44.160000000,32.52
-44.180000000,32.52
-44.200000000,32.52
-44.220000000,32.52
-44.240000000,32.52
-44.260000000,32.52
-44.280000000,32.52
-44.300000000,32.52
-44.320000000,32.52
-44.340000000,32.52
-44.360000000,32.52
-44.380000000,32.52
-44.400000000,32.52
-44.420000000,32.52
-44.440000000,32.52
-44.460000000,32.54
-44.480000000,32.56
-44.500000000,32.58
-44.520000000,32.58
-44.540000000,32.58
-44.560000000,32.58
-44.580000000,32.6
-44.600000000,32.6
-44.620000000,32.6
-44.640000000,32.6
-44.660000000,32.6
-44.680000000,32.6
-44.700000000,32.62
-44.720000000,32.64
-44.740000000,32.66
-44.760000000,32.68
-44.780000000,32.7
-44.800000000,32.72
-44.820000000,32.74
-44.840000000,32.76
-44.860000000,32.78
-44.880000000,32.8
-44.900000000,32.82
-44.920000000,32.82
-44.940000000,32.82
-44.960000000,32.84
-44.980000000,32.86
-45.000000000,32.88
-45.020000000,32.88
-45.040000000,32.88
-45.060000000,32.88
-45.080000000,32.88
-45.100000000,32.88
-45.120000000,32.88
-45.140000000,32.9
-45.160000000,32.92
-45.180000000,32.92
-45.200000000,32.92
-45.220000000,32.92
-45.240000000,32.92
-45.260000000,32.92
-45.280000000,32.92
-45.300000000,32.92
-45.320000000,32.92
-45.340000000,32.92
-45.360000000,32.94
-45.380000000,32.94
-45.400000000,32.94
-45.420000000,32.94
-45.440000000,32.96
-45.460000000,32.96
-45.480000000,32.96
-45.500000000,32.96
-45.520000000,32.96
-45.540000000,32.96
-45.560000000,32.96
-45.580000000,32.96
-45.600000000,32.96
-45.620000000,32.96
-45.640000000,32.98
-45.660000000,32.98
-45.680000000,32.98
-45.700000000,33
-45.720000000,33.02
-45.740000000,33.02
-45.760000000,33.04
-45.780000000,33.06
-45.800000000,33.08
-45.820000000,33.1
-45.840000000,33.12
-45.860000000,33.14
-45.880000000,33.16
-45.900000000,33.18
-45.920000000,33.2
-45.940000000,33.22
-45.960000000,33.24
-45.980000000,33.26
-46.000000000,33.28
-46.020000000,33.28
-46.040000000,33.28
-46.060000000,33.28
-46.080000000,33.28
-46.100000000,33.28
-46.120000000,33.28
-46.140000000,33.28
-46.160000000,33.28
-46.180000000,33.3
-46.200000000,33.3
-46.220000000,33.3
-46.240000000,33.3
-46.260000000,33.3
-46.280000000,33.3
-46.300000000,33.3
-46.320000000,33.3
-46.340000000,33.3
-46.360000000,33.3
-46.380000000,33.3
-46.400000000,33.3
-46.420000000,33.3
-46.440000000,33.3
-46.460000000,33.3
-46.480000000,33.3
-46.500000000,33.3
-46.520000000,33.3
-46.540000000,33.3
-46.560000000,33.3
-46.580000000,33.3
-46.600000000,33.3
-46.620000000,33.3
-46.640000000,33.3
-46.660000000,33.3
-46.680000000,33.3
-46.700000000,33.3
-46.720000000,33.3
-46.740000000,33.3
-46.760000000,33.3
-46.780000000,33.3
-46.800000000,33.3
-46.820000000,33.3
-46.840000000,33.3
-46.860000000,33.3
-46.880000000,33.3
-46.900000000,33.3
-46.920000000,33.3
-46.940000000,33.3
-46.960000000,33.32
-46.980000000,33.34
-47.000000000,33.36
-47.020000000,33.38
-47.040000000,33.4
-47.060000000,33.4
-47.080000000,33.4
-47.100000000,33.4
-47.120000000,33.42
-47.140000000,33.44
-47.160000000,33.44
-47.180000000,33.44
-47.200000000,33.44
-47.220000000,33.44
-47.240000000,33.44
-47.260000000,33.44
-47.280000000,33.44
-47.300000000,33.44
-47.320000000,33.46
-47.340000000,33.46
-47.360000000,33.46
-47.380000000,33.46
-47.400000000,33.46
-47.420000000,33.46
-47.440000000,33.46
-47.460000000,33.46
-47.480000000,33.46
-47.500000000,33.46
-47.520000000,33.46
-47.540000000,33.46
-47.560000000,33.48
-47.580000000,33.5
-47.600000000,33.5
-47.620000000,33.5
-47.640000000,33.5
-47.660000000,33.5
-47.680000000,33.5
-47.700000000,33.5
-47.720000000,33.5
-47.740000000,33.5
-47.760000000,33.52
-47.780000000,33.52
-47.800000000,33.52
-47.820000000,33.54
-47.840000000,33.54
-47.860000000,33.56
-47.880000000,33.58
-47.900000000,33.6
-47.920000000,33.62
-47.940000000,33.64
-47.960000000,33.66
-47.980000000,33.68
-48.000000000,33.7
-48.020000000,33.72
-48.040000000,33.74
-48.060000000,33.76
-48.080000000,33.78
-48.100000000,33.8
-48.120000000,33.82
-48.140000000,33.84
-48.160000000,33.86
-48.180000000,33.88
-48.200000000,33.9
-48.220000000,33.92
-48.240000000,33.94
-48.260000000,33.96
-48.280000000,33.98
-48.300000000,34
-48.320000000,34.02
-48.340000000,34.04
-48.360000000,34.06
-48.380000000,34.08
-48.400000000,34.1
-48.420000000,34.12
-48.440000000,34.14
-48.460000000,34.16
-48.480000000,34.18
-48.500000000,34.2
-48.520000000,34.22
-48.540000000,34.24
-48.560000000,34.26
-48.580000000,34.28
-48.600000000,34.3
-48.620000000,34.32
-48.640000000,34.34
-48.660000000,34.36
-48.680000000,34.38
-48.700000000,34.4
-48.720000000,34.42
-48.740000000,34.44
-48.760000000,34.46
-48.780000000,34.48
-48.800000000,34.5
-48.820000000,34.52
-48.840000000,34.54
-48.860000000,34.56
-48.860000000,34.58
-48.860000000,34.6
-48.860000000,34.62
-48.860000000,34.64
-48.860000000,34.66
-48.860000000,34.68
-48.860000000,34.7
-48.860000000,34.72
-48.860000000,34.74
-48.860000000,34.76
-48.860000000,34.78
-48.860000000,34.8
-48.860000000,34.82
-48.860000000,34.84
-48.860000000,34.86
-48.860000000,34.88
-48.860000000,34.9
-48.860000000,34.92
-48.860000000,34.94
-48.860000000,34.96
-48.860000000,34.98
-48.860000000,35
-48.860000000,35.02
-48.860000000,35.04
-48.860000000,35.06
-48.860000000,35.08
-48.860000000,35.1
-48.860000000,35.12
-48.860000000,35.14
-48.860000000,35.16
-48.860000000,35.18
-48.860000000,35.2
-48.860000000,35.22
-48.860000000,35.24
-48.860000000,35.26
-48.860000000,35.28
-48.860000000,35.3
-48.860000000,35.32
-48.860000000,35.34
-48.860000000,35.36
-48.860000000,35.38
-48.860000000,35.4
-48.860000000,35.42
-48.860000000,35.44
-48.860000000,35.46
-48.860000000,35.48
-48.860000000,35.5
-48.860000000,35.52
-48.860000000,35.54
-48.860000000,35.56
-48.860000000,35.58
-48.860000000,35.6
-48.860000000,35.62
-48.860000000,35.64
-48.860000000,35.66
-48.860000000,35.68
-48.860000000,35.7
-48.860000000,35.72
-48.860000000,35.74
-48.860000000,35.76
-48.860000000,35.78
-48.860000000,35.8
-48.860000000,35.82
-48.860000000,35.84
-48.860000000,35.86
-48.860000000,35.88
-48.860000000,35.9
-48.860000000,35.92
-48.860000000,35.94
-48.860000000,35.96
-48.860000000,35.98
-48.860000000,36
-48.860000000,36.02
-48.860000000,36.04
-48.860000000,36.06
-48.860000000,36.08
-48.860000000,36.1
-48.860000000,36.12
-48.860000000,36.14
-48.860000000,36.16
-48.860000000,36.18
-48.860000000,36.2
-48.860000000,36.22
-48.860000000,36.24
-48.860000000,36.26
-48.860000000,36.28
-48.860000000,36.3
-48.860000000,36.32
-48.860000000,36.34
-48.860000000,36.36
-48.860000000,36.38
-48.860000000,36.4
-48.860000000,36.42
-48.860000000,36.44
-48.860000000,36.46
-48.860000000,36.48
-48.860000000,36.5
-48.860000000,36.52
-48.860000000,36.54
-48.860000000,36.56
-48.860000000,36.58
-48.860000000,36.6
-48.860000000,36.62
-48.860000000,36.64
-48.860000000,36.66
-48.860000000,36.68
-48.860000000,36.7
-48.860000000,36.72
-48.860000000,36.74
-48.860000000,36.76
-48.860000000,36.78
-48.860000000,36.8
-48.860000000,36.82
-48.860000000,36.84
-48.860000000,36.86
-48.860000000,36.88
-48.860000000,36.9
-48.860000000,36.92
-48.860000000,36.94
-48.860000000,36.96
-48.860000000,36.98
-48.860000000,37
-48.860000000,37.02
-48.860000000,37.04
-48.860000000,37.06
-48.860000000,37.08
-48.860000000,37.1
-48.860000000,37.12
-48.860000000,37.14
-48.860000000,37.16
-48.860000000,37.18
-48.860000000,37.2
-48.860000000,37.22
-48.860000000,37.24
-48.860000000,37.26
-48.860000000,37.28
-48.860000000,37.3
-48.860000000,37.32
-48.860000000,37.34
-48.860000000,37.36
-48.860000000,37.38
-48.860000000,37.4
-48.860000000,37.42
-48.860000000,37.44
-48.860000000,37.46
-48.860000000,37.48
-48.860000000,37.5
-48.860000000,37.52
-48.860000000,37.54
-48.860000000,37.56
-48.860000000,37.58
-48.860000000,37.6
-48.860000000,37.62
-48.860000000,37.64
-48.860000000,37.66
-48.860000000,37.68
-48.860000000,37.7
-48.860000000,37.72
-48.860000000,37.74
-48.860000000,37.76
-48.860000000,37.78
-48.860000000,37.8
-48.860000000,37.82
-48.860000000,37.84
-48.860000000,37.86
-48.860000000,37.88
-48.860000000,37.9
-48.860000000,37.92
-48.860000000,37.94
-48.860000000,37.96
-48.860000000,37.98
-48.860000000,38
-48.860000000,38.02
-48.860000000,38.04
-48.860000000,38.06
-48.860000000,38.08
-48.860000000,38.1
-48.860000000,38.12
-48.860000000,38.14
-48.860000000,38.16
-48.860000000,38.18
-48.860000000,38.2
-48.860000000,38.22
-48.860000000,38.24
-48.860000000,38.26
-48.860000000,38.28
-48.860000000,38.3
-48.860000000,38.32
-48.860000000,38.34
-48.860000000,38.36
-48.860000000,38.38
-48.860000000,38.4
-48.860000000,38.42
-48.860000000,38.44
-48.860000000,38.46
-48.860000000,38.48
-48.860000000,38.5
-48.860000000,38.52
-48.860000000,38.54
-48.860000000,38.56
-48.860000000,38.58
-48.860000000,38.6
-48.860000000,38.62
-48.860000000,38.64
-48.860000000,38.66
-48.860000000,38.68
-48.860000000,38.7
-48.860000000,38.72
-48.860000000,38.74
-48.860000000,38.76
-48.860000000,38.78
-48.860000000,38.8
-48.860000000,38.82
-48.860000000,38.84
-48.860000000,38.86
-48.860000000,38.88
-48.860000000,38.9
-48.860000000,38.92
-48.860000000,38.94
-48.860000000,38.96
-48.860000000,38.98
-48.860000000,39
-48.860000000,39.02
-48.860000000,39.04
-48.860000000,39.06
-48.860000000,39.08
-48.860000000,39.1
-48.860000000,39.12
-48.860000000,39.14
-48.860000000,39.16
-48.860000000,39.18
-48.860000000,39.2
-48.860000000,39.22
-48.860000000,39.24
-48.860000000,39.26
-48.860000000,39.28
-48.860000000,39.3
-48.860000000,39.32
-48.860000000,39.34
-48.860000000,39.36
-48.860000000,39.38
-48.860000000,39.4
-48.860000000,39.42
-48.860000000,39.44
-48.860000000,39.46
-48.860000000,39.48
-48.860000000,39.5
-48.860000000,39.52
-48.860000000,39.54
-48.860000000,39.56
-48.860000000,39.58
-48.860000000,39.6
-48.860000000,39.62
-48.860000000,39.64
-48.860000000,39.66
-48.860000000,39.68
-48.860000000,39.7
-48.860000000,39.72
-48.860000000,39.74
-48.860000000,39.76
-48.860000000,39.78
-48.860000000,39.8
-48.860000000,39.82
-48.860000000,39.84
-48.860000000,39.86
-48.860000000,39.88
-48.860000000,39.9
-48.860000000,39.92
-48.860000000,39.94
-48.860000000,39.96
-48.860000000,39.98
-48.860000000,40
-48.860000000,40.02
-48.860000000,40.04
-48.860000000,40.06
-48.860000000,40.08
-48.860000000,40.1
-48.860000000,40.12
-48.860000000,40.14
-48.860000000,40.16
-48.860000000,40.18
-48.860000000,40.2
-48.860000000,40.22
-48.860000000,40.24
-48.860000000,40.26
-48.860000000,40.28
-48.860000000,40.3
-48.860000000,40.32
-48.860000000,40.34
-48.860000000,40.36
-48.860000000,40.38
-48.860000000,40.4
-48.860000000,40.42
-48.860000000,40.44
-48.860000000,40.46
-48.860000000,40.48
-48.860000000,40.5
-48.860000000,40.52
-48.860000000,40.54
-48.860000000,40.56
-48.860000000,40.58
-48.860000000,40.6
-48.860000000,40.62
-48.860000000,40.64
-48.860000000,40.66
-48.860000000,40.68
-48.860000000,40.7
-48.860000000,40.72
-48.860000000,40.74
-48.860000000,40.76
-48.860000000,40.78
-48.860000000,40.8
-48.860000000,40.82
-48.860000000,40.84
-48.860000000,40.86
-48.860000000,40.88
-48.860000000,40.9
-48.860000000,40.92
-48.860000000,40.94
-48.860000000,40.96
-48.860000000,40.98
-48.860000000,41
-48.860000000,41.02
-48.860000000,41.04
-48.860000000,41.06
-48.860000000,41.08
-48.860000000,41.1
-48.860000000,41.12
-48.860000000,41.14
-48.860000000,41.16
-48.860000000,41.18
-48.860000000,41.2
-48.860000000,41.22
-48.860000000,41.24
-48.860000000,41.26
-48.860000000,41.28
-48.860000000,41.3
-48.860000000,41.32
-48.860000000,41.34
-48.860000000,41.36
-48.860000000,41.38
-48.860000000,41.4
-48.860000000,41.42
-48.860000000,41.44
-48.860000000,41.46
-48.860000000,41.48
-48.860000000,41.5
-48.860000000,41.52
-48.860000000,41.54
-48.860000000,41.56
-48.860000000,41.58
-48.860000000,41.6
-48.860000000,41.62
-48.860000000,41.64
-48.860000000,41.66
-48.860000000,41.68
-48.860000000,41.7
-48.860000000,41.72
-48.860000000,41.74
-48.860000000,41.76
-48.860000000,41.78
-48.860000000,41.8
-48.860000000,41.82
-48.860000000,41.84
-48.860000000,41.86
-48.860000000,41.88
-48.860000000,41.9
-48.860000000,41.92
-48.860000000,41.94
-48.860000000,41.96
-48.860000000,41.98
-48.860000000,42
-48.860000000,42.02
-48.860000000,42.04
-48.860000000,42.06
-48.860000000,42.08
-48.860000000,42.1
-48.860000000,42.12
-48.860000000,42.14
-48.860000000,42.16
-48.860000000,42.18
-48.860000000,42.2
-48.860000000,42.22
-48.860000000,42.24
-48.860000000,42.26
-48.860000000,42.28
-48.860000000,42.3
-48.860000000,42.32
-48.860000000,42.34
-48.860000000,42.36
-48.860000000,42.38
-48.860000000,42.4
-48.860000000,42.42
-48.860000000,42.44
-48.860000000,42.46
-48.860000000,42.48
-48.860000000,42.5
-48.860000000,42.52
-48.860000000,42.54
-48.860000000,42.56
-48.860000000,42.58
-48.860000000,42.6
-48.860000000,42.62
-48.860000000,42.64
-48.860000000,42.66
-48.860000000,42.68
-48.860000000,42.7
-48.860000000,42.72
-48.860000000,42.74
-48.860000000,42.76
-48.860000000,42.78
-48.860000000,42.8
-48.860000000,42.82
-48.860000000,42.84
-48.860000000,42.86
-48.860000000,42.88
-48.860000000,42.9
-48.860000000,42.92
-48.860000000,42.94
-48.860000000,42.96
-48.860000000,42.98
-48.860000000,43
-48.860000000,43.02
-48.860000000,43.04
-48.860000000,43.06
-48.860000000,43.08
-48.860000000,43.1
-48.860000000,43.12
-48.860000000,43.14
-48.860000000,43.16
-48.860000000,43.18
-48.860000000,43.2
-48.860000000,43.22
-48.860000000,43.24
-48.860000000,43.26
-48.860000000,43.28
-48.860000000,43.3
-48.860000000,43.32
-48.860000000,43.34
-48.860000000,43.36
-48.860000000,43.38
-48.860000000,43.4
-48.860000000,43.42
-48.860000000,43.44
-48.860000000,43.46
-48.860000000,43.48
-48.860000000,43.5
-48.860000000,43.52
-48.860000000,43.54
-48.860000000,43.56
-48.860000000,43.58
-48.860000000,43.6
-48.860000000,43.62
-48.860000000,43.64
-48.860000000,43.66
-48.860000000,43.68
-48.860000000,43.7
-48.860000000,43.72
-48.860000000,43.74
-48.860000000,43.76
-48.860000000,43.78
-48.860000000,43.8
-48.860000000,43.82
-48.860000000,43.84
-48.860000000,43.86
-48.860000000,43.88
-48.860000000,43.9
-48.860000000,43.92
-48.860000000,43.94
-48.860000000,43.96
-48.860000000,43.98
-48.860000000,44
-48.860000000,44.02
-48.860000000,44.04
-48.860000000,44.06
-48.860000000,44.08
-48.860000000,44.1
-48.860000000,44.12
-48.860000000,44.14
-48.860000000,44.16
-48.860000000,44.18
-48.860000000,44.2
-48.860000000,44.22
-48.860000000,44.24
-48.860000000,44.26
-48.860000000,44.28
-48.860000000,44.3
-48.860000000,44.32
-48.860000000,44.34
-48.860000000,44.36
-48.860000000,44.38
-48.860000000,44.4
-48.860000000,44.42
-48.860000000,44.44
-48.860000000,44.46
-48.860000000,44.48
-48.860000000,44.5
-48.860000000,44.52
-48.860000000,44.54
-48.860000000,44.56
-48.860000000,44.58
-48.860000000,44.6
-48.860000000,44.62
-48.860000000,44.64
-48.860000000,44.66
-48.860000000,44.68
-48.860000000,44.7
-48.860000000,44.72
-48.860000000,44.74
-48.860000000,44.76
-48.860000000,44.78
-48.860000000,44.8
-48.860000000,44.82
-48.860000000,44.84
-48.860000000,44.86
-48.860000000,44.88
-48.860000000,44.9
-48.860000000,44.92
-48.860000000,44.94
-48.860000000,44.96
-48.860000000,44.98
-48.860000000,45
-48.860000000,45.02
-48.860000000,45.04
-48.860000000,45.06
-48.860000000,45.08
-48.860000000,45.1
-48.860000000,45.12
-48.860000000,45.14
-48.860000000,45.16
-48.860000000,45.18
-48.860000000,45.2
-48.860000000,45.22
-48.860000000,45.24
-48.860000000,45.26
-48.860000000,45.28
-48.860000000,45.3
-48.860000000,45.32
-48.860000000,45.34
-48.860000000,45.36
-48.860000000,45.38
-48.860000000,45.4
-48.860000000,45.42
-48.860000000,45.44
-48.860000000,45.46
-48.860000000,45.48
-48.860000000,45.5
-48.860000000,45.52
-48.860000000,45.54
-48.860000000,45.56
-48.860000000,45.58
-48.860000000,45.6
-48.860000000,45.62
-48.860000000,45.64
-48.860000000,45.66
-48.860000000,45.68
-48.860000000,45.7
-48.860000000,45.72
-48.860000000,45.74
-48.860000000,45.76
-48.860000000,45.78
-48.860000000,45.8
-48.860000000,45.82
-48.860000000,45.84
-48.860000000,45.86
-48.860000000,45.88
-48.860000000,45.9
-48.860000000,45.92
-48.860000000,45.94
-48.860000000,45.96
-48.860000000,45.98
-48.860000000,46
-48.860000000,46.02
-48.860000000,46.04
-48.860000000,46.06
-48.860000000,46.08
-48.860000000,46.1
-48.860000000,46.12
-48.860000000,46.14
-48.860000000,46.16
-48.860000000,46.18
-48.860000000,46.2
-48.860000000,46.22
-48.860000000,46.24
-48.860000000,46.26
-48.860000000,46.28
-48.860000000,46.3
-48.860000000,46.32
-48.860000000,46.34
-48.860000000,46.36
-48.860000000,46.38
-48.860000000,46.4
-48.860000000,46.42
-48.860000000,46.44
-48.860000000,46.46
-48.860000000,46.48
-48.860000000,46.5
-48.860000000,46.52
-48.860000000,46.54
-48.860000000,46.56
-48.860000000,46.58
-48.860000000,46.6
-48.860000000,46.62
-48.860000000,46.64
-48.860000000,46.66
-48.860000000,46.68
-48.860000000,46.7
-48.860000000,46.72
-48.860000000,46.74
-48.860000000,46.76
-48.860000000,46.78
-48.860000000,46.8
-48.860000000,46.82
-48.860000000,46.84
-48.860000000,46.86
-48.860000000,46.88
-48.860000000,46.9
-48.860000000,46.92
-48.860000000,46.94
-48.860000000,46.96
-48.860000000,46.98
-48.860000000,47
-48.860000000,47.02
-48.860000000,47.04
-48.860000000,47.06
-48.860000000,47.08
-48.860000000,47.1
-48.860000000,47.12
-48.860000000,47.14
-48.860000000,47.16
-48.860000000,47.18
-48.860000000,47.2
-48.860000000,47.22
-48.860000000,47.24
-48.860000000,47.26
-48.860000000,47.28
-48.860000000,47.3
-48.860000000,47.32
-48.860000000,47.34
-48.860000000,47.36
-48.860000000,47.38
-48.860000000,47.4
-48.860000000,47.42
-48.860000000,47.44
-48.860000000,47.46
-48.860000000,47.48
-48.860000000,47.5
-48.860000000,47.52
-48.860000000,47.54
-48.860000000,47.56
-48.860000000,47.58
-48.860000000,47.6
-48.860000000,47.62
-48.860000000,47.64
-48.860000000,47.66
-48.860000000,47.68
-48.860000000,47.7
-48.860000000,47.72
-48.860000000,47.74
-48.860000000,47.76
-48.860000000,47.78
-48.860000000,47.8
-48.860000000,47.82
-48.860000000,47.84
-48.860000000,47.86
-48.860000000,47.88
-48.860000000,47.9
-48.860000000,47.92
-48.860000000,47.94
-48.860000000,47.96
-48.860000000,47.98
-48.860000000,48
-48.860000000,48.02
-48.860000000,48.04
-48.860000000,48.06
-48.860000000,48.08
-48.860000000,48.1
-48.860000000,48.12
-48.860000000,48.14
-48.860000000,48.16
-48.860000000,48.18
-48.860000000,48.2
-48.860000000,48.22
-48.860000000,48.24
-48.860000000,48.26
-48.860000000,48.28
-48.860000000,48.3
-48.860000000,48.32
-48.860000000,48.34
-48.860000000,48.36
-48.860000000,48.38
-48.860000000,48.4
-48.860000000,48.42
-48.860000000,48.44
-48.860000000,48.46
-48.860000000,48.48
-48.860000000,48.5
-48.860000000,48.52
-48.860000000,48.54
-48.860000000,48.56
-48.860000000,48.58
-48.860000000,48.6
-48.860000000,48.62
-48.860000000,48.64
-48.860000000,48.66
-48.860000000,48.68
-48.860000000,48.7
-48.860000000,48.72
-48.860000000,48.74
-48.860000000,48.76
-48.860000000,48.78
-48.860000000,48.8
-48.860000000,48.82
-48.860000000,48.84
-48.860000000,48.86
-48.860000000,48.88
-48.860000000,48.9
-48.860000000,48.92
-48.860000000,48.94
-48.860000000,48.96
-48.860000000,48.98
-48.860000000,49
-48.860000000,49.02
-48.860000000,49.04
-48.860000000,49.06
-48.860000000,49.08
-48.860000000,49.1
-48.860000000,49.12
-48.860000000,49.14
-48.860000000,49.16
-48.860000000,49.18
-48.860000000,49.2
-48.860000000,49.22
-48.860000000,49.24
-48.860000000,49.26
-48.860000000,49.28
-48.860000000,49.3
-48.860000000,49.32
-48.860000000,49.34
-48.860000000,49.36
-48.860000000,49.38
-48.860000000,49.4
-48.860000000,49.42
-48.860000000,49.44
-48.860000000,49.46
-48.860000000,49.48
-48.860000000,49.5
-48.860000000,49.52
-48.860000000,49.54
-48.860000000,49.56
-48.860000000,49.58
-48.860000000,49.6
-48.860000000,49.62
-48.860000000,49.64
-48.860000000,49.66
-48.860000000,49.68
-48.860000000,49.7
-48.860000000,49.72
-48.860000000,49.74
-48.860000000,49.76
-48.860000000,49.78
-48.860000000,49.8
-48.860000000,49.82
-48.860000000,49.84
-48.860000000,49.86
-48.860000000,49.88
-48.860000000,49.9
-48.860000000,49.92
-48.860000000,49.94
-48.860000000,49.96
-48.860000000,49.98
-48.860000000,50
-48.860000000,50.02
-48.860000000,50.04
-48.860000000,50.06
-48.860000000,50.08
-48.860000000,50.1
-48.860000000,50.12
-48.860000000,50.14
-48.860000000,50.16
-48.860000000,50.18
-48.860000000,50.2
-48.860000000,50.22
-48.860000000,50.24
-48.860000000,50.26
-48.860000000,50.28
-48.860000000,50.3
-48.860000000,50.32
-48.860000000,50.34
-48.860000000,50.36
-48.860000000,50.38
-48.860000000,50.4
-48.860000000,50.42
-48.860000000,50.44
-48.860000000,50.46
-48.860000000,50.48
-48.860000000,50.5
-48.860000000,50.52
-48.860000000,50.54
-48.860000000,50.56
-48.860000000,50.58
-48.860000000,50.6
-48.860000000,50.62
-48.860000000,50.64
-48.860000000,50.66
-48.860000000,50.68
-48.860000000,50.7
-48.860000000,50.72
-48.860000000,50.74
-48.860000000,50.76
-48.860000000,50.78
-48.860000000,50.8
-48.860000000,50.82
-48.860000000,50.84
-48.860000000,50.86
-48.860000000,50.88
-48.860000000,50.9
-48.860000000,50.92
-48.860000000,50.94
-48.860000000,50.96
-48.860000000,50.98
-48.860000000,51
-48.860000000,51.02
-48.860000000,51.04
-48.860000000,51.06
-48.860000000,51.08
-48.860000000,51.1
-48.860000000,51.12
-48.860000000,51.14
-48.860000000,51.16
-48.860000000,51.18
-48.860000000,51.2
-48.860000000,51.22
-48.860000000,51.24
-48.860000000,51.26
-48.860000000,51.28
-48.860000000,51.3
-48.860000000,51.32
-48.860000000,51.34
-48.860000000,51.36
-48.860000000,51.38
-48.860000000,51.4
-48.860000000,51.42
-48.860000000,51.44
-48.860000000,51.46
-48.860000000,51.48
-48.860000000,51.5
-48.860000000,51.52
-48.860000000,51.54
-48.860000000,51.56
-48.860000000,51.58
-48.860000000,51.6
-48.860000000,51.62
-48.860000000,51.64
-48.860000000,51.66
-48.860000000,51.68
-48.860000000,51.7
-48.860000000,51.72
-48.860000000,51.74
-48.860000000,51.76
-48.860000000,51.78
-48.860000000,51.8
-48.860000000,51.82
-48.860000000,51.84
-48.860000000,51.86
-48.860000000,51.88
-48.860000000,51.9
-48.860000000,51.92
-48.860000000,51.94
-48.860000000,51.96
-48.860000000,51.98
-48.860000000,52
-48.860000000,52.02
-48.860000000,52.04
-48.860000000,52.06
-48.860000000,52.08
-48.860000000,52.1
-48.860000000,52.12
-48.860000000,52.14
-48.860000000,52.16
-48.860000000,52.18
-48.860000000,52.2
-48.860000000,52.22
-48.860000000,52.24
-48.860000000,52.26
-48.860000000,52.28
-48.860000000,52.3
-48.860000000,52.32
-48.860000000,52.34
-48.860000000,52.36
-48.860000000,52.38
-48.860000000,52.4
-48.860000000,52.42
-48.860000000,52.44
-48.860000000,52.46
-48.860000000,52.48
-48.860000000,52.5
-48.860000000,52.52
-48.860000000,52.54
-48.860000000,52.56
-48.860000000,52.58
-48.860000000,52.6
-48.860000000,52.62
-48.860000000,52.64
-48.860000000,52.66
-48.860000000,52.68
-48.860000000,52.7
-48.860000000,52.72
-48.860000000,52.74
-48.860000000,52.76
-48.860000000,52.78
-48.860000000,52.8
-48.860000000,52.82
-48.860000000,52.84
-48.860000000,52.86
-48.860000000,52.88
-48.860000000,52.9
-48.860000000,52.92
-48.860000000,52.94
-48.860000000,52.96
-48.860000000,52.98
-48.860000000,53
-48.860000000,53.02
-48.860000000,53.04
-48.860000000,53.06
-48.860000000,53.08
-48.860000000,53.1
-48.860000000,53.12
-48.860000000,53.14
-48.860000000,53.16
-48.860000000,53.18
-48.860000000,53.2
-48.860000000,53.22
-48.860000000,53.24
-48.860000000,53.26
-48.860000000,53.28
-48.860000000,53.3
-48.860000000,53.32
-48.860000000,53.34
-48.860000000,53.36
-48.860000000,53.38
-48.860000000,53.4
-48.860000000,53.42
-48.860000000,53.44
-48.860000000,53.46
-48.860000000,53.48
-48.860000000,53.5
-48.860000000,53.52
-48.860000000,53.54
-48.860000000,53.56
-48.860000000,53.58
-48.860000000,53.6
-48.860000000,53.62
-48.860000000,53.64
-48.860000000,53.66
-48.860000000,53.68
-48.860000000,53.7
-48.860000000,53.72
-48.860000000,53.74
-48.860000000,53.76
-48.860000000,53.78
-48.860000000,53.8
-48.860000000,53.82
-48.860000000,53.84
-48.860000000,53.86
-48.860000000,53.88
-48.860000000,53.9
-48.860000000,53.92
-48.860000000,53.94
-48.860000000,53.96
-48.860000000,53.98
-48.860000000,54
-48.860000000,54.02
-48.860000000,54.04
-48.860000000,54.06
-48.860000000,54.08
-48.860000000,54.1
-48.860000000,54.12
-48.860000000,54.14
-48.860000000,54.16
-48.860000000,54.18
-48.860000000,54.2
-48.860000000,54.22
-48.860000000,54.24
-48.860000000,54.26
-48.860000000,54.28
-48.860000000,54.3
-48.860000000,54.32
-48.860000000,54.34
-48.860000000,54.36
-48.860000000,54.38
-48.860000000,54.4
-48.860000000,54.42
-48.860000000,54.44
-48.860000000,54.46
-48.860000000,54.48
-48.860000000,54.5
-48.860000000,54.52
-48.860000000,54.54
-48.860000000,54.56
-48.860000000,54.58
-48.860000000,54.6
-48.860000000,54.62
-48.860000000,54.64
-48.860000000,54.66
-48.860000000,54.68
-48.860000000,54.7
-48.860000000,54.72
-48.860000000,54.74
-48.860000000,54.76
-48.860000000,54.78
-48.860000000,54.8
-48.860000000,54.82
-48.860000000,54.84
-48.860000000,54.86
-48.860000000,54.88
-48.860000000,54.9
-48.860000000,54.92
-48.860000000,54.94
-48.860000000,54.96
-48.860000000,54.98
-48.860000000,55
-48.860000000,55.02
-48.860000000,55.04
-48.860000000,55.06
-48.860000000,55.08
-48.860000000,55.1
-48.860000000,55.12
-48.860000000,55.14
-48.860000000,55.16
-48.860000000,55.18
-48.860000000,55.2
-48.860000000,55.22
-48.860000000,55.24
-48.860000000,55.26
-48.860000000,55.28
-48.860000000,55.3
-48.860000000,55.32
-48.860000000,55.34
-48.860000000,55.36
-48.860000000,55.38
-48.860000000,55.4
-48.860000000,55.42
-48.860000000,55.44
-48.860000000,55.46
-48.860000000,55.48
-48.860000000,55.5
-48.860000000,55.52
-48.860000000,55.54
-48.860000000,55.56
-48.860000000,55.58
-48.860000000,55.6
-48.860000000,55.62
-48.860000000,55.64
-48.860000000,55.66
-48.860000000,55.68
-48.860000000,55.7
-48.860000000,55.72
-48.860000000,55.74
-48.860000000,55.76
-48.860000000,55.78
-48.860000000,55.8
-48.860000000,55.82
-48.860000000,55.84
-48.860000000,55.86
-48.860000000,55.88
-48.860000000,55.9
-48.860000000,55.92
-48.860000000,55.94
-48.860000000,55.96
-48.860000000,55.98
-48.860000000,56
-48.860000000,56.02
-48.860000000,56.04
-48.860000000,56.06
-48.860000000,56.08
-48.860000000,56.1
-48.860000000,56.12
-48.860000000,56.14
-48.860000000,56.16
-48.860000000,56.18
-48.860000000,56.2
-48.860000000,56.22
-48.860000000,56.24
-48.860000000,56.26
-48.860000000,56.28
-48.860000000,56.3
-48.860000000,56.32
-48.860000000,56.34
-48.860000000,56.36
-48.860000000,56.38
-48.860000000,56.4
-48.860000000,56.42
-48.860000000,56.44
-48.860000000,56.46
-48.860000000,56.48
-48.860000000,56.5
-48.860000000,56.52
-48.860000000,56.54
-48.860000000,56.56
-48.860000000,56.58
-48.860000000,56.6
-48.860000000,56.62
-48.860000000,56.64
-48.860000000,56.66
-48.860000000,56.68
-48.860000000,56.7
-48.860000000,56.72
-48.860000000,56.74
-48.860000000,56.76
-48.860000000,56.78
-48.860000000,56.8
-48.860000000,56.82
-48.860000000,56.84
-48.860000000,56.86
-48.860000000,56.88
-48.860000000,56.9
-48.860000000,56.92
-48.860000000,56.94
-48.860000000,56.96
-48.860000000,56.98
-48.860000000,57
-48.860000000,57.02
-48.860000000,57.04
-48.860000000,57.06
-48.860000000,57.08
-48.860000000,57.1
-48.860000000,57.12
-48.860000000,57.14
-48.860000000,57.16
-48.860000000,57.18
-48.860000000,57.2
-48.860000000,57.22
-48.860000000,57.24
-48.860000000,57.26
-48.860000000,57.28
-48.860000000,57.3
-48.860000000,57.32
-48.860000000,57.34
-48.860000000,57.36
-48.860000000,57.38
-48.860000000,57.4
-48.860000000,57.42
-48.860000000,57.44
-48.860000000,57.46
-48.860000000,57.48
-48.860000000,57.5
-48.860000000,57.52
-48.860000000,57.54
-48.860000000,57.56
-48.860000000,57.58
-48.860000000,57.6
-48.860000000,57.62
-48.860000000,57.64
-48.860000000,57.66
-48.860000000,57.68
-48.860000000,57.7
-48.860000000,57.72
-48.860000000,57.74
-48.860000000,57.76
-48.860000000,57.78
-48.860000000,57.8
-48.860000000,57.82
-48.860000000,57.84
-48.860000000,57.86
-48.860000000,57.88
-48.860000000,57.9
-48.860000000,57.92
-48.860000000,57.94
-48.860000000,57.96
-48.860000000,57.98
-48.860000000,58
-48.860000000,58.02
-48.860000000,58.04
-48.860000000,58.06
-48.860000000,58.08
-48.860000000,58.1
-48.860000000,58.12
-48.860000000,58.14
-48.860000000,58.16
-48.860000000,58.18
-48.860000000,58.2
-48.860000000,58.22
-48.860000000,58.24
-48.860000000,58.26
-48.860000000,58.28
-48.860000000,58.3
-48.860000000,58.32
-48.860000000,58.34
-48.860000000,58.36
-48.860000000,58.38
-48.860000000,58.4
-48.860000000,58.42
-48.860000000,58.44
-48.860000000,58.46
-48.860000000,58.48
-48.860000000,58.5
-48.860000000,58.52
-48.860000000,58.54
-48.860000000,58.56
-48.860000000,58.58
-48.860000000,58.6
-48.860000000,58.62
-48.860000000,58.64
-48.860000000,58.66
-48.860000000,58.68
-48.860000000,58.7
-48.860000000,58.72
-48.860000000,58.74
-48.860000000,58.76
-48.860000000,58.78
-48.860000000,58.8
-48.860000000,58.82
-48.860000000,58.84
-48.860000000,58.86
-48.860000000,58.88
-48.860000000,58.9
-48.860000000,58.92
-48.860000000,58.94
-48.860000000,58.96
-48.860000000,58.98
-48.860000000,59
-48.860000000,59.02
-48.860000000,59.04
-48.860000000,59.06
-48.860000000,59.08
-48.860000000,59.1
-48.860000000,59.12
-48.860000000,59.14
-48.860000000,59.16
-48.860000000,59.18
-48.860000000,59.2
-48.860000000,59.22
-48.860000000,59.24
-48.860000000,59.26
-48.860000000,59.28
-48.860000000,59.3
-48.860000000,59.32
-48.860000000,59.34
-48.860000000,59.36
-48.860000000,59.38
-48.860000000,59.4
-48.860000000,59.42
-48.860000000,59.44
-48.860000000,59.46
-48.860000000,59.48
-48.860000000,59.5
-48.860000000,59.52
-48.860000000,59.54
-48.860000000,59.56
-48.860000000,59.58
-48.860000000,59.6
-48.860000000,59.62
-48.860000000,59.64
-48.860000000,59.66
-48.860000000,59.68
-48.860000000,59.7
-48.860000000,59.72
-48.860000000,59.74
-48.860000000,59.76
-48.860000000,59.78
-48.860000000,59.8
-48.860000000,59.82
-48.860000000,59.84
-48.860000000,59.86
-48.860000000,59.88
-48.860000000,59.9
-48.860000000,59.92
-48.860000000,59.94
-48.860000000,59.96
-48.860000000,59.98
-48.860000000,60
-48.860000000,60.02
-48.860000000,60.04
-48.860000000,60.06
-48.860000000,60.08
-48.860000000,60.1
-48.860000000,60.12
-48.860000000,60.14
-48.860000000,60.16
-48.860000000,60.18
-48.860000000,60.2
-48.860000000,60.22
-48.860000000,60.24
-48.860000000,60.26
-48.860000000,60.28
-48.860000000,60.3
-48.860000000,60.32
-48.860000000,60.34
-48.860000000,60.36
-48.860000000,60.38
-48.860000000,60.4
-48.860000000,60.42
-48.860000000,60.44
-48.860000000,60.46
-48.860000000,60.48
-48.860000000,60.5
-48.860000000,60.52
-48.860000000,60.54
-48.860000000,60.56
-48.860000000,60.58
-48.860000000,60.6
-48.860000000,60.62
-48.860000000,60.64
-48.860000000,60.66
-48.860000000,60.68
-48.860000000,60.7
-48.860000000,60.72
-48.860000000,60.74
-48.860000000,60.76
-48.860000000,60.78
-48.860000000,60.8
-48.860000000,60.82
-48.860000000,60.84
-48.860000000,60.86
-48.860000000,60.88
-48.860000000,60.9
-48.860000000,60.92
-48.860000000,60.94
-48.860000000,60.96
-48.860000000,60.98
-48.860000000,61
-48.860000000,61.02
-48.860000000,61.04
-48.860000000,61.06
-48.860000000,61.08
-48.860000000,61.1
-48.860000000,61.12
-48.860000000,61.14
-48.860000000,61.16
-48.860000000,61.18
-48.860000000,61.2
-48.860000000,61.22
-48.860000000,61.24
-48.860000000,61.26
-48.860000000,61.28
-48.860000000,61.3
-48.860000000,61.32
-48.860000000,61.34
-48.860000000,61.36
-48.860000000,61.38
-48.860000000,61.4
-48.860000000,61.42
-48.860000000,61.44
-48.860000000,61.46
-48.860000000,61.48
-48.860000000,61.5
-48.860000000,61.52
-48.860000000,61.54
-48.880000000,61.56
-48.900000000,61.58
-48.920000000,61.6
-48.940000000,61.62
-48.960000000,61.64
-48.980000000,61.66
-49.000000000,61.68
-49.020000000,61.7
-49.040000000,61.72
-49.060000000,61.74
-49.080000000,61.76
-49.100000000,61.78
-49.120000000,61.8
-49.140000000,61.82
-49.160000000,61.84
-49.180000000,61.86
-49.200000000,61.88
-49.220000000,61.9
-49.240000000,61.92
-49.260000000,61.94
-49.280000000,61.96
-49.300000000,61.98
-49.320000000,62
-49.340000000,62.02
-49.360000000,62.04
-49.380000000,62.06
-49.400000000,62.08
-49.420000000,62.1
-49.440000000,62.12
-49.460000000,62.14
-49.480000000,62.16
-49.500000000,62.18
-49.520000000,62.2
-49.540000000,62.22
-49.560000000,62.24
-49.580000000,62.26
-49.600000000,62.28
-49.620000000,62.3
-49.640000000,62.32
-49.660000000,62.34
-49.680000000,62.36
-49.700000000,62.38
-49.720000000,62.4
-49.740000000,62.42
-49.760000000,62.44
-49.780000000,62.46
-49.800000000,62.48
-49.820000000,62.5
-49.840000000,62.52
-49.860000000,62.54
-49.880000000,62.56
-49.900000000,62.56
-49.920000000,62.56
-49.940000000,62.56
-49.960000000,62.56
-49.980000000,62.56
-50.000000000,62.56
-50.020000000,62.56
-50.040000000,62.56
-50.060000000,62.56
-50.080000000,62.56
-50.100000000,62.56
-50.120000000,62.56
-50.140000000,62.56
-50.160000000,62.56
-50.180000000,62.56
-50.200000000,62.56
-50.220000000,62.56
-50.240000000,62.56
-50.260000000,62.56
-50.280000000,62.56
-50.300000000,62.56
-50.320000000,62.56
-50.340000000,62.56
-50.360000000,62.56
-50.380000000,62.56
-50.400000000,62.56
-50.420000000,62.56
-50.440000000,62.56
-50.460000000,62.56
-50.480000000,62.56
-50.500000000,62.56
-50.520000000,62.56
-50.540000000,62.56
-50.560000000,62.56
-50.580000000,62.56
-50.600000000,62.56
-50.620000000,62.56
-50.640000000,62.56
-50.660000000,62.56
-50.680000000,62.56
-50.700000000,62.56
-50.720000000,62.56
-50.740000000,62.56
-50.760000000,62.56
-50.780000000,62.56
-50.800000000,62.56
-50.820000000,62.56
-50.840000000,62.56
-50.860000000,62.56
-50.880000000,62.56
-50.900000000,62.56
-50.920000000,62.56
-50.940000000,62.56
-50.960000000,62.56
-50.980000000,62.56
-51.000000000,62.56
-51.020000000,62.56
-51.040000000,62.56
-51.060000000,62.56
-51.080000000,62.56
-51.100000000,62.56
-51.120000000,62.56
-51.140000000,62.56
-51.160000000,62.56
-51.180000000,62.56
-51.200000000,62.56
-51.220000000,62.56
-51.240000000,62.56
-51.260000000,62.56
-51.280000000,62.56
-51.300000000,62.56
-51.320000000,62.56
-51.340000000,62.56
-51.360000000,62.56
-51.380000000,62.56
-51.400000000,62.56
-51.420000000,62.56
-51.440000000,62.56
-51.460000000,62.56
-51.480000000,62.56
-51.500000000,62.56
-51.520000000,62.56
-51.540000000,62.56
-51.560000000,62.56
-51.580000000,62.56
-51.600000000,62.56
-51.620000000,62.56
-51.640000000,62.56
-51.660000000,62.56
-51.680000000,62.56
-51.700000000,62.56
-51.720000000,62.56
-51.740000000,62.56
-51.760000000,62.56
-51.780000000,62.56
-51.800000000,62.56
-51.820000000,62.56
-51.840000000,62.56
-51.860000000,62.56
-51.880000000,62.56
-51.900000000,62.56
-51.920000000,62.56
-51.940000000,62.56
-51.960000000,62.56
-51.980000000,62.56
-52.000000000,62.56
-52.020000000,62.56
-52.040000000,62.56
-52.060000000,62.56
-52.080000000,62.56
-52.100000000,62.56
-52.120000000,62.56
-52.140000000,62.56
-52.160000000,62.56
-52.180000000,62.56
-52.200000000,62.56
-52.220000000,62.56
-52.240000000,62.56
-52.260000000,62.56
-52.280000000,62.56
-52.300000000,62.56
-52.320000000,62.56
-52.340000000,62.56
-52.360000000,62.56
-52.380000000,62.56
-52.400000000,62.56
-52.420000000,62.56
-52.440000000,62.56
-52.460000000,62.56
-52.480000000,62.56
-52.500000000,62.56
-52.520000000,62.56
-52.540000000,62.56
-52.560000000,62.56
-52.580000000,62.56
-52.600000000,62.56
-52.620000000,62.56
-52.640000000,62.56
-52.660000000,62.56
-52.680000000,62.56
-52.700000000,62.56
-52.720000000,62.56
-52.740000000,62.56
-52.760000000,62.56
-52.780000000,62.56
-52.800000000,62.56
-52.820000000,62.56
-52.840000000,62.56
-52.860000000,62.56
-52.880000000,62.56
-52.900000000,62.56
-52.920000000,62.56
-52.940000000,62.56
-52.960000000,62.56
-52.980000000,62.56
-53.000000000,62.56
-53.020000000,62.56
-53.040000000,62.56
-53.060000000,62.56
-53.080000000,62.56
-53.100000000,62.56
-53.120000000,62.56
-53.140000000,62.56
-53.160000000,62.56
-53.180000000,62.56
-53.200000000,62.56
-53.220000000,62.56
-53.240000000,62.56
-53.260000000,62.56
-53.280000000,62.56
-53.300000000,62.56
-53.320000000,62.56
-53.340000000,62.56
-53.360000000,62.56
-53.380000000,62.56
-53.400000000,62.56
-53.420000000,62.56
-53.440000000,62.56
-53.460000000,62.56
-53.480000000,62.56
-53.500000000,62.56
-53.520000000,62.56
-53.540000000,62.56
-53.560000000,62.56
-53.580000000,62.56
-53.600000000,62.56
-53.620000000,62.56
-53.640000000,62.56
-53.660000000,62.56
-53.680000000,62.56
-53.700000000,62.56
-53.720000000,62.56
-53.740000000,62.56
-53.760000000,62.56
-53.780000000,62.56
-53.800000000,62.56
-53.820000000,62.56
-53.840000000,62.56
-53.860000000,62.56
-53.880000000,62.56
-53.900000000,62.56
-53.920000000,62.56
-53.940000000,62.56
-53.960000000,62.56
-53.980000000,62.56
-54.000000000,62.56
-54.020000000,62.56
-54.040000000,62.56
-54.060000000,62.56
-54.080000000,62.56
-54.100000000,62.56
-54.120000000,62.56
-54.140000000,62.56
-54.160000000,62.56
-54.180000000,62.56
-54.200000000,62.56
-54.220000000,62.56
-54.240000000,62.56
-54.260000000,62.56
-54.280000000,62.56
-54.300000000,62.56
-54.320000000,62.56
-54.340000000,62.56
-54.360000000,62.56
-54.380000000,62.56
-54.400000000,62.56
-54.420000000,62.56
-54.440000000,62.56
-54.460000000,62.56
-54.480000000,62.56
-54.500000000,62.56
-54.520000000,62.56
-54.540000000,62.56
-54.560000000,62.56
-54.580000000,62.56
-54.600000000,62.56
-54.620000000,62.56
-54.640000000,62.56
-54.660000000,62.56
-54.680000000,62.56
-54.700000000,62.56
-54.720000000,62.56
-54.740000000,62.56
-54.760000000,62.56
-54.780000000,62.56
-54.800000000,62.56
-54.820000000,62.56
-54.840000000,62.56
-54.860000000,62.56
-54.880000000,62.56
-54.900000000,62.56
-54.920000000,62.56
-54.940000000,62.56
-54.960000000,62.56
-54.980000000,62.56
-55.000000000,62.56
-55.020000000,62.56
-55.040000000,62.56
-55.060000000,62.56
-55.080000000,62.56
-55.100000000,62.56
-55.120000000,62.56
-55.140000000,62.56
-55.160000000,62.56
-55.180000000,62.56
-55.200000000,62.56
-55.220000000,62.56
-55.240000000,62.56
-55.260000000,62.56
-55.280000000,62.56
-55.300000000,62.56
-55.320000000,62.56
-55.340000000,62.56
-55.360000000,62.56
-55.380000000,62.56
-55.400000000,62.56
-55.420000000,62.56
-55.440000000,62.56
-55.460000000,62.56
-55.480000000,62.56
-55.500000000,62.56
-55.520000000,62.56
-55.540000000,62.56
-55.560000000,62.56
-55.580000000,62.56
-55.600000000,62.56
-55.620000000,62.56
-55.640000000,62.56
-55.660000000,62.56
-55.680000000,62.56
-55.700000000,62.56
-55.720000000,62.56
-55.740000000,62.56
-55.760000000,62.56
-55.780000000,62.56
-55.800000000,62.56
-55.820000000,62.56
-55.840000000,62.56
-55.860000000,62.56
-55.880000000,62.56
-55.900000000,62.56
-55.920000000,62.56
-55.940000000,62.56
-55.960000000,62.56
-55.980000000,62.56
-56.000000000,62.56
-56.020000000,62.56
-56.040000000,62.56
-56.060000000,62.56
-56.080000000,62.56
-56.100000000,62.56
-56.120000000,62.56
-56.140000000,62.56
-56.160000000,62.56
-56.180000000,62.56
-56.200000000,62.56
-56.220000000,62.56
-56.240000000,62.56
-56.260000000,62.56
-56.280000000,62.56
-56.300000000,62.56
-56.320000000,62.56
-56.340000000,62.56
-56.360000000,62.56
-56.380000000,62.56
-56.400000000,62.56
-56.420000000,62.56
-56.440000000,62.56
-56.460000000,62.56
-56.480000000,62.56
-56.500000000,62.56
-56.520000000,62.56
-56.540000000,62.56
-56.560000000,62.56
-56.580000000,62.56
-56.600000000,62.56
-56.620000000,62.56
-56.640000000,62.56
-56.660000000,62.56
-56.680000000,62.56
-56.700000000,62.56
-56.720000000,62.56
-56.740000000,62.56
-56.760000000,62.56
-56.780000000,62.56
-56.800000000,62.56
-56.820000000,62.56
-56.840000000,62.56
-56.860000000,62.56
-56.880000000,62.56
-56.900000000,62.56
-56.920000000,62.56
-56.940000000,62.56
-56.960000000,62.56
-56.980000000,62.56
-57.000000000,62.56
-57.020000000,62.56
-57.040000000,62.56
-57.060000000,62.56
-57.080000000,62.56
-57.100000000,62.56
-57.120000000,62.56
-57.140000000,62.56
-57.160000000,62.56
-57.180000000,62.56
-57.200000000,62.56
-57.220000000,62.56
-57.240000000,62.56
-57.260000000,62.56
-57.280000000,62.56
-57.300000000,62.56
-57.320000000,62.56
-57.340000000,62.56
-57.360000000,62.56
-57.380000000,62.56
-57.400000000,62.56
-57.420000000,62.56
-57.440000000,62.56
-57.460000000,62.56
-57.480000000,62.56
-57.500000000,62.56
-57.520000000,62.56
-57.540000000,62.56
-57.560000000,62.56
-57.580000000,62.56
-57.600000000,62.56
-57.620000000,62.56
-57.640000000,62.56
-57.660000000,62.56
-57.680000000,62.56
-57.700000000,62.56
-57.720000000,62.56
-57.740000000,62.56
-57.760000000,62.56
-57.780000000,62.56
-57.800000000,62.56
-57.820000000,62.56
-57.840000000,62.56
-57.860000000,62.56
-57.880000000,62.56
-57.900000000,62.56
-57.920000000,62.56
-57.940000000,62.56
-57.960000000,62.56
-57.980000000,62.56
-58.000000000,62.56
-58.020000000,62.56
-58.040000000,62.56
-58.060000000,62.56
-58.080000000,62.56
-58.100000000,62.56
-58.120000000,62.56
-58.140000000,62.56
-58.160000000,62.56
-58.180000000,62.56
-58.200000000,62.56
-58.220000000,62.56
-58.240000000,62.56
-58.260000000,62.56
-58.280000000,62.56
-58.300000000,62.56
-58.320000000,62.56
-58.340000000,62.56
-58.360000000,62.56
-58.380000000,62.56
-58.400000000,62.56
-58.420000000,62.56
-58.440000000,62.56
-58.460000000,62.56
-58.480000000,62.56
-58.500000000,62.56
-58.520000000,62.56
-58.540000000,62.56
-58.560000000,62.56
-58.580000000,62.56
-58.600000000,62.56
-58.620000000,62.56
-58.640000000,62.56
-58.660000000,62.56
-58.680000000,62.56
-58.700000000,62.56
-58.720000000,62.56
-58.740000000,62.56
-58.760000000,62.56
-58.780000000,62.56
-58.800000000,62.56
-58.820000000,62.56
-58.840000000,62.56
-58.860000000,62.56
-58.880000000,62.56
-58.900000000,62.56
-58.920000000,62.56
-58.940000000,62.56
-58.960000000,62.56
-58.980000000,62.56
-59.000000000,62.56
-59.020000000,62.56
-59.040000000,62.56
-59.060000000,62.56
-59.080000000,62.56
-59.100000000,62.56
-59.120000000,62.56
-59.140000000,62.56
-59.160000000,62.56
-59.180000000,62.56
-59.200000000,62.56
-59.220000000,62.56
-59.240000000,62.56
-59.260000000,62.56
-59.280000000,62.56
-59.300000000,62.56
-59.320000000,62.56
-59.340000000,62.56
-59.360000000,62.56
-59.380000000,62.56
-59.400000000,62.56
-59.420000000,62.56
-59.440000000,62.56
-59.460000000,62.56
-59.480000000,62.56
-59.500000000,62.56
-59.520000000,62.56
-59.540000000,62.56
-59.560000000,62.56
-59.580000000,62.56
-59.600000000,62.56
-59.620000000,62.56
-59.640000000,62.56
-59.660000000,62.56
-59.680000000,62.56
-59.700000000,62.56
-59.720000000,62.56
-59.740000000,62.56
-59.760000000,62.56
-59.780000000,62.56
-59.800000000,62.58
-59.820000000,62.6
-59.840000000,62.62
-59.860000000,62.64
-59.880000000,62.66
-59.900000000,62.68
-59.920000000,62.7
-59.940000000,62.72
-59.960000000,62.74
-59.980000000,62.76
-60.000000000,62.78
-60.020000000,62.8
-60.040000000,62.82
-60.060000000,62.84
-60.080000000,62.86
-60.100000000,62.88
-60.120000000,62.9
-60.140000000,62.92
-60.160000000,62.94
-60.180000000,62.96
-60.200000000,62.98
-60.220000000,63
-60.240000000,63.02
-60.260000000,63.04
-60.280000000,63.06
-60.300000000,63.08
-60.320000000,63.1
-60.340000000,63.12
-60.360000000,63.14
-60.380000000,63.16
-60.400000000,63.18
-60.420000000,63.2
-60.440000000,63.22
-60.460000000,63.24
-60.480000000,63.26
-60.500000000,63.28
-60.520000000,63.3
-60.540000000,63.32
-60.560000000,63.34
-60.580000000,63.36
-60.600000000,63.38
-60.620000000,63.4
-60.640000000,63.42
-60.660000000,63.44
-60.680000000,63.46
-60.700000000,63.48
-60.720000000,63.5
-60.740000000,63.52
-60.760000000,63.54
-60.780000000,63.56
-60.800000000,63.58
-60.800000000,63.6
-60.800000000,63.62
-60.800000000,63.64
-60.800000000,63.66
-60.800000000,63.68
-60.800000000,63.7
-60.800000000,63.72
-60.800000000,63.74
-60.800000000,63.76
-60.800000000,63.78
-60.800000000,63.8
-60.800000000,63.82
-60.800000000,63.84
-60.800000000,63.86
-60.800000000,63.88
-60.800000000,63.9
-60.800000000,63.92
-60.800000000,63.94
-60.800000000,63.96
-60.800000000,63.98
-60.800000000,64
-60.800000000,64.02
-60.800000000,64.04
-60.800000000,64.06
-60.800000000,64.08
-60.800000000,64.1
-60.800000000,64.12
-60.800000000,64.14
-60.800000000,64.16
-60.800000000,64.18
-60.800000000,64.2
-60.800000000,64.22
-60.800000000,64.24
-60.800000000,64.26
-60.800000000,64.28
-60.800000000,64.3
-60.800000000,64.32
-60.800000000,64.34
-60.800000000,64.36
-60.800000000,64.38
-60.800000000,64.4
-60.800000000,64.42
-60.800000000,64.44
-60.800000000,64.46
-60.800000000,64.48
-60.800000000,64.5
-60.800000000,64.52
-60.800000000,64.54
-60.800000000,64.56
-60.800000000,64.58
-60.800000000,64.6
-60.800000000,64.62
-60.800000000,64.64
-60.800000000,64.66
-60.800000000,64.68
-60.800000000,64.7
-60.800000000,64.72
-60.800000000,64.74
-60.800000000,64.76
-60.800000000,64.78
-60.800000000,64.8
-60.800000000,64.82
-60.800000000,64.84
-60.800000000,64.86
-60.800000000,64.88
-60.800000000,64.9
-60.800000000,64.92
-60.800000000,64.94
-60.800000000,64.96
-60.800000000,64.98
-60.800000000,65
-60.800000000,65.02
-60.800000000,65.04
-60.800000000,65.06
-60.800000000,65.08
-60.800000000,65.1
-60.800000000,65.12
-60.800000000,65.14
-60.800000000,65.16
-60.800000000,65.18
-60.800000000,65.2
-60.800000000,65.22
-60.800000000,65.24
-60.800000000,65.26
-60.800000000,65.28
-60.800000000,65.3
-60.800000000,65.32
-60.800000000,65.34
-60.800000000,65.36
-60.800000000,65.38
-60.800000000,65.4
-60.800000000,65.42
-60.800000000,65.44
-60.800000000,65.46
-60.800000000,65.48
-60.800000000,65.5
-60.800000000,65.52
-60.800000000,65.54
-60.800000000,65.56
-60.800000000,65.58
-60.800000000,65.6
-60.800000000,65.62
-60.800000000,65.64
-60.800000000,65.66
-60.800000000,65.68
-60.800000000,65.7
-60.800000000,65.72
-60.800000000,65.74
-60.800000000,65.76
-60.800000000,65.78
-60.800000000,65.8
-60.800000000,65.82
-60.800000000,65.84
-60.800000000,65.86
-60.800000000,65.88
-60.800000000,65.9
-60.800000000,65.92
-60.800000000,65.94
-60.800000000,65.96
-60.800000000,65.98
-60.800000000,66
-60.800000000,66.02
-60.800000000,66.04
-60.800000000,66.06
-60.800000000,66.08
-60.800000000,66.1
-60.800000000,66.12
-60.800000000,66.14
-60.800000000,66.16
-60.800000000,66.18
-60.800000000,66.2
-60.800000000,66.22
-60.800000000,66.24
-60.800000000,66.26
-60.800000000,66.28
-60.800000000,66.3
-60.800000000,66.32
-60.800000000,66.34
-60.800000000,66.36
-60.800000000,66.38
-60.800000000,66.4
-60.800000000,66.42
-60.800000000,66.44
-60.800000000,66.46
-60.800000000,66.48
-60.800000000,66.5
-60.800000000,66.52
-60.800000000,66.54
-60.800000000,66.56
-60.800000000,66.58
-60.800000000,66.6
-60.800000000,66.62
-60.800000000,66.64
-60.800000000,66.66
-60.800000000,66.68
-60.800000000,66.7
-60.800000000,66.72
-60.800000000,66.74
-60.800000000,66.76
-60.800000000,66.78
-60.800000000,66.8
-60.800000000,66.82
-60.800000000,66.84
-60.800000000,66.86
-60.800000000,66.88
-60.800000000,66.9
-60.800000000,66.92
-60.800000000,66.94
-60.800000000,66.96
-60.800000000,66.98
-60.800000000,67
-60.800000000,67.02
-60.800000000,67.04
-60.800000000,67.06
-60.800000000,67.08
-60.800000000,67.1
-60.800000000,67.12
-60.800000000,67.14
-60.800000000,67.16
-60.800000000,67.18
-60.800000000,67.2
-60.800000000,67.22
-60.800000000,67.24
-60.800000000,67.26
-60.800000000,67.28
-60.800000000,67.3
-60.800000000,67.32
-60.800000000,67.34
-60.800000000,67.36
-60.800000000,67.38
-60.800000000,67.4
-60.800000000,67.42
-60.800000000,67.44
-60.800000000,67.46
-60.800000000,67.48
-60.800000000,67.5
-60.800000000,67.52
-60.800000000,67.54
-60.800000000,67.56
-60.800000000,67.58
-60.800000000,67.6
-60.800000000,67.62
-60.800000000,67.64
-60.800000000,67.66
-60.800000000,67.68
-60.800000000,67.7
-60.800000000,67.72
-60.800000000,67.74
-60.800000000,67.76
-60.800000000,67.78
-60.800000000,67.8
-60.800000000,67.82
-60.800000000,67.84
-60.800000000,67.86
-60.800000000,67.88
-60.800000000,67.9
-60.800000000,67.92
-60.800000000,67.94
-60.800000000,67.96
-60.800000000,67.98
-60.800000000,68
-60.800000000,68.02
-60.800000000,68.04
-60.800000000,68.06
-60.800000000,68.08
-60.800000000,68.1
-60.800000000,68.12
-60.800000000,68.14
-60.800000000,68.16
-60.800000000,68.18
-60.800000000,68.2
-60.800000000,68.22
-60.800000000,68.24
-60.800000000,68.26
-60.800000000,68.28
-60.800000000,68.3
-60.800000000,68.32
-60.800000000,68.34
-60.800000000,68.36
-60.800000000,68.38
-60.800000000,68.4
-60.800000000,68.42
-60.800000000,68.44
-60.800000000,68.46
-60.800000000,68.48
-60.800000000,68.5
-60.800000000,68.52
-60.800000000,68.54
-60.800000000,68.56
-60.800000000,68.58
-60.800000000,68.6
-60.800000000,68.62
-60.800000000,68.64
-60.800000000,68.66
-60.800000000,68.68
-60.800000000,68.7
-60.800000000,68.72
-60.800000000,68.74
-60.800000000,68.76
-60.800000000,68.78
-60.800000000,68.8
-60.800000000,68.82
-60.800000000,68.84
-60.800000000,68.86
-60.800000000,68.88
-60.800000000,68.9
-60.800000000,68.92
-60.800000000,68.94
-60.800000000,68.96
-60.800000000,68.98
-60.800000000,69
-60.800000000,69.02
-60.800000000,69.04
-60.800000000,69.06
-60.800000000,69.08
-60.800000000,69.1
-60.800000000,69.12
-60.800000000,69.14
-60.800000000,69.16
-60.800000000,69.18
-60.800000000,69.2
-60.800000000,69.22
-60.800000000,69.24
-60.800000000,69.26
-60.800000000,69.28
-60.800000000,69.3
-60.800000000,69.32
-60.800000000,69.34
-60.800000000,69.36
-60.800000000,69.38
-60.800000000,69.4
-60.800000000,69.42
-60.800000000,69.44
-60.800000000,69.46
-60.800000000,69.48
-60.800000000,69.5
-60.800000000,69.52
-60.800000000,69.54
-60.800000000,69.56
-60.800000000,69.58
-60.800000000,69.6
-60.800000000,69.62
-60.800000000,69.64
-60.800000000,69.66
-60.800000000,69.68
-60.800000000,69.7
-60.800000000,69.72
-60.800000000,69.74
-60.800000000,69.76
-60.800000000,69.78
-60.800000000,69.8
-60.800000000,69.82
-60.800000000,69.84
-60.800000000,69.86
-60.800000000,69.88
-60.800000000,69.9
-60.800000000,69.92
-60.800000000,69.94
-60.800000000,69.96
-60.800000000,69.98
-60.800000000,70
-60.800000000,70.02
-60.800000000,70.04
-60.800000000,70.06
-60.800000000,70.08
-60.800000000,70.1
-60.800000000,70.12
-60.800000000,70.14
-60.800000000,70.16
-60.800000000,70.18
-60.800000000,70.2
-60.800000000,70.22
-60.800000000,70.24
-60.800000000,70.26
-60.800000000,70.28
-60.800000000,70.3
-60.800000000,70.32
-60.800000000,70.34
-60.800000000,70.36
-60.800000000,70.38
-60.800000000,70.4
-60.800000000,70.42
-60.800000000,70.44
-60.800000000,70.46
-60.800000000,70.48
-60.800000000,70.5
-60.800000000,70.52
-60.800000000,70.54
-60.800000000,70.56
-60.800000000,70.58
-60.800000000,70.6
-60.800000000,70.62
-60.800000000,70.64
-60.800000000,70.66
-60.800000000,70.68
-60.800000000,70.7
-60.800000000,70.72
-60.800000000,70.74
-60.800000000,70.76
-60.800000000,70.78
-60.800000000,70.8
-60.800000000,70.82
-60.800000000,70.84
-60.800000000,70.86
-60.800000000,70.88
-60.800000000,70.9
-60.800000000,70.92
-60.800000000,70.94
-60.800000000,70.96
-60.800000000,70.98
-60.800000000,71
-60.800000000,71.02
-60.800000000,71.04
-60.800000000,71.06
-60.800000000,71.08
-60.800000000,71.1
-60.800000000,71.12
-60.800000000,71.14
-60.800000000,71.16
-60.800000000,71.18
-60.800000000,71.2
-60.800000000,71.22
-60.800000000,71.24
-60.800000000,71.26
-60.800000000,71.28
-60.800000000,71.3
-60.800000000,71.32
-60.800000000,71.34
-60.800000000,71.36
-60.800000000,71.38
-60.800000000,71.4
-60.800000000,71.42
-60.800000000,71.44
-60.800000000,71.46
-60.800000000,71.48
-60.800000000,71.5
-60.800000000,71.52
-60.800000000,71.54
-60.800000000,71.56
-60.800000000,71.58
-60.800000000,71.6
-60.800000000,71.62
-60.800000000,71.64
-60.800000000,71.66
-60.800000000,71.68
-60.800000000,71.7
-60.800000000,71.72
-60.800000000,71.74
-60.800000000,71.76
-60.800000000,71.78
-60.800000000,71.8
-60.800000000,71.82
-60.800000000,71.84
-60.800000000,71.86
-60.800000000,71.88
-60.800000000,71.9
-60.800000000,71.92
-60.800000000,71.94
-60.800000000,71.96
-60.800000000,71.98
-60.800000000,72
-60.800000000,72.02
-60.800000000,72.04
-60.800000000,72.06
-60.800000000,72.08
-60.800000000,72.1
-60.800000000,72.12
-60.800000000,72.14
-60.800000000,72.16
-60.800000000,72.18
-60.800000000,72.2
-60.800000000,72.22
-60.800000000,72.24
-60.800000000,72.26
-60.800000000,72.28
-60.800000000,72.3
-60.800000000,72.32
-60.800000000,72.34
-60.800000000,72.36
-60.800000000,72.38
-60.800000000,72.4
-60.800000000,72.42
-60.800000000,72.44
-60.800000000,72.46
-60.800000000,72.48
-60.800000000,72.5
-60.800000000,72.52
-60.800000000,72.54
-60.800000000,72.56
-60.800000000,72.58
-60.800000000,72.6
-60.800000000,72.62
-60.800000000,72.64
-60.800000000,72.66
-60.800000000,72.68
-60.800000000,72.7
-60.800000000,72.72
-60.800000000,72.74
-60.800000000,72.76
-60.800000000,72.78
-60.800000000,72.8
-60.800000000,72.82
-60.800000000,72.84
-60.800000000,72.86
-60.800000000,72.88
-60.800000000,72.9
-60.800000000,72.92
-60.800000000,72.94
-60.800000000,72.96
-60.800000000,72.98
-60.800000000,73
-60.800000000,73.02
-60.800000000,73.04
-60.800000000,73.06
-60.800000000,73.08
-60.800000000,73.1
-60.800000000,73.12
-60.800000000,73.14
-60.800000000,73.16
-60.800000000,73.18
-60.800000000,73.2
-60.800000000,73.22
-60.800000000,73.24
-60.800000000,73.26
-60.800000000,73.28
-60.800000000,73.3
-60.800000000,73.32
-60.800000000,73.34
-60.800000000,73.36
-60.800000000,73.38
-60.800000000,73.4
-60.800000000,73.42
-60.800000000,73.44
-60.800000000,73.46
-60.800000000,73.48
-60.800000000,73.5
-60.800000000,73.52
-60.800000000,73.54
-60.800000000,73.56
-60.800000000,73.58
-60.800000000,73.6
-60.800000000,73.62
-60.800000000,73.64
-60.800000000,73.66
-60.800000000,73.68
-60.800000000,73.7
-60.800000000,73.72
-60.800000000,73.74
-60.800000000,73.76
-60.800000000,73.78
-60.800000000,73.8
-60.800000000,73.82
-60.800000000,73.84
-60.800000000,73.86
-60.800000000,73.88
-60.800000000,73.9
-60.800000000,73.92
-60.820000000,73.94
-60.840000000,73.96
-60.860000000,73.98
-60.880000000,74
-60.900000000,74.02
-60.920000000,74.04
-60.940000000,74.06
-60.960000000,74.08
-60.980000000,74.1
-61.000000000,74.12
-61.020000000,74.14
-61.040000000,74.16
-61.060000000,74.18
-61.080000000,74.2
-61.100000000,74.22
-61.120000000,74.24
-61.140000000,74.26
-61.160000000,74.28
-61.180000000,74.3
-61.200000000,74.32
-61.220000000,74.34
-61.240000000,74.36
-61.260000000,74.38
-61.280000000,74.4
-61.300000000,74.42
-61.320000000,74.44
-61.340000000,74.46
-61.360000000,74.48
-61.380000000,74.5
-61.400000000,74.52
-61.420000000,74.54
-61.440000000,74.56
-61.460000000,74.58
-61.480000000,74.6
-61.500000000,74.62
-61.520000000,74.64
-61.540000000,74.66
-61.560000000,74.68
-61.580000000,74.7
-61.600000000,74.72
-61.620000000,74.74
-61.640000000,74.76
-61.660000000,74.78
-61.680000000,74.8
-61.700000000,74.82
-61.720000000,74.84
-61.740000000,74.86
-61.760000000,74.88
-61.780000000,74.9
-61.800000000,74.92
-61.820000000,74.94
-61.840000000,74.94
-61.860000000,74.94
-61.880000000,74.94
-61.900000000,74.94
-61.920000000,74.94
-61.940000000,74.94
-61.960000000,74.94
-61.980000000,74.94
-62.000000000,74.94
-62.020000000,74.94
-62.040000000,74.94
-62.060000000,74.94
-62.080000000,74.94
-62.100000000,74.94
-62.120000000,74.94
-62.140000000,74.94
-62.160000000,74.94
-62.180000000,74.94
-62.200000000,74.94
-62.220000000,74.94
-62.240000000,74.94
-62.260000000,74.94
-62.280000000,74.94
-62.300000000,74.94
-62.320000000,74.94
-62.340000000,74.94
-62.360000000,74.94
-62.380000000,74.94
-62.400000000,74.94
-62.420000000,74.94
-62.440000000,74.94
-62.460000000,74.94
-62.480000000,74.94
-62.500000000,74.94
-62.520000000,74.94
-62.540000000,74.94
-62.560000000,74.94
-62.580000000,74.94
-62.600000000,74.94
-62.620000000,74.94
-62.640000000,74.94
-62.660000000,74.94
-62.680000000,74.94
-62.700000000,74.94
-62.720000000,74.94
-62.740000000,74.94
-62.760000000,74.94
-62.780000000,74.94
-62.800000000,74.94
-62.820000000,74.94
-62.840000000,74.94
-62.860000000,74.94
-62.880000000,74.94
-62.900000000,74.94
-62.920000000,74.94
-62.940000000,74.94
-62.960000000,74.94
-62.980000000,74.94
-63.000000000,74.94
diff -r a68204b9a529 -r cca298ecfc72 test/old/checksymmetry.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/old/checksymmetry.sh Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# Test that aligning A-B gives the same results as aligning B-A
+
+mydir=$(dirname "$0")
+
+sonic-annotator --minversion 1.1 || exit 1
+
+file1="$1"
+file2="$2"
+
+usage() {
+ echo "Usage: $0 a.wav b.wav"
+ exit 2
+}
+
+test -n "$file1" || usage
+test -f "$file1" || usage
+test -n "$file2" || usage
+test -f "$file2" || usage
+
+VAMP_PATH="${mydir}/../.." \
+ sonic-annotator \
+ -d vamp:match-vamp-plugin:match:a_b \
+ --multiplex \
+ "$file1" \
+ "$file2" \
+ -w csv --csv-stdout 2>/dev/null | sed 's/^"[^"]*"//' > /tmp/1_$$ || exit 1
+
+VAMP_PATH="${mydir}/../.." \
+ sonic-annotator \
+ -d vamp:match-vamp-plugin:match:b_a \
+ --multiplex \
+ "$file2" \
+ "$file1" \
+ -w csv --csv-stdout 2>/dev/null | sed 's/^"[^"]*"//' > /tmp/2_$$ || exit 1
+
+sdiff -w 78 /tmp/1_$$ /tmp/2_$$ && echo Passed
+
+rm /tmp/1_$$ /tmp/2_$$
diff -r a68204b9a529 -r cca298ecfc72 test/old/expected.csv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/old/expected.csv Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,5369 @@
+0.000000000,0.02
+0.000000000,0.04
+0.000000000,0.06
+0.000000000,0.08
+0.000000000,0.1
+0.000000000,0.12
+0.000000000,0.14
+0.000000000,0.16
+0.000000000,0.18
+0.000000000,0.2
+0.000000000,0.22
+0.000000000,0.24
+0.000000000,0.26
+0.000000000,0.28
+0.000000000,0.3
+0.000000000,0.32
+0.000000000,0.34
+0.000000000,0.36
+0.000000000,0.38
+0.000000000,0.4
+0.000000000,0.42
+0.000000000,0.44
+0.000000000,0.46
+0.000000000,0.48
+0.000000000,0.5
+0.000000000,0.52
+0.000000000,0.54
+0.000000000,0.56
+0.000000000,0.58
+0.000000000,0.6
+0.000000000,0.62
+0.000000000,0.64
+0.000000000,0.66
+0.000000000,0.68
+0.000000000,0.7
+0.000000000,0.72
+0.000000000,0.74
+0.000000000,0.76
+0.000000000,0.78
+0.000000000,0.8
+0.000000000,0.82
+0.000000000,0.84
+0.000000000,0.86
+0.000000000,0.88
+0.000000000,0.9
+0.000000000,0.92
+0.000000000,0.94
+0.000000000,0.96
+0.000000000,0.98
+0.000000000,1
+0.000000000,1.02
+0.000000000,1.04
+0.000000000,1.06
+0.000000000,1.08
+0.000000000,1.1
+0.000000000,1.12
+0.000000000,1.14
+0.000000000,1.16
+0.000000000,1.18
+0.000000000,1.2
+0.000000000,1.22
+0.000000000,1.24
+0.000000000,1.26
+0.000000000,1.28
+0.000000000,1.3
+0.000000000,1.32
+0.000000000,1.34
+0.000000000,1.36
+0.000000000,1.38
+0.000000000,1.4
+0.000000000,1.42
+0.000000000,1.44
+0.000000000,1.46
+0.000000000,1.48
+0.000000000,1.5
+0.000000000,1.52
+0.000000000,1.54
+0.000000000,1.56
+0.020000000,1.58
+0.040000000,1.6
+0.060000000,1.62
+0.080000000,1.64
+0.100000000,1.66
+0.120000000,1.68
+0.140000000,1.7
+0.160000000,1.72
+0.180000000,1.74
+0.200000000,1.76
+0.220000000,1.78
+0.240000000,1.8
+0.260000000,1.82
+0.280000000,1.84
+0.300000000,1.86
+0.320000000,1.88
+0.340000000,1.9
+0.360000000,1.92
+0.380000000,1.94
+0.400000000,1.96
+0.420000000,1.98
+0.440000000,2
+0.460000000,2.02
+0.480000000,2.04
+0.500000000,2.06
+0.520000000,2.08
+0.540000000,2.1
+0.560000000,2.12
+0.580000000,2.14
+0.600000000,2.16
+0.620000000,2.18
+0.640000000,2.2
+0.660000000,2.22
+0.680000000,2.24
+0.700000000,2.26
+0.720000000,2.28
+0.740000000,2.3
+0.760000000,2.32
+0.780000000,2.34
+0.800000000,2.36
+0.820000000,2.38
+0.840000000,2.4
+0.860000000,2.42
+0.880000000,2.44
+0.900000000,2.46
+0.920000000,2.48
+0.940000000,2.5
+0.960000000,2.52
+0.980000000,2.54
+1.000000000,2.56
+1.020000000,2.58
+1.040000000,2.6
+1.060000000,2.62
+1.080000000,2.64
+1.100000000,2.64
+1.120000000,2.64
+1.140000000,2.66
+1.160000000,2.68
+1.180000000,2.7
+1.200000000,2.72
+1.220000000,2.74
+1.240000000,2.76
+1.260000000,2.78
+1.280000000,2.8
+1.300000000,2.82
+1.320000000,2.84
+1.340000000,2.86
+1.360000000,2.88
+1.380000000,2.9
+1.400000000,2.92
+1.420000000,2.94
+1.440000000,2.96
+1.460000000,2.98
+1.480000000,3
+1.500000000,3.02
+1.520000000,3.04
+1.540000000,3.06
+1.560000000,3.08
+1.580000000,3.1
+1.600000000,3.12
+1.620000000,3.12
+1.640000000,3.12
+1.660000000,3.12
+1.680000000,3.12
+1.700000000,3.12
+1.720000000,3.12
+1.740000000,3.12
+1.760000000,3.12
+1.780000000,3.12
+1.800000000,3.12
+1.820000000,3.14
+1.840000000,3.16
+1.860000000,3.18
+1.880000000,3.2
+1.900000000,3.22
+1.920000000,3.24
+1.940000000,3.26
+1.960000000,3.28
+1.980000000,3.3
+2.000000000,3.32
+2.020000000,3.34
+2.040000000,3.36
+2.060000000,3.38
+2.080000000,3.4
+2.100000000,3.42
+2.120000000,3.44
+2.140000000,3.46
+2.160000000,3.48
+2.180000000,3.5
+2.200000000,3.52
+2.220000000,3.54
+2.240000000,3.56
+2.260000000,3.58
+2.280000000,3.6
+2.300000000,3.62
+2.320000000,3.64
+2.340000000,3.66
+2.360000000,3.68
+2.380000000,3.7
+2.400000000,3.72
+2.420000000,3.74
+2.440000000,3.76
+2.460000000,3.78
+2.480000000,3.8
+2.500000000,3.82
+2.520000000,3.84
+2.540000000,3.86
+2.560000000,3.88
+2.580000000,3.88
+2.600000000,3.88
+2.620000000,3.88
+2.640000000,3.88
+2.660000000,3.88
+2.680000000,3.88
+2.700000000,3.88
+2.720000000,3.88
+2.740000000,3.88
+2.760000000,3.88
+2.780000000,3.88
+2.800000000,3.9
+2.820000000,3.92
+2.840000000,3.94
+2.860000000,3.96
+2.880000000,3.98
+2.900000000,4
+2.920000000,4.02
+2.940000000,4.04
+2.960000000,4.06
+2.980000000,4.08
+3.000000000,4.1
+3.020000000,4.12
+3.040000000,4.14
+3.060000000,4.16
+3.080000000,4.18
+3.100000000,4.2
+3.120000000,4.22
+3.140000000,4.24
+3.160000000,4.26
+3.180000000,4.28
+3.200000000,4.3
+3.220000000,4.32
+3.240000000,4.34
+3.260000000,4.36
+3.280000000,4.38
+3.300000000,4.4
+3.320000000,4.42
+3.340000000,4.44
+3.360000000,4.46
+3.380000000,4.48
+3.400000000,4.5
+3.420000000,4.52
+3.440000000,4.54
+3.460000000,4.56
+3.480000000,4.58
+3.500000000,4.6
+3.520000000,4.62
+3.540000000,4.62
+3.560000000,4.62
+3.580000000,4.62
+3.600000000,4.64
+3.620000000,4.66
+3.640000000,4.68
+3.660000000,4.7
+3.680000000,4.72
+3.700000000,4.74
+3.720000000,4.76
+3.740000000,4.78
+3.760000000,4.8
+3.780000000,4.82
+3.800000000,4.84
+3.820000000,4.86
+3.840000000,4.88
+3.860000000,4.9
+3.880000000,4.9
+3.900000000,4.92
+3.920000000,4.92
+3.940000000,4.92
+3.960000000,4.92
+3.980000000,4.92
+4.000000000,4.92
+4.020000000,4.92
+4.040000000,4.92
+4.060000000,4.92
+4.080000000,4.92
+4.100000000,4.92
+4.120000000,4.92
+4.140000000,4.92
+4.160000000,4.92
+4.180000000,4.92
+4.200000000,4.92
+4.220000000,4.94
+4.240000000,4.96
+4.260000000,4.98
+4.280000000,5
+4.300000000,5.02
+4.320000000,5.04
+4.340000000,5.06
+4.360000000,5.08
+4.380000000,5.1
+4.400000000,5.1
+4.420000000,5.1
+4.440000000,5.12
+4.460000000,5.14
+4.480000000,5.16
+4.500000000,5.18
+4.520000000,5.2
+4.540000000,5.22
+4.560000000,5.24
+4.580000000,5.26
+4.600000000,5.28
+4.620000000,5.3
+4.640000000,5.32
+4.660000000,5.32
+4.680000000,5.32
+4.700000000,5.32
+4.720000000,5.32
+4.740000000,5.34
+4.760000000,5.36
+4.780000000,5.36
+4.800000000,5.36
+4.820000000,5.36
+4.840000000,5.36
+4.860000000,5.38
+4.880000000,5.4
+4.900000000,5.4
+4.920000000,5.42
+4.940000000,5.44
+4.960000000,5.46
+4.980000000,5.48
+5.000000000,5.5
+5.020000000,5.52
+5.040000000,5.54
+5.060000000,5.56
+5.080000000,5.56
+5.100000000,5.58
+5.120000000,5.58
+5.140000000,5.58
+5.160000000,5.6
+5.180000000,5.62
+5.200000000,5.64
+5.220000000,5.66
+5.240000000,5.68
+5.260000000,5.7
+5.280000000,5.72
+5.300000000,5.74
+5.320000000,5.76
+5.340000000,5.78
+5.360000000,5.78
+5.380000000,5.8
+5.400000000,5.82
+5.420000000,5.82
+5.440000000,5.82
+5.460000000,5.82
+5.480000000,5.82
+5.500000000,5.82
+5.520000000,5.84
+5.540000000,5.86
+5.560000000,5.88
+5.580000000,5.9
+5.600000000,5.92
+5.620000000,5.94
+5.640000000,5.96
+5.660000000,5.98
+5.680000000,6
+5.700000000,6.02
+5.720000000,6.04
+5.740000000,6.06
+5.760000000,6.08
+5.780000000,6.1
+5.800000000,6.12
+5.820000000,6.12
+5.840000000,6.12
+5.860000000,6.12
+5.880000000,6.14
+5.900000000,6.16
+5.920000000,6.18
+5.940000000,6.2
+5.960000000,6.22
+5.980000000,6.24
+6.000000000,6.26
+6.020000000,6.28
+6.040000000,6.3
+6.060000000,6.32
+6.080000000,6.34
+6.100000000,6.36
+6.120000000,6.38
+6.140000000,6.4
+6.160000000,6.42
+6.180000000,6.44
+6.200000000,6.46
+6.220000000,6.48
+6.240000000,6.5
+6.260000000,6.52
+6.280000000,6.54
+6.300000000,6.56
+6.320000000,6.58
+6.340000000,6.6
+6.360000000,6.62
+6.380000000,6.64
+6.400000000,6.66
+6.420000000,6.68
+6.440000000,6.7
+6.460000000,6.72
+6.480000000,6.74
+6.500000000,6.76
+6.520000000,6.78
+6.540000000,6.8
+6.560000000,6.82
+6.580000000,6.84
+6.600000000,6.86
+6.620000000,6.88
+6.640000000,6.9
+6.660000000,6.92
+6.680000000,6.94
+6.700000000,6.96
+6.720000000,6.98
+6.740000000,7
+6.760000000,7.02
+6.780000000,7.04
+6.800000000,7.06
+6.820000000,7.08
+6.840000000,7.1
+6.860000000,7.12
+6.880000000,7.14
+6.900000000,7.16
+6.920000000,7.18
+6.940000000,7.2
+6.960000000,7.22
+6.980000000,7.24
+7.000000000,7.26
+7.020000000,7.28
+7.040000000,7.3
+7.060000000,7.32
+7.080000000,7.34
+7.100000000,7.36
+7.120000000,7.38
+7.140000000,7.4
+7.160000000,7.42
+7.180000000,7.44
+7.200000000,7.46
+7.220000000,7.48
+7.240000000,7.5
+7.260000000,7.52
+7.280000000,7.54
+7.300000000,7.56
+7.320000000,7.58
+7.340000000,7.6
+7.360000000,7.62
+7.380000000,7.64
+7.400000000,7.66
+7.420000000,7.68
+7.440000000,7.7
+7.460000000,7.72
+7.480000000,7.74
+7.500000000,7.76
+7.520000000,7.78
+7.540000000,7.8
+7.560000000,7.82
+7.580000000,7.82
+7.600000000,7.82
+7.620000000,7.82
+7.640000000,7.82
+7.660000000,7.82
+7.680000000,7.82
+7.700000000,7.82
+7.720000000,7.82
+7.740000000,7.82
+7.760000000,7.82
+7.780000000,7.82
+7.800000000,7.82
+7.820000000,7.82
+7.840000000,7.82
+7.860000000,7.82
+7.880000000,7.82
+7.900000000,7.82
+7.920000000,7.82
+7.940000000,7.82
+7.960000000,7.82
+7.980000000,7.82
+8.000000000,7.84
+8.020000000,7.84
+8.040000000,7.84
+8.060000000,7.84
+8.080000000,7.84
+8.100000000,7.84
+8.120000000,7.84
+8.140000000,7.84
+8.160000000,7.84
+8.180000000,7.84
+8.200000000,7.86
+8.220000000,7.88
+8.240000000,7.9
+8.260000000,7.92
+8.280000000,7.94
+8.300000000,7.96
+8.320000000,7.98
+8.340000000,7.98
+8.360000000,7.98
+8.380000000,7.98
+8.400000000,7.98
+8.420000000,8
+8.440000000,8.02
+8.460000000,8.04
+8.480000000,8.06
+8.500000000,8.08
+8.520000000,8.1
+8.540000000,8.12
+8.560000000,8.14
+8.580000000,8.16
+8.600000000,8.18
+8.620000000,8.2
+8.640000000,8.2
+8.660000000,8.2
+8.680000000,8.2
+8.700000000,8.2
+8.720000000,8.2
+8.740000000,8.2
+8.760000000,8.22
+8.780000000,8.24
+8.800000000,8.26
+8.820000000,8.26
+8.840000000,8.26
+8.860000000,8.28
+8.880000000,8.28
+8.900000000,8.28
+8.920000000,8.3
+8.940000000,8.3
+8.960000000,8.32
+8.980000000,8.34
+9.000000000,8.36
+9.020000000,8.36
+9.040000000,8.36
+9.060000000,8.36
+9.080000000,8.36
+9.100000000,8.36
+9.120000000,8.36
+9.140000000,8.36
+9.160000000,8.36
+9.180000000,8.36
+9.200000000,8.36
+9.220000000,8.36
+9.240000000,8.36
+9.260000000,8.36
+9.280000000,8.36
+9.300000000,8.36
+9.320000000,8.36
+9.340000000,8.36
+9.360000000,8.36
+9.380000000,8.36
+9.400000000,8.36
+9.420000000,8.36
+9.440000000,8.36
+9.460000000,8.36
+9.480000000,8.36
+9.500000000,8.36
+9.520000000,8.36
+9.540000000,8.36
+9.560000000,8.36
+9.580000000,8.36
+9.600000000,8.36
+9.620000000,8.36
+9.640000000,8.36
+9.660000000,8.36
+9.680000000,8.36
+9.700000000,8.36
+9.720000000,8.36
+9.740000000,8.36
+9.760000000,8.36
+9.780000000,8.36
+9.800000000,8.36
+9.820000000,8.36
+9.840000000,8.36
+9.860000000,8.36
+9.880000000,8.36
+9.900000000,8.36
+9.920000000,8.36
+9.940000000,8.36
+9.960000000,8.36
+9.980000000,8.36
+10.000000000,8.36
+10.020000000,8.36
+10.040000000,8.36
+10.060000000,8.36
+10.080000000,8.36
+10.100000000,8.36
+10.120000000,8.36
+10.140000000,8.36
+10.160000000,8.36
+10.180000000,8.36
+10.200000000,8.36
+10.220000000,8.36
+10.240000000,8.36
+10.260000000,8.36
+10.280000000,8.38
+10.300000000,8.4
+10.320000000,8.42
+10.340000000,8.44
+10.360000000,8.46
+10.380000000,8.48
+10.400000000,8.5
+10.420000000,8.52
+10.440000000,8.54
+10.460000000,8.54
+10.480000000,8.56
+10.500000000,8.56
+10.520000000,8.56
+10.540000000,8.56
+10.560000000,8.56
+10.580000000,8.56
+10.600000000,8.56
+10.620000000,8.56
+10.640000000,8.58
+10.660000000,8.6
+10.680000000,8.6
+10.700000000,8.62
+10.720000000,8.62
+10.740000000,8.62
+10.760000000,8.64
+10.780000000,8.66
+10.800000000,8.68
+10.820000000,8.7
+10.840000000,8.7
+10.860000000,8.7
+10.880000000,8.72
+10.900000000,8.74
+10.920000000,8.76
+10.940000000,8.76
+10.960000000,8.76
+10.980000000,8.78
+11.000000000,8.78
+11.020000000,8.78
+11.040000000,8.8
+11.060000000,8.8
+11.080000000,8.82
+11.100000000,8.82
+11.120000000,8.82
+11.140000000,8.82
+11.160000000,8.82
+11.180000000,8.82
+11.200000000,8.82
+11.220000000,8.82
+11.240000000,8.82
+11.260000000,8.82
+11.280000000,8.82
+11.300000000,8.82
+11.320000000,8.82
+11.340000000,8.82
+11.360000000,8.82
+11.380000000,8.82
+11.400000000,8.82
+11.420000000,8.82
+11.440000000,8.84
+11.460000000,8.84
+11.480000000,8.84
+11.500000000,8.84
+11.520000000,8.84
+11.540000000,8.84
+11.560000000,8.84
+11.580000000,8.84
+11.600000000,8.84
+11.620000000,8.84
+11.640000000,8.86
+11.660000000,8.86
+11.680000000,8.86
+11.700000000,8.88
+11.720000000,8.88
+11.740000000,8.88
+11.760000000,8.88
+11.780000000,8.88
+11.800000000,8.88
+11.820000000,8.88
+11.840000000,8.88
+11.860000000,8.88
+11.880000000,8.88
+11.900000000,8.88
+11.920000000,8.88
+11.940000000,8.88
+11.960000000,8.88
+11.980000000,8.88
+12.000000000,8.88
+12.020000000,8.88
+12.040000000,8.88
+12.060000000,8.88
+12.080000000,8.88
+12.100000000,8.88
+12.120000000,8.88
+12.140000000,8.88
+12.160000000,8.88
+12.180000000,8.88
+12.200000000,8.88
+12.220000000,8.88
+12.240000000,8.88
+12.260000000,8.88
+12.280000000,8.88
+12.300000000,8.88
+12.320000000,8.88
+12.340000000,8.88
+12.360000000,8.88
+12.380000000,8.88
+12.400000000,8.88
+12.420000000,8.88
+12.440000000,8.88
+12.460000000,8.88
+12.480000000,8.88
+12.500000000,8.88
+12.520000000,8.88
+12.540000000,8.9
+12.560000000,8.92
+12.580000000,8.94
+12.600000000,8.96
+12.620000000,8.98
+12.640000000,8.98
+12.660000000,9
+12.680000000,9
+12.700000000,9
+12.720000000,9
+12.740000000,9
+12.760000000,9
+12.780000000,9
+12.800000000,9
+12.820000000,9
+12.840000000,9
+12.860000000,9
+12.880000000,9
+12.900000000,9.02
+12.920000000,9.04
+12.940000000,9.06
+12.960000000,9.08
+12.980000000,9.1
+13.000000000,9.12
+13.020000000,9.14
+13.040000000,9.16
+13.060000000,9.18
+13.080000000,9.2
+13.100000000,9.22
+13.120000000,9.24
+13.140000000,9.26
+13.160000000,9.28
+13.180000000,9.3
+13.200000000,9.3
+13.220000000,9.32
+13.240000000,9.34
+13.260000000,9.36
+13.280000000,9.38
+13.300000000,9.38
+13.320000000,9.38
+13.340000000,9.38
+13.360000000,9.4
+13.380000000,9.42
+13.400000000,9.44
+13.420000000,9.46
+13.440000000,9.48
+13.460000000,9.5
+13.480000000,9.52
+13.500000000,9.52
+13.520000000,9.54
+13.540000000,9.56
+13.560000000,9.58
+13.580000000,9.58
+13.600000000,9.58
+13.620000000,9.58
+13.640000000,9.58
+13.660000000,9.58
+13.680000000,9.58
+13.700000000,9.58
+13.720000000,9.58
+13.740000000,9.6
+13.760000000,9.62
+13.780000000,9.62
+13.800000000,9.62
+13.820000000,9.64
+13.840000000,9.66
+13.860000000,9.68
+13.880000000,9.68
+13.900000000,9.68
+13.920000000,9.68
+13.940000000,9.68
+13.960000000,9.68
+13.980000000,9.68
+14.000000000,9.68
+14.020000000,9.68
+14.040000000,9.68
+14.060000000,9.7
+14.080000000,9.72
+14.100000000,9.74
+14.120000000,9.74
+14.140000000,9.74
+14.160000000,9.74
+14.180000000,9.74
+14.200000000,9.74
+14.220000000,9.74
+14.240000000,9.76
+14.260000000,9.76
+14.280000000,9.76
+14.300000000,9.78
+14.320000000,9.8
+14.340000000,9.8
+14.360000000,9.8
+14.380000000,9.82
+14.400000000,9.84
+14.420000000,9.84
+14.440000000,9.84
+14.460000000,9.84
+14.480000000,9.84
+14.500000000,9.84
+14.520000000,9.84
+14.540000000,9.84
+14.560000000,9.84
+14.580000000,9.84
+14.600000000,9.84
+14.620000000,9.84
+14.640000000,9.84
+14.660000000,9.84
+14.680000000,9.84
+14.700000000,9.84
+14.720000000,9.84
+14.740000000,9.84
+14.760000000,9.84
+14.780000000,9.84
+14.800000000,9.84
+14.820000000,9.84
+14.840000000,9.86
+14.860000000,9.86
+14.880000000,9.86
+14.900000000,9.86
+14.920000000,9.86
+14.940000000,9.86
+14.960000000,9.86
+14.980000000,9.86
+15.000000000,9.86
+15.020000000,9.86
+15.040000000,9.86
+15.060000000,9.86
+15.080000000,9.86
+15.100000000,9.88
+15.120000000,9.88
+15.140000000,9.88
+15.160000000,9.88
+15.180000000,9.88
+15.200000000,9.88
+15.220000000,9.88
+15.240000000,9.9
+15.260000000,9.92
+15.280000000,9.92
+15.300000000,9.92
+15.320000000,9.92
+15.340000000,9.94
+15.360000000,9.96
+15.380000000,9.98
+15.400000000,10
+15.420000000,10.02
+15.440000000,10.04
+15.460000000,10.04
+15.480000000,10.04
+15.500000000,10.04
+15.520000000,10.04
+15.540000000,10.04
+15.560000000,10.04
+15.580000000,10.04
+15.600000000,10.04
+15.620000000,10.04
+15.640000000,10.04
+15.660000000,10.04
+15.680000000,10.04
+15.700000000,10.04
+15.720000000,10.04
+15.740000000,10.04
+15.760000000,10.04
+15.780000000,10.04
+15.800000000,10.04
+15.820000000,10.04
+15.840000000,10.04
+15.860000000,10.04
+15.880000000,10.06
+15.900000000,10.08
+15.920000000,10.1
+15.940000000,10.12
+15.960000000,10.14
+15.980000000,10.16
+16.000000000,10.18
+16.020000000,10.2
+16.040000000,10.22
+16.060000000,10.24
+16.080000000,10.26
+16.100000000,10.28
+16.120000000,10.3
+16.140000000,10.32
+16.160000000,10.34
+16.180000000,10.34
+16.200000000,10.36
+16.220000000,10.38
+16.240000000,10.4
+16.260000000,10.42
+16.280000000,10.44
+16.300000000,10.46
+16.320000000,10.46
+16.340000000,10.46
+16.360000000,10.46
+16.380000000,10.46
+16.400000000,10.46
+16.420000000,10.46
+16.440000000,10.46
+16.460000000,10.46
+16.480000000,10.46
+16.500000000,10.46
+16.520000000,10.46
+16.540000000,10.46
+16.560000000,10.48
+16.580000000,10.5
+16.600000000,10.52
+16.620000000,10.54
+16.640000000,10.56
+16.660000000,10.58
+16.680000000,10.6
+16.700000000,10.62
+16.720000000,10.64
+16.740000000,10.66
+16.760000000,10.66
+16.780000000,10.68
+16.800000000,10.68
+16.820000000,10.7
+16.840000000,10.7
+16.860000000,10.7
+16.880000000,10.7
+16.900000000,10.7
+16.920000000,10.7
+16.940000000,10.7
+16.960000000,10.7
+16.980000000,10.7
+17.000000000,10.7
+17.020000000,10.7
+17.040000000,10.7
+17.060000000,10.7
+17.080000000,10.7
+17.100000000,10.7
+17.120000000,10.7
+17.140000000,10.7
+17.160000000,10.72
+17.180000000,10.74
+17.200000000,10.76
+17.220000000,10.76
+17.240000000,10.76
+17.260000000,10.78
+17.280000000,10.8
+17.300000000,10.82
+17.320000000,10.84
+17.340000000,10.86
+17.360000000,10.88
+17.380000000,10.9
+17.400000000,10.92
+17.420000000,10.94
+17.440000000,10.96
+17.460000000,10.98
+17.480000000,11
+17.500000000,11.02
+17.520000000,11.02
+17.540000000,11.02
+17.560000000,11.02
+17.580000000,11.02
+17.600000000,11.02
+17.620000000,11.02
+17.640000000,11.02
+17.660000000,11.02
+17.680000000,11.02
+17.700000000,11.02
+17.720000000,11.02
+17.740000000,11.04
+17.760000000,11.06
+17.780000000,11.08
+17.800000000,11.08
+17.820000000,11.1
+17.840000000,11.12
+17.860000000,11.12
+17.880000000,11.12
+17.900000000,11.14
+17.920000000,11.16
+17.940000000,11.18
+17.960000000,11.2
+17.980000000,11.22
+18.000000000,11.24
+18.020000000,11.26
+18.040000000,11.28
+18.060000000,11.3
+18.080000000,11.32
+18.100000000,11.34
+18.120000000,11.36
+18.140000000,11.38
+18.160000000,11.4
+18.180000000,11.42
+18.200000000,11.44
+18.220000000,11.46
+18.240000000,11.48
+18.260000000,11.5
+18.280000000,11.52
+18.300000000,11.54
+18.320000000,11.56
+18.340000000,11.58
+18.360000000,11.58
+18.380000000,11.58
+18.400000000,11.58
+18.420000000,11.58
+18.440000000,11.58
+18.460000000,11.58
+18.480000000,11.6
+18.500000000,11.62
+18.520000000,11.64
+18.540000000,11.66
+18.560000000,11.68
+18.580000000,11.68
+18.600000000,11.7
+18.620000000,11.7
+18.640000000,11.7
+18.660000000,11.72
+18.680000000,11.72
+18.700000000,11.72
+18.720000000,11.72
+18.740000000,11.74
+18.760000000,11.74
+18.780000000,11.74
+18.800000000,11.76
+18.820000000,11.78
+18.840000000,11.8
+18.860000000,11.8
+18.880000000,11.82
+18.900000000,11.82
+18.920000000,11.82
+18.940000000,11.82
+18.960000000,11.84
+18.980000000,11.84
+19.000000000,11.84
+19.020000000,11.84
+19.040000000,11.84
+19.060000000,11.86
+19.080000000,11.88
+19.100000000,11.9
+19.120000000,11.92
+19.140000000,11.94
+19.160000000,11.96
+19.180000000,11.98
+19.200000000,12
+19.220000000,12.02
+19.240000000,12.04
+19.260000000,12.06
+19.280000000,12.08
+19.300000000,12.1
+19.320000000,12.12
+19.340000000,12.14
+19.360000000,12.16
+19.380000000,12.16
+19.400000000,12.18
+19.420000000,12.18
+19.440000000,12.2
+19.460000000,12.22
+19.480000000,12.24
+19.500000000,12.24
+19.520000000,12.24
+19.540000000,12.24
+19.560000000,12.26
+19.580000000,12.28
+19.600000000,12.3
+19.620000000,12.32
+19.640000000,12.34
+19.660000000,12.34
+19.680000000,12.36
+19.700000000,12.36
+19.720000000,12.36
+19.740000000,12.36
+19.760000000,12.36
+19.780000000,12.36
+19.800000000,12.36
+19.820000000,12.38
+19.840000000,12.4
+19.860000000,12.4
+19.880000000,12.42
+19.900000000,12.44
+19.920000000,12.46
+19.940000000,12.46
+19.960000000,12.48
+19.980000000,12.5
+20.000000000,12.5
+20.020000000,12.5
+20.040000000,12.5
+20.060000000,12.5
+20.080000000,12.52
+20.100000000,12.54
+20.120000000,12.56
+20.140000000,12.58
+20.160000000,12.6
+20.180000000,12.6
+20.200000000,12.62
+20.220000000,12.62
+20.240000000,12.64
+20.260000000,12.66
+20.280000000,12.68
+20.300000000,12.7
+20.320000000,12.72
+20.340000000,12.74
+20.360000000,12.74
+20.380000000,12.74
+20.400000000,12.74
+20.420000000,12.74
+20.440000000,12.74
+20.460000000,12.74
+20.480000000,12.74
+20.500000000,12.74
+20.520000000,12.74
+20.540000000,12.74
+20.560000000,12.74
+20.580000000,12.74
+20.600000000,12.74
+20.620000000,12.74
+20.640000000,12.74
+20.660000000,12.76
+20.680000000,12.78
+20.700000000,12.8
+20.720000000,12.82
+20.740000000,12.84
+20.760000000,12.86
+20.780000000,12.86
+20.800000000,12.86
+20.820000000,12.86
+20.840000000,12.86
+20.860000000,12.86
+20.880000000,12.86
+20.900000000,12.86
+20.920000000,12.86
+20.940000000,12.86
+20.960000000,12.86
+20.980000000,12.86
+21.000000000,12.86
+21.020000000,12.86
+21.040000000,12.86
+21.060000000,12.86
+21.080000000,12.86
+21.100000000,12.86
+21.120000000,12.86
+21.140000000,12.86
+21.160000000,12.86
+21.180000000,12.86
+21.200000000,12.86
+21.220000000,12.86
+21.240000000,12.86
+21.260000000,12.86
+21.280000000,12.86
+21.300000000,12.86
+21.320000000,12.86
+21.340000000,12.86
+21.360000000,12.86
+21.380000000,12.86
+21.400000000,12.88
+21.420000000,12.9
+21.440000000,12.92
+21.460000000,12.94
+21.480000000,12.96
+21.500000000,12.98
+21.520000000,13
+21.540000000,13
+21.560000000,13
+21.580000000,13.02
+21.600000000,13.02
+21.620000000,13.04
+21.640000000,13.04
+21.660000000,13.06
+21.680000000,13.06
+21.700000000,13.06
+21.720000000,13.06
+21.740000000,13.06
+21.760000000,13.08
+21.780000000,13.08
+21.800000000,13.08
+21.820000000,13.08
+21.840000000,13.08
+21.860000000,13.08
+21.880000000,13.08
+21.900000000,13.1
+21.920000000,13.12
+21.940000000,13.14
+21.960000000,13.16
+21.980000000,13.18
+22.000000000,13.2
+22.020000000,13.22
+22.040000000,13.24
+22.060000000,13.26
+22.080000000,13.28
+22.100000000,13.3
+22.120000000,13.32
+22.140000000,13.34
+22.160000000,13.36
+22.180000000,13.36
+22.200000000,13.36
+22.220000000,13.36
+22.240000000,13.36
+22.260000000,13.36
+22.280000000,13.36
+22.300000000,13.36
+22.320000000,13.36
+22.340000000,13.36
+22.360000000,13.36
+22.380000000,13.36
+22.400000000,13.36
+22.420000000,13.36
+22.440000000,13.36
+22.460000000,13.36
+22.480000000,13.36
+22.500000000,13.38
+22.520000000,13.4
+22.540000000,13.42
+22.560000000,13.44
+22.580000000,13.46
+22.600000000,13.48
+22.620000000,13.5
+22.640000000,13.52
+22.660000000,13.54
+22.680000000,13.56
+22.700000000,13.56
+22.720000000,13.58
+22.740000000,13.6
+22.760000000,13.62
+22.780000000,13.64
+22.800000000,13.66
+22.820000000,13.68
+22.840000000,13.7
+22.860000000,13.7
+22.880000000,13.7
+22.900000000,13.72
+22.920000000,13.74
+22.940000000,13.76
+22.960000000,13.78
+22.980000000,13.78
+23.000000000,13.78
+23.020000000,13.8
+23.040000000,13.8
+23.060000000,13.8
+23.080000000,13.82
+23.100000000,13.82
+23.120000000,13.82
+23.140000000,13.84
+23.160000000,13.86
+23.180000000,13.88
+23.200000000,13.9
+23.220000000,13.92
+23.240000000,13.94
+23.260000000,13.96
+23.280000000,13.98
+23.300000000,14
+23.320000000,14
+23.340000000,14.02
+23.360000000,14.02
+23.380000000,14.02
+23.400000000,14.04
+23.420000000,14.06
+23.440000000,14.08
+23.460000000,14.1
+23.480000000,14.12
+23.500000000,14.14
+23.520000000,14.16
+23.540000000,14.16
+23.560000000,14.18
+23.580000000,14.18
+23.600000000,14.18
+23.620000000,14.18
+23.640000000,14.18
+23.660000000,14.18
+23.680000000,14.2
+23.700000000,14.22
+23.720000000,14.24
+23.740000000,14.26
+23.760000000,14.28
+23.780000000,14.3
+23.800000000,14.3
+23.820000000,14.3
+23.840000000,14.32
+23.860000000,14.34
+23.880000000,14.34
+23.900000000,14.34
+23.920000000,14.36
+23.940000000,14.38
+23.960000000,14.4
+23.980000000,14.42
+24.000000000,14.44
+24.020000000,14.46
+24.040000000,14.48
+24.060000000,14.5
+24.080000000,14.52
+24.100000000,14.54
+24.120000000,14.56
+24.140000000,14.56
+24.160000000,14.56
+24.180000000,14.58
+24.200000000,14.6
+24.220000000,14.62
+24.240000000,14.64
+24.260000000,14.66
+24.280000000,14.68
+24.300000000,14.7
+24.320000000,14.72
+24.340000000,14.74
+24.360000000,14.76
+24.380000000,14.76
+24.400000000,14.76
+24.420000000,14.76
+24.440000000,14.76
+24.460000000,14.76
+24.480000000,14.76
+24.500000000,14.76
+24.520000000,14.76
+24.540000000,14.76
+24.560000000,14.76
+24.580000000,14.76
+24.600000000,14.76
+24.620000000,14.76
+24.640000000,14.76
+24.660000000,14.76
+24.680000000,14.76
+24.700000000,14.76
+24.720000000,14.76
+24.740000000,14.76
+24.760000000,14.76
+24.780000000,14.76
+24.800000000,14.76
+24.820000000,14.76
+24.840000000,14.78
+24.860000000,14.8
+24.880000000,14.82
+24.900000000,14.84
+24.920000000,14.86
+24.940000000,14.88
+24.960000000,14.9
+24.980000000,14.92
+25.000000000,14.94
+25.020000000,14.94
+25.040000000,14.94
+25.060000000,14.96
+25.080000000,14.96
+25.100000000,14.96
+25.120000000,14.96
+25.140000000,14.96
+25.160000000,14.96
+25.180000000,14.98
+25.200000000,15
+25.220000000,15.02
+25.240000000,15.04
+25.260000000,15.06
+25.280000000,15.08
+25.300000000,15.1
+25.320000000,15.12
+25.340000000,15.14
+25.360000000,15.16
+25.380000000,15.16
+25.400000000,15.16
+25.420000000,15.16
+25.440000000,15.16
+25.460000000,15.16
+25.480000000,15.16
+25.500000000,15.18
+25.520000000,15.2
+25.540000000,15.22
+25.560000000,15.24
+25.580000000,15.26
+25.600000000,15.26
+25.620000000,15.28
+25.640000000,15.3
+25.660000000,15.32
+25.680000000,15.34
+25.700000000,15.36
+25.720000000,15.38
+25.740000000,15.4
+25.760000000,15.42
+25.780000000,15.44
+25.800000000,15.46
+25.820000000,15.48
+25.840000000,15.5
+25.860000000,15.5
+25.880000000,15.5
+25.900000000,15.5
+25.920000000,15.5
+25.940000000,15.5
+25.960000000,15.5
+25.980000000,15.5
+26.000000000,15.5
+26.020000000,15.5
+26.040000000,15.5
+26.060000000,15.5
+26.080000000,15.5
+26.100000000,15.5
+26.120000000,15.5
+26.140000000,15.5
+26.160000000,15.52
+26.180000000,15.54
+26.200000000,15.56
+26.220000000,15.58
+26.240000000,15.58
+26.260000000,15.6
+26.280000000,15.6
+26.300000000,15.62
+26.320000000,15.64
+26.340000000,15.66
+26.360000000,15.68
+26.380000000,15.7
+26.400000000,15.72
+26.420000000,15.74
+26.440000000,15.76
+26.460000000,15.78
+26.480000000,15.8
+26.500000000,15.8
+26.520000000,15.82
+26.540000000,15.84
+26.560000000,15.84
+26.580000000,15.84
+26.600000000,15.84
+26.620000000,15.84
+26.640000000,15.86
+26.660000000,15.88
+26.680000000,15.9
+26.700000000,15.92
+26.720000000,15.94
+26.740000000,15.96
+26.760000000,15.96
+26.780000000,15.96
+26.800000000,15.96
+26.820000000,15.98
+26.840000000,16
+26.860000000,16.02
+26.880000000,16.04
+26.900000000,16.06
+26.920000000,16.08
+26.940000000,16.1
+26.960000000,16.12
+26.980000000,16.14
+27.000000000,16.16
+27.020000000,16.18
+27.040000000,16.2
+27.060000000,16.2
+27.080000000,16.2
+27.100000000,16.2
+27.120000000,16.2
+27.140000000,16.2
+27.160000000,16.2
+27.180000000,16.2
+27.200000000,16.2
+27.220000000,16.2
+27.240000000,16.2
+27.260000000,16.2
+27.280000000,16.2
+27.300000000,16.2
+27.320000000,16.2
+27.340000000,16.2
+27.360000000,16.22
+27.380000000,16.24
+27.400000000,16.26
+27.420000000,16.28
+27.440000000,16.3
+27.460000000,16.32
+27.480000000,16.34
+27.500000000,16.36
+27.520000000,16.38
+27.540000000,16.4
+27.560000000,16.42
+27.580000000,16.44
+27.600000000,16.46
+27.620000000,16.48
+27.640000000,16.5
+27.660000000,16.52
+27.680000000,16.54
+27.700000000,16.56
+27.720000000,16.58
+27.740000000,16.6
+27.760000000,16.62
+27.780000000,16.64
+27.800000000,16.66
+27.820000000,16.68
+27.840000000,16.7
+27.860000000,16.72
+27.880000000,16.74
+27.900000000,16.76
+27.920000000,16.76
+27.940000000,16.76
+27.960000000,16.78
+27.980000000,16.8
+28.000000000,16.82
+28.020000000,16.84
+28.040000000,16.86
+28.060000000,16.88
+28.080000000,16.9
+28.100000000,16.92
+28.120000000,16.94
+28.140000000,16.94
+28.160000000,16.96
+28.180000000,16.96
+28.200000000,16.96
+28.220000000,16.96
+28.240000000,16.96
+28.260000000,16.96
+28.280000000,16.98
+28.300000000,16.98
+28.320000000,16.98
+28.340000000,16.98
+28.360000000,16.98
+28.380000000,16.98
+28.400000000,16.98
+28.420000000,16.98
+28.440000000,16.98
+28.460000000,16.98
+28.480000000,16.98
+28.500000000,17
+28.520000000,17.02
+28.540000000,17.04
+28.560000000,17.06
+28.580000000,17.08
+28.600000000,17.1
+28.620000000,17.12
+28.640000000,17.12
+28.660000000,17.12
+28.680000000,17.12
+28.700000000,17.12
+28.720000000,17.12
+28.740000000,17.12
+28.760000000,17.12
+28.780000000,17.12
+28.800000000,17.12
+28.820000000,17.14
+28.840000000,17.16
+28.860000000,17.18
+28.880000000,17.2
+28.900000000,17.22
+28.920000000,17.24
+28.940000000,17.26
+28.960000000,17.28
+28.980000000,17.3
+29.000000000,17.32
+29.020000000,17.34
+29.040000000,17.36
+29.060000000,17.38
+29.080000000,17.4
+29.100000000,17.42
+29.120000000,17.44
+29.140000000,17.46
+29.160000000,17.48
+29.180000000,17.5
+29.200000000,17.52
+29.220000000,17.54
+29.240000000,17.56
+29.260000000,17.58
+29.280000000,17.6
+29.300000000,17.62
+29.320000000,17.64
+29.340000000,17.66
+29.360000000,17.68
+29.380000000,17.7
+29.400000000,17.72
+29.420000000,17.74
+29.440000000,17.76
+29.460000000,17.78
+29.480000000,17.8
+29.500000000,17.82
+29.520000000,17.84
+29.540000000,17.86
+29.560000000,17.86
+29.580000000,17.86
+29.600000000,17.86
+29.620000000,17.86
+29.640000000,17.86
+29.660000000,17.86
+29.680000000,17.86
+29.700000000,17.86
+29.720000000,17.88
+29.740000000,17.9
+29.760000000,17.92
+29.780000000,17.94
+29.800000000,17.96
+29.820000000,17.98
+29.840000000,18
+29.860000000,18.02
+29.880000000,18.04
+29.900000000,18.06
+29.920000000,18.08
+29.940000000,18.1
+29.960000000,18.12
+29.980000000,18.14
+30.000000000,18.16
+30.020000000,18.18
+30.040000000,18.2
+30.060000000,18.22
+30.080000000,18.24
+30.100000000,18.26
+30.120000000,18.28
+30.140000000,18.3
+30.160000000,18.32
+30.180000000,18.34
+30.200000000,18.36
+30.220000000,18.38
+30.240000000,18.4
+30.260000000,18.42
+30.280000000,18.44
+30.300000000,18.46
+30.320000000,18.48
+30.340000000,18.5
+30.360000000,18.52
+30.380000000,18.54
+30.400000000,18.56
+30.420000000,18.58
+30.440000000,18.6
+30.460000000,18.62
+30.480000000,18.64
+30.500000000,18.66
+30.520000000,18.68
+30.540000000,18.7
+30.560000000,18.72
+30.580000000,18.74
+30.600000000,18.76
+30.620000000,18.78
+30.640000000,18.8
+30.660000000,18.82
+30.680000000,18.84
+30.700000000,18.86
+30.720000000,18.88
+30.740000000,18.9
+30.760000000,18.92
+30.780000000,18.94
+30.800000000,18.96
+30.820000000,18.98
+30.840000000,19
+30.860000000,19.02
+30.880000000,19.04
+30.900000000,19.04
+30.920000000,19.04
+30.940000000,19.04
+30.960000000,19.04
+30.980000000,19.04
+31.000000000,19.04
+31.020000000,19.04
+31.040000000,19.06
+31.060000000,19.06
+31.080000000,19.06
+31.100000000,19.06
+31.120000000,19.06
+31.140000000,19.06
+31.160000000,19.06
+31.180000000,19.06
+31.200000000,19.08
+31.220000000,19.1
+31.240000000,19.1
+31.260000000,19.1
+31.280000000,19.12
+31.300000000,19.14
+31.320000000,19.16
+31.340000000,19.18
+31.360000000,19.2
+31.380000000,19.22
+31.400000000,19.24
+31.420000000,19.26
+31.440000000,19.28
+31.460000000,19.3
+31.480000000,19.32
+31.500000000,19.34
+31.520000000,19.36
+31.540000000,19.38
+31.560000000,19.4
+31.580000000,19.42
+31.600000000,19.44
+31.620000000,19.46
+31.640000000,19.48
+31.660000000,19.5
+31.680000000,19.52
+31.700000000,19.54
+31.720000000,19.56
+31.740000000,19.58
+31.760000000,19.6
+31.780000000,19.62
+31.800000000,19.64
+31.820000000,19.64
+31.840000000,19.64
+31.860000000,19.64
+31.880000000,19.66
+31.900000000,19.68
+31.920000000,19.7
+31.940000000,19.7
+31.960000000,19.7
+31.980000000,19.7
+32.000000000,19.72
+32.020000000,19.74
+32.040000000,19.76
+32.060000000,19.78
+32.080000000,19.78
+32.100000000,19.78
+32.120000000,19.78
+32.140000000,19.78
+32.160000000,19.78
+32.180000000,19.78
+32.200000000,19.78
+32.220000000,19.78
+32.240000000,19.78
+32.260000000,19.78
+32.280000000,19.78
+32.300000000,19.78
+32.320000000,19.78
+32.340000000,19.78
+32.360000000,19.8
+32.380000000,19.82
+32.400000000,19.84
+32.420000000,19.86
+32.440000000,19.88
+32.460000000,19.88
+32.480000000,19.9
+32.500000000,19.92
+32.520000000,19.92
+32.540000000,19.92
+32.560000000,19.92
+32.580000000,19.92
+32.600000000,19.92
+32.620000000,19.92
+32.640000000,19.92
+32.660000000,19.92
+32.680000000,19.92
+32.700000000,19.92
+32.720000000,19.94
+32.740000000,19.96
+32.760000000,19.98
+32.780000000,20
+32.800000000,20.02
+32.820000000,20.04
+32.840000000,20.06
+32.860000000,20.08
+32.880000000,20.1
+32.900000000,20.12
+32.920000000,20.14
+32.940000000,20.16
+32.960000000,20.18
+32.980000000,20.2
+33.000000000,20.22
+33.020000000,20.24
+33.040000000,20.26
+33.060000000,20.28
+33.080000000,20.3
+33.100000000,20.32
+33.120000000,20.34
+33.140000000,20.36
+33.160000000,20.38
+33.180000000,20.4
+33.200000000,20.42
+33.220000000,20.44
+33.240000000,20.46
+33.260000000,20.48
+33.280000000,20.5
+33.300000000,20.52
+33.320000000,20.54
+33.340000000,20.56
+33.360000000,20.58
+33.380000000,20.6
+33.400000000,20.6
+33.420000000,20.62
+33.440000000,20.64
+33.460000000,20.66
+33.480000000,20.68
+33.500000000,20.7
+33.520000000,20.72
+33.540000000,20.72
+33.560000000,20.72
+33.580000000,20.74
+33.600000000,20.76
+33.620000000,20.78
+33.640000000,20.8
+33.660000000,20.82
+33.680000000,20.84
+33.700000000,20.86
+33.720000000,20.88
+33.740000000,20.9
+33.760000000,20.92
+33.780000000,20.92
+33.800000000,20.92
+33.820000000,20.94
+33.840000000,20.94
+33.860000000,20.96
+33.880000000,20.98
+33.900000000,21
+33.920000000,21.02
+33.940000000,21.04
+33.960000000,21.06
+33.980000000,21.08
+34.000000000,21.1
+34.020000000,21.12
+34.040000000,21.12
+34.060000000,21.14
+34.080000000,21.14
+34.100000000,21.14
+34.120000000,21.14
+34.140000000,21.14
+34.160000000,21.16
+34.180000000,21.18
+34.200000000,21.2
+34.220000000,21.22
+34.240000000,21.24
+34.260000000,21.26
+34.280000000,21.28
+34.300000000,21.3
+34.320000000,21.3
+34.340000000,21.3
+34.360000000,21.3
+34.380000000,21.3
+34.400000000,21.3
+34.420000000,21.32
+34.440000000,21.34
+34.460000000,21.36
+34.480000000,21.36
+34.500000000,21.36
+34.520000000,21.36
+34.540000000,21.38
+34.560000000,21.4
+34.580000000,21.4
+34.600000000,21.4
+34.620000000,21.4
+34.640000000,21.4
+34.660000000,21.4
+34.680000000,21.4
+34.700000000,21.4
+34.720000000,21.4
+34.740000000,21.4
+34.760000000,21.4
+34.780000000,21.42
+34.800000000,21.42
+34.820000000,21.44
+34.840000000,21.46
+34.860000000,21.46
+34.880000000,21.46
+34.900000000,21.46
+34.920000000,21.46
+34.940000000,21.46
+34.960000000,21.46
+34.980000000,21.46
+35.000000000,21.46
+35.020000000,21.46
+35.040000000,21.46
+35.060000000,21.46
+35.080000000,21.46
+35.100000000,21.46
+35.120000000,21.46
+35.140000000,21.46
+35.160000000,21.46
+35.180000000,21.46
+35.200000000,21.46
+35.220000000,21.46
+35.240000000,21.46
+35.260000000,21.46
+35.280000000,21.46
+35.300000000,21.46
+35.320000000,21.46
+35.340000000,21.46
+35.360000000,21.48
+35.380000000,21.5
+35.400000000,21.52
+35.420000000,21.54
+35.440000000,21.56
+35.460000000,21.58
+35.480000000,21.6
+35.500000000,21.6
+35.520000000,21.6
+35.540000000,21.6
+35.560000000,21.62
+35.580000000,21.62
+35.600000000,21.62
+35.620000000,21.62
+35.640000000,21.62
+35.660000000,21.62
+35.680000000,21.62
+35.700000000,21.62
+35.720000000,21.62
+35.740000000,21.62
+35.760000000,21.62
+35.780000000,21.62
+35.800000000,21.62
+35.820000000,21.62
+35.840000000,21.62
+35.860000000,21.62
+35.880000000,21.62
+35.900000000,21.62
+35.920000000,21.62
+35.940000000,21.62
+35.960000000,21.64
+35.980000000,21.64
+36.000000000,21.64
+36.020000000,21.64
+36.040000000,21.64
+36.060000000,21.64
+36.080000000,21.64
+36.100000000,21.64
+36.120000000,21.64
+36.140000000,21.66
+36.160000000,21.68
+36.180000000,21.68
+36.200000000,21.68
+36.220000000,21.68
+36.240000000,21.68
+36.260000000,21.68
+36.280000000,21.68
+36.300000000,21.7
+36.320000000,21.7
+36.340000000,21.72
+36.360000000,21.74
+36.380000000,21.76
+36.400000000,21.76
+36.420000000,21.76
+36.440000000,21.76
+36.460000000,21.76
+36.480000000,21.76
+36.500000000,21.76
+36.520000000,21.76
+36.540000000,21.76
+36.560000000,21.76
+36.580000000,21.76
+36.600000000,21.76
+36.620000000,21.76
+36.640000000,21.76
+36.660000000,21.76
+36.680000000,21.76
+36.700000000,21.76
+36.720000000,21.76
+36.740000000,21.76
+36.760000000,21.76
+36.780000000,21.76
+36.800000000,21.76
+36.820000000,21.76
+36.840000000,21.78
+36.860000000,21.8
+36.880000000,21.82
+36.900000000,21.84
+36.920000000,21.86
+36.940000000,21.88
+36.960000000,21.9
+36.980000000,21.92
+37.000000000,21.94
+37.020000000,21.96
+37.040000000,21.98
+37.060000000,22
+37.080000000,22.02
+37.100000000,22.04
+37.120000000,22.06
+37.140000000,22.06
+37.160000000,22.06
+37.180000000,22.06
+37.200000000,22.06
+37.220000000,22.06
+37.240000000,22.06
+37.260000000,22.06
+37.280000000,22.06
+37.300000000,22.06
+37.320000000,22.06
+37.340000000,22.06
+37.360000000,22.06
+37.380000000,22.06
+37.400000000,22.06
+37.420000000,22.06
+37.440000000,22.06
+37.460000000,22.06
+37.480000000,22.08
+37.500000000,22.1
+37.520000000,22.12
+37.540000000,22.14
+37.560000000,22.16
+37.580000000,22.18
+37.600000000,22.18
+37.620000000,22.18
+37.640000000,22.18
+37.660000000,22.18
+37.680000000,22.18
+37.700000000,22.18
+37.720000000,22.2
+37.740000000,22.2
+37.760000000,22.22
+37.780000000,22.22
+37.800000000,22.24
+37.820000000,22.26
+37.840000000,22.28
+37.860000000,22.28
+37.880000000,22.28
+37.900000000,22.28
+37.920000000,22.3
+37.940000000,22.32
+37.960000000,22.34
+37.980000000,22.36
+38.000000000,22.36
+38.020000000,22.36
+38.040000000,22.38
+38.060000000,22.4
+38.080000000,22.4
+38.100000000,22.4
+38.120000000,22.4
+38.140000000,22.4
+38.160000000,22.42
+38.180000000,22.44
+38.200000000,22.44
+38.220000000,22.44
+38.240000000,22.44
+38.260000000,22.44
+38.280000000,22.46
+38.300000000,22.48
+38.320000000,22.48
+38.340000000,22.48
+38.360000000,22.5
+38.380000000,22.5
+38.400000000,22.52
+38.420000000,22.54
+38.440000000,22.54
+38.460000000,22.54
+38.480000000,22.54
+38.500000000,22.54
+38.520000000,22.56
+38.540000000,22.58
+38.560000000,22.6
+38.580000000,22.62
+38.600000000,22.64
+38.620000000,22.66
+38.640000000,22.68
+38.660000000,22.7
+38.680000000,22.72
+38.700000000,22.74
+38.720000000,22.76
+38.740000000,22.78
+38.760000000,22.8
+38.780000000,22.82
+38.800000000,22.84
+38.820000000,22.84
+38.840000000,22.84
+38.860000000,22.84
+38.880000000,22.84
+38.900000000,22.84
+38.920000000,22.84
+38.940000000,22.84
+38.960000000,22.84
+38.980000000,22.84
+39.000000000,22.84
+39.020000000,22.86
+39.040000000,22.88
+39.060000000,22.9
+39.080000000,22.92
+39.100000000,22.94
+39.120000000,22.96
+39.140000000,22.98
+39.160000000,23
+39.180000000,23.02
+39.200000000,23.04
+39.220000000,23.06
+39.240000000,23.08
+39.260000000,23.1
+39.280000000,23.12
+39.300000000,23.14
+39.320000000,23.16
+39.340000000,23.18
+39.360000000,23.2
+39.380000000,23.22
+39.400000000,23.24
+39.420000000,23.26
+39.440000000,23.28
+39.460000000,23.3
+39.480000000,23.32
+39.500000000,23.34
+39.520000000,23.36
+39.540000000,23.38
+39.560000000,23.4
+39.580000000,23.42
+39.600000000,23.44
+39.620000000,23.46
+39.640000000,23.48
+39.660000000,23.5
+39.680000000,23.52
+39.700000000,23.54
+39.720000000,23.56
+39.740000000,23.58
+39.760000000,23.6
+39.780000000,23.62
+39.800000000,23.64
+39.820000000,23.66
+39.840000000,23.68
+39.860000000,23.7
+39.880000000,23.72
+39.900000000,23.74
+39.920000000,23.76
+39.940000000,23.78
+39.960000000,23.8
+39.980000000,23.82
+40.000000000,23.84
+40.020000000,23.86
+40.040000000,23.88
+40.060000000,23.9
+40.080000000,23.92
+40.100000000,23.94
+40.100000000,23.96
+40.100000000,23.98
+40.120000000,24
+40.120000000,24.02
+40.120000000,24.04
+40.120000000,24.06
+40.120000000,24.08
+40.120000000,24.1
+40.120000000,24.12
+40.120000000,24.14
+40.120000000,24.16
+40.120000000,24.18
+40.120000000,24.2
+40.120000000,24.22
+40.140000000,24.24
+40.160000000,24.26
+40.180000000,24.28
+40.200000000,24.3
+40.220000000,24.32
+40.220000000,24.34
+40.220000000,24.36
+40.220000000,24.38
+40.220000000,24.4
+40.220000000,24.42
+40.220000000,24.44
+40.220000000,24.46
+40.220000000,24.48
+40.220000000,24.5
+40.220000000,24.52
+40.240000000,24.54
+40.260000000,24.56
+40.280000000,24.58
+40.280000000,24.6
+40.280000000,24.62
+40.300000000,24.64
+40.320000000,24.66
+40.320000000,24.68
+40.320000000,24.7
+40.320000000,24.72
+40.320000000,24.74
+40.320000000,24.76
+40.320000000,24.78
+40.320000000,24.8
+40.320000000,24.82
+40.320000000,24.84
+40.320000000,24.86
+40.320000000,24.88
+40.320000000,24.9
+40.320000000,24.92
+40.320000000,24.94
+40.320000000,24.96
+40.320000000,24.98
+40.320000000,25
+40.320000000,25.02
+40.320000000,25.04
+40.320000000,25.06
+40.320000000,25.08
+40.340000000,25.1
+40.340000000,25.12
+40.340000000,25.14
+40.340000000,25.16
+40.340000000,25.18
+40.340000000,25.2
+40.340000000,25.22
+40.340000000,25.24
+40.340000000,25.26
+40.340000000,25.28
+40.340000000,25.3
+40.340000000,25.32
+40.340000000,25.34
+40.340000000,25.36
+40.340000000,25.38
+40.340000000,25.4
+40.340000000,25.42
+40.340000000,25.44
+40.340000000,25.46
+40.340000000,25.48
+40.340000000,25.5
+40.340000000,25.52
+40.340000000,25.54
+40.340000000,25.56
+40.340000000,25.58
+40.340000000,25.6
+40.340000000,25.62
+40.340000000,25.64
+40.340000000,25.66
+40.340000000,25.68
+40.340000000,25.7
+40.340000000,25.72
+40.340000000,25.74
+40.340000000,25.76
+40.340000000,25.78
+40.360000000,25.8
+40.380000000,25.82
+40.400000000,25.84
+40.420000000,25.86
+40.440000000,25.88
+40.460000000,25.9
+40.480000000,25.92
+40.500000000,25.94
+40.500000000,25.96
+40.500000000,25.98
+40.520000000,26
+40.540000000,26.02
+40.560000000,26.04
+40.580000000,26.06
+40.600000000,26.08
+40.620000000,26.1
+40.640000000,26.12
+40.660000000,26.14
+40.680000000,26.16
+40.680000000,26.18
+40.680000000,26.2
+40.680000000,26.22
+40.680000000,26.24
+40.680000000,26.26
+40.680000000,26.28
+40.680000000,26.3
+40.700000000,26.32
+40.720000000,26.34
+40.740000000,26.36
+40.740000000,26.38
+40.740000000,26.4
+40.740000000,26.42
+40.740000000,26.44
+40.740000000,26.46
+40.740000000,26.48
+40.740000000,26.5
+40.740000000,26.52
+40.760000000,26.54
+40.780000000,26.56
+40.800000000,26.58
+40.820000000,26.6
+40.820000000,26.62
+40.820000000,26.64
+40.820000000,26.66
+40.820000000,26.68
+40.820000000,26.7
+40.820000000,26.72
+40.820000000,26.74
+40.820000000,26.76
+40.820000000,26.78
+40.820000000,26.8
+40.820000000,26.82
+40.820000000,26.84
+40.820000000,26.86
+40.820000000,26.88
+40.820000000,26.9
+40.820000000,26.92
+40.820000000,26.94
+40.820000000,26.96
+40.820000000,26.98
+40.820000000,27
+40.820000000,27.02
+40.820000000,27.04
+40.820000000,27.06
+40.820000000,27.08
+40.820000000,27.1
+40.820000000,27.12
+40.820000000,27.14
+40.840000000,27.16
+40.840000000,27.18
+40.840000000,27.2
+40.840000000,27.22
+40.840000000,27.24
+40.840000000,27.26
+40.840000000,27.28
+40.840000000,27.3
+40.840000000,27.32
+40.840000000,27.34
+40.840000000,27.36
+40.840000000,27.38
+40.840000000,27.4
+40.840000000,27.42
+40.840000000,27.44
+40.840000000,27.46
+40.840000000,27.48
+40.840000000,27.5
+40.840000000,27.52
+40.840000000,27.54
+40.840000000,27.56
+40.840000000,27.58
+40.840000000,27.6
+40.840000000,27.62
+40.840000000,27.64
+40.840000000,27.66
+40.840000000,27.68
+40.840000000,27.7
+40.840000000,27.72
+40.840000000,27.74
+40.860000000,27.76
+40.860000000,27.78
+40.860000000,27.8
+40.860000000,27.82
+40.860000000,27.84
+40.860000000,27.86
+40.860000000,27.88
+40.860000000,27.9
+40.860000000,27.92
+40.860000000,27.94
+40.860000000,27.96
+40.860000000,27.98
+40.860000000,28
+40.860000000,28.02
+40.860000000,28.04
+40.860000000,28.06
+40.860000000,28.08
+40.860000000,28.1
+40.860000000,28.12
+40.860000000,28.14
+40.860000000,28.16
+40.860000000,28.18
+40.860000000,28.2
+40.860000000,28.22
+40.860000000,28.24
+40.860000000,28.26
+40.860000000,28.28
+40.860000000,28.3
+40.860000000,28.32
+40.860000000,28.34
+40.860000000,28.36
+40.860000000,28.38
+40.860000000,28.4
+40.880000000,28.42
+40.900000000,28.44
+40.920000000,28.46
+40.940000000,28.48
+40.960000000,28.5
+40.980000000,28.52
+41.000000000,28.54
+41.020000000,28.56
+41.040000000,28.58
+41.040000000,28.6
+41.040000000,28.62
+41.040000000,28.64
+41.040000000,28.66
+41.040000000,28.68
+41.040000000,28.7
+41.060000000,28.72
+41.080000000,28.74
+41.100000000,28.76
+41.120000000,28.78
+41.140000000,28.8
+41.160000000,28.82
+41.180000000,28.84
+41.200000000,28.86
+41.220000000,28.88
+41.240000000,28.9
+41.260000000,28.92
+41.280000000,28.94
+41.300000000,28.96
+41.320000000,28.98
+41.340000000,29
+41.360000000,29.02
+41.380000000,29.04
+41.400000000,29.06
+41.400000000,29.08
+41.400000000,29.1
+41.400000000,29.12
+41.400000000,29.14
+41.420000000,29.16
+41.440000000,29.18
+41.440000000,29.2
+41.440000000,29.22
+41.460000000,29.24
+41.460000000,29.26
+41.480000000,29.28
+41.500000000,29.3
+41.500000000,29.32
+41.520000000,29.34
+41.520000000,29.36
+41.520000000,29.38
+41.520000000,29.4
+41.520000000,29.42
+41.520000000,29.44
+41.520000000,29.46
+41.520000000,29.48
+41.520000000,29.5
+41.520000000,29.52
+41.540000000,29.54
+41.560000000,29.56
+41.580000000,29.58
+41.580000000,29.6
+41.580000000,29.62
+41.580000000,29.64
+41.580000000,29.66
+41.580000000,29.68
+41.580000000,29.7
+41.580000000,29.72
+41.580000000,29.74
+41.600000000,29.76
+41.620000000,29.78
+41.640000000,29.8
+41.660000000,29.82
+41.680000000,29.84
+41.700000000,29.86
+41.720000000,29.88
+41.740000000,29.9
+41.740000000,29.92
+41.760000000,29.94
+41.780000000,29.96
+41.800000000,29.98
+41.820000000,30
+41.840000000,30.02
+41.860000000,30.04
+41.860000000,30.06
+41.860000000,30.08
+41.860000000,30.1
+41.860000000,30.12
+41.860000000,30.14
+41.860000000,30.16
+41.860000000,30.18
+41.860000000,30.2
+41.860000000,30.22
+41.880000000,30.24
+41.880000000,30.26
+41.880000000,30.28
+41.880000000,30.3
+41.880000000,30.32
+41.880000000,30.34
+41.880000000,30.36
+41.880000000,30.38
+41.880000000,30.4
+41.880000000,30.42
+41.900000000,30.44
+41.920000000,30.46
+41.920000000,30.48
+41.920000000,30.5
+41.920000000,30.52
+41.920000000,30.54
+41.920000000,30.56
+41.920000000,30.58
+41.920000000,30.6
+41.920000000,30.62
+41.920000000,30.64
+41.920000000,30.66
+41.920000000,30.68
+41.920000000,30.7
+41.920000000,30.72
+41.920000000,30.74
+41.940000000,30.76
+41.940000000,30.78
+41.960000000,30.8
+41.980000000,30.82
+42.000000000,30.84
+42.020000000,30.86
+42.040000000,30.88
+42.060000000,30.9
+42.060000000,30.92
+42.060000000,30.94
+42.060000000,30.96
+42.060000000,30.98
+42.060000000,31
+42.060000000,31.02
+42.060000000,31.04
+42.060000000,31.06
+42.060000000,31.08
+42.060000000,31.1
+42.060000000,31.12
+42.060000000,31.14
+42.060000000,31.16
+42.060000000,31.18
+42.060000000,31.2
+42.060000000,31.22
+42.060000000,31.24
+42.060000000,31.26
+42.060000000,31.28
+42.060000000,31.3
+42.060000000,31.32
+42.060000000,31.34
+42.060000000,31.36
+42.060000000,31.38
+42.060000000,31.4
+42.080000000,31.42
+42.100000000,31.44
+42.120000000,31.46
+42.140000000,31.48
+42.160000000,31.5
+42.180000000,31.52
+42.200000000,31.54
+42.220000000,31.56
+42.240000000,31.58
+42.260000000,31.6
+42.280000000,31.62
+42.300000000,31.64
+42.320000000,31.66
+42.340000000,31.68
+42.360000000,31.7
+42.380000000,31.72
+42.400000000,31.74
+42.420000000,31.76
+42.440000000,31.78
+42.460000000,31.8
+42.480000000,31.82
+42.500000000,31.84
+42.520000000,31.86
+42.540000000,31.88
+42.560000000,31.9
+42.580000000,31.92
+42.600000000,31.94
+42.620000000,31.96
+42.640000000,31.98
+42.660000000,32
+42.680000000,32.02
+42.700000000,32.04
+42.720000000,32.06
+42.740000000,32.08
+42.760000000,32.1
+42.780000000,32.12
+42.800000000,32.14
+42.820000000,32.16
+42.840000000,32.18
+42.860000000,32.2
+42.880000000,32.22
+42.900000000,32.24
+42.920000000,32.26
+42.940000000,32.28
+42.960000000,32.3
+42.980000000,32.32
+43.000000000,32.34
+43.020000000,32.36
+43.040000000,32.38
+43.060000000,32.4
+43.080000000,32.42
+43.100000000,32.42
+43.120000000,32.44
+43.140000000,32.46
+43.160000000,32.46
+43.180000000,32.46
+43.200000000,32.46
+43.220000000,32.46
+43.240000000,32.46
+43.260000000,32.46
+43.280000000,32.46
+43.300000000,32.46
+43.320000000,32.46
+43.340000000,32.46
+43.360000000,32.46
+43.380000000,32.46
+43.400000000,32.46
+43.420000000,32.48
+43.440000000,32.5
+43.460000000,32.52
+43.480000000,32.52
+43.500000000,32.52
+43.520000000,32.52
+43.540000000,32.52
+43.560000000,32.52
+43.580000000,32.52
+43.600000000,32.52
+43.620000000,32.52
+43.640000000,32.52
+43.660000000,32.52
+43.680000000,32.52
+43.700000000,32.52
+43.720000000,32.52
+43.740000000,32.52
+43.760000000,32.52
+43.780000000,32.52
+43.800000000,32.52
+43.820000000,32.52
+43.840000000,32.52
+43.860000000,32.52
+43.880000000,32.52
+43.900000000,32.52
+43.920000000,32.52
+43.940000000,32.52
+43.960000000,32.52
+43.980000000,32.52
+44.000000000,32.52
+44.020000000,32.52
+44.040000000,32.52
+44.060000000,32.52
+44.080000000,32.52
+44.100000000,32.52
+44.120000000,32.52
+44.140000000,32.52
+44.160000000,32.52
+44.180000000,32.52
+44.200000000,32.52
+44.220000000,32.52
+44.240000000,32.52
+44.260000000,32.52
+44.280000000,32.52
+44.300000000,32.52
+44.320000000,32.52
+44.340000000,32.52
+44.360000000,32.52
+44.380000000,32.52
+44.400000000,32.52
+44.420000000,32.52
+44.440000000,32.52
+44.460000000,32.54
+44.480000000,32.56
+44.500000000,32.58
+44.520000000,32.58
+44.540000000,32.58
+44.560000000,32.58
+44.580000000,32.6
+44.600000000,32.6
+44.620000000,32.6
+44.640000000,32.6
+44.660000000,32.6
+44.680000000,32.6
+44.700000000,32.62
+44.720000000,32.64
+44.740000000,32.66
+44.760000000,32.68
+44.780000000,32.7
+44.800000000,32.72
+44.820000000,32.74
+44.840000000,32.76
+44.860000000,32.78
+44.880000000,32.8
+44.900000000,32.82
+44.920000000,32.82
+44.940000000,32.82
+44.960000000,32.84
+44.980000000,32.86
+45.000000000,32.88
+45.020000000,32.88
+45.040000000,32.88
+45.060000000,32.88
+45.080000000,32.88
+45.100000000,32.88
+45.120000000,32.88
+45.140000000,32.9
+45.160000000,32.92
+45.180000000,32.92
+45.200000000,32.92
+45.220000000,32.92
+45.240000000,32.92
+45.260000000,32.92
+45.280000000,32.92
+45.300000000,32.92
+45.320000000,32.92
+45.340000000,32.92
+45.360000000,32.94
+45.380000000,32.94
+45.400000000,32.94
+45.420000000,32.94
+45.440000000,32.96
+45.460000000,32.96
+45.480000000,32.96
+45.500000000,32.96
+45.520000000,32.96
+45.540000000,32.96
+45.560000000,32.96
+45.580000000,32.96
+45.600000000,32.96
+45.620000000,32.96
+45.640000000,32.98
+45.660000000,32.98
+45.680000000,32.98
+45.700000000,33
+45.720000000,33.02
+45.740000000,33.02
+45.760000000,33.04
+45.780000000,33.06
+45.800000000,33.08
+45.820000000,33.1
+45.840000000,33.12
+45.860000000,33.14
+45.880000000,33.16
+45.900000000,33.18
+45.920000000,33.2
+45.940000000,33.22
+45.960000000,33.24
+45.980000000,33.26
+46.000000000,33.28
+46.020000000,33.28
+46.040000000,33.28
+46.060000000,33.28
+46.080000000,33.28
+46.100000000,33.28
+46.120000000,33.28
+46.140000000,33.28
+46.160000000,33.28
+46.180000000,33.3
+46.200000000,33.3
+46.220000000,33.3
+46.240000000,33.3
+46.260000000,33.3
+46.280000000,33.3
+46.300000000,33.3
+46.320000000,33.3
+46.340000000,33.3
+46.360000000,33.3
+46.380000000,33.3
+46.400000000,33.3
+46.420000000,33.3
+46.440000000,33.3
+46.460000000,33.3
+46.480000000,33.3
+46.500000000,33.3
+46.520000000,33.3
+46.540000000,33.3
+46.560000000,33.3
+46.580000000,33.3
+46.600000000,33.3
+46.620000000,33.3
+46.640000000,33.3
+46.660000000,33.3
+46.680000000,33.3
+46.700000000,33.3
+46.720000000,33.3
+46.740000000,33.3
+46.760000000,33.3
+46.780000000,33.3
+46.800000000,33.3
+46.820000000,33.3
+46.840000000,33.3
+46.860000000,33.3
+46.880000000,33.3
+46.900000000,33.3
+46.920000000,33.3
+46.940000000,33.3
+46.960000000,33.32
+46.980000000,33.34
+47.000000000,33.36
+47.020000000,33.38
+47.040000000,33.4
+47.060000000,33.4
+47.080000000,33.4
+47.100000000,33.4
+47.120000000,33.42
+47.140000000,33.44
+47.160000000,33.44
+47.180000000,33.44
+47.200000000,33.44
+47.220000000,33.44
+47.240000000,33.44
+47.260000000,33.44
+47.280000000,33.44
+47.300000000,33.44
+47.320000000,33.46
+47.340000000,33.46
+47.360000000,33.46
+47.380000000,33.46
+47.400000000,33.46
+47.420000000,33.46
+47.440000000,33.46
+47.460000000,33.46
+47.480000000,33.46
+47.500000000,33.46
+47.520000000,33.46
+47.540000000,33.46
+47.560000000,33.48
+47.580000000,33.5
+47.600000000,33.5
+47.620000000,33.5
+47.640000000,33.5
+47.660000000,33.5
+47.680000000,33.5
+47.700000000,33.5
+47.720000000,33.5
+47.740000000,33.5
+47.760000000,33.52
+47.780000000,33.52
+47.800000000,33.52
+47.820000000,33.54
+47.840000000,33.54
+47.860000000,33.56
+47.880000000,33.58
+47.900000000,33.6
+47.920000000,33.62
+47.940000000,33.64
+47.960000000,33.66
+47.980000000,33.68
+48.000000000,33.7
+48.020000000,33.72
+48.040000000,33.74
+48.060000000,33.76
+48.080000000,33.78
+48.100000000,33.8
+48.120000000,33.82
+48.140000000,33.84
+48.160000000,33.86
+48.180000000,33.88
+48.200000000,33.9
+48.220000000,33.92
+48.240000000,33.94
+48.260000000,33.96
+48.280000000,33.98
+48.300000000,34
+48.320000000,34.02
+48.340000000,34.04
+48.360000000,34.06
+48.380000000,34.08
+48.400000000,34.1
+48.420000000,34.12
+48.440000000,34.14
+48.460000000,34.16
+48.480000000,34.18
+48.500000000,34.2
+48.520000000,34.22
+48.540000000,34.24
+48.560000000,34.26
+48.580000000,34.28
+48.600000000,34.3
+48.620000000,34.32
+48.640000000,34.34
+48.660000000,34.36
+48.680000000,34.38
+48.700000000,34.4
+48.720000000,34.42
+48.740000000,34.44
+48.760000000,34.46
+48.780000000,34.48
+48.800000000,34.5
+48.820000000,34.52
+48.840000000,34.54
+48.860000000,34.56
+48.860000000,34.58
+48.860000000,34.6
+48.860000000,34.62
+48.860000000,34.64
+48.860000000,34.66
+48.860000000,34.68
+48.860000000,34.7
+48.860000000,34.72
+48.860000000,34.74
+48.860000000,34.76
+48.860000000,34.78
+48.860000000,34.8
+48.860000000,34.82
+48.860000000,34.84
+48.860000000,34.86
+48.860000000,34.88
+48.860000000,34.9
+48.860000000,34.92
+48.860000000,34.94
+48.860000000,34.96
+48.860000000,34.98
+48.860000000,35
+48.860000000,35.02
+48.860000000,35.04
+48.860000000,35.06
+48.860000000,35.08
+48.860000000,35.1
+48.860000000,35.12
+48.860000000,35.14
+48.860000000,35.16
+48.860000000,35.18
+48.860000000,35.2
+48.860000000,35.22
+48.860000000,35.24
+48.860000000,35.26
+48.860000000,35.28
+48.860000000,35.3
+48.860000000,35.32
+48.860000000,35.34
+48.860000000,35.36
+48.860000000,35.38
+48.860000000,35.4
+48.860000000,35.42
+48.860000000,35.44
+48.860000000,35.46
+48.860000000,35.48
+48.860000000,35.5
+48.860000000,35.52
+48.860000000,35.54
+48.860000000,35.56
+48.860000000,35.58
+48.860000000,35.6
+48.860000000,35.62
+48.860000000,35.64
+48.860000000,35.66
+48.860000000,35.68
+48.860000000,35.7
+48.860000000,35.72
+48.860000000,35.74
+48.860000000,35.76
+48.860000000,35.78
+48.860000000,35.8
+48.860000000,35.82
+48.860000000,35.84
+48.860000000,35.86
+48.860000000,35.88
+48.860000000,35.9
+48.860000000,35.92
+48.860000000,35.94
+48.860000000,35.96
+48.860000000,35.98
+48.860000000,36
+48.860000000,36.02
+48.860000000,36.04
+48.860000000,36.06
+48.860000000,36.08
+48.860000000,36.1
+48.860000000,36.12
+48.860000000,36.14
+48.860000000,36.16
+48.860000000,36.18
+48.860000000,36.2
+48.860000000,36.22
+48.860000000,36.24
+48.860000000,36.26
+48.860000000,36.28
+48.860000000,36.3
+48.860000000,36.32
+48.860000000,36.34
+48.860000000,36.36
+48.860000000,36.38
+48.860000000,36.4
+48.860000000,36.42
+48.860000000,36.44
+48.860000000,36.46
+48.860000000,36.48
+48.860000000,36.5
+48.860000000,36.52
+48.860000000,36.54
+48.860000000,36.56
+48.860000000,36.58
+48.860000000,36.6
+48.860000000,36.62
+48.860000000,36.64
+48.860000000,36.66
+48.860000000,36.68
+48.860000000,36.7
+48.860000000,36.72
+48.860000000,36.74
+48.860000000,36.76
+48.860000000,36.78
+48.860000000,36.8
+48.860000000,36.82
+48.860000000,36.84
+48.860000000,36.86
+48.860000000,36.88
+48.860000000,36.9
+48.860000000,36.92
+48.860000000,36.94
+48.860000000,36.96
+48.860000000,36.98
+48.860000000,37
+48.860000000,37.02
+48.860000000,37.04
+48.860000000,37.06
+48.860000000,37.08
+48.860000000,37.1
+48.860000000,37.12
+48.860000000,37.14
+48.860000000,37.16
+48.860000000,37.18
+48.860000000,37.2
+48.860000000,37.22
+48.860000000,37.24
+48.860000000,37.26
+48.860000000,37.28
+48.860000000,37.3
+48.860000000,37.32
+48.860000000,37.34
+48.860000000,37.36
+48.860000000,37.38
+48.860000000,37.4
+48.860000000,37.42
+48.860000000,37.44
+48.860000000,37.46
+48.860000000,37.48
+48.860000000,37.5
+48.860000000,37.52
+48.860000000,37.54
+48.860000000,37.56
+48.860000000,37.58
+48.860000000,37.6
+48.860000000,37.62
+48.860000000,37.64
+48.860000000,37.66
+48.860000000,37.68
+48.860000000,37.7
+48.860000000,37.72
+48.860000000,37.74
+48.860000000,37.76
+48.860000000,37.78
+48.860000000,37.8
+48.860000000,37.82
+48.860000000,37.84
+48.860000000,37.86
+48.860000000,37.88
+48.860000000,37.9
+48.860000000,37.92
+48.860000000,37.94
+48.860000000,37.96
+48.860000000,37.98
+48.860000000,38
+48.860000000,38.02
+48.860000000,38.04
+48.860000000,38.06
+48.860000000,38.08
+48.860000000,38.1
+48.860000000,38.12
+48.860000000,38.14
+48.860000000,38.16
+48.860000000,38.18
+48.860000000,38.2
+48.860000000,38.22
+48.860000000,38.24
+48.860000000,38.26
+48.860000000,38.28
+48.860000000,38.3
+48.860000000,38.32
+48.860000000,38.34
+48.860000000,38.36
+48.860000000,38.38
+48.860000000,38.4
+48.860000000,38.42
+48.860000000,38.44
+48.860000000,38.46
+48.860000000,38.48
+48.860000000,38.5
+48.860000000,38.52
+48.860000000,38.54
+48.860000000,38.56
+48.860000000,38.58
+48.860000000,38.6
+48.860000000,38.62
+48.860000000,38.64
+48.860000000,38.66
+48.860000000,38.68
+48.860000000,38.7
+48.860000000,38.72
+48.860000000,38.74
+48.860000000,38.76
+48.860000000,38.78
+48.860000000,38.8
+48.860000000,38.82
+48.860000000,38.84
+48.860000000,38.86
+48.860000000,38.88
+48.860000000,38.9
+48.860000000,38.92
+48.860000000,38.94
+48.860000000,38.96
+48.860000000,38.98
+48.860000000,39
+48.860000000,39.02
+48.860000000,39.04
+48.860000000,39.06
+48.860000000,39.08
+48.860000000,39.1
+48.860000000,39.12
+48.860000000,39.14
+48.860000000,39.16
+48.860000000,39.18
+48.860000000,39.2
+48.860000000,39.22
+48.860000000,39.24
+48.860000000,39.26
+48.860000000,39.28
+48.860000000,39.3
+48.860000000,39.32
+48.860000000,39.34
+48.860000000,39.36
+48.860000000,39.38
+48.860000000,39.4
+48.860000000,39.42
+48.860000000,39.44
+48.860000000,39.46
+48.860000000,39.48
+48.860000000,39.5
+48.860000000,39.52
+48.860000000,39.54
+48.860000000,39.56
+48.860000000,39.58
+48.860000000,39.6
+48.860000000,39.62
+48.860000000,39.64
+48.860000000,39.66
+48.860000000,39.68
+48.860000000,39.7
+48.860000000,39.72
+48.860000000,39.74
+48.860000000,39.76
+48.860000000,39.78
+48.860000000,39.8
+48.860000000,39.82
+48.860000000,39.84
+48.860000000,39.86
+48.860000000,39.88
+48.860000000,39.9
+48.860000000,39.92
+48.860000000,39.94
+48.860000000,39.96
+48.860000000,39.98
+48.860000000,40
+48.860000000,40.02
+48.860000000,40.04
+48.860000000,40.06
+48.860000000,40.08
+48.860000000,40.1
+48.860000000,40.12
+48.860000000,40.14
+48.860000000,40.16
+48.860000000,40.18
+48.860000000,40.2
+48.860000000,40.22
+48.860000000,40.24
+48.860000000,40.26
+48.860000000,40.28
+48.860000000,40.3
+48.860000000,40.32
+48.860000000,40.34
+48.860000000,40.36
+48.860000000,40.38
+48.860000000,40.4
+48.860000000,40.42
+48.860000000,40.44
+48.860000000,40.46
+48.860000000,40.48
+48.860000000,40.5
+48.860000000,40.52
+48.860000000,40.54
+48.860000000,40.56
+48.860000000,40.58
+48.860000000,40.6
+48.860000000,40.62
+48.860000000,40.64
+48.860000000,40.66
+48.860000000,40.68
+48.860000000,40.7
+48.860000000,40.72
+48.860000000,40.74
+48.860000000,40.76
+48.860000000,40.78
+48.860000000,40.8
+48.860000000,40.82
+48.860000000,40.84
+48.860000000,40.86
+48.860000000,40.88
+48.860000000,40.9
+48.860000000,40.92
+48.860000000,40.94
+48.860000000,40.96
+48.860000000,40.98
+48.860000000,41
+48.860000000,41.02
+48.860000000,41.04
+48.860000000,41.06
+48.860000000,41.08
+48.860000000,41.1
+48.860000000,41.12
+48.860000000,41.14
+48.860000000,41.16
+48.860000000,41.18
+48.860000000,41.2
+48.860000000,41.22
+48.860000000,41.24
+48.860000000,41.26
+48.860000000,41.28
+48.860000000,41.3
+48.860000000,41.32
+48.860000000,41.34
+48.860000000,41.36
+48.860000000,41.38
+48.860000000,41.4
+48.860000000,41.42
+48.860000000,41.44
+48.860000000,41.46
+48.860000000,41.48
+48.860000000,41.5
+48.860000000,41.52
+48.860000000,41.54
+48.860000000,41.56
+48.860000000,41.58
+48.860000000,41.6
+48.860000000,41.62
+48.860000000,41.64
+48.860000000,41.66
+48.860000000,41.68
+48.860000000,41.7
+48.860000000,41.72
+48.860000000,41.74
+48.860000000,41.76
+48.860000000,41.78
+48.860000000,41.8
+48.860000000,41.82
+48.860000000,41.84
+48.860000000,41.86
+48.860000000,41.88
+48.860000000,41.9
+48.860000000,41.92
+48.860000000,41.94
+48.860000000,41.96
+48.860000000,41.98
+48.860000000,42
+48.860000000,42.02
+48.860000000,42.04
+48.860000000,42.06
+48.860000000,42.08
+48.860000000,42.1
+48.860000000,42.12
+48.860000000,42.14
+48.860000000,42.16
+48.860000000,42.18
+48.860000000,42.2
+48.860000000,42.22
+48.860000000,42.24
+48.860000000,42.26
+48.860000000,42.28
+48.860000000,42.3
+48.860000000,42.32
+48.860000000,42.34
+48.860000000,42.36
+48.860000000,42.38
+48.860000000,42.4
+48.860000000,42.42
+48.860000000,42.44
+48.860000000,42.46
+48.860000000,42.48
+48.860000000,42.5
+48.860000000,42.52
+48.860000000,42.54
+48.860000000,42.56
+48.860000000,42.58
+48.860000000,42.6
+48.860000000,42.62
+48.860000000,42.64
+48.860000000,42.66
+48.860000000,42.68
+48.860000000,42.7
+48.860000000,42.72
+48.860000000,42.74
+48.860000000,42.76
+48.860000000,42.78
+48.860000000,42.8
+48.860000000,42.82
+48.860000000,42.84
+48.860000000,42.86
+48.860000000,42.88
+48.860000000,42.9
+48.860000000,42.92
+48.860000000,42.94
+48.860000000,42.96
+48.860000000,42.98
+48.860000000,43
+48.860000000,43.02
+48.860000000,43.04
+48.860000000,43.06
+48.860000000,43.08
+48.860000000,43.1
+48.860000000,43.12
+48.860000000,43.14
+48.860000000,43.16
+48.860000000,43.18
+48.860000000,43.2
+48.860000000,43.22
+48.860000000,43.24
+48.860000000,43.26
+48.860000000,43.28
+48.860000000,43.3
+48.860000000,43.32
+48.860000000,43.34
+48.860000000,43.36
+48.860000000,43.38
+48.860000000,43.4
+48.860000000,43.42
+48.860000000,43.44
+48.860000000,43.46
+48.860000000,43.48
+48.860000000,43.5
+48.860000000,43.52
+48.860000000,43.54
+48.860000000,43.56
+48.860000000,43.58
+48.860000000,43.6
+48.860000000,43.62
+48.860000000,43.64
+48.860000000,43.66
+48.860000000,43.68
+48.860000000,43.7
+48.860000000,43.72
+48.860000000,43.74
+48.860000000,43.76
+48.860000000,43.78
+48.860000000,43.8
+48.860000000,43.82
+48.860000000,43.84
+48.860000000,43.86
+48.860000000,43.88
+48.860000000,43.9
+48.860000000,43.92
+48.860000000,43.94
+48.860000000,43.96
+48.860000000,43.98
+48.860000000,44
+48.860000000,44.02
+48.860000000,44.04
+48.860000000,44.06
+48.860000000,44.08
+48.860000000,44.1
+48.860000000,44.12
+48.860000000,44.14
+48.860000000,44.16
+48.860000000,44.18
+48.860000000,44.2
+48.860000000,44.22
+48.860000000,44.24
+48.860000000,44.26
+48.860000000,44.28
+48.860000000,44.3
+48.860000000,44.32
+48.860000000,44.34
+48.860000000,44.36
+48.860000000,44.38
+48.860000000,44.4
+48.860000000,44.42
+48.860000000,44.44
+48.860000000,44.46
+48.860000000,44.48
+48.860000000,44.5
+48.860000000,44.52
+48.860000000,44.54
+48.860000000,44.56
+48.860000000,44.58
+48.860000000,44.6
+48.860000000,44.62
+48.860000000,44.64
+48.860000000,44.66
+48.860000000,44.68
+48.860000000,44.7
+48.860000000,44.72
+48.860000000,44.74
+48.860000000,44.76
+48.860000000,44.78
+48.860000000,44.8
+48.860000000,44.82
+48.860000000,44.84
+48.860000000,44.86
+48.860000000,44.88
+48.860000000,44.9
+48.860000000,44.92
+48.860000000,44.94
+48.860000000,44.96
+48.860000000,44.98
+48.860000000,45
+48.860000000,45.02
+48.860000000,45.04
+48.860000000,45.06
+48.860000000,45.08
+48.860000000,45.1
+48.860000000,45.12
+48.860000000,45.14
+48.860000000,45.16
+48.860000000,45.18
+48.860000000,45.2
+48.860000000,45.22
+48.860000000,45.24
+48.860000000,45.26
+48.860000000,45.28
+48.860000000,45.3
+48.860000000,45.32
+48.860000000,45.34
+48.860000000,45.36
+48.860000000,45.38
+48.860000000,45.4
+48.860000000,45.42
+48.860000000,45.44
+48.860000000,45.46
+48.860000000,45.48
+48.860000000,45.5
+48.860000000,45.52
+48.860000000,45.54
+48.860000000,45.56
+48.860000000,45.58
+48.860000000,45.6
+48.860000000,45.62
+48.860000000,45.64
+48.860000000,45.66
+48.860000000,45.68
+48.860000000,45.7
+48.860000000,45.72
+48.860000000,45.74
+48.860000000,45.76
+48.860000000,45.78
+48.860000000,45.8
+48.860000000,45.82
+48.860000000,45.84
+48.860000000,45.86
+48.860000000,45.88
+48.860000000,45.9
+48.860000000,45.92
+48.860000000,45.94
+48.860000000,45.96
+48.860000000,45.98
+48.860000000,46
+48.860000000,46.02
+48.860000000,46.04
+48.860000000,46.06
+48.860000000,46.08
+48.860000000,46.1
+48.860000000,46.12
+48.860000000,46.14
+48.860000000,46.16
+48.860000000,46.18
+48.860000000,46.2
+48.860000000,46.22
+48.860000000,46.24
+48.860000000,46.26
+48.860000000,46.28
+48.860000000,46.3
+48.860000000,46.32
+48.860000000,46.34
+48.860000000,46.36
+48.860000000,46.38
+48.860000000,46.4
+48.860000000,46.42
+48.860000000,46.44
+48.860000000,46.46
+48.860000000,46.48
+48.860000000,46.5
+48.860000000,46.52
+48.860000000,46.54
+48.860000000,46.56
+48.860000000,46.58
+48.860000000,46.6
+48.860000000,46.62
+48.860000000,46.64
+48.860000000,46.66
+48.860000000,46.68
+48.860000000,46.7
+48.860000000,46.72
+48.860000000,46.74
+48.860000000,46.76
+48.860000000,46.78
+48.860000000,46.8
+48.860000000,46.82
+48.860000000,46.84
+48.860000000,46.86
+48.860000000,46.88
+48.860000000,46.9
+48.860000000,46.92
+48.860000000,46.94
+48.860000000,46.96
+48.860000000,46.98
+48.860000000,47
+48.860000000,47.02
+48.860000000,47.04
+48.860000000,47.06
+48.860000000,47.08
+48.860000000,47.1
+48.860000000,47.12
+48.860000000,47.14
+48.860000000,47.16
+48.860000000,47.18
+48.860000000,47.2
+48.860000000,47.22
+48.860000000,47.24
+48.860000000,47.26
+48.860000000,47.28
+48.860000000,47.3
+48.860000000,47.32
+48.860000000,47.34
+48.860000000,47.36
+48.860000000,47.38
+48.860000000,47.4
+48.860000000,47.42
+48.860000000,47.44
+48.860000000,47.46
+48.860000000,47.48
+48.860000000,47.5
+48.860000000,47.52
+48.860000000,47.54
+48.860000000,47.56
+48.860000000,47.58
+48.860000000,47.6
+48.860000000,47.62
+48.860000000,47.64
+48.860000000,47.66
+48.860000000,47.68
+48.860000000,47.7
+48.860000000,47.72
+48.860000000,47.74
+48.860000000,47.76
+48.860000000,47.78
+48.860000000,47.8
+48.860000000,47.82
+48.860000000,47.84
+48.860000000,47.86
+48.860000000,47.88
+48.860000000,47.9
+48.860000000,47.92
+48.860000000,47.94
+48.860000000,47.96
+48.860000000,47.98
+48.860000000,48
+48.860000000,48.02
+48.860000000,48.04
+48.860000000,48.06
+48.860000000,48.08
+48.860000000,48.1
+48.860000000,48.12
+48.860000000,48.14
+48.860000000,48.16
+48.860000000,48.18
+48.860000000,48.2
+48.860000000,48.22
+48.860000000,48.24
+48.860000000,48.26
+48.860000000,48.28
+48.860000000,48.3
+48.860000000,48.32
+48.860000000,48.34
+48.860000000,48.36
+48.860000000,48.38
+48.860000000,48.4
+48.860000000,48.42
+48.860000000,48.44
+48.860000000,48.46
+48.860000000,48.48
+48.860000000,48.5
+48.860000000,48.52
+48.860000000,48.54
+48.860000000,48.56
+48.860000000,48.58
+48.860000000,48.6
+48.860000000,48.62
+48.860000000,48.64
+48.860000000,48.66
+48.860000000,48.68
+48.860000000,48.7
+48.860000000,48.72
+48.860000000,48.74
+48.860000000,48.76
+48.860000000,48.78
+48.860000000,48.8
+48.860000000,48.82
+48.860000000,48.84
+48.860000000,48.86
+48.860000000,48.88
+48.860000000,48.9
+48.860000000,48.92
+48.860000000,48.94
+48.860000000,48.96
+48.860000000,48.98
+48.860000000,49
+48.860000000,49.02
+48.860000000,49.04
+48.860000000,49.06
+48.860000000,49.08
+48.860000000,49.1
+48.860000000,49.12
+48.860000000,49.14
+48.860000000,49.16
+48.860000000,49.18
+48.860000000,49.2
+48.860000000,49.22
+48.860000000,49.24
+48.860000000,49.26
+48.860000000,49.28
+48.860000000,49.3
+48.860000000,49.32
+48.860000000,49.34
+48.860000000,49.36
+48.860000000,49.38
+48.860000000,49.4
+48.860000000,49.42
+48.860000000,49.44
+48.860000000,49.46
+48.860000000,49.48
+48.860000000,49.5
+48.860000000,49.52
+48.860000000,49.54
+48.860000000,49.56
+48.860000000,49.58
+48.860000000,49.6
+48.860000000,49.62
+48.860000000,49.64
+48.860000000,49.66
+48.860000000,49.68
+48.860000000,49.7
+48.860000000,49.72
+48.860000000,49.74
+48.860000000,49.76
+48.860000000,49.78
+48.860000000,49.8
+48.860000000,49.82
+48.860000000,49.84
+48.860000000,49.86
+48.860000000,49.88
+48.860000000,49.9
+48.860000000,49.92
+48.860000000,49.94
+48.860000000,49.96
+48.860000000,49.98
+48.860000000,50
+48.860000000,50.02
+48.860000000,50.04
+48.860000000,50.06
+48.860000000,50.08
+48.860000000,50.1
+48.860000000,50.12
+48.860000000,50.14
+48.860000000,50.16
+48.860000000,50.18
+48.860000000,50.2
+48.860000000,50.22
+48.860000000,50.24
+48.860000000,50.26
+48.860000000,50.28
+48.860000000,50.3
+48.860000000,50.32
+48.860000000,50.34
+48.860000000,50.36
+48.860000000,50.38
+48.860000000,50.4
+48.860000000,50.42
+48.860000000,50.44
+48.860000000,50.46
+48.860000000,50.48
+48.860000000,50.5
+48.860000000,50.52
+48.860000000,50.54
+48.860000000,50.56
+48.860000000,50.58
+48.860000000,50.6
+48.860000000,50.62
+48.860000000,50.64
+48.860000000,50.66
+48.860000000,50.68
+48.860000000,50.7
+48.860000000,50.72
+48.860000000,50.74
+48.860000000,50.76
+48.860000000,50.78
+48.860000000,50.8
+48.860000000,50.82
+48.860000000,50.84
+48.860000000,50.86
+48.860000000,50.88
+48.860000000,50.9
+48.860000000,50.92
+48.860000000,50.94
+48.860000000,50.96
+48.860000000,50.98
+48.860000000,51
+48.860000000,51.02
+48.860000000,51.04
+48.860000000,51.06
+48.860000000,51.08
+48.860000000,51.1
+48.860000000,51.12
+48.860000000,51.14
+48.860000000,51.16
+48.860000000,51.18
+48.860000000,51.2
+48.860000000,51.22
+48.860000000,51.24
+48.860000000,51.26
+48.860000000,51.28
+48.860000000,51.3
+48.860000000,51.32
+48.860000000,51.34
+48.860000000,51.36
+48.860000000,51.38
+48.860000000,51.4
+48.860000000,51.42
+48.860000000,51.44
+48.860000000,51.46
+48.860000000,51.48
+48.860000000,51.5
+48.860000000,51.52
+48.860000000,51.54
+48.860000000,51.56
+48.860000000,51.58
+48.860000000,51.6
+48.860000000,51.62
+48.860000000,51.64
+48.860000000,51.66
+48.860000000,51.68
+48.860000000,51.7
+48.860000000,51.72
+48.860000000,51.74
+48.860000000,51.76
+48.860000000,51.78
+48.860000000,51.8
+48.860000000,51.82
+48.860000000,51.84
+48.860000000,51.86
+48.860000000,51.88
+48.860000000,51.9
+48.860000000,51.92
+48.860000000,51.94
+48.860000000,51.96
+48.860000000,51.98
+48.860000000,52
+48.860000000,52.02
+48.860000000,52.04
+48.860000000,52.06
+48.860000000,52.08
+48.860000000,52.1
+48.860000000,52.12
+48.860000000,52.14
+48.860000000,52.16
+48.860000000,52.18
+48.860000000,52.2
+48.860000000,52.22
+48.860000000,52.24
+48.860000000,52.26
+48.860000000,52.28
+48.860000000,52.3
+48.860000000,52.32
+48.860000000,52.34
+48.860000000,52.36
+48.860000000,52.38
+48.860000000,52.4
+48.860000000,52.42
+48.860000000,52.44
+48.860000000,52.46
+48.860000000,52.48
+48.860000000,52.5
+48.860000000,52.52
+48.860000000,52.54
+48.860000000,52.56
+48.860000000,52.58
+48.860000000,52.6
+48.860000000,52.62
+48.860000000,52.64
+48.860000000,52.66
+48.860000000,52.68
+48.860000000,52.7
+48.860000000,52.72
+48.860000000,52.74
+48.860000000,52.76
+48.860000000,52.78
+48.860000000,52.8
+48.860000000,52.82
+48.860000000,52.84
+48.860000000,52.86
+48.860000000,52.88
+48.860000000,52.9
+48.860000000,52.92
+48.860000000,52.94
+48.860000000,52.96
+48.860000000,52.98
+48.860000000,53
+48.860000000,53.02
+48.860000000,53.04
+48.860000000,53.06
+48.860000000,53.08
+48.860000000,53.1
+48.860000000,53.12
+48.860000000,53.14
+48.860000000,53.16
+48.860000000,53.18
+48.860000000,53.2
+48.860000000,53.22
+48.860000000,53.24
+48.860000000,53.26
+48.860000000,53.28
+48.860000000,53.3
+48.860000000,53.32
+48.860000000,53.34
+48.860000000,53.36
+48.860000000,53.38
+48.860000000,53.4
+48.860000000,53.42
+48.860000000,53.44
+48.860000000,53.46
+48.860000000,53.48
+48.860000000,53.5
+48.860000000,53.52
+48.860000000,53.54
+48.860000000,53.56
+48.860000000,53.58
+48.860000000,53.6
+48.860000000,53.62
+48.860000000,53.64
+48.860000000,53.66
+48.860000000,53.68
+48.860000000,53.7
+48.860000000,53.72
+48.860000000,53.74
+48.860000000,53.76
+48.860000000,53.78
+48.860000000,53.8
+48.860000000,53.82
+48.860000000,53.84
+48.860000000,53.86
+48.860000000,53.88
+48.860000000,53.9
+48.860000000,53.92
+48.860000000,53.94
+48.860000000,53.96
+48.860000000,53.98
+48.860000000,54
+48.860000000,54.02
+48.860000000,54.04
+48.860000000,54.06
+48.860000000,54.08
+48.860000000,54.1
+48.860000000,54.12
+48.860000000,54.14
+48.860000000,54.16
+48.860000000,54.18
+48.860000000,54.2
+48.860000000,54.22
+48.860000000,54.24
+48.860000000,54.26
+48.860000000,54.28
+48.860000000,54.3
+48.860000000,54.32
+48.860000000,54.34
+48.860000000,54.36
+48.860000000,54.38
+48.860000000,54.4
+48.860000000,54.42
+48.860000000,54.44
+48.860000000,54.46
+48.860000000,54.48
+48.860000000,54.5
+48.860000000,54.52
+48.860000000,54.54
+48.860000000,54.56
+48.860000000,54.58
+48.860000000,54.6
+48.860000000,54.62
+48.860000000,54.64
+48.860000000,54.66
+48.860000000,54.68
+48.860000000,54.7
+48.860000000,54.72
+48.860000000,54.74
+48.860000000,54.76
+48.860000000,54.78
+48.860000000,54.8
+48.860000000,54.82
+48.860000000,54.84
+48.860000000,54.86
+48.860000000,54.88
+48.860000000,54.9
+48.860000000,54.92
+48.860000000,54.94
+48.860000000,54.96
+48.860000000,54.98
+48.860000000,55
+48.860000000,55.02
+48.860000000,55.04
+48.860000000,55.06
+48.860000000,55.08
+48.860000000,55.1
+48.860000000,55.12
+48.860000000,55.14
+48.860000000,55.16
+48.860000000,55.18
+48.860000000,55.2
+48.860000000,55.22
+48.860000000,55.24
+48.860000000,55.26
+48.860000000,55.28
+48.860000000,55.3
+48.860000000,55.32
+48.860000000,55.34
+48.860000000,55.36
+48.860000000,55.38
+48.860000000,55.4
+48.860000000,55.42
+48.860000000,55.44
+48.860000000,55.46
+48.860000000,55.48
+48.860000000,55.5
+48.860000000,55.52
+48.860000000,55.54
+48.860000000,55.56
+48.860000000,55.58
+48.860000000,55.6
+48.860000000,55.62
+48.860000000,55.64
+48.860000000,55.66
+48.860000000,55.68
+48.860000000,55.7
+48.860000000,55.72
+48.860000000,55.74
+48.860000000,55.76
+48.860000000,55.78
+48.860000000,55.8
+48.860000000,55.82
+48.860000000,55.84
+48.860000000,55.86
+48.860000000,55.88
+48.860000000,55.9
+48.860000000,55.92
+48.860000000,55.94
+48.860000000,55.96
+48.860000000,55.98
+48.860000000,56
+48.860000000,56.02
+48.860000000,56.04
+48.860000000,56.06
+48.860000000,56.08
+48.860000000,56.1
+48.860000000,56.12
+48.860000000,56.14
+48.860000000,56.16
+48.860000000,56.18
+48.860000000,56.2
+48.860000000,56.22
+48.860000000,56.24
+48.860000000,56.26
+48.860000000,56.28
+48.860000000,56.3
+48.860000000,56.32
+48.860000000,56.34
+48.860000000,56.36
+48.860000000,56.38
+48.860000000,56.4
+48.860000000,56.42
+48.860000000,56.44
+48.860000000,56.46
+48.860000000,56.48
+48.860000000,56.5
+48.860000000,56.52
+48.860000000,56.54
+48.860000000,56.56
+48.860000000,56.58
+48.860000000,56.6
+48.860000000,56.62
+48.860000000,56.64
+48.860000000,56.66
+48.860000000,56.68
+48.860000000,56.7
+48.860000000,56.72
+48.860000000,56.74
+48.860000000,56.76
+48.860000000,56.78
+48.860000000,56.8
+48.860000000,56.82
+48.860000000,56.84
+48.860000000,56.86
+48.860000000,56.88
+48.860000000,56.9
+48.860000000,56.92
+48.860000000,56.94
+48.860000000,56.96
+48.860000000,56.98
+48.860000000,57
+48.860000000,57.02
+48.860000000,57.04
+48.860000000,57.06
+48.860000000,57.08
+48.860000000,57.1
+48.860000000,57.12
+48.860000000,57.14
+48.860000000,57.16
+48.860000000,57.18
+48.860000000,57.2
+48.860000000,57.22
+48.860000000,57.24
+48.860000000,57.26
+48.860000000,57.28
+48.860000000,57.3
+48.860000000,57.32
+48.860000000,57.34
+48.860000000,57.36
+48.860000000,57.38
+48.860000000,57.4
+48.860000000,57.42
+48.860000000,57.44
+48.860000000,57.46
+48.860000000,57.48
+48.860000000,57.5
+48.860000000,57.52
+48.860000000,57.54
+48.860000000,57.56
+48.860000000,57.58
+48.860000000,57.6
+48.860000000,57.62
+48.860000000,57.64
+48.860000000,57.66
+48.860000000,57.68
+48.860000000,57.7
+48.860000000,57.72
+48.860000000,57.74
+48.860000000,57.76
+48.860000000,57.78
+48.860000000,57.8
+48.860000000,57.82
+48.860000000,57.84
+48.860000000,57.86
+48.860000000,57.88
+48.860000000,57.9
+48.860000000,57.92
+48.860000000,57.94
+48.860000000,57.96
+48.860000000,57.98
+48.860000000,58
+48.860000000,58.02
+48.860000000,58.04
+48.860000000,58.06
+48.860000000,58.08
+48.860000000,58.1
+48.860000000,58.12
+48.860000000,58.14
+48.860000000,58.16
+48.860000000,58.18
+48.860000000,58.2
+48.860000000,58.22
+48.860000000,58.24
+48.860000000,58.26
+48.860000000,58.28
+48.860000000,58.3
+48.860000000,58.32
+48.860000000,58.34
+48.860000000,58.36
+48.860000000,58.38
+48.860000000,58.4
+48.860000000,58.42
+48.860000000,58.44
+48.860000000,58.46
+48.860000000,58.48
+48.860000000,58.5
+48.860000000,58.52
+48.860000000,58.54
+48.860000000,58.56
+48.860000000,58.58
+48.860000000,58.6
+48.860000000,58.62
+48.860000000,58.64
+48.860000000,58.66
+48.860000000,58.68
+48.860000000,58.7
+48.860000000,58.72
+48.860000000,58.74
+48.860000000,58.76
+48.860000000,58.78
+48.860000000,58.8
+48.860000000,58.82
+48.860000000,58.84
+48.860000000,58.86
+48.860000000,58.88
+48.860000000,58.9
+48.860000000,58.92
+48.860000000,58.94
+48.860000000,58.96
+48.860000000,58.98
+48.860000000,59
+48.860000000,59.02
+48.860000000,59.04
+48.860000000,59.06
+48.860000000,59.08
+48.860000000,59.1
+48.860000000,59.12
+48.860000000,59.14
+48.860000000,59.16
+48.860000000,59.18
+48.860000000,59.2
+48.860000000,59.22
+48.860000000,59.24
+48.860000000,59.26
+48.860000000,59.28
+48.860000000,59.3
+48.860000000,59.32
+48.860000000,59.34
+48.860000000,59.36
+48.860000000,59.38
+48.860000000,59.4
+48.860000000,59.42
+48.860000000,59.44
+48.860000000,59.46
+48.860000000,59.48
+48.860000000,59.5
+48.860000000,59.52
+48.860000000,59.54
+48.860000000,59.56
+48.860000000,59.58
+48.860000000,59.6
+48.860000000,59.62
+48.860000000,59.64
+48.860000000,59.66
+48.860000000,59.68
+48.860000000,59.7
+48.860000000,59.72
+48.860000000,59.74
+48.860000000,59.76
+48.860000000,59.78
+48.860000000,59.8
+48.860000000,59.82
+48.860000000,59.84
+48.860000000,59.86
+48.860000000,59.88
+48.860000000,59.9
+48.860000000,59.92
+48.860000000,59.94
+48.860000000,59.96
+48.860000000,59.98
+48.860000000,60
+48.860000000,60.02
+48.860000000,60.04
+48.860000000,60.06
+48.860000000,60.08
+48.860000000,60.1
+48.860000000,60.12
+48.860000000,60.14
+48.860000000,60.16
+48.860000000,60.18
+48.860000000,60.2
+48.860000000,60.22
+48.860000000,60.24
+48.860000000,60.26
+48.860000000,60.28
+48.860000000,60.3
+48.860000000,60.32
+48.860000000,60.34
+48.860000000,60.36
+48.860000000,60.38
+48.860000000,60.4
+48.860000000,60.42
+48.860000000,60.44
+48.860000000,60.46
+48.860000000,60.48
+48.860000000,60.5
+48.860000000,60.52
+48.860000000,60.54
+48.860000000,60.56
+48.860000000,60.58
+48.860000000,60.6
+48.860000000,60.62
+48.860000000,60.64
+48.860000000,60.66
+48.860000000,60.68
+48.860000000,60.7
+48.860000000,60.72
+48.860000000,60.74
+48.860000000,60.76
+48.860000000,60.78
+48.860000000,60.8
+48.860000000,60.82
+48.860000000,60.84
+48.860000000,60.86
+48.860000000,60.88
+48.860000000,60.9
+48.860000000,60.92
+48.860000000,60.94
+48.860000000,60.96
+48.860000000,60.98
+48.860000000,61
+48.860000000,61.02
+48.860000000,61.04
+48.860000000,61.06
+48.860000000,61.08
+48.860000000,61.1
+48.860000000,61.12
+48.860000000,61.14
+48.860000000,61.16
+48.860000000,61.18
+48.860000000,61.2
+48.860000000,61.22
+48.860000000,61.24
+48.860000000,61.26
+48.860000000,61.28
+48.860000000,61.3
+48.860000000,61.32
+48.860000000,61.34
+48.860000000,61.36
+48.860000000,61.38
+48.860000000,61.4
+48.860000000,61.42
+48.860000000,61.44
+48.860000000,61.46
+48.860000000,61.48
+48.860000000,61.5
+48.860000000,61.52
+48.860000000,61.54
+48.880000000,61.56
+48.900000000,61.58
+48.920000000,61.6
+48.940000000,61.62
+48.960000000,61.64
+48.980000000,61.66
+49.000000000,61.68
+49.020000000,61.7
+49.040000000,61.72
+49.060000000,61.74
+49.080000000,61.76
+49.100000000,61.78
+49.120000000,61.8
+49.140000000,61.82
+49.160000000,61.84
+49.180000000,61.86
+49.200000000,61.88
+49.220000000,61.9
+49.240000000,61.92
+49.260000000,61.94
+49.280000000,61.96
+49.300000000,61.98
+49.320000000,62
+49.340000000,62.02
+49.360000000,62.04
+49.380000000,62.06
+49.400000000,62.08
+49.420000000,62.1
+49.440000000,62.12
+49.460000000,62.14
+49.480000000,62.16
+49.500000000,62.18
+49.520000000,62.2
+49.540000000,62.22
+49.560000000,62.24
+49.580000000,62.26
+49.600000000,62.28
+49.620000000,62.3
+49.640000000,62.32
+49.660000000,62.34
+49.680000000,62.36
+49.700000000,62.38
+49.720000000,62.4
+49.740000000,62.42
+49.760000000,62.44
+49.780000000,62.46
+49.800000000,62.48
+49.820000000,62.5
+49.840000000,62.52
+49.860000000,62.54
+49.880000000,62.56
+49.900000000,62.56
+49.920000000,62.56
+49.940000000,62.56
+49.960000000,62.56
+49.980000000,62.56
+50.000000000,62.56
+50.020000000,62.56
+50.040000000,62.56
+50.060000000,62.56
+50.080000000,62.56
+50.100000000,62.56
+50.120000000,62.56
+50.140000000,62.56
+50.160000000,62.56
+50.180000000,62.56
+50.200000000,62.56
+50.220000000,62.56
+50.240000000,62.56
+50.260000000,62.56
+50.280000000,62.56
+50.300000000,62.56
+50.320000000,62.56
+50.340000000,62.56
+50.360000000,62.56
+50.380000000,62.56
+50.400000000,62.56
+50.420000000,62.56
+50.440000000,62.56
+50.460000000,62.56
+50.480000000,62.56
+50.500000000,62.56
+50.520000000,62.56
+50.540000000,62.56
+50.560000000,62.56
+50.580000000,62.56
+50.600000000,62.56
+50.620000000,62.56
+50.640000000,62.56
+50.660000000,62.56
+50.680000000,62.56
+50.700000000,62.56
+50.720000000,62.56
+50.740000000,62.56
+50.760000000,62.56
+50.780000000,62.56
+50.800000000,62.56
+50.820000000,62.56
+50.840000000,62.56
+50.860000000,62.56
+50.880000000,62.56
+50.900000000,62.56
+50.920000000,62.56
+50.940000000,62.56
+50.960000000,62.56
+50.980000000,62.56
+51.000000000,62.56
+51.020000000,62.56
+51.040000000,62.56
+51.060000000,62.56
+51.080000000,62.56
+51.100000000,62.56
+51.120000000,62.56
+51.140000000,62.56
+51.160000000,62.56
+51.180000000,62.56
+51.200000000,62.56
+51.220000000,62.56
+51.240000000,62.56
+51.260000000,62.56
+51.280000000,62.56
+51.300000000,62.56
+51.320000000,62.56
+51.340000000,62.56
+51.360000000,62.56
+51.380000000,62.56
+51.400000000,62.56
+51.420000000,62.56
+51.440000000,62.56
+51.460000000,62.56
+51.480000000,62.56
+51.500000000,62.56
+51.520000000,62.56
+51.540000000,62.56
+51.560000000,62.56
+51.580000000,62.56
+51.600000000,62.56
+51.620000000,62.56
+51.640000000,62.56
+51.660000000,62.56
+51.680000000,62.56
+51.700000000,62.56
+51.720000000,62.56
+51.740000000,62.56
+51.760000000,62.56
+51.780000000,62.56
+51.800000000,62.56
+51.820000000,62.56
+51.840000000,62.56
+51.860000000,62.56
+51.880000000,62.56
+51.900000000,62.56
+51.920000000,62.56
+51.940000000,62.56
+51.960000000,62.56
+51.980000000,62.56
+52.000000000,62.56
+52.020000000,62.56
+52.040000000,62.56
+52.060000000,62.56
+52.080000000,62.56
+52.100000000,62.56
+52.120000000,62.56
+52.140000000,62.56
+52.160000000,62.56
+52.180000000,62.56
+52.200000000,62.56
+52.220000000,62.56
+52.240000000,62.56
+52.260000000,62.56
+52.280000000,62.56
+52.300000000,62.56
+52.320000000,62.56
+52.340000000,62.56
+52.360000000,62.56
+52.380000000,62.56
+52.400000000,62.56
+52.420000000,62.56
+52.440000000,62.56
+52.460000000,62.56
+52.480000000,62.56
+52.500000000,62.56
+52.520000000,62.56
+52.540000000,62.56
+52.560000000,62.56
+52.580000000,62.56
+52.600000000,62.56
+52.620000000,62.56
+52.640000000,62.56
+52.660000000,62.56
+52.680000000,62.56
+52.700000000,62.56
+52.720000000,62.56
+52.740000000,62.56
+52.760000000,62.56
+52.780000000,62.56
+52.800000000,62.56
+52.820000000,62.56
+52.840000000,62.56
+52.860000000,62.56
+52.880000000,62.56
+52.900000000,62.56
+52.920000000,62.56
+52.940000000,62.56
+52.960000000,62.56
+52.980000000,62.56
+53.000000000,62.56
+53.020000000,62.56
+53.040000000,62.56
+53.060000000,62.56
+53.080000000,62.56
+53.100000000,62.56
+53.120000000,62.56
+53.140000000,62.56
+53.160000000,62.56
+53.180000000,62.56
+53.200000000,62.56
+53.220000000,62.56
+53.240000000,62.56
+53.260000000,62.56
+53.280000000,62.56
+53.300000000,62.56
+53.320000000,62.56
+53.340000000,62.56
+53.360000000,62.56
+53.380000000,62.56
+53.400000000,62.56
+53.420000000,62.56
+53.440000000,62.56
+53.460000000,62.56
+53.480000000,62.56
+53.500000000,62.56
+53.520000000,62.56
+53.540000000,62.56
+53.560000000,62.56
+53.580000000,62.56
+53.600000000,62.56
+53.620000000,62.56
+53.640000000,62.56
+53.660000000,62.56
+53.680000000,62.56
+53.700000000,62.56
+53.720000000,62.56
+53.740000000,62.56
+53.760000000,62.56
+53.780000000,62.56
+53.800000000,62.56
+53.820000000,62.56
+53.840000000,62.56
+53.860000000,62.56
+53.880000000,62.56
+53.900000000,62.56
+53.920000000,62.56
+53.940000000,62.56
+53.960000000,62.56
+53.980000000,62.56
+54.000000000,62.56
+54.020000000,62.56
+54.040000000,62.56
+54.060000000,62.56
+54.080000000,62.56
+54.100000000,62.56
+54.120000000,62.56
+54.140000000,62.56
+54.160000000,62.56
+54.180000000,62.56
+54.200000000,62.56
+54.220000000,62.56
+54.240000000,62.56
+54.260000000,62.56
+54.280000000,62.56
+54.300000000,62.56
+54.320000000,62.56
+54.340000000,62.56
+54.360000000,62.56
+54.380000000,62.56
+54.400000000,62.56
+54.420000000,62.56
+54.440000000,62.56
+54.460000000,62.56
+54.480000000,62.56
+54.500000000,62.56
+54.520000000,62.56
+54.540000000,62.56
+54.560000000,62.56
+54.580000000,62.56
+54.600000000,62.56
+54.620000000,62.56
+54.640000000,62.56
+54.660000000,62.56
+54.680000000,62.56
+54.700000000,62.56
+54.720000000,62.56
+54.740000000,62.56
+54.760000000,62.56
+54.780000000,62.56
+54.800000000,62.56
+54.820000000,62.56
+54.840000000,62.56
+54.860000000,62.56
+54.880000000,62.56
+54.900000000,62.56
+54.920000000,62.56
+54.940000000,62.56
+54.960000000,62.56
+54.980000000,62.56
+55.000000000,62.56
+55.020000000,62.56
+55.040000000,62.56
+55.060000000,62.56
+55.080000000,62.56
+55.100000000,62.56
+55.120000000,62.56
+55.140000000,62.56
+55.160000000,62.56
+55.180000000,62.56
+55.200000000,62.56
+55.220000000,62.56
+55.240000000,62.56
+55.260000000,62.56
+55.280000000,62.56
+55.300000000,62.56
+55.320000000,62.56
+55.340000000,62.56
+55.360000000,62.56
+55.380000000,62.56
+55.400000000,62.56
+55.420000000,62.56
+55.440000000,62.56
+55.460000000,62.56
+55.480000000,62.56
+55.500000000,62.56
+55.520000000,62.56
+55.540000000,62.56
+55.560000000,62.56
+55.580000000,62.56
+55.600000000,62.56
+55.620000000,62.56
+55.640000000,62.56
+55.660000000,62.56
+55.680000000,62.56
+55.700000000,62.56
+55.720000000,62.56
+55.740000000,62.56
+55.760000000,62.56
+55.780000000,62.56
+55.800000000,62.56
+55.820000000,62.56
+55.840000000,62.56
+55.860000000,62.56
+55.880000000,62.56
+55.900000000,62.56
+55.920000000,62.56
+55.940000000,62.56
+55.960000000,62.56
+55.980000000,62.56
+56.000000000,62.56
+56.020000000,62.56
+56.040000000,62.56
+56.060000000,62.56
+56.080000000,62.56
+56.100000000,62.56
+56.120000000,62.56
+56.140000000,62.56
+56.160000000,62.56
+56.180000000,62.56
+56.200000000,62.56
+56.220000000,62.56
+56.240000000,62.56
+56.260000000,62.56
+56.280000000,62.56
+56.300000000,62.56
+56.320000000,62.56
+56.340000000,62.56
+56.360000000,62.56
+56.380000000,62.56
+56.400000000,62.56
+56.420000000,62.56
+56.440000000,62.56
+56.460000000,62.56
+56.480000000,62.56
+56.500000000,62.56
+56.520000000,62.56
+56.540000000,62.56
+56.560000000,62.56
+56.580000000,62.56
+56.600000000,62.56
+56.620000000,62.56
+56.640000000,62.56
+56.660000000,62.56
+56.680000000,62.56
+56.700000000,62.56
+56.720000000,62.56
+56.740000000,62.56
+56.760000000,62.56
+56.780000000,62.56
+56.800000000,62.56
+56.820000000,62.56
+56.840000000,62.56
+56.860000000,62.56
+56.880000000,62.56
+56.900000000,62.56
+56.920000000,62.56
+56.940000000,62.56
+56.960000000,62.56
+56.980000000,62.56
+57.000000000,62.56
+57.020000000,62.56
+57.040000000,62.56
+57.060000000,62.56
+57.080000000,62.56
+57.100000000,62.56
+57.120000000,62.56
+57.140000000,62.56
+57.160000000,62.56
+57.180000000,62.56
+57.200000000,62.56
+57.220000000,62.56
+57.240000000,62.56
+57.260000000,62.56
+57.280000000,62.56
+57.300000000,62.56
+57.320000000,62.56
+57.340000000,62.56
+57.360000000,62.56
+57.380000000,62.56
+57.400000000,62.56
+57.420000000,62.56
+57.440000000,62.56
+57.460000000,62.56
+57.480000000,62.56
+57.500000000,62.56
+57.520000000,62.56
+57.540000000,62.56
+57.560000000,62.56
+57.580000000,62.56
+57.600000000,62.56
+57.620000000,62.56
+57.640000000,62.56
+57.660000000,62.56
+57.680000000,62.56
+57.700000000,62.56
+57.720000000,62.56
+57.740000000,62.56
+57.760000000,62.56
+57.780000000,62.56
+57.800000000,62.56
+57.820000000,62.56
+57.840000000,62.56
+57.860000000,62.56
+57.880000000,62.56
+57.900000000,62.56
+57.920000000,62.56
+57.940000000,62.56
+57.960000000,62.56
+57.980000000,62.56
+58.000000000,62.56
+58.020000000,62.56
+58.040000000,62.56
+58.060000000,62.56
+58.080000000,62.56
+58.100000000,62.56
+58.120000000,62.56
+58.140000000,62.56
+58.160000000,62.56
+58.180000000,62.56
+58.200000000,62.56
+58.220000000,62.56
+58.240000000,62.56
+58.260000000,62.56
+58.280000000,62.56
+58.300000000,62.56
+58.320000000,62.56
+58.340000000,62.56
+58.360000000,62.56
+58.380000000,62.56
+58.400000000,62.56
+58.420000000,62.56
+58.440000000,62.56
+58.460000000,62.56
+58.480000000,62.56
+58.500000000,62.56
+58.520000000,62.56
+58.540000000,62.56
+58.560000000,62.56
+58.580000000,62.56
+58.600000000,62.56
+58.620000000,62.56
+58.640000000,62.56
+58.660000000,62.56
+58.680000000,62.56
+58.700000000,62.56
+58.720000000,62.56
+58.740000000,62.56
+58.760000000,62.56
+58.780000000,62.56
+58.800000000,62.56
+58.820000000,62.56
+58.840000000,62.56
+58.860000000,62.56
+58.880000000,62.56
+58.900000000,62.56
+58.920000000,62.56
+58.940000000,62.56
+58.960000000,62.56
+58.980000000,62.56
+59.000000000,62.56
+59.020000000,62.56
+59.040000000,62.56
+59.060000000,62.56
+59.080000000,62.56
+59.100000000,62.56
+59.120000000,62.56
+59.140000000,62.56
+59.160000000,62.56
+59.180000000,62.56
+59.200000000,62.56
+59.220000000,62.56
+59.240000000,62.56
+59.260000000,62.56
+59.280000000,62.56
+59.300000000,62.56
+59.320000000,62.56
+59.340000000,62.56
+59.360000000,62.56
+59.380000000,62.56
+59.400000000,62.56
+59.420000000,62.56
+59.440000000,62.56
+59.460000000,62.56
+59.480000000,62.56
+59.500000000,62.56
+59.520000000,62.56
+59.540000000,62.56
+59.560000000,62.56
+59.580000000,62.56
+59.600000000,62.56
+59.620000000,62.56
+59.640000000,62.56
+59.660000000,62.56
+59.680000000,62.56
+59.700000000,62.56
+59.720000000,62.56
+59.740000000,62.56
+59.760000000,62.56
+59.780000000,62.56
+59.800000000,62.58
+59.820000000,62.6
+59.840000000,62.62
+59.860000000,62.64
+59.880000000,62.66
+59.900000000,62.68
+59.920000000,62.7
+59.940000000,62.72
+59.960000000,62.74
+59.980000000,62.76
+60.000000000,62.78
+60.020000000,62.8
+60.040000000,62.82
+60.060000000,62.84
+60.080000000,62.86
+60.100000000,62.88
+60.120000000,62.9
+60.140000000,62.92
+60.160000000,62.94
+60.180000000,62.96
+60.200000000,62.98
+60.220000000,63
+60.240000000,63.02
+60.260000000,63.04
+60.280000000,63.06
+60.300000000,63.08
+60.320000000,63.1
+60.340000000,63.12
+60.360000000,63.14
+60.380000000,63.16
+60.400000000,63.18
+60.420000000,63.2
+60.440000000,63.22
+60.460000000,63.24
+60.480000000,63.26
+60.500000000,63.28
+60.520000000,63.3
+60.540000000,63.32
+60.560000000,63.34
+60.580000000,63.36
+60.600000000,63.38
+60.620000000,63.4
+60.640000000,63.42
+60.660000000,63.44
+60.680000000,63.46
+60.700000000,63.48
+60.720000000,63.5
+60.740000000,63.52
+60.760000000,63.54
+60.780000000,63.56
+60.800000000,63.58
+60.800000000,63.6
+60.800000000,63.62
+60.800000000,63.64
+60.800000000,63.66
+60.800000000,63.68
+60.800000000,63.7
+60.800000000,63.72
+60.800000000,63.74
+60.800000000,63.76
+60.800000000,63.78
+60.800000000,63.8
+60.800000000,63.82
+60.800000000,63.84
+60.800000000,63.86
+60.800000000,63.88
+60.800000000,63.9
+60.800000000,63.92
+60.800000000,63.94
+60.800000000,63.96
+60.800000000,63.98
+60.800000000,64
+60.800000000,64.02
+60.800000000,64.04
+60.800000000,64.06
+60.800000000,64.08
+60.800000000,64.1
+60.800000000,64.12
+60.800000000,64.14
+60.800000000,64.16
+60.800000000,64.18
+60.800000000,64.2
+60.800000000,64.22
+60.800000000,64.24
+60.800000000,64.26
+60.800000000,64.28
+60.800000000,64.3
+60.800000000,64.32
+60.800000000,64.34
+60.800000000,64.36
+60.800000000,64.38
+60.800000000,64.4
+60.800000000,64.42
+60.800000000,64.44
+60.800000000,64.46
+60.800000000,64.48
+60.800000000,64.5
+60.800000000,64.52
+60.800000000,64.54
+60.800000000,64.56
+60.800000000,64.58
+60.800000000,64.6
+60.800000000,64.62
+60.800000000,64.64
+60.800000000,64.66
+60.800000000,64.68
+60.800000000,64.7
+60.800000000,64.72
+60.800000000,64.74
+60.800000000,64.76
+60.800000000,64.78
+60.800000000,64.8
+60.800000000,64.82
+60.800000000,64.84
+60.800000000,64.86
+60.800000000,64.88
+60.800000000,64.9
+60.800000000,64.92
+60.800000000,64.94
+60.800000000,64.96
+60.800000000,64.98
+60.800000000,65
+60.800000000,65.02
+60.800000000,65.04
+60.800000000,65.06
+60.800000000,65.08
+60.800000000,65.1
+60.800000000,65.12
+60.800000000,65.14
+60.800000000,65.16
+60.800000000,65.18
+60.800000000,65.2
+60.800000000,65.22
+60.800000000,65.24
+60.800000000,65.26
+60.800000000,65.28
+60.800000000,65.3
+60.800000000,65.32
+60.800000000,65.34
+60.800000000,65.36
+60.800000000,65.38
+60.800000000,65.4
+60.800000000,65.42
+60.800000000,65.44
+60.800000000,65.46
+60.800000000,65.48
+60.800000000,65.5
+60.800000000,65.52
+60.800000000,65.54
+60.800000000,65.56
+60.800000000,65.58
+60.800000000,65.6
+60.800000000,65.62
+60.800000000,65.64
+60.800000000,65.66
+60.800000000,65.68
+60.800000000,65.7
+60.800000000,65.72
+60.800000000,65.74
+60.800000000,65.76
+60.800000000,65.78
+60.800000000,65.8
+60.800000000,65.82
+60.800000000,65.84
+60.800000000,65.86
+60.800000000,65.88
+60.800000000,65.9
+60.800000000,65.92
+60.800000000,65.94
+60.800000000,65.96
+60.800000000,65.98
+60.800000000,66
+60.800000000,66.02
+60.800000000,66.04
+60.800000000,66.06
+60.800000000,66.08
+60.800000000,66.1
+60.800000000,66.12
+60.800000000,66.14
+60.800000000,66.16
+60.800000000,66.18
+60.800000000,66.2
+60.800000000,66.22
+60.800000000,66.24
+60.800000000,66.26
+60.800000000,66.28
+60.800000000,66.3
+60.800000000,66.32
+60.800000000,66.34
+60.800000000,66.36
+60.800000000,66.38
+60.800000000,66.4
+60.800000000,66.42
+60.800000000,66.44
+60.800000000,66.46
+60.800000000,66.48
+60.800000000,66.5
+60.800000000,66.52
+60.800000000,66.54
+60.800000000,66.56
+60.800000000,66.58
+60.800000000,66.6
+60.800000000,66.62
+60.800000000,66.64
+60.800000000,66.66
+60.800000000,66.68
+60.800000000,66.7
+60.800000000,66.72
+60.800000000,66.74
+60.800000000,66.76
+60.800000000,66.78
+60.800000000,66.8
+60.800000000,66.82
+60.800000000,66.84
+60.800000000,66.86
+60.800000000,66.88
+60.800000000,66.9
+60.800000000,66.92
+60.800000000,66.94
+60.800000000,66.96
+60.800000000,66.98
+60.800000000,67
+60.800000000,67.02
+60.800000000,67.04
+60.800000000,67.06
+60.800000000,67.08
+60.800000000,67.1
+60.800000000,67.12
+60.800000000,67.14
+60.800000000,67.16
+60.800000000,67.18
+60.800000000,67.2
+60.800000000,67.22
+60.800000000,67.24
+60.800000000,67.26
+60.800000000,67.28
+60.800000000,67.3
+60.800000000,67.32
+60.800000000,67.34
+60.800000000,67.36
+60.800000000,67.38
+60.800000000,67.4
+60.800000000,67.42
+60.800000000,67.44
+60.800000000,67.46
+60.800000000,67.48
+60.800000000,67.5
+60.800000000,67.52
+60.800000000,67.54
+60.800000000,67.56
+60.800000000,67.58
+60.800000000,67.6
+60.800000000,67.62
+60.800000000,67.64
+60.800000000,67.66
+60.800000000,67.68
+60.800000000,67.7
+60.800000000,67.72
+60.800000000,67.74
+60.800000000,67.76
+60.800000000,67.78
+60.800000000,67.8
+60.800000000,67.82
+60.800000000,67.84
+60.800000000,67.86
+60.800000000,67.88
+60.800000000,67.9
+60.800000000,67.92
+60.800000000,67.94
+60.800000000,67.96
+60.800000000,67.98
+60.800000000,68
+60.800000000,68.02
+60.800000000,68.04
+60.800000000,68.06
+60.800000000,68.08
+60.800000000,68.1
+60.800000000,68.12
+60.800000000,68.14
+60.800000000,68.16
+60.800000000,68.18
+60.800000000,68.2
+60.800000000,68.22
+60.800000000,68.24
+60.800000000,68.26
+60.800000000,68.28
+60.800000000,68.3
+60.800000000,68.32
+60.800000000,68.34
+60.800000000,68.36
+60.800000000,68.38
+60.800000000,68.4
+60.800000000,68.42
+60.800000000,68.44
+60.800000000,68.46
+60.800000000,68.48
+60.800000000,68.5
+60.800000000,68.52
+60.800000000,68.54
+60.800000000,68.56
+60.800000000,68.58
+60.800000000,68.6
+60.800000000,68.62
+60.800000000,68.64
+60.800000000,68.66
+60.800000000,68.68
+60.800000000,68.7
+60.800000000,68.72
+60.800000000,68.74
+60.800000000,68.76
+60.800000000,68.78
+60.800000000,68.8
+60.800000000,68.82
+60.800000000,68.84
+60.800000000,68.86
+60.800000000,68.88
+60.800000000,68.9
+60.800000000,68.92
+60.800000000,68.94
+60.800000000,68.96
+60.800000000,68.98
+60.800000000,69
+60.800000000,69.02
+60.800000000,69.04
+60.800000000,69.06
+60.800000000,69.08
+60.800000000,69.1
+60.800000000,69.12
+60.800000000,69.14
+60.800000000,69.16
+60.800000000,69.18
+60.800000000,69.2
+60.800000000,69.22
+60.800000000,69.24
+60.800000000,69.26
+60.800000000,69.28
+60.800000000,69.3
+60.800000000,69.32
+60.800000000,69.34
+60.800000000,69.36
+60.800000000,69.38
+60.800000000,69.4
+60.800000000,69.42
+60.800000000,69.44
+60.800000000,69.46
+60.800000000,69.48
+60.800000000,69.5
+60.800000000,69.52
+60.800000000,69.54
+60.800000000,69.56
+60.800000000,69.58
+60.800000000,69.6
+60.800000000,69.62
+60.800000000,69.64
+60.800000000,69.66
+60.800000000,69.68
+60.800000000,69.7
+60.800000000,69.72
+60.800000000,69.74
+60.800000000,69.76
+60.800000000,69.78
+60.800000000,69.8
+60.800000000,69.82
+60.800000000,69.84
+60.800000000,69.86
+60.800000000,69.88
+60.800000000,69.9
+60.800000000,69.92
+60.800000000,69.94
+60.800000000,69.96
+60.800000000,69.98
+60.800000000,70
+60.800000000,70.02
+60.800000000,70.04
+60.800000000,70.06
+60.800000000,70.08
+60.800000000,70.1
+60.800000000,70.12
+60.800000000,70.14
+60.800000000,70.16
+60.800000000,70.18
+60.800000000,70.2
+60.800000000,70.22
+60.800000000,70.24
+60.800000000,70.26
+60.800000000,70.28
+60.800000000,70.3
+60.800000000,70.32
+60.800000000,70.34
+60.800000000,70.36
+60.800000000,70.38
+60.800000000,70.4
+60.800000000,70.42
+60.800000000,70.44
+60.800000000,70.46
+60.800000000,70.48
+60.800000000,70.5
+60.800000000,70.52
+60.800000000,70.54
+60.800000000,70.56
+60.800000000,70.58
+60.800000000,70.6
+60.800000000,70.62
+60.800000000,70.64
+60.800000000,70.66
+60.800000000,70.68
+60.800000000,70.7
+60.800000000,70.72
+60.800000000,70.74
+60.800000000,70.76
+60.800000000,70.78
+60.800000000,70.8
+60.800000000,70.82
+60.800000000,70.84
+60.800000000,70.86
+60.800000000,70.88
+60.800000000,70.9
+60.800000000,70.92
+60.800000000,70.94
+60.800000000,70.96
+60.800000000,70.98
+60.800000000,71
+60.800000000,71.02
+60.800000000,71.04
+60.800000000,71.06
+60.800000000,71.08
+60.800000000,71.1
+60.800000000,71.12
+60.800000000,71.14
+60.800000000,71.16
+60.800000000,71.18
+60.800000000,71.2
+60.800000000,71.22
+60.800000000,71.24
+60.800000000,71.26
+60.800000000,71.28
+60.800000000,71.3
+60.800000000,71.32
+60.800000000,71.34
+60.800000000,71.36
+60.800000000,71.38
+60.800000000,71.4
+60.800000000,71.42
+60.800000000,71.44
+60.800000000,71.46
+60.800000000,71.48
+60.800000000,71.5
+60.800000000,71.52
+60.800000000,71.54
+60.800000000,71.56
+60.800000000,71.58
+60.800000000,71.6
+60.800000000,71.62
+60.800000000,71.64
+60.800000000,71.66
+60.800000000,71.68
+60.800000000,71.7
+60.800000000,71.72
+60.800000000,71.74
+60.800000000,71.76
+60.800000000,71.78
+60.800000000,71.8
+60.800000000,71.82
+60.800000000,71.84
+60.800000000,71.86
+60.800000000,71.88
+60.800000000,71.9
+60.800000000,71.92
+60.800000000,71.94
+60.800000000,71.96
+60.800000000,71.98
+60.800000000,72
+60.800000000,72.02
+60.800000000,72.04
+60.800000000,72.06
+60.800000000,72.08
+60.800000000,72.1
+60.800000000,72.12
+60.800000000,72.14
+60.800000000,72.16
+60.800000000,72.18
+60.800000000,72.2
+60.800000000,72.22
+60.800000000,72.24
+60.800000000,72.26
+60.800000000,72.28
+60.800000000,72.3
+60.800000000,72.32
+60.800000000,72.34
+60.800000000,72.36
+60.800000000,72.38
+60.800000000,72.4
+60.800000000,72.42
+60.800000000,72.44
+60.800000000,72.46
+60.800000000,72.48
+60.800000000,72.5
+60.800000000,72.52
+60.800000000,72.54
+60.800000000,72.56
+60.800000000,72.58
+60.800000000,72.6
+60.800000000,72.62
+60.800000000,72.64
+60.800000000,72.66
+60.800000000,72.68
+60.800000000,72.7
+60.800000000,72.72
+60.800000000,72.74
+60.800000000,72.76
+60.800000000,72.78
+60.800000000,72.8
+60.800000000,72.82
+60.800000000,72.84
+60.800000000,72.86
+60.800000000,72.88
+60.800000000,72.9
+60.800000000,72.92
+60.800000000,72.94
+60.800000000,72.96
+60.800000000,72.98
+60.800000000,73
+60.800000000,73.02
+60.800000000,73.04
+60.800000000,73.06
+60.800000000,73.08
+60.800000000,73.1
+60.800000000,73.12
+60.800000000,73.14
+60.800000000,73.16
+60.800000000,73.18
+60.800000000,73.2
+60.800000000,73.22
+60.800000000,73.24
+60.800000000,73.26
+60.800000000,73.28
+60.800000000,73.3
+60.800000000,73.32
+60.800000000,73.34
+60.800000000,73.36
+60.800000000,73.38
+60.800000000,73.4
+60.800000000,73.42
+60.800000000,73.44
+60.800000000,73.46
+60.800000000,73.48
+60.800000000,73.5
+60.800000000,73.52
+60.800000000,73.54
+60.800000000,73.56
+60.800000000,73.58
+60.800000000,73.6
+60.800000000,73.62
+60.800000000,73.64
+60.800000000,73.66
+60.800000000,73.68
+60.800000000,73.7
+60.800000000,73.72
+60.800000000,73.74
+60.800000000,73.76
+60.800000000,73.78
+60.800000000,73.8
+60.800000000,73.82
+60.800000000,73.84
+60.800000000,73.86
+60.800000000,73.88
+60.800000000,73.9
+60.800000000,73.92
+60.820000000,73.94
+60.840000000,73.96
+60.860000000,73.98
+60.880000000,74
+60.900000000,74.02
+60.920000000,74.04
+60.940000000,74.06
+60.960000000,74.08
+60.980000000,74.1
+61.000000000,74.12
+61.020000000,74.14
+61.040000000,74.16
+61.060000000,74.18
+61.080000000,74.2
+61.100000000,74.22
+61.120000000,74.24
+61.140000000,74.26
+61.160000000,74.28
+61.180000000,74.3
+61.200000000,74.32
+61.220000000,74.34
+61.240000000,74.36
+61.260000000,74.38
+61.280000000,74.4
+61.300000000,74.42
+61.320000000,74.44
+61.340000000,74.46
+61.360000000,74.48
+61.380000000,74.5
+61.400000000,74.52
+61.420000000,74.54
+61.440000000,74.56
+61.460000000,74.58
+61.480000000,74.6
+61.500000000,74.62
+61.520000000,74.64
+61.540000000,74.66
+61.560000000,74.68
+61.580000000,74.7
+61.600000000,74.72
+61.620000000,74.74
+61.640000000,74.76
+61.660000000,74.78
+61.680000000,74.8
+61.700000000,74.82
+61.720000000,74.84
+61.740000000,74.86
+61.760000000,74.88
+61.780000000,74.9
+61.800000000,74.92
+61.820000000,74.94
+61.840000000,74.94
+61.860000000,74.94
+61.880000000,74.94
+61.900000000,74.94
+61.920000000,74.94
+61.940000000,74.94
+61.960000000,74.94
+61.980000000,74.94
+62.000000000,74.94
+62.020000000,74.94
+62.040000000,74.94
+62.060000000,74.94
+62.080000000,74.94
+62.100000000,74.94
+62.120000000,74.94
+62.140000000,74.94
+62.160000000,74.94
+62.180000000,74.94
+62.200000000,74.94
+62.220000000,74.94
+62.240000000,74.94
+62.260000000,74.94
+62.280000000,74.94
+62.300000000,74.94
+62.320000000,74.94
+62.340000000,74.94
+62.360000000,74.94
+62.380000000,74.94
+62.400000000,74.94
+62.420000000,74.94
+62.440000000,74.94
+62.460000000,74.94
+62.480000000,74.94
+62.500000000,74.94
+62.520000000,74.94
+62.540000000,74.94
+62.560000000,74.94
+62.580000000,74.94
+62.600000000,74.94
+62.620000000,74.94
+62.640000000,74.94
+62.660000000,74.94
+62.680000000,74.94
+62.700000000,74.94
+62.720000000,74.94
+62.740000000,74.94
+62.760000000,74.94
+62.780000000,74.94
+62.800000000,74.94
+62.820000000,74.94
+62.840000000,74.94
+62.860000000,74.94
+62.880000000,74.94
+62.900000000,74.94
+62.920000000,74.94
+62.940000000,74.94
+62.960000000,74.94
+62.980000000,74.94
+63.000000000,74.94
diff -r a68204b9a529 -r cca298ecfc72 test/old/regressiontest.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/old/regressiontest.sh Fri Feb 27 09:29:37 2015 +0000
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+mydir=$(dirname "$0")
+
+sonic-annotator --minversion 1.1 || exit 1
+
+VAMP_PATH="${mydir}/../.." \
+ sonic-annotator \
+ -d vamp:match-vamp-plugin:match \
+ --multiplex \
+ ~/Music/cc-kids-abrsm-dataset/ABRSM/Allegro\ in\ G.mp3 \
+ ~/Music/cc-kids-abrsm-dataset/Kids/Allegro\ in\ G.mp3 \
+ -w csv --csv-stdout 2>/dev/null | sed 's/^[^,]*,//' > /tmp/$$ || exit 1
+
+sdiff -w 78 /tmp/$$ `dirname $0`/expected.csv && echo Passed
+
+rm /tmp/$$
diff -r a68204b9a529 -r cca298ecfc72 test/regressiontest.sh
--- a/test/regressiontest.sh Fri Nov 14 10:24:13 2014 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-#!/bin/bash
-
-mydir=$(dirname "$0")
-
-sonic-annotator --minversion 1.1 || exit 1
-
-VAMP_PATH="${mydir}/.." \
- sonic-annotator \
- -d vamp:match-vamp-plugin:match \
- --multiplex \
- ~/Music/cc-kids-abrsm-dataset/ABRSM/Allegro\ in\ G.mp3 \
- ~/Music/cc-kids-abrsm-dataset/Kids/Allegro\ in\ G.mp3 \
- -w csv --csv-stdout 2>/dev/null | sed 's/^[^,]*,//' > /tmp/$$ || exit 1
-
-sdiff -w 78 /tmp/$$ `dirname $0`/expected.csv && echo Passed
-
-rm /tmp/$$